35#include <boost/dynamic_bitset.hpp>
39 : _freeInstanceIds(
std::make_unique<
InstanceIds>()), _nextInstanceId(0), _scheduledScripts(0)
59 for (
auto iter =
i_maps.begin(); iter !=
i_maps.end(); ++iter)
60 iter->second->InitVisibilityDistance();
71 auto itr =
i_maps.find({ mapId, instanceId });
72 return itr !=
i_maps.end() ? itr->second.get() :
nullptr;
94 TC_LOG_ERROR(
"maps",
"CreateInstance: no entry for map {}", mapId);
99 sDB2Manager.GetDownscaledMapDifficultyData(mapId, difficulty);
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()]);
124 TC_LOG_DEBUG(
"maps",
"MapInstanced::CreateBattleground: map bg {} for {} created.", instanceId, mapId);
160 std::unique_lock<std::shared_mutex> lock(
_mapsLock);
197 if (!entries.Map->IsFlexLocking())
203 if (!entries.MapDifficulty->HasResetSchedule())
210 instanceLock =
sInstanceLockMgr.CreateInstanceLockForNewInstance(instanceOwnerGuid, entries, newInstanceId);
254 if (ptr.
get() != map)
270 std::shared_lock<std::shared_mutex> lock(
_mapsLock);
292 else if (!entries.MapDifficulty->HasResetSchedule())
304 return newInstanceId;
323 MapMapType::iterator iter =
i_maps.begin();
324 while (iter !=
i_maps.end())
326 if (iter->second->CanUnload(diff))
329 iter =
i_maps.erase(iter);
346 for (iter =
i_maps.begin(); iter !=
i_maps.end(); ++iter)
374 return sMapStore.LookupEntry(mapId) !=
nullptr;
380 for (
auto iter =
i_maps.begin(); iter !=
i_maps.end(); ++iter)
382 iter->second->UnloadAll();
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(); });
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); });
414 uint64 maxExistingInstanceId = 0;
416 maxExistingInstanceId = std::max(maxExistingInstanceId, (*result)[0].GetUInt64());
419 maxExistingInstanceId = std::max(maxExistingInstanceId, (*result)[0].GetUInt64());
442 TC_LOG_ERROR(
"maps",
"Instance ID overflow!! Can't continue, shutting down server. ");
448 ASSERT(newInstanceId < _freeInstanceIds->
size());
453 if (nextFreedId == InstanceIds::npos)
461 return newInstanceId;
489 if (mapEntry->IsWorldMap() && mapEntry->IsSplitByFaction())
DB2Storage< DifficultyEntry > sDifficultyStore("Difficulty.db2", &DifficultyLoadInfo::Instance)
DB2Storage< MapEntry > sMapStore("Map.db2", &MapLoadInfo::Instance)
std::shared_ptr< ResultSet > QueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
#define TC_LOG_DEBUG(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
@ WS_TEAM_IN_INSTANCE_ALLIANCE
@ WS_TEAM_IN_INSTANCE_HORDE
void SetBG(Battleground *bg)
void SetBgMap(BattlegroundMap *map)
uint32 GetRecentInstanceId(uint32 mapId) const
void SetRecentInstance(uint32 mapId, ObjectGuid instanceOwner, uint32 instanceId)
ObjectGuid GetRecentInstanceOwner(uint32 mapId) const
Difficulty GetDifficultyID(MapEntry const *mapEntry) const
void SetInstanceId(uint32 instanceId)
Difficulty GetDifficultyId() const
uint32 GetInstanceId() const
void TrySetOwningGroup(Group *group)
InstanceLock const * GetInstanceLock() const
void SetInstanceScenario(InstanceScenario *scenario)
void CreateInstanceData()
void RegisterInstanceId(uint32 instanceId)
std::unique_ptr< InstanceIds > _freeInstanceIds
std::shared_mutex _mapsLock
bool DestroyMap(Map *map)
uint32 FindInstanceIdForPlayer(uint32 mapId, Player const *player) const
boost::dynamic_bitset< size_t > InstanceIds
static MapManager * instance()
uint32 i_gridCleanUpDelay
Map * FindMap_i(uint32 mapId, uint32 instanceId) const
GarrisonMap * CreateGarrison(uint32 mapId, uint32 instanceId, Player *owner)
Map * FindMap(uint32 mapId, uint32 instanceId) const
void InitializeVisibilityDistanceInfo()
Map * CreateMap(uint32 mapId, Player *player)
uint32 GetNumPlayersInInstances() const
static bool IsValidMAP(uint32 mapId)
InstanceMap * CreateInstance(uint32 mapId, uint32 instanceId, InstanceLock *instanceLock, Difficulty difficulty, TeamId team, Group *group)
Map * CreateWorldMap(uint32 mapId, uint32 instanceId)
void AddSC_BuiltInScripts()
BattlegroundMap * CreateBattleground(uint32 mapId, uint32 instanceId, Battleground *bg)
uint32 GenerateInstanceId()
uint32 GetNumInstances() const
void FreeInstanceId(uint32 instanceId)
void schedule_update(Map &map, uint32 diff)
void activate(size_t num_threads)
bool IsBattlegroundOrArena() const
void SetWeakPtr(Trinity::unique_weak_ptr< Map > weakRef)
MapDifficultyEntry const * GetMapDifficulty() const
virtual void RemoveAllPlayers()
static void DeleteStateMachine()
InstanceMap * ToInstanceMap()
void InitSpawnGroupState()
uint32 GetInstanceId() const
static void InitStateMachine()
LowType GetCounter() const
static ObjectGuid GetGUID(Object const *o)
void SetRecentInstance(uint32 mapId, uint32 instanceId)
uint32 GetRecentInstanceId(uint32 mapId) const
bool TeleportToBGEntryPoint()
Battleground * GetBattleground() const
uint32 GetBattlegroundId() const
Group * GetGroup(Optional< uint8 > partyIndex)
Difficulty GetDifficultyID(MapEntry const *mapEntry) const
SplitByFactionMapScript(char const *name, uint32 mapId)
void OnCreate(Map *map) override
static void StopNow(uint8 exitcode)
@ CONFIG_INTERVAL_GRIDCLEAN
@ CONFIG_INTERVAL_MAPUPDATE
@ CONFIG_INSTANCEMAP_LOAD_GRIDS
@ CONFIG_BASEMAP_LOAD_GRIDS
@ CONFIG_BATTLEGROUNDMAP_LOAD_GRIDS
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
constexpr std::size_t size()
void SetInterval(time_t interval)
time_t GetCurrent() const
void SetCurrent(time_t current)
bool HasResetSchedule() const
bool IsSplitByFaction() const
bool IsBattlegroundOrArena() const