38#include <boost/dynamic_bitset.hpp>
42 : _freeInstanceIds(
std::make_unique<
InstanceIds>()), _nextInstanceId(0), _scheduledScripts(0)
62 for (
auto iter =
i_maps.begin(); iter !=
i_maps.end(); ++iter)
63 iter->second->InitVisibilityDistance();
74 auto itr =
i_maps.find({ mapId, instanceId });
75 return itr !=
i_maps.
end() ? itr->second.get() :
nullptr;
98 TC_LOG_ERROR(
"maps",
"CreateInstance: no entry for map {}", mapId);
103 sDB2Manager.GetDownscaledMapDifficultyData(mapId, difficulty);
105 TC_LOG_DEBUG(
"maps",
"MapInstanced::CreateInstance: {}map instance {} for {} created with difficulty {}",
111 map->LoadRespawnTimes();
112 map->LoadCorpseData();
114 map->TrySetOwningGroup(group);
116 map->CreateInstanceData();
117 map->SetInstanceScenario(
sScenarioMgr->CreateInstanceScenarioForTeam(map, team));
118 map->InitSpawnGroupState();
128 TC_LOG_DEBUG(
"maps",
"MapInstanced::CreateBattleground: map bg {} for {} created.", instanceId, mapId);
203 if (!entries.Map->IsFlexLocking())
209 if (!entries.MapDifficulty->HasResetSchedule())
216 instanceLock =
sInstanceLockMgr.CreateInstanceLockForNewInstance(instanceOwnerGuid, entries, newInstanceId);
261 if (ptr.
get() != map)
277 std::shared_lock<std::shared_mutex> lock(
_mapsLock);
299 else if (!entries.MapDifficulty->HasResetSchedule())
311 return newInstanceId;
330 MapMapType::iterator iter =
i_maps.begin();
331 while (iter !=
i_maps.end())
336 iter =
i_maps.erase(iter);
353 for (iter =
i_maps.begin(); iter !=
i_maps.end(); ++iter)
381 return sMapStore.LookupEntry(mapId) !=
nullptr;
387 for (
auto iter =
i_maps.begin(); iter !=
i_maps.end(); ++iter)
389 iter->second->UnloadAll();
407 std::shared_lock<std::shared_mutex> lock(
_mapsLock);
408 return std::count_if(
i_maps.begin(),
i_maps.end(), [](MapMapType::value_type
const& value) { return value.second->IsDungeon(); });
413 std::shared_lock<std::shared_mutex> lock(
_mapsLock);
414 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().size() : 0); });
421 uint64 maxExistingInstanceId = 0;
423 maxExistingInstanceId = std::max(maxExistingInstanceId, (*result)[0].GetUInt64());
426 maxExistingInstanceId = std::max(maxExistingInstanceId, (*result)[0].GetUInt64());
449 TC_LOG_ERROR(
"maps",
"Instance ID overflow!! Can't continue, shutting down server. ");
455 ASSERT(newInstanceId < _freeInstanceIds->size());
460 if (nextFreedId == InstanceIds::npos)
468 return newInstanceId;
496 if (mapEntry->IsWorldMap() && mapEntry->IsSplitByFaction())
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__, message__,...)
#define TC_LOG_ERROR(filterType__, message__,...)
std::optional< T > Optional
Optional helper class to wrap optional values within.
constexpr TeamId GetTeamIdForTeam(Team team)
@ WS_TEAM_IN_INSTANCE_ALLIANCE
@ WS_TEAM_IN_INSTANCE_HORDE
ObjectGuid const & GetGUID() const
void SetBG(Battleground *bg)
BattlegroundScript * GetBattlegroundScript()
void SetBgMap(BattlegroundMap *map)
static std::string_view GetDifficultyName(Difficulty difficulty)
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
InstanceLock const * GetInstanceLock() const
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()
InstanceMap * CreateInstance(uint32 mapId, uint32 instanceId, InstanceLock *instanceLock, Difficulty difficulty, TeamId team, Group *group, Optional< uint32 > lfgDungeonsId)
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()
uint32 GetNumPlayersInInstances() const
Map * CreateMap(uint32 mapId, Player *player, Optional< uint32 > lfgDungeonsId={})
static bool IsValidMAP(uint32 mapId)
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
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
Specialized variant of std::shared_ptr that enforces unique ownership and/or std::unique_ptr with std...
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) noexcept
Default TC string format function.
TC_GAME_API void SetValue(int32 worldStateId, int32 value, bool hidden, Map *map)
void SetInterval(time_t interval)
time_t GetCurrent() const
void SetCurrent(time_t current)
bool HasResetSchedule() const
bool IsSplitByFaction() const
bool IsBattlegroundOrArena() const