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:209
#define sWorld
Definition: World.h:451
void SetInterval(time_t interval)
Definition: Timer.h:179
IntervalTimer i_timer[4]
Definition: MapMgr.h:174
uint8 mapUpdateStep
Definition: MapMgr.h:175
uint32 _nextInstanceId
Definition: MapMgr.h:178

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 {
88 map = new Map(id, 0, REGULAR_DIFFICULTY);
89 map->LoadRespawnTimes();
90 map->LoadCorpseData();
91 }
92
93 i_maps[id] = map;
94 }
95 }
96
97 ASSERT(map);
98 return map;
99}
#define ASSERT
Definition: Errors.h:68
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
@ REGULAR_DIFFICULTY
Definition: DBCEnums.h:272
Definition: Map.h:312
void LoadRespawnTimes()
Definition: Map.cpp:3396
void LoadCorpseData()
Definition: Map.cpp:3982
Definition: MapInstanced.h:26
Map * FindBaseMap(uint32 mapId) const
Definition: MapMgr.h:45
std::mutex Lock
Definition: MapMgr.h:172
MapMapType i_maps
Definition: MapMgr.h:173
Definition: DBCStructure.h:1308
bool Instanceable() const
Definition: DBCStructure.h:1336

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

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

◆ CreateMap()

Map * MapMgr::CreateMap ( uint32  mapId,
Player player 
)
110{
111 Map* m = CreateBaseMap(id);
112
113 if (m && m->Instanceable())
114 m = ((MapInstanced*)m)->CreateInstanceForPlayer(id, player);
115
116 return m;
117}
bool Instanceable() const
Definition: Map.h:446
Map * CreateBaseMap(uint32 mapId)
Definition: MapMgr.cpp:70

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

◆ DoDelayedMovesAndRemoves()

void MapMgr::DoDelayedMovesAndRemoves ( )
297{
298}

◆ DoForAllMaps()

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

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

◆ DoForAllMapsWithMapId()

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

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

◆ ExistMapAndVMap()

bool MapMgr::ExistMapAndVMap ( uint32  mapid,
float  x,
float  y 
)
static
301{
303
304 int gx = 63 - p.x_coord;
305 int gy = 63 - p.y_coord;
306
307 return Map::ExistMap(mapid, gx, gy) && Map::ExistVMap(mapid, gx, gy);
308}
GridCoord ComputeGridCoord(float x, float y)
Definition: GridDefines.h:186
Definition: GridDefines.h:86
uint32 x_coord
Definition: GridDefines.h:153
uint32 y_coord
Definition: GridDefines.h:154
static bool ExistVMap(uint32 mapid, int gx, int gy)
Definition: Map.cpp:118
static bool ExistMap(uint32 mapid, int gx, int gy)
Definition: Map.cpp:87

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

Referenced by World::SetInitialWorldSettings().

◆ FindBaseMap()

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

References i_maps.

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

◆ FindBaseNonInstanceMap()

Map * MapMgr::FindBaseNonInstanceMap ( uint32  mapId) const
102{
103 Map* map = FindBaseMap(mapId);
104 if (map && map->Instanceable())
105 return nullptr;
106 return map;
107}

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

◆ FindMap()

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

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

◆ GenerateInstanceId()

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

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
52 {
53 Map const* m = const_cast<MapMgr*>(this)->CreateBaseMap(mapid);
54 return m->GetAreaId(phaseMask, x, y, z);
55 }
uint32 GetAreaId(uint32 phaseMask, float x, float y, float z) const
Definition: Map.cpp:2150
Definition: MapMgr.h:36

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

◆ GetAreaId() [2/3]

uint32 MapMgr::GetAreaId ( uint32  phaseMask,
uint32  mapid,
Position const &  pos 
) const
inline
56{ 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:51

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
57{ return GetAreaId(phaseMask, loc.GetMapId(), loc); }

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

Referenced by GetAreaId().

◆ GetInstanceIDs()

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

References _instanceIds.

◆ GetMapUpdater()

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

References m_updater.

◆ GetNumInstances()

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

References i_maps, and Map::Instanceable().

◆ GetNumPlayersInInstances()

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

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
68 {
69 Map const* m = const_cast<MapMgr*>(this)->CreateBaseMap(mapid);
70 m->GetZoneAndAreaId(phaseMask, zoneid, areaid, x, y, z);
71 }
void GetZoneAndAreaId(uint32 phaseMask, uint32 &zoneid, uint32 &areaid, float x, float y, float z) const
Definition: Map.cpp:2196

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

◆ GetZoneId() [1/3]

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

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

◆ GetZoneId() [2/3]

uint32 MapMgr::GetZoneId ( uint32  phaseMask,
uint32  mapid,
Position const &  pos 
) const
inline
64{ 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:59

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
65{ 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:335
void activate(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 ( )
383{
384 _nextInstanceId = 1;
385
386 QueryResult result = CharacterDatabase.Query("SELECT MAX(id) FROM instance");
387 if (result)
388 {
389 uint32 maxId = (*result)[0].Get<uint32>();
390 _instanceIds.resize(maxId + 1);
391 }
392}
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
std::shared_ptr< ResultSet > QueryResult
Definition: DatabaseEnvFwd.h:28

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
311{
312 MapEntry const* mEntry = sMapStore.LookupEntry(mapid);
313
314 if (startUp)
315 {
316 return mEntry != nullptr;
317 }
318 else
319 {
320 return mEntry && (!mEntry->IsDungeon() || sObjectMgr->GetInstanceTemplate(mapid));
321 }
322
324}
#define sObjectMgr
Definition: ObjectMgr.h:1640
bool IsDungeon() const
Definition: DBCStructure.h:1334

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

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

◆ IsValidMapCoord() [1/5]

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

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

◆ IsValidMapCoord() [2/5]

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

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

◆ IsValidMapCoord() [3/5]

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

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

◆ IsValidMapCoord() [4/5]

◆ IsValidMapCoord() [5/5]

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

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

◆ NormalizeOrientation()

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

◆ 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
132{
133 MapEntry const* entry = sMapStore.LookupEntry(mapid);
134 if (!entry)
136
137 if (!entry->IsDungeon())
138 return Map::CAN_ENTER;
139
140 InstanceTemplate const* instance = sObjectMgr->GetInstanceTemplate(mapid);
141 if (!instance)
143
144 Difficulty targetDifficulty, requestedDifficulty;
145 targetDifficulty = requestedDifficulty = player->GetDifficulty(entry->IsRaid());
146 // Get the highest available difficulty if current setting is higher than the instance allows
147 MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(entry->MapID, targetDifficulty);
148 if (!mapDiff)
149 {
150 player->SendTransferAborted(mapid, TRANSFER_ABORT_DIFFICULTY, requestedDifficulty);
152 }
153
154 //Bypass checks for GMs
155 if (player->IsGameMaster())
156 return Map::CAN_ENTER;
157
158 char const* mapName = entry->name[player->GetSession()->GetSessionDbcLocale()];
159
160 if (!sScriptMgr->CanEnterMap(player, entry, instance, mapDiff, loginCheck))
162
163 Group* group = player->GetGroup();
164 if (entry->IsRaid())
165 {
166 // can only enter in a raid group
167 if ((!group || !group->isRaidGroup()) && !sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_RAID))
168 {
169 // probably there must be special opcode, because client has this string constant in GlobalStrings.lua
172 LOG_DEBUG("maps", "MAP: Player '{}' must be in a raid group to enter instance '{}'", player->GetName(), mapName);
174 }
175 }
176
177 // xinef: dont allow LFG Group to enter other instance that is selected
178 if (group)
179 if (group->isLFGGroup())
180 if (!sLFGMgr->inLfgDungeonMap(group->GetGUID(), mapid, targetDifficulty))
181 {
184 }
185
186 if (!player->IsAlive())
187 {
188 if (player->HasCorpse())
189 {
190 // let enter in ghost mode in instance that connected to inner instance with corpse
191 uint32 corpseMap = player->GetCorpseLocation().GetMapId();
192 do
193 {
194 if (corpseMap == mapid)
195 break;
196
197 InstanceTemplate const* corpseInstance = sObjectMgr->GetInstanceTemplate(corpseMap);
198 corpseMap = corpseInstance ? corpseInstance->Parent : 0;
199 } while (corpseMap);
200
201 if (!corpseMap)
202 {
204 player->GetSession()->SendPacket(&data);
205 LOG_DEBUG("maps", "MAP: Player '{}' does not have a corpse in instance '{}' and cannot enter.", player->GetName(), mapName);
207 }
208 LOG_DEBUG("maps", "MAP: Player '{}' has corpse in instance '{}' and can enter.", player->GetName(), mapName);
209 }
210 else
211 {
212 LOG_DEBUG("maps", "Map::PlayerCannotEnter - player '{}' is dead but does not have a corpse!", player->GetName());
213 }
214 }
215
216 // if map exists - check for being full, etc.
217 if (!loginCheck) // for login this is done by the calling function
218 {
219 uint32 destInstId = sInstanceSaveMgr->PlayerGetDestinationInstanceId(player, mapid, targetDifficulty);
220 if (destInstId)
221 if (Map* boundMap = sMapMgr->FindMap(mapid, destInstId))
222 if (Map::EnterState denyReason = boundMap->CannotEnter(player, loginCheck))
223 return denyReason;
224 }
225
226 // players are only allowed to enter 5 instances per hour
227 if (entry->IsDungeon() && (!group || !group->isLFGGroup() || !group->IsLfgRandomInstance()))
228 {
229 uint32 instaceIdToCheck = 0;
230 if (InstanceSave* save = sInstanceSaveMgr->PlayerGetInstanceSave(player->GetGUID(), mapid, player->GetDifficulty(entry->IsRaid())))
231 instaceIdToCheck = save->GetInstanceId();
232
233 // instaceIdToCheck can be 0 if save not found - means no bind so the instance is new
234 if (!player->CheckInstanceCount(instaceIdToCheck))
235 {
238 }
239 }
240
241 //Other requirements
242 return player->Satisfy(sObjectMgr->GetAccessRequirement(mapid, targetDifficulty), mapid, true) ? Map::CAN_ENTER : Map::CANNOT_ENTER_UNSPECIFIED_REASON;
243}
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:171
MapDifficulty const * GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty)
Definition: DBCStores.cpp:760
#define sLFGMgr
Definition: LFGMgr.h:638
@ TRANSFER_ABORT_TOO_MANY_INSTANCES
Definition: Player.h:780
@ TRANSFER_ABORT_DIFFICULTY
Definition: Player.h:783
@ TRANSFER_ABORT_MAP_NOT_ALLOWED
Definition: Player.h:791
#define sInstanceSaveMgr
Definition: InstanceSaveMgr.h:202
#define sMapMgr
Definition: MapMgr.h:221
@ LANG_INSTANCE_RAID_GROUP_ONLY
Definition: Language.h:1060
#define sScriptMgr
Definition: ScriptMgr.h:2702
@ CONFIG_INSTANCE_IGNORE_RAID
Definition: IWorld.h:89
Difficulty
Definition: DBCEnums.h:271
@ SMSG_CORPSE_NOT_IN_INSTANCE
Definition: Opcodes.h:1316
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:106
std::string const & GetName() const
Definition: Object.h:446
uint32 GetMapId() const
Definition: Position.h:276
Difficulty GetDifficulty(bool isRaid) const
Definition: Player.h:1870
bool HasCorpse() const
Definition: Player.h:1989
bool CheckInstanceCount(uint32 instanceId) const
Definition: PlayerStorage.cpp:6996
WorldSession * GetSession() const
Definition: Player.h:1948
WorldLocation GetCorpseLocation() const
Definition: Player.h:1990
Group * GetGroup()
Definition: Player.h:2418
bool IsGameMaster() const
Definition: Player.h:1136
bool Satisfy(DungeonProgressionRequirements const *ar, uint32 target_map, bool report=false)
Definition: PlayerStorage.cpp:6727
void SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg=0)
Definition: Player.cpp:11612
bool IsAlive() const
Definition: Unit.h:1808
Definition: Group.h:168
bool isLFGGroup(bool restricted=false) const
Definition: Group.cpp:2204
bool IsLfgRandomInstance() const
Definition: Group.h:312
ObjectGuid GetGUID() const
Definition: Group.cpp:2245
bool isRaidGroup() const
Definition: Group.cpp:2210
Definition: InstanceSaveMgr.h:56
Definition: Map.h:273
uint32 Parent
Definition: Map.h:274
EnterState
Definition: Map.h:422
@ CANNOT_ENTER_CORPSE_IN_DIFFERENT_INSTANCE
Definition: Map.h:429
@ CANNOT_ENTER_TOO_MANY_INSTANCES
Definition: Map.h:431
@ CAN_ENTER
Definition: Map.h:423
@ CANNOT_ENTER_UNSPECIFIED_REASON
Definition: Map.h:434
@ CANNOT_ENTER_NO_ENTRY
Definition: Map.h:425
@ CANNOT_ENTER_DIFFICULTY_UNAVAILABLE
Definition: Map.h:427
@ CANNOT_ENTER_UNINSTANCED_DUNGEON
Definition: Map.h:426
@ CANNOT_ENTER_NOT_IN_RAID
Definition: Map.h:428
Definition: WorldPacket.h:27
void SendAreaTriggerMessage(const char *Text,...) ATTR_PRINTF(2
Definition: MiscHandler.cpp:714
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition: WorldSession.cpp:207
LocaleConstant GetSessionDbcLocale() const
Definition: WorldSession.h:496
char const * GetAcoreString(uint32 entry) const
Definition: WorldSession.cpp:822
uint32 MapID
Definition: DBCStructure.h:1309
char const * name[16]
Definition: DBCStructure.h:1314
bool IsRaid() const
Definition: DBCStructure.h:1337
Definition: DBCStructure.h:2195

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

References _instanceIds, and _nextInstanceId.

◆ SetMapUpdateInterval()

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

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

◆ UnloadAll()

void MapMgr::UnloadAll ( )
327{
328 for (MapMapType::iterator iter = i_maps.begin(); iter != i_maps.end();)
329 {
330 iter->second->UnloadAll();
331 delete iter->second;
332 i_maps.erase(iter++);
333 }
334
335 if (m_updater.activated())
337}
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)
246{
247 for (uint8 i = 0; i < 4; ++i)
248 i_timer[i].Update(diff);
249
250 // pussywizard: lfg compatibles update, schedule before maps so it is processed from the very beginning
251 //if (mapUpdateStep == 0)
252 {
253 if (m_updater.activated())
254 {
256 }
257 else
258 {
259 sLFGMgr->Update(diff, 1);
260 }
261 }
262
263 MapMapType::iterator iter = i_maps.begin();
264 for (; iter != i_maps.end(); ++iter)
265 {
266 bool full = mapUpdateStep < 3 && ((mapUpdateStep == 0 && !iter->second->IsBattlegroundOrArena() && !iter->second->IsDungeon()) || (mapUpdateStep == 1 && iter->second->IsBattlegroundOrArena()) || (mapUpdateStep == 2 && iter->second->IsDungeon()));
267 if (m_updater.activated())
268 m_updater.schedule_update(*iter->second, uint32(full ? i_timer[mapUpdateStep].GetCurrent() : 0), diff);
269 else
270 iter->second->Update(uint32(full ? i_timer[mapUpdateStep].GetCurrent() : 0), diff);
271 }
272
273 if (m_updater.activated())
274 m_updater.wait();
275
276 if (mapUpdateStep < 3)
277 {
278 for (iter = i_maps.begin(); iter != i_maps.end(); ++iter)
279 {
280 bool full = ((mapUpdateStep == 0 && !iter->second->IsBattlegroundOrArena() && !iter->second->IsDungeon()) || (mapUpdateStep == 1 && iter->second->IsBattlegroundOrArena()) || (mapUpdateStep == 2 && iter->second->IsDungeon()));
281 if (full)
282 iter->second->DelayedUpdate(uint32(i_timer[mapUpdateStep].GetCurrent()));
283 }
284
287 }
288
289 if (mapUpdateStep == 3 && i_timer[3].Passed())
290 {
291 mapUpdateStep = 0;
292 i_timer[3].SetCurrent(0);
293 }
294}
std::uint8_t uint8
Definition: Define.h:110
void SetCurrent(time_t current)
Definition: Timer.h:174
void Update(uint32)
Definition: MapMgr.cpp:245
void schedule_lfg_update(uint32 diff)
Definition: MapUpdater.cpp:119
void wait()
Definition: MapUpdater.cpp:100
void schedule_update(Map &map, uint32 diff, uint32 s_diff)
Definition: MapUpdater.cpp:110

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().