TrinityCore
MapManager.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "MapManager.h"
19#include "BattlefieldMgr.h"
20#include "Battleground.h"
21#include "Containers.h"
22#include "DatabaseEnv.h"
23#include "DB2Stores.h"
24#include "GarrisonMap.h"
25#include "Group.h"
26#include "InstanceLockMgr.h"
27#include "Log.h"
28#include "Map.h"
29#include "OutdoorPvPMgr.h"
30#include "Player.h"
31#include "ScenarioMgr.h"
32#include "ScriptMgr.h"
33#include "World.h"
34#include "WorldStateMgr.h"
35#include <boost/dynamic_bitset.hpp>
36#include <numeric>
37
39 : _freeInstanceIds(std::make_unique<InstanceIds>()), _nextInstanceId(0), _scheduledScripts(0)
40{
43}
44
45MapManager::~MapManager() = default;
46
48{
50
51 int num_threads(sWorld->getIntConfig(CONFIG_NUMTHREADS));
52 // Start mtmaps if needed.
53 if (num_threads > 0)
54 m_updater.activate(num_threads);
55}
56
58{
59 for (auto iter = i_maps.begin(); iter != i_maps.end(); ++iter)
60 iter->second->InitVisibilityDistance();
61}
62
64{
65 static MapManager instance;
66 return &instance;
67}
68
69Map* MapManager::FindMap_i(uint32 mapId, uint32 instanceId) const
70{
71 auto itr = i_maps.find({ mapId, instanceId });
72 return itr != i_maps.end() ? itr->second.get() : nullptr;
73}
74
76{
77 Map* map = new Map(mapId, i_gridCleanUpDelay, instanceId, DIFFICULTY_NONE);
78 map->LoadRespawnTimes();
79 map->LoadCorpseData();
81
82 if (sWorld->getBoolConfig(CONFIG_BASEMAP_LOAD_GRIDS))
83 map->LoadAllCells();
84
85 return map;
86}
87
88InstanceMap* MapManager::CreateInstance(uint32 mapId, uint32 instanceId, InstanceLock* instanceLock, Difficulty difficulty, TeamId team, Group* group)
89{
90 // make sure we have a valid map id
91 MapEntry const* entry = sMapStore.LookupEntry(mapId);
92 if (!entry)
93 {
94 TC_LOG_ERROR("maps", "CreateInstance: no entry for map {}", mapId);
95 ABORT();
96 }
97
98 // some instances only have one difficulty
99 sDB2Manager.GetDownscaledMapDifficultyData(mapId, difficulty);
100
101 TC_LOG_DEBUG("maps", "MapInstanced::CreateInstance: {}map instance {} for {} created with difficulty {}",
102 instanceLock && instanceLock->IsNew() ? "" : "new ", instanceId, mapId, sDifficultyStore.AssertEntry(difficulty)->Name[sWorld->GetDefaultDbcLocale()]);
103
104 InstanceMap* map = new InstanceMap(mapId, i_gridCleanUpDelay, instanceId, difficulty, team, instanceLock);
105 ASSERT(map->IsDungeon());
106
107 map->LoadRespawnTimes();
108 map->LoadCorpseData();
109 if (group)
110 map->TrySetOwningGroup(group);
111
112 map->CreateInstanceData();
113 map->SetInstanceScenario(sScenarioMgr->CreateInstanceScenario(map, team));
114 map->InitSpawnGroupState();
115
116 if (sWorld->getBoolConfig(CONFIG_INSTANCEMAP_LOAD_GRIDS))
117 map->LoadAllCells();
118
119 return map;
120}
121
123{
124 TC_LOG_DEBUG("maps", "MapInstanced::CreateBattleground: map bg {} for {} created.", instanceId, mapId);
125
128 map->SetBG(bg);
129 bg->SetBgMap(map);
130 map->InitSpawnGroupState();
131
132 if (sWorld->getBoolConfig(CONFIG_BATTLEGROUNDMAP_LOAD_GRIDS))
133 map->LoadAllCells();
134
135 return map;
136}
137
139{
140 GarrisonMap* map = new GarrisonMap(mapId, i_gridCleanUpDelay, instanceId, owner->GetGUID());
141 ASSERT(map->IsGarrison());
142 map->InitSpawnGroupState();
143 return map;
144}
145
146/*
147- return the right instance for the object, based on its InstanceId
148- create the instance if it's not created already
149- the player is not actually added to the instance (only in InstanceMap::Add)
150*/
152{
153 if (!player)
154 return nullptr;
155
156 MapEntry const* entry = sMapStore.LookupEntry(mapId);
157 if (!entry)
158 return nullptr;
159
160 std::unique_lock<std::shared_mutex> lock(_mapsLock);
161
162 Map* map = nullptr;
163 uint32 newInstanceId = 0; // instanceId of the resulting map
164
165 if (entry->IsBattlegroundOrArena())
166 {
167 // instantiate or find existing bg map for player
168 // the instance id is set in battlegroundid
169 newInstanceId = player->GetBattlegroundId();
170 if (!newInstanceId)
171 return nullptr;
172
173 map = FindMap_i(mapId, newInstanceId);
174 if (!map)
175 {
176 if (Battleground* bg = player->GetBattleground())
177 map = CreateBattleground(mapId, newInstanceId, bg);
178 else
179 {
180 player->TeleportToBGEntryPoint();
181 return nullptr;
182 }
183 }
184 }
185 else if (entry->IsDungeon())
186 {
187 Group* group = player->GetGroup();
188 Difficulty difficulty = group ? group->GetDifficultyID(entry) : player->GetDifficultyID(entry);
189 MapDb2Entries entries{ entry, sDB2Manager.GetDownscaledMapDifficultyData(mapId, difficulty) };
190 ObjectGuid instanceOwnerGuid = group ? group->GetRecentInstanceOwner(mapId) : player->GetGUID();
191 InstanceLock* instanceLock = sInstanceLockMgr.FindActiveInstanceLock(instanceOwnerGuid, entries);
192 if (instanceLock)
193 {
194 newInstanceId = instanceLock->GetInstanceId();
195
196 // Reset difficulty to the one used in instance lock
197 if (!entries.Map->IsFlexLocking())
198 difficulty = instanceLock->GetDifficultyId();
199 }
200 else
201 {
202 // Try finding instance id for normal dungeon
203 if (!entries.MapDifficulty->HasResetSchedule())
204 newInstanceId = group ? group->GetRecentInstanceId(mapId) : player->GetRecentInstanceId(mapId);
205
206 // If not found or instance is not a normal dungeon, generate new one
207 if (!newInstanceId)
208 newInstanceId = GenerateInstanceId();
209
210 instanceLock = sInstanceLockMgr.CreateInstanceLockForNewInstance(instanceOwnerGuid, entries, newInstanceId);
211 }
212
213 // it is possible that the save exists but the map doesn't
214 map = FindMap_i(mapId, newInstanceId);
215
216 // is is also possible that instance id is already in use by another group for boss-based locks
217 if (!entries.IsInstanceIdBound() && instanceLock && map && map->ToInstanceMap()->GetInstanceLock() != instanceLock)
218 {
219 newInstanceId = GenerateInstanceId();
220 instanceLock->SetInstanceId(newInstanceId);
221 map = nullptr;
222 }
223
224 if (!map)
225 {
226 map = CreateInstance(mapId, newInstanceId, instanceLock, difficulty, player->GetTeamId(), group);
227 if (group)
228 group->SetRecentInstance(mapId, instanceOwnerGuid, newInstanceId);
229 else
230 player->SetRecentInstance(mapId, newInstanceId);
231 }
232 }
233 else if (entry->IsGarrison())
234 {
235 newInstanceId = player->GetGUID().GetCounter();
236 map = FindMap_i(mapId, newInstanceId);
237 if (!map)
238 map = CreateGarrison(mapId, newInstanceId, player);
239 }
240 else
241 {
242 newInstanceId = 0;
243 if (entry->IsSplitByFaction())
244 newInstanceId = player->GetTeamId();
245
246 map = FindMap_i(mapId, newInstanceId);
247 if (!map)
248 map = CreateWorldMap(mapId, newInstanceId);
249 }
250
251 if (map)
252 {
254 if (ptr.get() != map)
255 {
256 ptr.reset(map);
257 map->SetWeakPtr(ptr);
258
259 sScriptMgr->OnCreateMap(map);
260 sOutdoorPvPMgr->CreateOutdoorPvPForMap(map);
261 sBattlefieldMgr->CreateBattlefieldsForMap(map);
262 }
263 }
264
265 return map;
266}
267
268Map* MapManager::FindMap(uint32 mapId, uint32 instanceId) const
269{
270 std::shared_lock<std::shared_mutex> lock(_mapsLock);
271 return FindMap_i(mapId, instanceId);
272}
273
275{
276 MapEntry const* entry = sMapStore.LookupEntry(mapId);
277 if (!entry)
278 return 0;
279
280 if (entry->IsBattlegroundOrArena())
281 return player->GetBattlegroundId();
282 else if (entry->IsDungeon())
283 {
284 Group const* group = player->GetGroup();
285 Difficulty difficulty = group ? group->GetDifficultyID(entry) : player->GetDifficultyID(entry);
286 MapDb2Entries entries{ entry, sDB2Manager.GetDownscaledMapDifficultyData(mapId, difficulty) };
287 ObjectGuid instanceOwnerGuid = group ? group->GetRecentInstanceOwner(mapId) : player->GetGUID();
288 InstanceLock* instanceLock = sInstanceLockMgr.FindActiveInstanceLock(instanceOwnerGuid, entries);
289 uint32 newInstanceId = 0;
290 if (instanceLock)
291 newInstanceId = instanceLock->GetInstanceId();
292 else if (!entries.MapDifficulty->HasResetSchedule()) // Try finding instance id for normal dungeon
293 newInstanceId = group ? group->GetRecentInstanceId(mapId) : player->GetRecentInstanceId(mapId);
294
295 if (!newInstanceId)
296 return 0;
297
298 Map* map = FindMap(mapId, newInstanceId);
299
300 // is is possible that instance id is already in use by another group for boss-based locks
301 if (!entries.IsInstanceIdBound() && instanceLock && map && map->ToInstanceMap()->GetInstanceLock() != instanceLock)
302 return 0;
303
304 return newInstanceId;
305 }
306 else if (entry->IsGarrison())
307 return uint32(player->GetGUID().GetCounter());
308 else
309 {
310 if (entry->IsSplitByFaction())
311 return player->GetTeamId();
312
313 return 0;
314 }
315}
316
318{
319 i_timer.Update(diff);
320 if (!i_timer.Passed())
321 return;
322
323 MapMapType::iterator iter = i_maps.begin();
324 while (iter != i_maps.end())
325 {
326 if (iter->second->CanUnload(diff))
327 {
328 if (DestroyMap(iter->second.get()))
329 iter = i_maps.erase(iter);
330 else
331 ++iter;
332
333 continue;
334 }
335
336 if (m_updater.activated())
338 else
339 iter->second->Update(uint32(i_timer.GetCurrent()));
340
341 ++iter;
342 }
343 if (m_updater.activated())
344 m_updater.wait();
345
346 for (iter = i_maps.begin(); iter != i_maps.end(); ++iter)
347 iter->second->DelayedUpdate(uint32(i_timer.GetCurrent()));
348
350}
351
353{
354 map->RemoveAllPlayers();
355 if (map->HavePlayers())
356 return false;
357
358 sOutdoorPvPMgr->DestroyOutdoorPvPForMap(map);
359 sBattlefieldMgr->DestroyBattlefieldsForMap(map);
360 sScriptMgr->OnDestroyMap(map);
361
362 map->UnloadAll();
363
364 // Free up the instance id and allow it to be reused for normal dungeons, bgs and arenas
365 if (map->IsBattlegroundOrArena() || (map->IsDungeon() && !map->GetMapDifficulty()->HasResetSchedule()))
366 sMapMgr->FreeInstanceId(map->GetInstanceId());
367
368 // erase map
369 return true;
370}
371
373{
374 return sMapStore.LookupEntry(mapId) != nullptr;
375}
376
378{
379 // first unload maps
380 for (auto iter = i_maps.begin(); iter != i_maps.end(); ++iter)
381 {
382 iter->second->UnloadAll();
383
384 sOutdoorPvPMgr->DestroyOutdoorPvPForMap(iter->second.get());
385 sBattlefieldMgr->DestroyBattlefieldsForMap(iter->second.get());
386 sScriptMgr->OnDestroyMap(iter->second.get());
387 }
388
389 // then delete them
390 i_maps.clear();
391
392 if (m_updater.activated())
394
396}
397
399{
400 std::shared_lock<std::shared_mutex> lock(_mapsLock);
401 return std::count_if(i_maps.begin(), i_maps.end(), [](MapMapType::value_type const& value) { return value.second->IsDungeon(); });
402}
403
405{
406 std::shared_lock<std::shared_mutex> lock(_mapsLock);
407 return std::accumulate(i_maps.begin(), i_maps.end(), 0u, [](uint32 total, MapMapType::value_type const& value) { return total + (value.second->IsDungeon() ? value.second->GetPlayers().getSize() : 0); });
408}
409
411{
412 _nextInstanceId = 1;
413
414 uint64 maxExistingInstanceId = 0;
415 if (QueryResult result = CharacterDatabase.Query("SELECT IFNULL(MAX(instanceId), 0) FROM instance"))
416 maxExistingInstanceId = std::max(maxExistingInstanceId, (*result)[0].GetUInt64());
417
418 if (QueryResult result = CharacterDatabase.Query("SELECT IFNULL(MAX(instanceId), 0) FROM character_instance_lock"))
419 maxExistingInstanceId = std::max(maxExistingInstanceId, (*result)[0].GetUInt64());
420
421 _freeInstanceIds->resize(maxExistingInstanceId + 2, true); // make space for one extra to be able to access [_nextInstanceId] index in case all slots are taken
422
423 // never allow 0 id
424 _freeInstanceIds->set(0, false);
425}
426
428{
429 // Allocation and sizing was done in InitInstanceIds()
430 _freeInstanceIds->set(instanceId, false);
431
432 // Instances are pulled in ascending order from db and nextInstanceId is initialized with 1,
433 // so if the instance id is used, increment until we find the first unused one for a potential new instance
434 if (_nextInstanceId == instanceId)
436}
437
439{
440 if (_nextInstanceId == 0xFFFFFFFF)
441 {
442 TC_LOG_ERROR("maps", "Instance ID overflow!! Can't continue, shutting down server. ");
444 return _nextInstanceId;
445 }
446
447 uint32 newInstanceId = _nextInstanceId;
448 ASSERT(newInstanceId < _freeInstanceIds->size());
449 _freeInstanceIds->set(newInstanceId, false);
450
451 // Find the lowest available id starting from the current NextInstanceId (which should be the lowest according to the logic in FreeInstanceId())
452 size_t nextFreedId = _freeInstanceIds->find_next(_nextInstanceId++);
453 if (nextFreedId == InstanceIds::npos)
454 {
456 _freeInstanceIds->push_back(true);
457 }
458 else
459 _nextInstanceId = uint32(nextFreedId);
460
461 return newInstanceId;
462}
463
465{
466 // If freed instance id is lower than the next id available for new instances, use the freed one instead
467 _nextInstanceId = std::min(instanceId, _nextInstanceId);
468 _freeInstanceIds->set(instanceId, true);
469}
470
471// hack to allow conditions to access what faction owns the map (these worldstates should not be set on these maps)
473{
474public:
475 SplitByFactionMapScript(char const* name, uint32 mapId) : WorldMapScript(name, mapId)
476 {
477 }
478
479 void OnCreate(Map* map) override
480 {
482 sWorldStateMgr->SetValue(WS_TEAM_IN_INSTANCE_HORDE, map->GetInstanceId() == TEAM_HORDE, false, map);
483 }
484};
485
487{
488 for (MapEntry const* mapEntry : sMapStore)
489 if (mapEntry->IsWorldMap() && mapEntry->IsSplitByFaction())
490 new SplitByFactionMapScript(Trinity::StringFormat("world_map_set_faction_worldstates_{}", mapEntry->ID).c_str(), mapEntry->ID);
491}
#define sBattlefieldMgr
DB2Storage< DifficultyEntry > sDifficultyStore("Difficulty.db2", &DifficultyLoadInfo::Instance)
DB2Storage< MapEntry > sMapStore("Map.db2", &MapLoadInfo::Instance)
#define sDB2Manager
Definition: DB2Stores.h:538
Difficulty
Definition: DBCEnums.h:873
@ DIFFICULTY_NONE
Definition: DBCEnums.h:874
std::shared_ptr< ResultSet > QueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
#define ABORT
Definition: Errors.h:74
#define ASSERT
Definition: Errors.h:68
#define sInstanceLockMgr
#define TC_LOG_DEBUG(filterType__,...)
Definition: Log.h:156
#define TC_LOG_ERROR(filterType__,...)
Definition: Log.h:165
#define sMapMgr
Definition: MapManager.h:184
#define sOutdoorPvPMgr
#define sScenarioMgr
Definition: ScenarioMgr.h:125
#define sScriptMgr
Definition: ScriptMgr.h:1418
TeamId
@ TEAM_ALLIANCE
@ TEAM_HORDE
@ WS_TEAM_IN_INSTANCE_ALLIANCE
@ WS_TEAM_IN_INSTANCE_HORDE
#define sWorldStateMgr
Definition: WorldStateMgr.h:50
void SetBG(Battleground *bg)
Definition: Map.h:915
void SetBgMap(BattlegroundMap *map)
Definition: Group.h:197
uint32 GetRecentInstanceId(uint32 mapId) const
Definition: Group.h:390
void SetRecentInstance(uint32 mapId, ObjectGuid instanceOwner, uint32 instanceId)
Definition: Group.h:396
ObjectGuid GetRecentInstanceOwner(uint32 mapId) const
Definition: Group.h:384
Difficulty GetDifficultyID(MapEntry const *mapEntry) const
Definition: Group.cpp:1358
void SetInstanceId(uint32 instanceId)
Difficulty GetDifficultyId() const
bool IsNew() const
uint32 GetInstanceId() const
void TrySetOwningGroup(Group *group)
Definition: Map.cpp:3026
InstanceLock const * GetInstanceLock() const
Definition: Map.h:875
void SetInstanceScenario(InstanceScenario *scenario)
Definition: Map.h:874
void CreateInstanceData()
Definition: Map.cpp:2987
void RegisterInstanceId(uint32 instanceId)
Definition: MapManager.cpp:427
std::unique_ptr< InstanceIds > _freeInstanceIds
Definition: MapManager.h:153
std::shared_mutex _mapsLock
Definition: MapManager.h:148
bool DestroyMap(Map *map)
Definition: MapManager.cpp:352
void Update(uint32 diff)
Definition: MapManager.cpp:317
uint32 FindInstanceIdForPlayer(uint32 mapId, Player const *player) const
Definition: MapManager.cpp:274
MapUpdater m_updater
Definition: MapManager.h:155
boost::dynamic_bitset< size_t > InstanceIds
Definition: MapManager.h:137
static MapManager * instance()
Definition: MapManager.cpp:63
uint32 i_gridCleanUpDelay
Definition: MapManager.h:149
Map * FindMap_i(uint32 mapId, uint32 instanceId) const
Definition: MapManager.cpp:69
GarrisonMap * CreateGarrison(uint32 mapId, uint32 instanceId, Player *owner)
Definition: MapManager.cpp:138
Map * FindMap(uint32 mapId, uint32 instanceId) const
Definition: MapManager.cpp:268
void InitializeVisibilityDistanceInfo()
Definition: MapManager.cpp:57
void UnloadAll()
Definition: MapManager.cpp:377
Map * CreateMap(uint32 mapId, Player *player)
Definition: MapManager.cpp:151
uint32 GetNumPlayersInInstances() const
Definition: MapManager.cpp:404
static bool IsValidMAP(uint32 mapId)
Definition: MapManager.cpp:372
uint32 _nextInstanceId
Definition: MapManager.h:154
InstanceMap * CreateInstance(uint32 mapId, uint32 instanceId, InstanceLock *instanceLock, Difficulty difficulty, TeamId team, Group *group)
Definition: MapManager.cpp:88
MapMapType i_maps
Definition: MapManager.h:150
void InitInstanceIds()
Definition: MapManager.cpp:410
Map * CreateWorldMap(uint32 mapId, uint32 instanceId)
Definition: MapManager.cpp:75
void AddSC_BuiltInScripts()
Definition: MapManager.cpp:486
BattlegroundMap * CreateBattleground(uint32 mapId, uint32 instanceId, Battleground *bg)
Definition: MapManager.cpp:122
uint32 GenerateInstanceId()
Definition: MapManager.cpp:438
IntervalTimer i_timer
Definition: MapManager.h:151
uint32 GetNumInstances() const
Definition: MapManager.cpp:398
void FreeInstanceId(uint32 instanceId)
Definition: MapManager.cpp:464
void Initialize()
Definition: MapManager.cpp:47
void schedule_update(Map &map, uint32 diff)
Definition: MapUpdater.cpp:80
void activate(size_t num_threads)
Definition: MapUpdater.cpp:48
void wait()
Definition: MapUpdater.cpp:70
bool activated()
Definition: MapUpdater.cpp:89
void deactivate()
Definition: MapUpdater.cpp:56
Definition: Map.h:189
bool IsDungeon() const
Definition: Map.cpp:3238
bool IsBattlegroundOrArena() const
Definition: Map.cpp:3340
void SetWeakPtr(Trinity::unique_weak_ptr< Map > weakRef)
Definition: Map.h:317
MapDifficultyEntry const * GetMapDifficulty() const
Definition: Map.cpp:3223
void UnloadAll()
Definition: Map.cpp:1684
bool HavePlayers() const
Definition: Map.h:357
void LoadRespawnTimes()
Definition: Map.cpp:3598
virtual void RemoveAllPlayers()
Definition: Map.cpp:1667
static void DeleteStateMachine()
Definition: Map.cpp:125
void LoadCorpseData()
Definition: Map.cpp:3658
uint32 GetId() const
Definition: Map.cpp:3228
InstanceMap * ToInstanceMap()
Definition: Map.h:454
void InitSpawnGroupState()
Definition: Map.cpp:2488
uint32 GetInstanceId() const
Definition: Map.h:314
static void InitStateMachine()
Definition: Map.cpp:117
void LoadAllCells()
Definition: Map.cpp:110
bool IsGarrison() const
Definition: Map.cpp:3350
LowType GetCounter() const
Definition: ObjectGuid.h:293
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
void SetRecentInstance(uint32 mapId, uint32 instanceId)
Definition: Player.h:2579
uint32 GetRecentInstanceId(uint32 mapId) const
Definition: Player.h:2573
TeamId GetTeamId() const
Definition: Player.h:2236
bool TeleportToBGEntryPoint()
Definition: Player.cpp:1496
Battleground * GetBattleground() const
Definition: Player.cpp:24976
uint32 GetBattlegroundId() const
Definition: Player.h:2396
Group * GetGroup(Optional< uint8 > partyIndex)
Definition: Player.h:2606
Difficulty GetDifficultyID(MapEntry const *mapEntry) const
Definition: Player.cpp:29636
SplitByFactionMapScript(char const *name, uint32 mapId)
Definition: MapManager.cpp:475
void OnCreate(Map *map) override
Definition: MapManager.cpp:479
static void StopNow(uint8 exitcode)
Definition: World.h:670
#define sWorld
Definition: World.h:931
@ CONFIG_INTERVAL_GRIDCLEAN
Definition: World.h:235
@ CONFIG_INTERVAL_MAPUPDATE
Definition: World.h:236
@ CONFIG_NUMTHREADS
Definition: World.h:358
@ CONFIG_INSTANCEMAP_LOAD_GRIDS
Definition: World.h:182
@ CONFIG_BASEMAP_LOAD_GRIDS
Definition: World.h:181
@ CONFIG_BATTLEGROUNDMAP_LOAD_GRIDS
Definition: World.h:199
@ ERROR_EXIT_CODE
Definition: World.h:75
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
Definition: StringFormat.h:38
constexpr std::size_t size()
Definition: UpdateField.h:796
STL namespace.
void SetInterval(time_t interval)
Definition: Timer.h:94
time_t GetCurrent() const
Definition: Timer.h:104
bool Passed()
Definition: Timer.h:78
void Update(time_t diff)
Definition: Timer.h:71
void SetCurrent(time_t current)
Definition: Timer.h:89
bool HasResetSchedule() const
bool IsSplitByFaction() const
bool IsBattlegroundOrArena() const
bool IsGarrison() const
bool IsDungeon() const