AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
MapMgr Class Reference

#include "MapMgr.h"

Public Member Functions

MapCreateBaseMap (uint32 mapId)
 
MapFindBaseNonInstanceMap (uint32 mapId) const
 
MapCreateMap (uint32 mapId, Player *player)
 
MapFindMap (uint32 mapId, uint32 instanceId) const
 
MapFindBaseMap (uint32 mapId) const
 
uint32 GetAreaId (uint32 phaseMask, uint32 mapid, float x, float y, float z) const
 
uint32 GetAreaId (uint32 phaseMask, uint32 mapid, Position const &pos) const
 
uint32 GetAreaId (uint32 phaseMask, WorldLocation const &loc) const
 
uint32 GetZoneId (uint32 phaseMask, uint32 mapid, float x, float y, float z) const
 
uint32 GetZoneId (uint32 phaseMask, uint32 mapid, Position const &pos) const
 
uint32 GetZoneId (uint32 phaseMask, WorldLocation const &loc) const
 
void GetZoneAndAreaId (uint32 phaseMask, uint32 &zoneid, uint32 &areaid, uint32 mapid, float x, float y, float z)
 
void Initialize (void)
 
void Update (uint32)
 
void SetMapUpdateInterval (uint32 t)
 
void UnloadAll ()
 

Static Public Member Functions

static MapMgrinstance ()
 
static bool ExistMapAndVMap (uint32 mapid, float x, float y)
 
static bool IsValidMAP (uint32 mapid, bool startUp)
 
static bool IsValidMapCoord (uint32 mapid, Position const &pos)
 
static bool IsValidMapCoord (uint32 mapid, float x, float y)
 
static bool IsValidMapCoord (uint32 mapid, float x, float y, float z)
 
static bool IsValidMapCoord (uint32 mapid, float x, float y, float z, float o)
 
static bool IsValidMapCoord (WorldLocation const &loc)
 
static float NormalizeOrientation (float o)
 

GetInstanceIDs

Returns
vector of instance IDs
typedef std::unordered_map< uint32, Map * > MapMapType
 
typedef std::vector< bool > InstanceIds
 
std::mutex Lock
 
MapMapType i_maps
 
IntervalTimer i_timer [4]
 
uint8 mapUpdateStep
 
InstanceIds _instanceIds
 
uint32 _nextInstanceId
 
MapUpdater m_updater
 
std::vector< bool > GetInstanceIDs ()
 
void DoDelayedMovesAndRemoves ()
 
Map::EnterState PlayerCannotEnter (uint32 mapid, Player *player, bool loginCheck=false)
 
void InitializeVisibilityDistanceInfo ()
 
void GetNumInstances (uint32 &dungeons, uint32 &battlegrounds, uint32 &arenas)
 
void GetNumPlayersInInstances (uint32 &dungeons, uint32 &battlegrounds, uint32 &arenas, uint32 &spectators)
 
void InitInstanceIds ()
 
void RegisterInstanceId (uint32 instanceId)
 
uint32 GenerateInstanceId ()
 
MapUpdaterGetMapUpdater ()
 
template<typename Worker >
void DoForAllMaps (Worker &&worker)
 
template<typename Worker >
void DoForAllMapsWithMapId (uint32 mapId, Worker &&worker)
 
 MapMgr ()
 
 ~MapMgr ()
 
 MapMgr (MapMgr const &)
 
MapMgroperator= (MapMgr const &)
 

Detailed Description

Member Typedef Documentation

◆ InstanceIds

typedef std::vector<bool> MapMgr::InstanceIds
private

◆ MapMapType

typedef std::unordered_map<uint32, Map*> MapMgr::MapMapType
private

Constructor & Destructor Documentation

◆ MapMgr() [1/2]

MapMgr::MapMgr ( )
private
40{
42 mapUpdateStep = 0;
44}
@ CONFIG_INTERVAL_MAPUPDATE
Definition WorldConfig.h:170
IntervalTimer i_timer[4]
Definition MapMgr.h:173
uint8 mapUpdateStep
Definition MapMgr.h:174
uint32 _nextInstanceId
Definition MapMgr.h:177
#define sWorld
Definition World.h:318
void SetInterval(time_t interval)
Definition Timer.h:179

References _nextInstanceId, CONFIG_INTERVAL_MAPUPDATE, i_timer, mapUpdateStep, IntervalTimer::SetInterval(), and sWorld.

◆ ~MapMgr()

MapMgr::~MapMgr ( )
private
47{
48}

◆ MapMgr() [2/2]

MapMgr::MapMgr ( MapMgr const &  )
private

Member Function Documentation

◆ CreateBaseMap()

Map * MapMgr::CreateBaseMap ( uint32  mapId)
72{
73 Map* map = FindBaseMap(id);
74
75 if (!map)
76 {
77 std::lock_guard<std::mutex> guard(Lock);
78
79 map = FindBaseMap(id);
80 if (!map) // pussywizard: check again after acquiring mutex
81 {
82 MapEntry const* entry = sMapStore.LookupEntry(id);
83 ASSERT(entry);
84
85 if (entry->Instanceable())
86 map = new MapInstanced(id);
87 else
88 map = new Map(id, 0, REGULAR_DIFFICULTY);
89
90 i_maps[id] = map;
91
92 if (!entry->Instanceable())
93 {
94 map->LoadRespawnTimes();
95 map->LoadCorpseData();
96 }
97
98 map->OnCreateMap();
99 }
100 }
101
102 ASSERT(map);
103 return map;
104}
@ REGULAR_DIFFICULTY
Definition DBCEnums.h:267
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
#define ASSERT
Definition Errors.h:68
Definition MapInstanced.h:26
Map * FindBaseMap(uint32 mapId) const
Definition MapMgr.h:44
std::mutex Lock
Definition MapMgr.h:171
MapMapType i_maps
Definition MapMgr.h:172
Definition Map.h:168
void OnCreateMap()
Definition Map.cpp:89
void LoadRespawnTimes()
Definition Map.cpp:2539
void LoadCorpseData()
Definition Map.cpp:3504
Definition DBCStructure.h:1325
bool Instanceable() const
Definition DBCStructure.h:1353

References ASSERT, FindBaseMap(), i_maps, MapEntry::Instanceable(), Map::LoadCorpseData(), Map::LoadRespawnTimes(), Lock, Map::OnCreateMap(), REGULAR_DIFFICULTY, and sMapStore.

Referenced by CreateMap(), GetAreaId(), GetZoneAndAreaId(), and GetZoneId().

◆ CreateMap()

Map * MapMgr::CreateMap ( uint32  mapId,
Player player 
)
115{
116 Map* m = CreateBaseMap(id);
117
118 if (m && m->Instanceable())
119 m = ((MapInstanced*)m)->CreateInstanceForPlayer(id, player);
120
121 return m;
122}
Map * CreateBaseMap(uint32 mapId)
Definition MapMgr.cpp:71
bool Instanceable() const
Definition Map.h:298

References CreateBaseMap(), and Map::Instanceable().

◆ DoDelayedMovesAndRemoves()

void MapMgr::DoDelayedMovesAndRemoves ( )
303{
304}

◆ DoForAllMaps()

template<typename Worker >
void MapMgr::DoForAllMaps ( Worker &&  worker)
183{
184 std::lock_guard<std::mutex> guard(Lock);
185
186 for (auto& mapPair : i_maps)
187 {
188 Map* map = mapPair.second;
189 if (MapInstanced* mapInstanced = map->ToMapInstanced())
190 {
191 MapInstanced::InstancedMaps& instances = mapInstanced->GetInstancedMaps();
192 for (auto& instancePair : instances)
193 worker(instancePair.second);
194 }
195 else
196 worker(map);
197 }
198}
std::unordered_map< uint32, Map * > InstancedMaps
Definition MapInstanced.h:29
MapInstanced * ToMapInstanced()
Definition Map.h:387

References i_maps, Lock, and Map::ToMapInstanced().

◆ DoForAllMapsWithMapId()

template<typename Worker >
void MapMgr::DoForAllMapsWithMapId ( uint32  mapId,
Worker &&  worker 
)
inline
202{
203 std::lock_guard<std::mutex> guard(Lock);
204
205 auto itr = i_maps.find(mapId);
206 if (itr != i_maps.end())
207 {
208 Map* map = itr->second;
209 if (MapInstanced* mapInstanced = map->ToMapInstanced())
210 {
211 MapInstanced::InstancedMaps& instances = mapInstanced->GetInstancedMaps();
212 for (auto& p : instances)
213 worker(p.second);
214 }
215 else
216 worker(map);
217 }
218}

References i_maps, Lock, and Map::ToMapInstanced().

◆ ExistMapAndVMap()

bool MapMgr::ExistMapAndVMap ( uint32  mapid,
float  x,
float  y 
)
static
307{
310}
static bool ExistVMap(uint32 mapid, int gx, int gy)
Definition GridTerrainLoader.cpp:121
static bool ExistMap(uint32 mapid, int gx, int gy)
Definition GridTerrainLoader.cpp:94
GridCoord ComputeGridCoord(float x, float y)
Definition GridDefines.h:185
Definition GridDefines.h:88
uint32 x_coord
Definition GridDefines.h:155
uint32 y_coord
Definition GridDefines.h:156

References Acore::ComputeGridCoord(), GridTerrainLoader::ExistMap(), GridTerrainLoader::ExistVMap(), CoordPair< LIMIT >::x_coord, and CoordPair< LIMIT >::y_coord.

Referenced by World::SetInitialWorldSettings().

◆ FindBaseMap()

Map * MapMgr::FindBaseMap ( uint32  mapId) const
inline
45 {
46 MapMapType::const_iterator iter = i_maps.find(mapId);
47 return (iter == i_maps.end() ? nullptr : iter->second);
48 }

References i_maps.

Referenced by CreateBaseMap(), FindBaseNonInstanceMap(), and FindMap().

◆ FindBaseNonInstanceMap()

Map * MapMgr::FindBaseNonInstanceMap ( uint32  mapId) const
107{
108 Map* map = FindBaseMap(mapId);
109 if (map && map->Instanceable())
110 return nullptr;
111 return map;
112}

References FindBaseMap(), and Map::Instanceable().

◆ FindMap()

Map * MapMgr::FindMap ( uint32  mapId,
uint32  instanceId 
) const
125{
126 Map* map = FindBaseMap(mapid);
127 if (!map)
128 return nullptr;
129
130 if (!map->Instanceable())
131 return instanceId == 0 ? map : nullptr;
132
133 return ((MapInstanced*)map)->FindInstanceMap(instanceId);
134}

References FindBaseMap(), and Map::Instanceable().

Referenced by PlayerCannotEnter().

◆ GenerateInstanceId()

uint32 MapMgr::GenerateInstanceId ( )
408{
409 if (sToCloud9Sidecar->ClusterModeEnabled())
410 return sToCloud9Sidecar->GenerateInstanceGuid();
411
412 uint32 newInstanceId = _nextInstanceId;
413
414 // find the lowest available id starting from the current _nextInstanceId
415 while (_nextInstanceId < 0xFFFFFFFF && ++_nextInstanceId < _instanceIds.size() && _instanceIds[_nextInstanceId]);
416
417 if (_nextInstanceId == 0xFFFFFFFF)
418 {
419 LOG_ERROR("server.worldserver", "Instance ID overflow!! Can't continue, shutting down server. ");
421 }
422
423 return newInstanceId;
424}
std::uint32_t uint32
Definition Define.h:107
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
#define sToCloud9Sidecar
Definition TC9Sidecar.h:76
InstanceIds _instanceIds
Definition MapMgr.h:176
static void StopNow(uint8 exitcode)
Definition World.h:188
@ ERROR_EXIT_CODE
Definition World.h:54

References _instanceIds, _nextInstanceId, ERROR_EXIT_CODE, LOG_ERROR, sToCloud9Sidecar, and World::StopNow().

◆ GetAreaId() [1/3]

uint32 MapMgr::GetAreaId ( uint32  phaseMask,
uint32  mapid,
float  x,
float  y,
float  z 
) const
inline
51 {
52 Map const* m = const_cast<MapMgr*>(this)->CreateBaseMap(mapid);
53 return m->GetAreaId(phaseMask, x, y, z);
54 }
Definition MapMgr.h:35
uint32 GetAreaId(uint32 phaseMask, float x, float y, float z) const
Definition Map.cpp:1260

References CreateBaseMap(), and Map::GetAreaId().

◆ GetAreaId() [2/3]

uint32 MapMgr::GetAreaId ( uint32  phaseMask,
uint32  mapid,
Position const &  pos 
) const
inline
55{ return GetAreaId(phaseMask, mapid, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); }
uint32 GetAreaId(uint32 phaseMask, uint32 mapid, float x, float y, float z) const
Definition MapMgr.h:50

References GetAreaId(), Position::GetPositionX(), Position::GetPositionY(), and Position::GetPositionZ().

Referenced by GetAreaId().

◆ GetAreaId() [3/3]

uint32 MapMgr::GetAreaId ( uint32  phaseMask,
WorldLocation const &  loc 
) const
inline
56{ return GetAreaId(phaseMask, loc.GetMapId(), loc); }

References GetAreaId(), and WorldLocation::GetMapId().

Referenced by GetAreaId().

◆ GetInstanceIDs()

std::vector< bool > MapMgr::GetInstanceIDs ( )
inline
135 {
136 return _instanceIds;
137 }

References _instanceIds.

◆ GetMapUpdater()

MapUpdater * MapMgr::GetMapUpdater ( )
inline
153{ return &m_updater; }
MapUpdater m_updater
Definition MapMgr.h:178

References m_updater.

◆ GetNumInstances()

void MapMgr::GetNumInstances ( uint32 dungeons,
uint32 battlegrounds,
uint32 arenas 
)
342{
343 for (MapMapType::iterator itr = i_maps.begin(); itr != i_maps.end(); ++itr)
344 {
345 Map* map = itr->second;
346 if (!map->Instanceable())
347 continue;
348 MapInstanced::InstancedMaps& maps = ((MapInstanced*)map)->GetInstancedMaps();
349 for (MapInstanced::InstancedMaps::iterator mitr = maps.begin(); mitr != maps.end(); ++mitr)
350 {
351 if (mitr->second->IsDungeon()) dungeons++;
352 else if (mitr->second->IsBattleground()) battlegrounds++;
353 else if (mitr->second->IsBattleArena()) arenas++;
354 }
355 }
356}

References i_maps, and Map::Instanceable().

◆ GetNumPlayersInInstances()

void MapMgr::GetNumPlayersInInstances ( uint32 dungeons,
uint32 battlegrounds,
uint32 arenas,
uint32 spectators 
)
359{
360 for (MapMapType::iterator itr = i_maps.begin(); itr != i_maps.end(); ++itr)
361 {
362 Map* map = itr->second;
363 if (!map->Instanceable())
364 continue;
365 MapInstanced::InstancedMaps& maps = ((MapInstanced*)map)->GetInstancedMaps();
366 for (MapInstanced::InstancedMaps::iterator mitr = maps.begin(); mitr != maps.end(); ++mitr)
367 {
368 if (mitr->second->IsDungeon()) dungeons += ((InstanceMap*)mitr->second)->GetPlayers().getSize();
369 else if (mitr->second->IsBattleground()) battlegrounds += ((InstanceMap*)mitr->second)->GetPlayers().getSize();
370 else if (mitr->second->IsBattleArena())
371 {
372 uint32 spect = 0;
373 if (BattlegroundMap* bgmap = mitr->second->ToBattlegroundMap())
374 if (Battleground* bg = bgmap->GetBG())
375 spect = bg->GetSpectators().size();
376
377 arenas += ((InstanceMap*)mitr->second)->GetPlayers().getSize() - spect;
378 spectators += spect;
379 }
380 }
381 }
382}
Definition Map.h:758
Definition Battleground.h:303
Definition Map.h:724
BattlegroundMap * ToBattlegroundMap()
Definition Map.h:393
HashMapHolder< Player >::MapType const & GetPlayers()
Definition ObjectAccessor.cpp:99

References i_maps, Map::Instanceable(), and Map::ToBattlegroundMap().

◆ GetZoneAndAreaId()

void MapMgr::GetZoneAndAreaId ( uint32  phaseMask,
uint32 zoneid,
uint32 areaid,
uint32  mapid,
float  x,
float  y,
float  z 
)
inline
67 {
68 Map const* m = const_cast<MapMgr*>(this)->CreateBaseMap(mapid);
69 m->GetZoneAndAreaId(phaseMask, zoneid, areaid, x, y, z);
70 }
void GetZoneAndAreaId(uint32 phaseMask, uint32 &zoneid, uint32 &areaid, float x, float y, float z) const
Definition Map.cpp:1306

References CreateBaseMap(), and Map::GetZoneAndAreaId().

◆ GetZoneId() [1/3]

uint32 MapMgr::GetZoneId ( uint32  phaseMask,
uint32  mapid,
float  x,
float  y,
float  z 
) const
inline
59 {
60 Map const* m = const_cast<MapMgr*>(this)->CreateBaseMap(mapid);
61 return m->GetZoneId(phaseMask, x, y, z);
62 }
uint32 GetZoneId(uint32 phaseMask, float x, float y, float z) const
Definition Map.cpp:1296

References CreateBaseMap(), and Map::GetZoneId().

◆ GetZoneId() [2/3]

uint32 MapMgr::GetZoneId ( uint32  phaseMask,
uint32  mapid,
Position const &  pos 
) const
inline
63{ return GetZoneId(phaseMask, mapid, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); }
uint32 GetZoneId(uint32 phaseMask, uint32 mapid, float x, float y, float z) const
Definition MapMgr.h:58

References Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and GetZoneId().

Referenced by GetZoneId().

◆ GetZoneId() [3/3]

uint32 MapMgr::GetZoneId ( uint32  phaseMask,
WorldLocation const &  loc 
) const
inline
64{ return GetZoneId(phaseMask, loc.GetMapId(), loc); }

References WorldLocation::GetMapId(), and GetZoneId().

Referenced by GetZoneId().

◆ Initialize()

void MapMgr::Initialize ( void  )
57{
58 int num_threads(sWorld->getIntConfig(CONFIG_NUMTHREADS));
59
60 // Start mtmaps if needed
61 if (num_threads > 0)
62 m_updater.activate(num_threads);
63}
@ CONFIG_NUMTHREADS
Definition WorldConfig.h:310
void activate(std::size_t num_threads)
Definition MapUpdater.cpp:97

References MapUpdater::activate(), CONFIG_NUMTHREADS, m_updater, and sWorld.

◆ InitializeVisibilityDistanceInfo()

void MapMgr::InitializeVisibilityDistanceInfo ( )
66{
67 for (MapMapType::iterator iter = i_maps.begin(); iter != i_maps.end(); ++iter)
68 (*iter).second->InitVisibilityDistance();
69}

References i_maps.

◆ InitInstanceIds()

void MapMgr::InitInstanceIds ( )
385{
386 _nextInstanceId = 1;
387
388 QueryResult result = CharacterDatabase.Query("SELECT MAX(id) FROM instance");
389 if (result)
390 {
391 uint32 maxId = (*result)[0].Get<uint32>();
392 _instanceIds.resize(maxId + 1);
393 }
394}
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21

References _instanceIds, _nextInstanceId, and CharacterDatabase.

◆ instance()

MapMgr * MapMgr::instance ( )
static
51{
52 static MapMgr instance;
53 return &instance;
54}
static MapMgr * instance()
Definition MapMgr.cpp:50

References instance().

Referenced by instance(), and PlayerCannotEnter().

◆ IsValidMAP()

bool MapMgr::IsValidMAP ( uint32  mapid,
bool  startUp 
)
static
Todo:
: add check for battleground template
313{
314 MapEntry const* mEntry = sMapStore.LookupEntry(mapid);
315
316 if (startUp)
317 {
318 return mEntry != nullptr;
319 }
320 else
321 {
322 return mEntry && (!mEntry->IsDungeon() || sObjectMgr->GetInstanceTemplate(mapid));
323 }
324
326}
#define sObjectMgr
Definition ObjectMgr.h:1730
bool IsDungeon() const
Definition DBCStructure.h:1351

References MapEntry::IsDungeon(), sMapStore, and sObjectMgr.

Referenced by IsValidMapCoord(), IsValidMapCoord(), IsValidMapCoord(), and ObjectMgr::LoadInstanceTemplate().

◆ IsValidMapCoord() [1/5]

static bool MapMgr::IsValidMapCoord ( uint32  mapid,
float  x,
float  y 
)
inlinestatic
96 {
97 return IsValidMAP(mapid, false) && Acore::IsValidMapCoord(x, y);
98 }
static bool IsValidMAP(uint32 mapid, bool startUp)
Definition MapMgr.cpp:312
bool IsValidMapCoord(float c)
Definition GridDefines.h:210

References IsValidMAP(), and Acore::IsValidMapCoord().

◆ IsValidMapCoord() [2/5]

static bool MapMgr::IsValidMapCoord ( uint32  mapid,
float  x,
float  y,
float  z 
)
inlinestatic
101 {
102 return IsValidMAP(mapid, false) && Acore::IsValidMapCoord(x, y, z);
103 }

References IsValidMAP(), and Acore::IsValidMapCoord().

◆ IsValidMapCoord() [3/5]

static bool MapMgr::IsValidMapCoord ( uint32  mapid,
float  x,
float  y,
float  z,
float  o 
)
inlinestatic
106 {
107 return IsValidMAP(mapid, false) && Acore::IsValidMapCoord(x, y, z, o);
108 }

References IsValidMAP(), and Acore::IsValidMapCoord().

◆ IsValidMapCoord() [4/5]

◆ IsValidMapCoord() [5/5]

static bool MapMgr::IsValidMapCoord ( WorldLocation const &  loc)
inlinestatic
111 {
112 return IsValidMapCoord(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation());
113 }

References WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and IsValidMapCoord().

◆ NormalizeOrientation()

static float MapMgr::NormalizeOrientation ( float  o)
inlinestatic
117 {
118 // fmod only supports positive numbers. Thus we have
119 // to emulate negative numbers
120 if (o < 0)
121 {
122 float mod = o * -1;
123 mod = std::fmod(mod, 2.0f * static_cast<float>(M_PI));
124 mod = -mod + 2.0f * static_cast<float>(M_PI);
125 return mod;
126 }
127 return std::fmod(o, 2.0f * static_cast<float>(M_PI));
128 }

◆ operator=()

MapMgr & MapMgr::operator= ( MapMgr const &  )
private

◆ PlayerCannotEnter()

Map::EnterState MapMgr::PlayerCannotEnter ( uint32  mapid,
Player player,
bool  loginCheck = false 
)
Todo:
: this is not a good place to send the message
137{
138 MapEntry const* entry = sMapStore.LookupEntry(mapid);
139 if (!entry)
141
142 if (!entry->IsDungeon())
143 return Map::CAN_ENTER;
144
145 InstanceTemplate const* instance = sObjectMgr->GetInstanceTemplate(mapid);
146 if (!instance)
148
149 Difficulty targetDifficulty, requestedDifficulty;
150 targetDifficulty = requestedDifficulty = player->GetDifficulty(entry->IsRaid());
151 // Get the highest available difficulty if current setting is higher than the instance allows
152 MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(entry->MapID, targetDifficulty);
153 if (!mapDiff)
154 {
155 player->SendTransferAborted(mapid, TRANSFER_ABORT_DIFFICULTY, requestedDifficulty);
157 }
158
159 //Bypass checks for GMs
160 if (player->IsGameMaster())
161 return Map::CAN_ENTER;
162
163 char const* mapName = entry->name[player->GetSession()->GetSessionDbcLocale()];
164
165 if (!sScriptMgr->OnPlayerCanEnterMap(player, entry, instance, mapDiff, loginCheck))
167
168 Group* group = player->GetGroup();
169 if (entry->IsRaid())
170 {
171 // can only enter in a raid group
172 if ((!group || !group->isRaidGroup()) && !sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_RAID))
173 {
174 // probably there must be special opcode, because client has this string constant in GlobalStrings.lua
177 LOG_DEBUG("maps", "MAP: Player '{}' must be in a raid group to enter instance '{}'", player->GetName(), mapName);
179 }
180 }
181
182 // xinef: dont allow LFG Group to enter other instance that is selected
183 if (group)
184 if (group->isLFGGroup())
185 if (!sLFGMgr->inLfgDungeonMap(group->GetGUID(), mapid, targetDifficulty))
186 {
189 }
190
191 if (!player->IsAlive())
192 {
193 if (player->HasCorpse())
194 {
195 // let enter in ghost mode in instance that connected to inner instance with corpse
196 uint32 corpseMap = player->GetCorpseLocation().GetMapId();
197 do
198 {
199 if (corpseMap == mapid)
200 break;
201
202 InstanceTemplate const* corpseInstance = sObjectMgr->GetInstanceTemplate(corpseMap);
203 corpseMap = corpseInstance ? corpseInstance->Parent : 0;
204 } while (corpseMap);
205
206 if (!corpseMap)
207 {
209 player->SendDirectMessage(&data);
210 LOG_DEBUG("maps", "MAP: Player '{}' does not have a corpse in instance '{}' and cannot enter.", player->GetName(), mapName);
212 }
213 LOG_DEBUG("maps", "MAP: Player '{}' has corpse in instance '{}' and can enter.", player->GetName(), mapName);
214 }
215 else
216 {
217 LOG_DEBUG("maps", "Map::PlayerCannotEnter - player '{}' is dead but does not have a corpse!", player->GetName());
219 }
220 }
221
222 // if map exists - check for being full, etc.
223 if (!loginCheck) // for login this is done by the calling function
224 {
225 uint32 destInstId = sInstanceSaveMgr->PlayerGetDestinationInstanceId(player, mapid, targetDifficulty);
226 if (destInstId)
227 if (Map* boundMap = FindMap(mapid, destInstId))
228 if (Map::EnterState denyReason = boundMap->CannotEnter(player, loginCheck))
229 return denyReason;
230 }
231
232 // players are only allowed to enter 5 instances per hour
233 if (entry->IsNonRaidDungeon() && (!group || !group->isLFGGroup() || !group->IsLfgRandomInstance()))
234 {
235 uint32 instaceIdToCheck = 0;
236 if (InstanceSave* save = sInstanceSaveMgr->PlayerGetInstanceSave(player->GetGUID(), mapid, player->GetDifficulty(entry->IsRaid())))
237 instaceIdToCheck = save->GetInstanceId();
238
239 // instaceIdToCheck can be 0 if save not found - means no bind so the instance is new
240 if (!player->CheckInstanceCount(instaceIdToCheck))
241 {
244 }
245 }
246
247 //Other requirements
248 return player->Satisfy(sObjectMgr->GetAccessRequirement(mapid, targetDifficulty), mapid, true) ? Map::CAN_ENTER : Map::CANNOT_ENTER_UNSPECIFIED_REASON;
249}
Difficulty
Definition DBCEnums.h:266
MapDifficulty const * GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty)
Definition DBCStores.cpp:767
#define sInstanceSaveMgr
Definition InstanceSaveMgr.h:233
#define sLFGMgr
Definition LFGMgr.h:665
@ LANG_INSTANCE_RAID_GROUP_ONLY
Definition Language.h:1068
#define LOG_DEBUG(filterType__,...)
Definition Log.h:157
@ TRANSFER_ABORT_TOO_MANY_INSTANCES
Definition Player.h:774
@ TRANSFER_ABORT_DIFFICULTY
Definition Player.h:777
@ TRANSFER_ABORT_MAP_NOT_ALLOWED
Definition Player.h:785
#define sScriptMgr
Definition ScriptMgr.h:743
@ CONFIG_INSTANCE_IGNORE_RAID
Definition WorldConfig.h:41
Definition Group.h:177
bool isLFGGroup(bool restricted=false) const
Definition Group.cpp:2471
bool IsLfgRandomInstance() const
Definition Group.h:327
ObjectGuid GetGUID() const
Definition Group.cpp:2512
bool isRaidGroup() const
Definition Group.cpp:2477
Definition InstanceSaveMgr.h:57
Map * FindMap(uint32 mapId, uint32 instanceId) const
Definition MapMgr.cpp:124
EnterState
Definition Map.h:274
@ CANNOT_ENTER_CORPSE_IN_DIFFERENT_INSTANCE
Definition Map.h:281
@ CANNOT_ENTER_TOO_MANY_INSTANCES
Definition Map.h:283
@ CAN_ENTER
Definition Map.h:275
@ CANNOT_ENTER_UNSPECIFIED_REASON
Definition Map.h:286
@ CANNOT_ENTER_NO_ENTRY
Definition Map.h:277
@ CANNOT_ENTER_DIFFICULTY_UNAVAILABLE
Definition Map.h:279
@ CANNOT_ENTER_UNINSTANCED_DUNGEON
Definition Map.h:278
@ CANNOT_ENTER_NOT_IN_RAID
Definition Map.h:280
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5852
Difficulty GetDifficulty(bool isRaid) const
Definition Player.h:1947
bool HasCorpse() const
Definition Player.h:2069
bool CheckInstanceCount(uint32 instanceId) const
Definition PlayerStorage.cpp:7127
WorldSession * GetSession() const
Definition Player.h:2030
WorldLocation GetCorpseLocation() const
Definition Player.h:2070
Group * GetGroup()
Definition Player.h:2516
bool IsGameMaster() const
Definition Player.h:1178
bool Satisfy(DungeonProgressionRequirements const *ar, uint32 target_map, bool report=false)
Definition PlayerStorage.cpp:6852
void SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg=0)
Definition Player.cpp:11943
bool IsAlive() const
Definition Unit.h:1793
uint32 GetMapId() const
Definition Position.h:281
std::string const & GetName() const
Definition Object.h:529
Definition WorldPacket.h:26
void SendAreaTriggerMessage(std::string_view str)
Definition WorldSession.cpp:283
LocaleConstant GetSessionDbcLocale() const
Definition WorldSession.h:622
@ SMSG_CORPSE_NOT_IN_INSTANCE
Definition Opcodes.h:1316
Definition Map.h:126
uint32 Parent
Definition Map.h:127
Definition DBCStructure.h:2222
bool IsNonRaidDungeon() const
Definition DBCStructure.h:1352
uint32 MapID
Definition DBCStructure.h:1326
char const * name[16]
Definition DBCStructure.h:1331
bool IsRaid() const
Definition DBCStructure.h:1354

References Map::CAN_ENTER, Map::CANNOT_ENTER_CORPSE_IN_DIFFERENT_INSTANCE, Map::CANNOT_ENTER_DIFFICULTY_UNAVAILABLE, Map::CANNOT_ENTER_NO_ENTRY, Map::CANNOT_ENTER_NOT_IN_RAID, Map::CANNOT_ENTER_TOO_MANY_INSTANCES, Map::CANNOT_ENTER_UNINSTANCED_DUNGEON, Map::CANNOT_ENTER_UNSPECIFIED_REASON, Player::CheckInstanceCount(), CONFIG_INSTANCE_IGNORE_RAID, FindMap(), Player::GetCorpseLocation(), Player::GetDifficulty(), GetDownscaledMapDifficultyData(), Player::GetGroup(), Group::GetGUID(), Object::GetGUID(), WorldLocation::GetMapId(), WorldObject::GetName(), Player::GetSession(), WorldSession::GetSessionDbcLocale(), Player::HasCorpse(), instance(), Unit::IsAlive(), MapEntry::IsDungeon(), Player::IsGameMaster(), Group::isLFGGroup(), Group::IsLfgRandomInstance(), MapEntry::IsNonRaidDungeon(), MapEntry::IsRaid(), Group::isRaidGroup(), LANG_INSTANCE_RAID_GROUP_ONLY, LOG_DEBUG, MapEntry::MapID, MapEntry::name, InstanceTemplate::Parent, Player::Satisfy(), WorldSession::SendAreaTriggerMessage(), Player::SendDirectMessage(), Player::SendTransferAborted(), sInstanceSaveMgr, sLFGMgr, sMapStore, SMSG_CORPSE_NOT_IN_INSTANCE, sObjectMgr, sScriptMgr, sWorld, TRANSFER_ABORT_DIFFICULTY, TRANSFER_ABORT_MAP_NOT_ALLOWED, and TRANSFER_ABORT_TOO_MANY_INSTANCES.

◆ RegisterInstanceId()

void MapMgr::RegisterInstanceId ( uint32  instanceId)
397{
398 // Allocation was done in InitInstanceIds()
399 _instanceIds[instanceId] = true;
400
401 // Instances are pulled in ascending order from db and _nextInstanceId is initialized with 1,
402 // so if the instance id is used, increment
403 if (_nextInstanceId == instanceId)
405}

References _instanceIds, and _nextInstanceId.

◆ SetMapUpdateInterval()

void MapMgr::SetMapUpdateInterval ( uint32  t)
inline
76 {
79
80 i_timer[3].SetInterval(t);
81 i_timer[3].Reset();
82 }
#define MIN_MAP_UPDATE_DELAY
Definition GridDefines.h:40
void Reset()
Definition Timer.h:166

References i_timer, MIN_MAP_UPDATE_DELAY, IntervalTimer::Reset(), and IntervalTimer::SetInterval().

◆ UnloadAll()

void MapMgr::UnloadAll ( )
329{
330 for (MapMapType::iterator iter = i_maps.begin(); iter != i_maps.end();)
331 {
332 iter->second->UnloadAll();
333 delete iter->second;
334 i_maps.erase(iter++);
335 }
336
337 if (m_updater.activated())
339}
bool activated()
Definition MapUpdater.cpp:156
void deactivate()
Definition MapUpdater.cpp:106

References MapUpdater::activated(), MapUpdater::deactivate(), i_maps, and m_updater.

◆ Update()

void MapMgr::Update ( uint32  diff)
252{
253 for (uint8 i = 0; i < 4; ++i)
254 i_timer[i].Update(diff);
255
256 // pussywizard: lfg compatibles update, schedule before maps so it is processed from the very beginning
257 //if (mapUpdateStep == 0)
258 {
259 if (m_updater.activated())
260 {
262 }
263 else
264 {
265 sLFGMgr->Update(diff, 1);
266 }
267 }
268
269 MapMapType::iterator iter = i_maps.begin();
270 for (; iter != i_maps.end(); ++iter)
271 {
272 bool full = mapUpdateStep < 3 && ((mapUpdateStep == 0 && !iter->second->IsBattlegroundOrArena() && !iter->second->IsDungeon()) || (mapUpdateStep == 1 && iter->second->IsBattlegroundOrArena()) || (mapUpdateStep == 2 && iter->second->IsDungeon()));
273 if (m_updater.activated())
274 m_updater.schedule_update(*iter->second, uint32(full ? i_timer[mapUpdateStep].GetCurrent() : 0), diff);
275 else
276 iter->second->Update(uint32(full ? i_timer[mapUpdateStep].GetCurrent() : 0), diff);
277 }
278
279 if (m_updater.activated())
280 m_updater.wait();
281
282 if (mapUpdateStep < 3)
283 {
284 for (iter = i_maps.begin(); iter != i_maps.end(); ++iter)
285 {
286 bool full = ((mapUpdateStep == 0 && !iter->second->IsBattlegroundOrArena() && !iter->second->IsDungeon()) || (mapUpdateStep == 1 && iter->second->IsBattlegroundOrArena()) || (mapUpdateStep == 2 && iter->second->IsDungeon()));
287 if (full)
288 iter->second->DelayedUpdate(uint32(i_timer[mapUpdateStep].GetCurrent()));
289 }
290
293 }
294
295 if (mapUpdateStep == 3 && i_timer[3].Passed())
296 {
297 mapUpdateStep = 0;
298 i_timer[3].SetCurrent(0);
299 }
300}
std::uint8_t uint8
Definition Define.h:109
void Update(uint32)
Definition MapMgr.cpp:251
void schedule_lfg_update(uint32 diff)
Definition MapUpdater.cpp:151
void wait()
Definition MapUpdater.cpp:124
void schedule_update(Map &map, uint32 diff, uint32 s_diff)
Definition MapUpdater.cpp:141
void SetCurrent(time_t current)
Definition Timer.h:174

References MapUpdater::activated(), i_maps, i_timer, m_updater, mapUpdateStep, MapUpdater::schedule_lfg_update(), MapUpdater::schedule_update(), IntervalTimer::SetCurrent(), sLFGMgr, Update(), and MapUpdater::wait().

Referenced by Update().

Member Data Documentation

◆ _instanceIds

InstanceIds MapMgr::_instanceIds
private

◆ _nextInstanceId

uint32 MapMgr::_nextInstanceId
private

◆ i_maps

◆ i_timer

IntervalTimer MapMgr::i_timer[4]
private

◆ Lock

std::mutex MapMgr::Lock
private

◆ m_updater

MapUpdater MapMgr::m_updater
private

◆ mapUpdateStep

uint8 MapMgr::mapUpdateStep
private

Referenced by MapMgr(), and Update().


The documentation for this class was generated from the following files: