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 (const MapMgr &)
 
MapMgroperator= (const MapMgr &)
 

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
39{
41 mapUpdateStep = 0;
43}
@ CONFIG_INTERVAL_MAPUPDATE
Definition IWorld.h:210
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:363
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
46{
47}

◆ MapMgr() [2/2]

MapMgr::MapMgr ( const MapMgr )
private

Member Function Documentation

◆ CreateBaseMap()

Map * MapMgr::CreateBaseMap ( uint32  mapId)
71{
72 Map* map = FindBaseMap(id);
73
74 if (!map)
75 {
76 std::lock_guard<std::mutex> guard(Lock);
77
78 map = FindBaseMap(id);
79 if (!map) // pussywizard: check again after acquiring mutex
80 {
81 MapEntry const* entry = sMapStore.LookupEntry(id);
82 ASSERT(entry);
83
84 if (entry->Instanceable())
85 map = new MapInstanced(id);
86 else
87 map = new Map(id, 0, REGULAR_DIFFICULTY);
88
89 i_maps[id] = map;
90
91 if (!entry->Instanceable())
92 {
93 map->LoadRespawnTimes();
94 map->LoadCorpseData();
95 }
96
97 map->OnCreateMap();
98 }
99 }
100
101 ASSERT(map);
102 return map;
103}
@ 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:156
void OnCreateMap()
Definition Map.cpp:89
void LoadRespawnTimes()
Definition Map.cpp:2601
void LoadCorpseData()
Definition Map.cpp:3198
Definition DBCStructure.h:1324
bool Instanceable() const
Definition DBCStructure.h:1352

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 
)
114{
115 Map* m = CreateBaseMap(id);
116
117 if (m && m->Instanceable())
118 m = ((MapInstanced*)m)->CreateInstanceForPlayer(id, player);
119
120 return m;
121}
Map * CreateBaseMap(uint32 mapId)
Definition MapMgr.cpp:70
bool Instanceable() const
Definition Map.h:294

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

◆ DoDelayedMovesAndRemoves()

void MapMgr::DoDelayedMovesAndRemoves ( )
302{
303}

◆ 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:390

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
306{
309}
static bool ExistVMap(uint32 mapid, int gx, int gy)
Definition GridTerrainLoader.cpp:122
static bool ExistMap(uint32 mapid, int gx, int gy)
Definition GridTerrainLoader.cpp:95
GridCoord ComputeGridCoord(float x, float y)
Definition GridDefines.h:181
Definition GridDefines.h:84
uint32 x_coord
Definition GridDefines.h:151
uint32 y_coord
Definition GridDefines.h:152

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
106{
107 Map* map = FindBaseMap(mapId);
108 if (map && map->Instanceable())
109 return nullptr;
110 return map;
111}

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

◆ FindMap()

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

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

◆ GenerateInstanceId()

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

References _instanceIds, _nextInstanceId, ERROR_EXIT_CODE, LOG_ERROR, 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:1301

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

References i_maps, and Map::Instanceable().

◆ GetNumPlayersInInstances()

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

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:1347

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:1337

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  )
56{
57 int num_threads(sWorld->getIntConfig(CONFIG_NUMTHREADS));
58
59 // Start mtmaps if needed
60 if (num_threads > 0)
61 m_updater.activate(num_threads);
62}
@ CONFIG_NUMTHREADS
Definition IWorld.h:343
void activate(std::size_t num_threads)
Definition MapUpdater.cpp:74

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

◆ InitializeVisibilityDistanceInfo()

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

References i_maps.

◆ InitInstanceIds()

void MapMgr::InitInstanceIds ( )
384{
385 _nextInstanceId = 1;
386
387 QueryResult result = CharacterDatabase.Query("SELECT MAX(id) FROM instance");
388 if (result)
389 {
390 uint32 maxId = (*result)[0].Get<uint32>();
391 _instanceIds.resize(maxId + 1);
392 }
393}
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
50{
51 static MapMgr instance;
52 return &instance;
53}
static MapMgr * instance()
Definition MapMgr.cpp:49

References instance().

Referenced by instance(), and PlayerCannotEnter().

◆ IsValidMAP()

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

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:311
bool IsValidMapCoord(float c)
Definition GridDefines.h:206

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= ( const MapMgr )
private

◆ PlayerCannotEnter()

Map::EnterState MapMgr::PlayerCannotEnter ( uint32  mapid,
Player player,
bool  loginCheck = false 
)
Todo:
: this is not a good place to send the message
136{
137 MapEntry const* entry = sMapStore.LookupEntry(mapid);
138 if (!entry)
140
141 if (!entry->IsDungeon())
142 return Map::CAN_ENTER;
143
144 InstanceTemplate const* instance = sObjectMgr->GetInstanceTemplate(mapid);
145 if (!instance)
147
148 Difficulty targetDifficulty, requestedDifficulty;
149 targetDifficulty = requestedDifficulty = player->GetDifficulty(entry->IsRaid());
150 // Get the highest available difficulty if current setting is higher than the instance allows
151 MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(entry->MapID, targetDifficulty);
152 if (!mapDiff)
153 {
154 player->SendTransferAborted(mapid, TRANSFER_ABORT_DIFFICULTY, requestedDifficulty);
156 }
157
158 //Bypass checks for GMs
159 if (player->IsGameMaster())
160 return Map::CAN_ENTER;
161
162 char const* mapName = entry->name[player->GetSession()->GetSessionDbcLocale()];
163
164 if (!sScriptMgr->OnPlayerCanEnterMap(player, entry, instance, mapDiff, loginCheck))
166
167 Group* group = player->GetGroup();
168 if (entry->IsRaid())
169 {
170 // can only enter in a raid group
171 if ((!group || !group->isRaidGroup()) && !sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_RAID))
172 {
173 // probably there must be special opcode, because client has this string constant in GlobalStrings.lua
176 LOG_DEBUG("maps", "MAP: Player '{}' must be in a raid group to enter instance '{}'", player->GetName(), mapName);
178 }
179 }
180
181 // xinef: dont allow LFG Group to enter other instance that is selected
182 if (group)
183 if (group->isLFGGroup())
184 if (!sLFGMgr->inLfgDungeonMap(group->GetGUID(), mapid, targetDifficulty))
185 {
188 }
189
190 if (!player->IsAlive())
191 {
192 if (player->HasCorpse())
193 {
194 // let enter in ghost mode in instance that connected to inner instance with corpse
195 uint32 corpseMap = player->GetCorpseLocation().GetMapId();
196 do
197 {
198 if (corpseMap == mapid)
199 break;
200
201 InstanceTemplate const* corpseInstance = sObjectMgr->GetInstanceTemplate(corpseMap);
202 corpseMap = corpseInstance ? corpseInstance->Parent : 0;
203 } while (corpseMap);
204
205 if (!corpseMap)
206 {
208 player->GetSession()->SendPacket(&data);
209 LOG_DEBUG("maps", "MAP: Player '{}' does not have a corpse in instance '{}' and cannot enter.", player->GetName(), mapName);
211 }
212 LOG_DEBUG("maps", "MAP: Player '{}' has corpse in instance '{}' and can enter.", player->GetName(), mapName);
213 }
214 else
215 {
216 LOG_DEBUG("maps", "Map::PlayerCannotEnter - player '{}' is dead but does not have a corpse!", player->GetName());
218 }
219 }
220
221 // if map exists - check for being full, etc.
222 if (!loginCheck) // for login this is done by the calling function
223 {
224 uint32 destInstId = sInstanceSaveMgr->PlayerGetDestinationInstanceId(player, mapid, targetDifficulty);
225 if (destInstId)
226 if (Map* boundMap = sMapMgr->FindMap(mapid, destInstId))
227 if (Map::EnterState denyReason = boundMap->CannotEnter(player, loginCheck))
228 return denyReason;
229 }
230
231 // players are only allowed to enter 5 instances per hour
232 if (entry->IsNonRaidDungeon() && (!group || !group->isLFGGroup() || !group->IsLfgRandomInstance()))
233 {
234 uint32 instaceIdToCheck = 0;
235 if (InstanceSave* save = sInstanceSaveMgr->PlayerGetInstanceSave(player->GetGUID(), mapid, player->GetDifficulty(entry->IsRaid())))
236 instaceIdToCheck = save->GetInstanceId();
237
238 // instaceIdToCheck can be 0 if save not found - means no bind so the instance is new
239 if (!player->CheckInstanceCount(instaceIdToCheck))
240 {
243 }
244 }
245
246 //Other requirements
247 return player->Satisfy(sObjectMgr->GetAccessRequirement(mapid, targetDifficulty), mapid, true) ? Map::CAN_ENTER : Map::CANNOT_ENTER_UNSPECIFIED_REASON;
248}
Difficulty
Definition DBCEnums.h:266
MapDifficulty const * GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty)
Definition DBCStores.cpp:767
@ CONFIG_INSTANCE_IGNORE_RAID
Definition IWorld.h:83
#define sInstanceSaveMgr
Definition InstanceSaveMgr.h:202
#define sLFGMgr
Definition LFGMgr.h:641
@ LANG_INSTANCE_RAID_GROUP_ONLY
Definition Language.h:1054
#define LOG_DEBUG(filterType__,...)
Definition Log.h:169
#define sMapMgr
Definition MapMgr.h:220
@ TRANSFER_ABORT_TOO_MANY_INSTANCES
Definition Player.h:792
@ TRANSFER_ABORT_DIFFICULTY
Definition Player.h:795
@ TRANSFER_ABORT_MAP_NOT_ALLOWED
Definition Player.h:803
#define sScriptMgr
Definition ScriptMgr.h:727
Definition Group.h:169
bool isLFGGroup(bool restricted=false) const
Definition Group.cpp:2263
bool IsLfgRandomInstance() const
Definition Group.h:314
ObjectGuid GetGUID() const
Definition Group.cpp:2304
bool isRaidGroup() const
Definition Group.cpp:2269
Definition InstanceSaveMgr.h:56
EnterState
Definition Map.h:270
@ CANNOT_ENTER_CORPSE_IN_DIFFERENT_INSTANCE
Definition Map.h:277
@ CANNOT_ENTER_TOO_MANY_INSTANCES
Definition Map.h:279
@ CAN_ENTER
Definition Map.h:271
@ CANNOT_ENTER_UNSPECIFIED_REASON
Definition Map.h:282
@ CANNOT_ENTER_NO_ENTRY
Definition Map.h:273
@ CANNOT_ENTER_DIFFICULTY_UNAVAILABLE
Definition Map.h:275
@ CANNOT_ENTER_UNINSTANCED_DUNGEON
Definition Map.h:274
@ CANNOT_ENTER_NOT_IN_RAID
Definition Map.h:276
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:112
Difficulty GetDifficulty(bool isRaid) const
Definition Player.h:1927
bool HasCorpse() const
Definition Player.h:2045
bool CheckInstanceCount(uint32 instanceId) const
Definition PlayerStorage.cpp:6981
WorldSession * GetSession() const
Definition Player.h:2005
WorldLocation GetCorpseLocation() const
Definition Player.h:2046
Group * GetGroup()
Definition Player.h:2476
bool IsGameMaster() const
Definition Player.h:1175
bool Satisfy(DungeonProgressionRequirements const *ar, uint32 target_map, bool report=false)
Definition PlayerStorage.cpp:6706
void SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg=0)
Definition Player.cpp:11778
bool IsAlive() const
Definition Unit.h:1707
uint32 GetMapId() const
Definition Position.h:280
std::string const & GetName() const
Definition Object.h:463
Definition WorldPacket.h:26
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition WorldSession.cpp:226
void SendAreaTriggerMessage(std::string_view str)
Definition WorldSession.cpp:206
LocaleConstant GetSessionDbcLocale() const
Definition WorldSession.h:511
@ SMSG_CORPSE_NOT_IN_INSTANCE
Definition Opcodes.h:1316
Definition Map.h:117
uint32 Parent
Definition Map.h:118
Definition DBCStructure.h:2221
bool IsNonRaidDungeon() const
Definition DBCStructure.h:1351
uint32 MapID
Definition DBCStructure.h:1325
char const * name[16]
Definition DBCStructure.h:1330
bool IsRaid() const
Definition DBCStructure.h:1353

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, 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(), WorldSession::SendPacket(), Player::SendTransferAborted(), sInstanceSaveMgr, sLFGMgr, sMapMgr, 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)
396{
397 // Allocation was done in InitInstanceIds()
398 _instanceIds[instanceId] = true;
399
400 // Instances are pulled in ascending order from db and _nextInstanceId is initialized with 1,
401 // so if the instance id is used, increment
402 if (_nextInstanceId == instanceId)
404}

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 ( )
328{
329 for (MapMapType::iterator iter = i_maps.begin(); iter != i_maps.end();)
330 {
331 iter->second->UnloadAll();
332 delete iter->second;
333 i_maps.erase(iter++);
334 }
335
336 if (m_updater.activated())
338}
bool activated()
Definition MapUpdater.cpp:128
void deactivate()
Definition MapUpdater.cpp:83

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

◆ Update()

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