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

#include "Map.h"

Inheritance diagram for Map:
GridRefMgr< MapGridType > RefMgr< TO, FROM > LinkedListHead BattlegroundMap InstanceMap MapInstanced

Public Types

enum  EnterState {
  CAN_ENTER = 0 ,
  CANNOT_ENTER_ALREADY_IN_MAP = 1 ,
  CANNOT_ENTER_NO_ENTRY ,
  CANNOT_ENTER_UNINSTANCED_DUNGEON ,
  CANNOT_ENTER_DIFFICULTY_UNAVAILABLE ,
  CANNOT_ENTER_NOT_IN_RAID ,
  CANNOT_ENTER_CORPSE_IN_DIFFERENT_INSTANCE ,
  CANNOT_ENTER_INSTANCE_BIND_MISMATCH ,
  CANNOT_ENTER_TOO_MANY_INSTANCES ,
  CANNOT_ENTER_MAX_PLAYERS ,
  CANNOT_ENTER_ZONE_IN_COMBAT ,
  CANNOT_ENTER_UNSPECIFIED_REASON
}
 
typedef MapRefMgr PlayerList
 
typedef std::unordered_multimap< ObjectGuid::LowType, Creature * > CreatureBySpawnIdContainer
 
typedef std::unordered_multimap< ObjectGuid::LowType, GameObject * > GameObjectBySpawnIdContainer
 
typedef std::vector< WorldObject * > UpdatableObjectList
 
typedef std::unordered_set< WorldObject * > PendingAddUpdatableObjectList
 
- Public Types inherited from GridRefMgr< MapGridType >
typedef LinkedListHead::Iterator< GridReference< MapGridType > > iterator
 
- Public Types inherited from RefMgr< TO, FROM >
typedef LinkedListHead::Iterator< Reference< TO, FROM > > iterator
 
- Public Types inherited from LinkedListHead
typedef Iterator< LinkedListElementiterator
 

Public Member Functions

 Map (uint32 id, uint32 InstanceId, uint8 SpawnMode, Map *_parent=nullptr)
 
 ~Map () override
 
MapEntry const * GetEntry () const
 
bool CanUnload (uint32 diff)
 
virtual bool AddPlayerToMap (Player *)
 
virtual void RemovePlayerFromMap (Player *, bool)
 
virtual void AfterPlayerUnlinkFromMap ()
 
template<class T >
bool AddToMap (T *, bool checkTransport=false)
 
template<class T >
void RemoveFromMap (T *, bool)
 
void MarkNearbyCellsOf (WorldObject *obj)
 
virtual void Update (const uint32, const uint32, bool thread=true)
 
float GetVisibilityRange () const
 
void SetVisibilityRange (float range)
 
void OnCreateMap ()
 
virtual void InitVisibilityDistance ()
 
void PlayerRelocation (Player *, float x, float y, float z, float o)
 
void CreatureRelocation (Creature *creature, float x, float y, float z, float o)
 
void GameObjectRelocation (GameObject *go, float x, float y, float z, float o)
 
void DynamicObjectRelocation (DynamicObject *go, float x, float y, float z, float o)
 
template<class T , class CONTAINER >
void Visit (const Cell &cell, TypeContainerVisitor< T, CONTAINER > &visitor)
 
bool IsGridLoaded (GridCoord const &gridCoord) const
 
bool IsGridLoaded (float x, float y) const
 
bool IsGridCreated (GridCoord const &gridCoord) const
 
bool IsGridCreated (float x, float y) const
 
void LoadGrid (float x, float y)
 
void LoadAllGrids ()
 
void LoadGridsInRange (Position const &center, float radius)
 
bool UnloadGrid (MapGridType &grid)
 
virtual void UnloadAll ()
 
std::shared_ptr< GridTerrainDataGetGridTerrainDataSharedPtr (GridCoord const &gridCoord)
 
GridTerrainDataGetGridTerrainData (GridCoord const &gridCoord)
 
GridTerrainDataGetGridTerrainData (float x, float y)
 
uint32 GetId () const
 
Map const * GetParent () const
 
std::shared_mutex & GetMMapLock () const
 
void HandleDelayedVisibility ()
 
float GetHeight (float x, float y, float z, bool checkVMap=true, float maxSearchDist=DEFAULT_HEIGHT_SEARCH) const
 
float GetGridHeight (float x, float y) const
 
float GetMinHeight (float x, float y) const
 
TransportGetTransportForPos (uint32 phase, float x, float y, float z, WorldObject *worldobject=nullptr)
 
void GetFullTerrainStatusForPosition (uint32 phaseMask, float x, float y, float z, float collisionHeight, PositionFullTerrainStatus &data, uint8 reqLiquidType=MAP_ALL_LIQUIDS)
 
LiquidData const GetLiquidData (uint32 phaseMask, float x, float y, float z, float collisionHeight, uint8 ReqLiquidType)
 
bool GetAreaInfo (uint32 phaseMask, float x, float y, float z, uint32 &mogpflags, int32 &adtId, int32 &rootId, int32 &groupId) const
 
uint32 GetAreaId (uint32 phaseMask, float x, float y, float z) const
 
uint32 GetZoneId (uint32 phaseMask, float x, float y, float z) const
 
void GetZoneAndAreaId (uint32 phaseMask, uint32 &zoneid, uint32 &areaid, float x, float y, float z) const
 
float GetWaterLevel (float x, float y) const
 
bool IsInWater (uint32 phaseMask, float x, float y, float z, float collisionHeight) const
 
bool IsUnderWater (uint32 phaseMask, float x, float y, float z, float collisionHeight) const
 
bool HasEnoughWater (WorldObject const *searcher, float x, float y, float z) const
 
bool HasEnoughWater (WorldObject const *searcher, LiquidData const &liquidData) const
 
void MoveAllCreaturesInMoveList ()
 
void MoveAllGameObjectsInMoveList ()
 
void MoveAllDynamicObjectsInMoveList ()
 
void RemoveAllObjectsInRemoveList ()
 
virtual void RemoveAllPlayers ()
 
uint32 GetInstanceId () const
 
uint8 GetSpawnMode () const
 
virtual EnterState CannotEnter (Player *, bool)
 
const char * GetMapName () const
 
Difficulty GetDifficulty () const
 
bool IsRegularDifficulty () const
 
MapDifficulty const * GetMapDifficulty () const
 
bool Instanceable () const
 
bool IsDungeon () const
 
bool IsNonRaidDungeon () const
 
bool IsRaid () const
 
bool IsRaidOrHeroicDungeon () const
 
bool IsHeroic () const
 
bool Is25ManRaid () const
 
bool IsBattleground () const
 
bool IsBattleArena () const
 
bool IsBattlegroundOrArena () const
 
bool IsWorldMap () const
 
bool GetEntrancePos (int32 &mapid, float &x, float &y)
 
void AddObjectToRemoveList (WorldObject *obj)
 
virtual void DelayedUpdate (const uint32 diff)
 
void resetMarkedCells ()
 
bool isCellMarked (uint32 pCellId)
 
void markCell (uint32 pCellId)
 
bool HavePlayers () const
 
uint32 GetPlayersCountExceptGMs () const
 
void AddWorldObject (WorldObject *obj)
 
void RemoveWorldObject (WorldObject *obj)
 
void SendToPlayers (WorldPacket const *data) const
 
PlayerList const & GetPlayers () const
 
void ScriptsStart (std::map< uint32, std::multimap< uint32, ScriptInfo > > const &scripts, uint32 id, Object *source, Object *target)
 Put scripts in the execution queue.
 
void ScriptCommandStart (ScriptInfo const &script, uint32 delay, Object *source, Object *target)
 
template<class T >
void AddToActive (T *obj)
 
template<class T >
void RemoveFromActive (T *obj)
 
void UpdateIteratorBack (Player *player)
 
TempSummonSummonCreature (uint32 entry, Position const &pos, SummonPropertiesEntry const *properties=nullptr, uint32 duration=0, WorldObject *summoner=nullptr, uint32 spellId=0, uint32 vehId=0, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true)
 
GameObjectSummonGameObject (uint32 entry, Position const &pos, float rotation0=0.0f, float rotation1=0.0f, float rotation2=0.0f, float rotation3=0.0f, uint32 respawnTime=100, bool checkTransport=true)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
CorpseGetCorpse (ObjectGuid const guid)
 
CreatureGetCreature (ObjectGuid const guid)
 
GameObjectGetGameObject (ObjectGuid const guid)
 
TransportGetTransport (ObjectGuid const guid)
 
DynamicObjectGetDynamicObject (ObjectGuid const guid)
 
PetGetPet (ObjectGuid const guid)
 
MapStoredObjectTypesContainerGetObjectsStore ()
 
CreatureBySpawnIdContainerGetCreatureBySpawnIdStore ()
 
GameObjectBySpawnIdContainerGetGameObjectBySpawnIdStore ()
 
std::unordered_set< Corpse * > const * GetCorpsesInGrid (uint32 gridId) const
 
CorpseGetCorpseByPlayer (ObjectGuid const &ownerGuid) const
 
MapInstancedToMapInstanced ()
 
MapInstanced const * ToMapInstanced () const
 
InstanceMapToInstanceMap ()
 
InstanceMap const * ToInstanceMap () const
 
BattlegroundMapToBattlegroundMap ()
 
BattlegroundMap const * ToBattlegroundMap () const
 
float GetWaterOrGroundLevel (uint32 phasemask, float x, float y, float z, float *ground=nullptr, bool swim=false, float collisionHeight=DEFAULT_COLLISION_HEIGHT) const
 
float GetHeight (uint32 phasemask, float x, float y, float z, bool vmap=true, float maxSearchDist=DEFAULT_HEIGHT_SEARCH) const
 
bool isInLineOfSight (float x1, float y1, float z1, float x2, float y2, float z2, uint32 phasemask, LineOfSightChecks checks, VMAP::ModelIgnoreFlags ignoreFlags) const
 
bool CanReachPositionAndGetValidCoords (WorldObject const *source, PathGenerator *path, float &destX, float &destY, float &destZ, bool failOnCollision=true, bool failOnSlopes=true) const
 Check if a given source can reach a specific point following a path and normalize the coords. Use this method for long paths, otherwise use the overloaded method with the start coords when you need to do a quick check on small segments.
 
bool CanReachPositionAndGetValidCoords (WorldObject const *source, float &destX, float &destY, float &destZ, bool failOnCollision=true, bool failOnSlopes=true) const
 validate the new destination and set reachable coords Check if a given unit can reach a specific point on a segment and set the correct dest coords NOTE: use this method with small segments.
 
bool CanReachPositionAndGetValidCoords (WorldObject const *source, float startX, float startY, float startZ, float &destX, float &destY, float &destZ, bool failOnCollision=true, bool failOnSlopes=true) const
 
bool CheckCollisionAndGetValidCoords (WorldObject const *source, float startX, float startY, float startZ, float &destX, float &destY, float &destZ, bool failOnCollision=true) const
 validate the new destination and set coords Check if a given unit can face collisions in a specific segment
 
void Balance ()
 
void RemoveGameObjectModel (const GameObjectModel &model)
 
void InsertGameObjectModel (const GameObjectModel &model)
 
bool ContainsGameObjectModel (const GameObjectModel &model) const
 
DynamicMapTree const & GetDynamicMapTree () const
 
bool GetObjectHitPos (uint32 phasemask, float x1, float y1, float z1, float x2, float y2, float z2, float &rx, float &ry, float &rz, float modifyDist)
 
float GetGameObjectFloor (uint32 phasemask, float x, float y, float z, float maxSearchDist=DEFAULT_HEIGHT_SEARCH) const
 
time_t GetLinkedRespawnTime (ObjectGuid guid) const
 
time_t GetCreatureRespawnTime (ObjectGuid::LowType dbGuid) const
 
time_t GetGORespawnTime (ObjectGuid::LowType dbGuid) const
 
void SaveCreatureRespawnTime (ObjectGuid::LowType dbGuid, time_t &respawnTime)
 
void RemoveCreatureRespawnTime (ObjectGuid::LowType dbGuid)
 
void SaveGORespawnTime (ObjectGuid::LowType dbGuid, time_t &respawnTime)
 
void RemoveGORespawnTime (ObjectGuid::LowType dbGuid)
 
void LoadRespawnTimes ()
 
void DeleteRespawnTimes ()
 
time_t GetInstanceResetPeriod () const
 
void UpdatePlayerZoneStats (uint32 oldZone, uint32 newZone)
 
uint32 ApplyDynamicModeRespawnScaling (WorldObject const *obj, uint32 respawnDelay) const
 
void ScheduleCreatureRespawn (ObjectGuid, Milliseconds, Position pos=Position())
 
void LoadCorpseData ()
 
void DeleteCorpseData ()
 
void AddCorpse (Corpse *corpse)
 
void RemoveCorpse (Corpse *corpse)
 
CorpseConvertCorpseToBones (ObjectGuid const ownerGuid, bool insignia=false)
 
void RemoveOldCorpses ()
 
void SendInitTransports (Player *player)
 
void SendRemoveTransports (Player *player)
 
void SendZoneDynamicInfo (Player *player)
 
void SendInitSelf (Player *player)
 
void PlayDirectSoundToMap (uint32 soundId, uint32 zoneId=0)
 
void SetZoneMusic (uint32 zoneId, uint32 musicId)
 
void SetZoneWeather (uint32 zoneId, WeatherState weatherId, float weatherGrade)
 
void SetZoneOverrideLight (uint32 zoneId, uint32 lightId, Milliseconds fadeInTime)
 
void UpdateEncounterState (EncounterCreditType type, uint32 creditEntry, Unit *source)
 
void LogEncounterFinished (EncounterCreditType type, uint32 creditEntry)
 
void DoForAllPlayers (std::function< void(Player *)> exec)
 
void EnsureGridCreated (GridCoord const &gridCoord)
 
bool AllTransportsEmpty () const
 
void AllTransportsRemovePassengers ()
 
TransportsContainer const & GetAllTransports () const
 
template<HighGuid high>
ObjectGuid::LowType GenerateLowGuid ()
 
void AddUpdateObject (Object *obj)
 
void RemoveUpdateObject (Object *obj)
 
std::size_t GetActiveNonPlayersCount () const
 
virtual std::string GetDebugInfo () const
 
uint32 GetCreatedGridsCount ()
 
uint32 GetLoadedGridsCount ()
 
uint32 GetCreatedCellsInGridCount (uint16 const x, uint16 const y)
 
uint32 GetCreatedCellsInMapCount ()
 
void AddObjectToPendingUpdateList (WorldObject *obj)
 
void RemoveObjectFromMapUpdateList (WorldObject *obj)
 
template<>
void AddToGrid (Creature *obj, Cell const &cell)
 
template<>
void AddToGrid (GameObject *obj, Cell const &cell)
 
template<>
void AddToGrid (DynamicObject *obj, Cell const &cell)
 
template<>
void AddToGrid (Corpse *obj, Cell const &cell)
 
template<>
void DeleteFromWorld (Player *player)
 
template<>
void InitializeObject (Creature *)
 
template<>
void InitializeObject (GameObject *)
 
template<>
bool AddToMap (MotionTransport *obj, bool)
 
template<>
void RemoveFromMap (MotionTransport *obj, bool remove)
 
template<>
void AddToActive (Creature *c)
 
template<>
void AddToActive (DynamicObject *d)
 
template<>
void AddToActive (GameObject *d)
 
template<>
void AddToActive (Corpse *)
 
template<>
void RemoveFromActive (Creature *c)
 
template<>
void RemoveFromActive (DynamicObject *obj)
 
template<>
void RemoveFromActive (GameObject *obj)
 
- Public Member Functions inherited from GridRefMgr< MapGridType >
GridReference< MapGridType > * getFirst ()
 
GridReference< MapGridType > * getLast ()
 
iterator begin ()
 
iterator end ()
 
iterator rbegin ()
 
iterator rend ()
 
- Public Member Functions inherited from RefMgr< TO, FROM >
 RefMgr ()=default
 
virtual ~RefMgr ()
 
Reference< TO, FROM > * getFirst ()
 
Reference< TO, FROM > const * getFirst () const
 
Reference< TO, FROM > * getLast ()
 
Reference< TO, FROM > const * getLast () const
 
iterator begin ()
 
iterator end ()
 
iterator rbegin ()
 
iterator rend ()
 
void clearReferences ()
 
- Public Member Functions inherited from LinkedListHead
 LinkedListHead ()
 
bool IsEmpty () const
 
LinkedListElementgetFirst ()
 
LinkedListElement const * getFirst () const
 
LinkedListElementgetLast ()
 
LinkedListElement const * getLast () const
 
void insertFirst (LinkedListElement *pElem)
 
void insertLast (LinkedListElement *pElem)
 
uint32 getSize () const
 
void incSize ()
 
void decSize ()
 

Static Public Member Functions

static void DeleteRespawnTimesInDB (uint16 mapId, uint32 instanceId)
 

Public Attributes

std::unordered_set< Unit * > i_objectsForDelayedVisibility
 
CreatureGroupHolderType CreatureGroupHolder
 
TaskScheduler _creatureRespawnScheduler
 
DataMap CustomData
 

Protected Types

typedef std::set< WorldObject * > ActiveNonPlayers
 

Protected Member Functions

template<class T >
void AddToGrid (T *object, Cell const &cell)
 

Protected Attributes

std::mutex Lock
 
std::shared_mutex MMapLock
 
MapGridManager _mapGridManager
 
MapEntry const * i_mapEntry
 
uint8 i_spawnMode
 
uint32 i_InstanceId
 
uint32 m_unloadTimer
 
float m_VisibleDistance
 
DynamicMapTree _dynamicTree
 
time_t _instanceResetPeriod
 
MapRefMgr m_mapRefMgr
 
MapRefMgr::iterator m_mapRefIter
 
ActiveNonPlayers m_activeNonPlayers
 
ActiveNonPlayers::iterator m_activeNonPlayersIter
 
TransportsContainer _transports
 
TransportsContainer::iterator _transportsUpdateIter
 

Private Types

typedef std::multimap< time_t, ScriptActionScriptScheduleMap
 

Private Member Functions

template<class T >
void InitializeObject (T *obj)
 
void AddCreatureToMoveList (Creature *c)
 
void RemoveCreatureFromMoveList (Creature *c)
 
void AddGameObjectToMoveList (GameObject *go)
 
void RemoveGameObjectFromMoveList (GameObject *go)
 
void AddDynamicObjectToMoveList (DynamicObject *go)
 
void RemoveDynamicObjectFromMoveList (DynamicObject *go)
 
bool EnsureGridLoaded (Cell const &cell)
 
MapGridTypeGetMapGrid (uint16 const x, uint16 const y)
 
void ScriptsProcess ()
 Process queued scripts.
 
void SendObjectUpdates ()
 
Player_GetScriptPlayerSourceOrTarget (Object *source, Object *target, const ScriptInfo *scriptInfo) const
 
Creature_GetScriptCreatureSourceOrTarget (Object *source, Object *target, const ScriptInfo *scriptInfo, bool bReverse=false) const
 
Unit_GetScriptUnit (Object *obj, bool isSource, const ScriptInfo *scriptInfo) const
 
Player_GetScriptPlayer (Object *obj, bool isSource, const ScriptInfo *scriptInfo) const
 
Creature_GetScriptCreature (Object *obj, bool isSource, const ScriptInfo *scriptInfo) const
 
WorldObject_GetScriptWorldObject (Object *obj, bool isSource, const ScriptInfo *scriptInfo) const
 
void _ScriptProcessDoor (Object *source, Object *target, const ScriptInfo *scriptInfo) const
 
GameObject_FindGameObject (WorldObject *pWorldObject, ObjectGuid::LowType guid) const
 
template<class T >
void DeleteFromWorld (T *)
 
void AddToActiveHelper (WorldObject *obj)
 
void RemoveFromActiveHelper (WorldObject *obj)
 
void UpdateNonPlayerObjects (uint32 const diff)
 
void _AddObjectToUpdateList (WorldObject *obj)
 
void _RemoveObjectFromUpdateList (WorldObject *obj)
 
template<HighGuid high>
ObjectGuidGeneratorBaseGetGuidSequenceGenerator ()
 

Private Attributes

std::vector< Creature * > _creaturesToMove
 
std::vector< GameObject * > _gameObjectsToMove
 
std::vector< DynamicObject * > _dynamicObjectsToMove
 
Mapm_parentMap
 
std::bitset< TOTAL_NUMBER_OF_CELLS_PER_MAP *TOTAL_NUMBER_OF_CELLS_PER_MAPmarked_cells
 
bool i_scriptLock
 
std::unordered_set< WorldObject * > i_objectsToRemove
 
std::unordered_set< WorldObject * > i_worldObjects
 
ScriptScheduleMap m_scriptSchedule
 
std::unordered_map< ObjectGuid::LowType, time_t > _creatureRespawnTimes
 
std::unordered_map< ObjectGuid::LowType, time_t > _goRespawnTimes
 
std::unordered_map< uint32, uint32_zonePlayerCountMap
 
ZoneDynamicInfoMap _zoneDynamicInfo
 
uint32 _defaultLight
 
std::map< HighGuid, std::unique_ptr< ObjectGuidGeneratorBase > > _guidGenerators
 
MapStoredObjectTypesContainer _objectsStore
 
CreatureBySpawnIdContainer _creatureBySpawnIdStore
 
GameObjectBySpawnIdContainer _gameobjectBySpawnIdStore
 
std::unordered_map< uint32, std::unordered_set< Corpse * > > _corpsesByGrid
 
std::unordered_map< ObjectGuid, Corpse * > _corpsesByPlayer
 
std::unordered_set< Corpse * > _corpseBones
 
std::unordered_set< Object * > _updateObjects
 
UpdatableObjectList _updatableObjectList
 
PendingAddUpdatableObjectList _pendingAddUpdatableObjectList
 
IntervalTimer _updatableObjectListRecheckTimer
 

Friends

class MapReference
 
class GridObjectLoader
 

Detailed Description

Member Typedef Documentation

◆ ActiveNonPlayers

typedef std::set<WorldObject*> Map::ActiveNonPlayers
protected

◆ CreatureBySpawnIdContainer

typedef std::unordered_multimap<ObjectGuid::LowType, Creature*> Map::CreatureBySpawnIdContainer

◆ GameObjectBySpawnIdContainer

◆ PendingAddUpdatableObjectList

typedef std::unordered_set<WorldObject*> Map::PendingAddUpdatableObjectList

◆ PlayerList

◆ ScriptScheduleMap

typedef std::multimap<time_t, ScriptAction> Map::ScriptScheduleMap
private

◆ UpdatableObjectList

typedef std::vector<WorldObject*> Map::UpdatableObjectList

Member Enumeration Documentation

◆ EnterState

Enumerator
CAN_ENTER 
CANNOT_ENTER_ALREADY_IN_MAP 
CANNOT_ENTER_NO_ENTRY 
CANNOT_ENTER_UNINSTANCED_DUNGEON 
CANNOT_ENTER_DIFFICULTY_UNAVAILABLE 
CANNOT_ENTER_NOT_IN_RAID 
CANNOT_ENTER_CORPSE_IN_DIFFERENT_INSTANCE 
CANNOT_ENTER_INSTANCE_BIND_MISMATCH 
CANNOT_ENTER_TOO_MANY_INSTANCES 
CANNOT_ENTER_MAX_PLAYERS 
CANNOT_ENTER_ZONE_IN_COMBAT 
CANNOT_ENTER_UNSPECIFIED_REASON 
265 {
266 CAN_ENTER = 0,
267 CANNOT_ENTER_ALREADY_IN_MAP = 1, // Player is already in the map
268 CANNOT_ENTER_NO_ENTRY, // No map entry was found for the target map ID
269 CANNOT_ENTER_UNINSTANCED_DUNGEON, // No instance template was found for dungeon map
270 CANNOT_ENTER_DIFFICULTY_UNAVAILABLE, // Requested instance difficulty is not available for target map
271 CANNOT_ENTER_NOT_IN_RAID, // Target instance is a raid instance and the player is not in a raid group
272 CANNOT_ENTER_CORPSE_IN_DIFFERENT_INSTANCE, // Player is dead and their corpse is not in target instance
273 CANNOT_ENTER_INSTANCE_BIND_MISMATCH, // Player's permanent instance save is not compatible with their group's current instance bind
274 CANNOT_ENTER_TOO_MANY_INSTANCES, // Player has entered too many instances recently
275 CANNOT_ENTER_MAX_PLAYERS, // Target map already has the maximum number of players allowed
276 CANNOT_ENTER_ZONE_IN_COMBAT, // A boss encounter is currently in progress on the target map
278 };
@ CANNOT_ENTER_CORPSE_IN_DIFFERENT_INSTANCE
Definition Map.h:272
@ CANNOT_ENTER_TOO_MANY_INSTANCES
Definition Map.h:274
@ CANNOT_ENTER_MAX_PLAYERS
Definition Map.h:275
@ CANNOT_ENTER_ZONE_IN_COMBAT
Definition Map.h:276
@ CAN_ENTER
Definition Map.h:266
@ CANNOT_ENTER_ALREADY_IN_MAP
Definition Map.h:267
@ CANNOT_ENTER_UNSPECIFIED_REASON
Definition Map.h:277
@ CANNOT_ENTER_NO_ENTRY
Definition Map.h:268
@ CANNOT_ENTER_DIFFICULTY_UNAVAILABLE
Definition Map.h:270
@ CANNOT_ENTER_INSTANCE_BIND_MISMATCH
Definition Map.h:273
@ CANNOT_ENTER_UNINSTANCED_DUNGEON
Definition Map.h:269
@ CANNOT_ENTER_NOT_IN_RAID
Definition Map.h:271

Constructor & Destructor Documentation

◆ Map()

Map::Map ( uint32  id,
uint32  InstanceId,
uint8  SpawnMode,
Map _parent = nullptr 
)
74 :
75 _mapGridManager(this), i_mapEntry(sMapStore.LookupEntry(id)), i_spawnMode(SpawnMode), i_InstanceId(InstanceId),
79{
80 m_parentMap = (_parent ? _parent : this);
81
82 _zonePlayerCountMap.clear();
84
85 //lets initialize visibility distance for map
87}
uint32 GetDefaultMapLight(uint32 mapId)
Definition DBCStores.cpp:880
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
#define UPDATABLE_OBJECT_LIST_RECHECK_TIMER
Definition Map.h:89
#define DEFAULT_VISIBILITY_DISTANCE
Definition ObjectDefines.h:40
MapEntry const * i_mapEntry
Definition Map.h:541
uint8 i_spawnMode
Definition Map.h:542
std::unordered_map< uint32, uint32 > _zonePlayerCountMap
Definition Map.h:615
TransportsContainer::iterator _transportsUpdateIter
Definition Map.h:558
uint32 m_unloadTimer
Definition Map.h:544
uint32 _defaultLight
Definition Map.h:618
Map * m_parentMap
Definition Map.h:572
IntervalTimer _updatableObjectListRecheckTimer
Definition Map.h:642
bool i_scriptLock
Definition Map.h:576
time_t _instanceResetPeriod
Definition Map.h:547
ActiveNonPlayers m_activeNonPlayers
Definition Map.h:553
float m_VisibleDistance
Definition Map.h:545
MapGridManager _mapGridManager
Definition Map.h:540
virtual void InitVisibilityDistance()
Definition Map.cpp:99
TransportsContainer _transports
Definition Map.h:557
uint32 i_InstanceId
Definition Map.h:543
ActiveNonPlayers::iterator m_activeNonPlayersIter
Definition Map.h:554
void SetInterval(time_t interval)
Definition Timer.h:179

References _updatableObjectListRecheckTimer, _zonePlayerCountMap, InitVisibilityDistance(), m_parentMap, IntervalTimer::SetInterval(), and UPDATABLE_OBJECT_LIST_RECHECK_TIMER.

◆ ~Map()

Map::~Map ( )
override
53{
54 // UnloadAll must be called before deleting the map
55
56 sScriptMgr->OnDestroyMap(this);
57
58 while (!i_worldObjects.empty())
59 {
60 WorldObject* obj = *i_worldObjects.begin();
61 ASSERT(obj->IsWorldObject());
62 LOG_DEBUG("maps", "Map::~Map: WorldObject TypeId is not a corpse! ({})", static_cast<uint8>(obj->GetTypeId()));
63 //ASSERT(obj->IsCorpse());
64 obj->RemoveFromWorld();
65 obj->ResetMap();
66 }
67
68 if (!m_scriptSchedule.empty())
69 sScriptMgr->DecreaseScheduledScriptCount(m_scriptSchedule.size());
70
72}
std::uint8_t uint8
Definition Define.h:109
#define ASSERT
Definition Errors.h:68
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
#define sScriptMgr
Definition ScriptMgr.h:727
static MMapMgr * createOrGetMMapMgr()
Definition MMapFactory.cpp:27
bool unloadMapInstance(uint32 mapId, uint32 instanceId)
Definition MMapMgr.cpp:279
ScriptScheduleMap m_scriptSchedule
Definition Map.h:581
uint32 GetId() const
Definition Map.h:224
std::unordered_set< WorldObject * > i_worldObjects
Definition Map.h:578
TypeID GetTypeId() const
Definition Object.h:128
Definition Object.h:461
virtual void ResetMap()
Definition Object.cpp:2124
bool IsWorldObject() const
Definition Object.h:638
void RemoveFromWorld() override
Definition Object.cpp:1175

References ASSERT, MMAP::MMapFactory::createOrGetMMapMgr(), GetId(), Object::GetTypeId(), i_InstanceId, i_worldObjects, WorldObject::IsWorldObject(), LOG_DEBUG, m_scriptSchedule, WorldObject::RemoveFromWorld(), WorldObject::ResetMap(), sScriptMgr, and MMAP::MMapMgr::unloadMapInstance().

Member Function Documentation

◆ _AddObjectToUpdateList()

void Map::_AddObjectToUpdateList ( WorldObject obj)
private
615{
616 UpdatableMapObject* mapUpdatableObject = dynamic_cast<UpdatableMapObject*>(obj);
617 ASSERT(mapUpdatableObject && mapUpdatableObject->GetUpdateState() == UpdatableMapObject::UpdateState::PendingAdd);
618
620 mapUpdatableObject->SetMapUpdateListOffset(_updatableObjectList.size());
621 _updatableObjectList.push_back(obj);
622}
UpdatableObjectList _updatableObjectList
Definition Map.h:640
Definition Object.h:418
void SetUpdateState(UpdateState state)
Definition Object.h:445
UpdateState GetUpdateState() const
Definition Object.h:450
@ PendingAdd
Definition Object.h:425
@ Updating
Definition Object.h:426
void SetMapUpdateListOffset(std::size_t const offset)
Definition Object.h:433

References _updatableObjectList, ASSERT, UpdatableMapObject::GetUpdateState(), UpdatableMapObject::PendingAdd, UpdatableMapObject::SetMapUpdateListOffset(), UpdatableMapObject::SetUpdateState(), and UpdatableMapObject::Updating.

Referenced by UpdateNonPlayerObjects().

◆ _FindGameObject()

GameObject * Map::_FindGameObject ( WorldObject pWorldObject,
ObjectGuid::LowType  guid 
) const
inlineprivate
268{
269 auto bounds = searchObject->GetMap()->GetGameObjectBySpawnIdStore().equal_range(guid);
270 if (bounds.first == bounds.second)
271 return nullptr;
272
273 return bounds.first->second;
274}

References GetGameObjectBySpawnIdStore(), and WorldObject::GetMap().

Referenced by _ScriptProcessDoor(), and ScriptsProcess().

◆ _GetScriptCreature()

Creature * Map::_GetScriptCreature ( Object obj,
bool  isSource,
const ScriptInfo scriptInfo 
) const
inlineprivate
187{
188 Creature* creature = nullptr;
189 if (!obj)
190 LOG_ERROR("maps.script", "{} {} object is nullptr.", scriptInfo->GetDebugInfo(), isSource ? "source" : "target");
191 else
192 {
193 creature = obj->ToCreature();
194 if (!creature)
195 LOG_ERROR("maps.script", "{} {} object is not a creature ({}).", scriptInfo->GetDebugInfo(),
196 isSource ? "source" : "target", obj->GetGUID().ToString());
197 }
198 return creature;
199}
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
Definition Creature.h:43
Creature * ToCreature()
Definition Object.h:206
std::string ToString(Type &&val, Params &&... params)
Definition StringConvert.h:250
std::string GetDebugInfo() const
Definition ObjectMgr.cpp:201

References ScriptInfo::GetDebugInfo(), Object::GetGUID(), LOG_ERROR, Object::ToCreature(), and ObjectGuid::ToString().

Referenced by ScriptsProcess().

◆ _GetScriptCreatureSourceOrTarget()

Creature * Map::_GetScriptCreatureSourceOrTarget ( Object source,
Object target,
const ScriptInfo scriptInfo,
bool  bReverse = false 
) const
inlineprivate
121{
122 Creature* creature = nullptr;
123 if (!source && !target)
124 LOG_ERROR("maps.script", "{} source and target objects are nullptr.", scriptInfo->GetDebugInfo());
125 else
126 {
127 if (bReverse)
128 {
129 // Check target first, then source.
130 if (target)
131 creature = target->ToCreature();
132 if (!creature && source)
133 creature = source->ToCreature();
134 }
135 else
136 {
137 // Check source first, then target.
138 if (source)
139 creature = source->ToCreature();
140 if (!creature && target)
141 creature = target->ToCreature();
142 }
143
144 if (!creature)
145 LOG_ERROR("maps.script", "{} neither source nor target are creatures (source: TypeId: {}, Entry: {}, GUID: {}; target: TypeId: {}, Entry: {}, GUID: {}), skipping.",
146 scriptInfo->GetDebugInfo(),
147 source ? source->GetTypeId() : 0, source ? source->GetEntry() : 0, source ? source->GetGUID().ToString() : "",
148 target ? target->GetTypeId() : 0, target ? target->GetEntry() : 0, target ? target->GetGUID().ToString() : "");
149 }
150 return creature;
151}
MapEntry const * GetEntry() const
Definition Map.h:165

References ScriptInfo::GetDebugInfo(), Object::GetEntry(), Object::GetGUID(), Object::GetTypeId(), LOG_ERROR, Object::ToCreature(), and ObjectGuid::ToString().

Referenced by ScriptsProcess().

◆ _GetScriptPlayer()

Player * Map::_GetScriptPlayer ( Object obj,
bool  isSource,
const ScriptInfo scriptInfo 
) const
inlineprivate
172{
173 Player* player = nullptr;
174 if (!obj)
175 LOG_ERROR("maps.script", "{} {} object is nullptr.", scriptInfo->GetDebugInfo(), isSource ? "source" : "target");
176 else
177 {
178 player = obj->ToPlayer();
179 if (!player)
180 LOG_ERROR("maps.script", "{} {} object is not a player ({}).",
181 scriptInfo->GetDebugInfo(), isSource ? "source" : "target", obj->GetGUID().ToString());
182 }
183 return player;
184}
Player * ToPlayer()
Definition Object.h:202
Definition Player.h:1083

References ScriptInfo::GetDebugInfo(), Object::GetGUID(), LOG_ERROR, Object::ToPlayer(), and ObjectGuid::ToString().

Referenced by ScriptsProcess().

◆ _GetScriptPlayerSourceOrTarget()

Player * Map::_GetScriptPlayerSourceOrTarget ( Object source,
Object target,
const ScriptInfo scriptInfo 
) const
inlineprivate
99{
100 Player* player = nullptr;
101 if (!source && !target)
102 LOG_ERROR("maps.script", "{} source and target objects are nullptr.", scriptInfo->GetDebugInfo());
103 else
104 {
105 // Check target first, then source.
106 if (target)
107 player = target->ToPlayer();
108 if (!player && source)
109 player = source->ToPlayer();
110
111 if (!player)
112 LOG_ERROR("maps.script", "{} neither source nor target object is player (source: TypeId: {}, Entry: {}, GUID: {}; target: TypeId: {}, Entry: {}, GUID: {}), skipping.",
113 scriptInfo->GetDebugInfo(),
114 source ? source->GetTypeId() : 0, source ? source->GetEntry() : 0, source ? source->GetGUID().ToString() : "",
115 target ? target->GetTypeId() : 0, target ? target->GetEntry() : 0, target ? target->GetGUID().ToString() : "");
116 }
117 return player;
118}

References ScriptInfo::GetDebugInfo(), Object::GetEntry(), Object::GetGUID(), Object::GetTypeId(), LOG_ERROR, Object::ToPlayer(), and ObjectGuid::ToString().

Referenced by ScriptsProcess().

◆ _GetScriptUnit()

Unit * Map::_GetScriptUnit ( Object obj,
bool  isSource,
const ScriptInfo scriptInfo 
) const
inlineprivate
154{
155 Unit* unit = nullptr;
156 if (!obj)
157 LOG_ERROR("maps.script", "{} {} object is nullptr.", scriptInfo->GetDebugInfo(), isSource ? "source" : "target");
158 else if (!obj->IsUnit())
159 LOG_ERROR("maps.script", "{} {} object is not unit (TypeId: {}, Entry: {}, GUID: {}), skipping.",
160 scriptInfo->GetDebugInfo(), isSource ? "source" : "target", obj->GetTypeId(), obj->GetEntry(), obj->GetGUID().ToString());
161 else
162 {
163 unit = obj->ToUnit();
164 if (!unit)
165 LOG_ERROR("maps.script", "{} {} object could not be casted to unit.",
166 scriptInfo->GetDebugInfo(), isSource ? "source" : "target");
167 }
168 return unit;
169}
bool IsUnit() const
Definition Object.h:209
Unit * ToUnit()
Definition Object.h:210
Definition Unit.h:620

References ScriptInfo::GetDebugInfo(), Object::GetEntry(), Object::GetGUID(), Object::GetTypeId(), Object::IsUnit(), LOG_ERROR, ObjectGuid::ToString(), and Object::ToUnit().

Referenced by ScriptsProcess().

◆ _GetScriptWorldObject()

WorldObject * Map::_GetScriptWorldObject ( Object obj,
bool  isSource,
const ScriptInfo scriptInfo 
) const
inlineprivate
202{
203 WorldObject* pWorldObject = nullptr;
204 if (!obj)
205 LOG_ERROR("maps.script", "{} {} object is nullptr.",
206 scriptInfo->GetDebugInfo(), isSource ? "source" : "target");
207 else
208 {
209 pWorldObject = dynamic_cast<WorldObject*>(obj);
210 if (!pWorldObject)
211 LOG_ERROR("maps.script", "{} {} object is not a world object ({}).",
212 scriptInfo->GetDebugInfo(), isSource ? "source" : "target", obj->GetGUID().ToString());
213 }
214 return pWorldObject;
215}

References ScriptInfo::GetDebugInfo(), Object::GetGUID(), LOG_ERROR, and ObjectGuid::ToString().

Referenced by ScriptsProcess().

◆ _RemoveObjectFromUpdateList()

void Map::_RemoveObjectFromUpdateList ( WorldObject obj)
private
626{
627 UpdatableMapObject* mapUpdatableObject = dynamic_cast<UpdatableMapObject*>(obj);
628 ASSERT(mapUpdatableObject && mapUpdatableObject->GetUpdateState() == UpdatableMapObject::UpdateState::Updating);
629
630 if (obj != _updatableObjectList.back())
631 {
632 dynamic_cast<UpdatableMapObject*>(_updatableObjectList.back())->SetMapUpdateListOffset(mapUpdatableObject->GetMapUpdateListOffset());
633 std::swap(_updatableObjectList[mapUpdatableObject->GetMapUpdateListOffset()], _updatableObjectList.back());
634 }
635
636 _updatableObjectList.pop_back();
638}
size_t GetMapUpdateListOffset() const
Definition Object.h:439
@ NotUpdating
Definition Object.h:424

References _updatableObjectList, ASSERT, UpdatableMapObject::GetMapUpdateListOffset(), UpdatableMapObject::GetUpdateState(), UpdatableMapObject::NotUpdating, UpdatableMapObject::SetUpdateState(), and UpdatableMapObject::Updating.

Referenced by RemoveObjectFromMapUpdateList(), and UpdateNonPlayerObjects().

◆ _ScriptProcessDoor()

void Map::_ScriptProcessDoor ( Object source,
Object target,
const ScriptInfo scriptInfo 
) const
inlineprivate
218{
219 bool bOpen = false;
220 ObjectGuid::LowType guid = scriptInfo->ToggleDoor.GOGuid;
221 int32 nTimeToToggle = std::max(15, int32(scriptInfo->ToggleDoor.ResetDelay));
222 switch (scriptInfo->command)
223 {
225 bOpen = true;
226 break;
228 break;
229 default:
230 LOG_ERROR("maps.script", "{} unknown command for _ScriptProcessDoor.", scriptInfo->GetDebugInfo());
231 return;
232 }
233 if (!guid)
234 LOG_ERROR("maps.script", "{} door guid is not specified.", scriptInfo->GetDebugInfo());
235 else if (!source)
236 LOG_ERROR("maps.script", "{} source object is nullptr.", scriptInfo->GetDebugInfo());
237 else if (!source->IsUnit())
238 LOG_ERROR("maps.script", "{} source object is not unit ({}), skipping.", scriptInfo->GetDebugInfo(), source->GetGUID().ToString());
239 else
240 {
241 WorldObject* wSource = dynamic_cast <WorldObject*> (source);
242 if (!wSource)
243 LOG_ERROR("maps.script", "{} source object could not be casted to world object ({}), skipping.", scriptInfo->GetDebugInfo(), source->GetGUID().ToString());
244 else
245 {
246 GameObject* pDoor = _FindGameObject(wSource, guid);
247 if (!pDoor)
248 LOG_ERROR("maps.script", "{} gameobject was not found (guid: {}).", scriptInfo->GetDebugInfo(), guid);
249 else if (pDoor->GetGoType() != GAMEOBJECT_TYPE_DOOR)
250 LOG_ERROR("maps.script", "{} gameobject is not a door ({}).",
251 scriptInfo->GetDebugInfo(), pDoor->GetGUID().ToString());
252 else if (bOpen == (pDoor->GetGoState() == GO_STATE_READY))
253 {
254 pDoor->UseDoorOrButton(nTimeToToggle);
255
256 if (target && target->isType(TYPEMASK_GAMEOBJECT))
257 {
258 GameObject* goTarget = target->ToGameObject();
259 if (goTarget && goTarget->GetGoType() == GAMEOBJECT_TYPE_BUTTON)
260 goTarget->UseDoorOrButton(nTimeToToggle);
261 }
262 }
263 }
264 }
265}
std::int32_t int32
Definition Define.h:103
@ GO_STATE_READY
Definition GameObjectData.h:690
@ TYPEMASK_GAMEOBJECT
Definition ObjectGuid.h:51
@ SCRIPT_COMMAND_CLOSE_DOOR
Definition ObjectMgr.h:104
@ SCRIPT_COMMAND_OPEN_DOOR
Definition ObjectMgr.h:103
@ GAMEOBJECT_TYPE_BUTTON
Definition SharedDefines.h:1561
@ GAMEOBJECT_TYPE_DOOR
Definition SharedDefines.h:1560
Definition GameObject.h:120
void UseDoorOrButton(uint32 time_to_restore=0, bool alternative=false, Unit *user=nullptr)
Definition GameObject.cpp:1414
GOState GetGoState() const
Definition GameObject.h:204
GameobjectTypes GetGoType() const
Definition GameObject.h:202
GameObject * _FindGameObject(WorldObject *pWorldObject, ObjectGuid::LowType guid) const
Definition MapScripts.cpp:267
std::string ToString() const
Definition ObjectGuid.cpp:47
uint32 LowType
Definition ObjectGuid.h:122
bool isType(uint16 mask) const
Definition Object.h:129
GameObject * ToGameObject()
Definition Object.h:214
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:113
struct ScriptInfo::@266::@279 ToggleDoor
ScriptCommands command
Definition ObjectMgr.h:194
uint32 ResetDelay
Definition ObjectMgr.h:287
uint32 GOGuid
Definition ObjectMgr.h:267

References _FindGameObject(), ScriptInfo::command, GAMEOBJECT_TYPE_BUTTON, GAMEOBJECT_TYPE_DOOR, ScriptInfo::GetDebugInfo(), GameObject::GetGoState(), GameObject::GetGoType(), Object::GetGUID(), GO_STATE_READY, ScriptInfo::GOGuid, Object::isType(), Object::IsUnit(), LOG_ERROR, ScriptInfo::ResetDelay, SCRIPT_COMMAND_CLOSE_DOOR, SCRIPT_COMMAND_OPEN_DOOR, Object::ToGameObject(), ScriptInfo::ToggleDoor, ObjectGuid::ToString(), TYPEMASK_GAMEOBJECT, and GameObject::UseDoorOrButton().

Referenced by ScriptsProcess().

◆ AddCorpse()

void Map::AddCorpse ( Corpse corpse)
2673{
2674 corpse->SetMap(this);
2675
2676 GridCoord const gridCoord = Acore::ComputeGridCoord(corpse->GetPositionX(), corpse->GetPositionY());
2677 _corpsesByGrid[gridCoord.GetId()].insert(corpse);
2678 if (corpse->GetType() != CORPSE_BONES)
2679 _corpsesByPlayer[corpse->GetOwnerGUID()] = corpse;
2680 else
2681 _corpseBones.insert(corpse);
2682}
@ CORPSE_BONES
Definition Corpse.h:28
ObjectGuid GetOwnerGUID() const
Definition Corpse.h:68
CorpseType GetType() const
Definition Corpse.h:72
std::unordered_map< ObjectGuid, Corpse * > _corpsesByPlayer
Definition Map.h:635
std::unordered_set< Corpse * > _corpseBones
Definition Map.h:636
std::unordered_map< uint32, std::unordered_set< Corpse * > > _corpsesByGrid
Definition Map.h:634
virtual void SetMap(Map *map)
Definition Object.cpp:2098
GridCoord ComputeGridCoord(float x, float y)
Definition GridDefines.h:181
Definition GridDefines.h:84
uint32 GetId() const
Definition GridDefines.h:146
float GetPositionX() const
Definition Position.h:121
float GetPositionY() const
Definition Position.h:122

References _corpseBones, _corpsesByGrid, _corpsesByPlayer, Acore::ComputeGridCoord(), CORPSE_BONES, CoordPair< LIMIT >::GetId(), Corpse::GetOwnerGUID(), Position::GetPositionX(), Position::GetPositionY(), Corpse::GetType(), and WorldObject::SetMap().

Referenced by ConvertCorpseToBones(), Player::CreateCorpse(), and LoadCorpseData().

◆ AddCreatureToMoveList()

void Map::AddCreatureToMoveList ( Creature c)
private
857{
859 _creaturesToMove.push_back(c);
861}
@ MAP_OBJECT_CELL_MOVE_ACTIVE
Definition Object.h:395
@ MAP_OBJECT_CELL_MOVE_NONE
Definition Object.h:394
std::vector< Creature * > _creaturesToMove
Definition Map.h:521
MapObjectCellMoveState _moveState
Definition Object.h:414

References _creaturesToMove, MovableMapObject::_moveState, MAP_OBJECT_CELL_MOVE_ACTIVE, and MAP_OBJECT_CELL_MOVE_NONE.

Referenced by CreatureRelocation().

◆ AddDynamicObjectToMoveList()

void Map::AddDynamicObjectToMoveList ( DynamicObject go)
private
883{
884 if (dynObj->_moveState == MAP_OBJECT_CELL_MOVE_NONE)
885 _dynamicObjectsToMove.push_back(dynObj);
886 dynObj->_moveState = MAP_OBJECT_CELL_MOVE_ACTIVE;
887}
std::vector< DynamicObject * > _dynamicObjectsToMove
Definition Map.h:523

References _dynamicObjectsToMove, MovableMapObject::_moveState, MAP_OBJECT_CELL_MOVE_ACTIVE, and MAP_OBJECT_CELL_MOVE_NONE.

Referenced by DynamicObjectRelocation().

◆ AddGameObjectToMoveList()

void Map::AddGameObjectToMoveList ( GameObject go)
private
870{
872 _gameObjectsToMove.push_back(go);
874}
std::vector< GameObject * > _gameObjectsToMove
Definition Map.h:522

References _gameObjectsToMove, MovableMapObject::_moveState, MAP_OBJECT_CELL_MOVE_ACTIVE, and MAP_OBJECT_CELL_MOVE_NONE.

Referenced by GameObjectRelocation().

◆ AddObjectToPendingUpdateList()

void Map::AddObjectToPendingUpdateList ( WorldObject obj)
601{
602 if (!obj->CanBeAddedToMapUpdateList())
603 return;
604
605 UpdatableMapObject* mapUpdatableObject = dynamic_cast<UpdatableMapObject*>(obj);
607 return;
608
611}
PendingAddUpdatableObjectList _pendingAddUpdatableObjectList
Definition Map.h:641
bool CanBeAddedToMapUpdateList()
Definition Object.cpp:3228

References _pendingAddUpdatableObjectList, WorldObject::CanBeAddedToMapUpdateList(), UpdatableMapObject::GetUpdateState(), UpdatableMapObject::NotUpdating, UpdatableMapObject::PendingAdd, and UpdatableMapObject::SetUpdateState().

Referenced by WorldObject::AddToWorld(), and Player::UpdateVisibilityOf().

◆ AddObjectToRemoveList()

void Map::AddObjectToRemoveList ( WorldObject obj)
1762{
1763 ASSERT(obj->GetMapId() == GetId() && obj->GetInstanceId() == GetInstanceId());
1764
1765 obj->CleanupsBeforeDelete(false); // remove or simplify at least cross referenced links
1766
1767 i_objectsToRemove.insert(obj);
1768 //LOG_DEBUG("maps", "Object ({}) added to removing list.", obj->GetGUID().ToString());
1769}
std::unordered_set< WorldObject * > i_objectsToRemove
Definition Map.h:577
uint32 GetInstanceId() const
Definition Map.h:261
uint32 GetMapId() const
Definition Position.h:280
uint32 GetInstanceId() const
Definition Object.h:499
virtual void CleanupsBeforeDelete(bool finalCleanup=true)
Definition Object.cpp:1123

References ASSERT, WorldObject::CleanupsBeforeDelete(), GetId(), WorldObject::GetInstanceId(), GetInstanceId(), WorldLocation::GetMapId(), and i_objectsToRemove.

Referenced by WorldObject::AddObjectToRemoveList(), and wp_commandscript::HandleWpModifyCommand().

◆ AddPlayerToMap()

bool Map::AddPlayerToMap ( Player player)
virtual

Reimplemented in InstanceMap, and BattlegroundMap.

270{
271 CellCoord cellCoord = Acore::ComputeCellCoord(player->GetPositionX(), player->GetPositionY());
272 if (!cellCoord.IsCoordValid())
273 {
274 LOG_ERROR("maps", "Map::Add: Player ({}) has invalid coordinates X:{} Y:{} grid cell [{}:{}]",
275 player->GetGUID().ToString(), player->GetPositionX(), player->GetPositionY(), cellCoord.x_coord, cellCoord.y_coord);
276 return false;
277 }
278
279 Cell cell(cellCoord);
281 AddToGrid(player, cell);
282
283 // Check if we are adding to correct map
284 ASSERT (player->GetMap() == this);
285 player->SetMap(this);
286 player->AddToWorld();
287
288 SendInitTransports(player);
289 SendInitSelf(player);
290 SendZoneDynamicInfo(player);
291
292 player->m_clientGUIDs.clear();
293 player->UpdateObjectVisibility(false);
294
295 if (player->IsAlive())
296 ConvertCorpseToBones(player->GetGUID());
297
298 sScriptMgr->OnPlayerEnterMap(this, player);
299 return true;
300}
#define MAX_VISIBILITY_DISTANCE
Definition ObjectDefines.h:31
void LoadGridsInRange(Position const &center, float radius)
Definition Map.cpp:239
void SendZoneDynamicInfo(Player *player)
Definition Map.cpp:2795
void SendInitSelf(Player *player)
Definition Map.cpp:1613
void AddToGrid(T *object, Cell const &cell)
Definition Map.cpp:117
void SendInitTransports(Player *player)
Definition Map.cpp:1648
Corpse * ConvertCorpseToBones(ObjectGuid const ownerGuid, bool insignia=false)
Definition Map.cpp:2705
GuidUnorderedSet m_clientGUIDs
Definition Player.h:2400
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition PlayerUpdates.cpp:1617
void AddToWorld() override
Definition Player.cpp:1710
void SetMap(Map *map) override
Definition Player.cpp:14656
bool IsAlive() const
Definition Unit.h:1707
Map * GetMap() const
Definition Object.h:587
CellCoord ComputeCellCoord(float x, float y)
Definition GridDefines.h:193
Definition Cell.h:45
bool IsCoordValid() const
Definition GridDefines.h:134
uint32 x_coord
Definition GridDefines.h:151
uint32 y_coord
Definition GridDefines.h:152

References AddToGrid(), Player::AddToWorld(), ASSERT, Acore::ComputeCellCoord(), ConvertCorpseToBones(), Object::GetGUID(), WorldObject::GetMap(), Position::GetPositionX(), Position::GetPositionY(), Unit::IsAlive(), CoordPair< LIMIT >::IsCoordValid(), LoadGridsInRange(), LOG_ERROR, Player::m_clientGUIDs, MAX_VISIBILITY_DISTANCE, SendInitSelf(), SendInitTransports(), SendZoneDynamicInfo(), Player::SetMap(), sScriptMgr, ObjectGuid::ToString(), Player::UpdateObjectVisibility(), CoordPair< LIMIT >::x_coord, and CoordPair< LIMIT >::y_coord.

Referenced by InstanceMap::AddPlayerToMap(), BattlegroundMap::AddPlayerToMap(), and WorldSession::HandlePlayerLoginFromDB().

◆ AddToActive() [1/5]

template<>
void Map::AddToActive ( Corpse )
1853{
1854 // do nothing for corpses
1855}

◆ AddToActive() [2/5]

template<>
void Map::AddToActive ( Creature c)
1835{
1837}
void AddToActiveHelper(WorldObject *obj)
Definition Map.h:586

References AddToActiveHelper().

◆ AddToActive() [3/5]

template<>
void Map::AddToActive ( DynamicObject d)
1841{
1843}

References AddToActiveHelper().

◆ AddToActive() [4/5]

template<>
void Map::AddToActive ( GameObject d)
1847{
1849}

References AddToActiveHelper().

◆ AddToActive() [5/5]

template<class T >
void Map::AddToActive ( T *  obj)

◆ AddToActiveHelper()

void Map::AddToActiveHelper ( WorldObject obj)
inlineprivate
587 {
588 m_activeNonPlayers.insert(obj);
589 }

References m_activeNonPlayers.

Referenced by AddToActive(), AddToActive(), AddToActive(), and AddToActive().

◆ AddToGrid() [1/5]

template<>
void Map::AddToGrid ( Corpse obj,
Cell const &  cell 
)
161{
162 MapGridType* grid = GetMapGrid(cell.GridX(), cell.GridY());
163 // Corpses are a special object type - they can be added to grid via a call to AddToMap
164 // or loaded through ObjectGridLoader.
165 // Both corpses loaded from database and these freshly generated by Player::CreateCoprse are added to _corpsesByCell
166 // ObjectGridLoader loads all corpses from _corpsesByCell even if they were already added to grid before it was loaded
167 // so we need to explicitly check it here (Map::AddToGrid is only called from Player::BuildPlayerRepop, not from ObjectGridLoader)
168 // to avoid failing an assertion in GridObject::AddToGrid
169 if (grid->IsObjectDataLoaded())
170 {
171 if (obj->IsWorldObject())
172 grid->AddWorldObject(cell.CellX(), cell.CellY(), obj);
173 else
174 grid->AddGridObject(cell.CellX(), cell.CellY(), obj);
175 }
176}
Definition MapGrid.h:32
void AddGridObject(uint16 const x, uint16 const y, SPECIFIC_OBJECT *obj)
Definition MapGrid.h:58
void AddWorldObject(uint16 const x, uint16 const y, SPECIFIC_OBJECT *obj)
Definition MapGrid.h:48
bool IsObjectDataLoaded() const
Definition MapGrid.h:45
MapGridType * GetMapGrid(uint16 const x, uint16 const y)
Definition Map.cpp:212

References MapGrid< WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES >::AddGridObject(), MapGrid< WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES >::AddWorldObject(), Cell::CellX(), Cell::CellY(), GetMapGrid(), Cell::GridX(), Cell::GridY(), MapGrid< WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES >::IsObjectDataLoaded(), and WorldObject::IsWorldObject().

◆ AddToGrid() [2/5]

template<>
void Map::AddToGrid ( Creature obj,
Cell const &  cell 
)
128{
129 MapGridType* grid = GetMapGrid(cell.GridX(), cell.GridY());
130 if (obj->IsWorldObject())
131 grid->AddWorldObject(cell.CellX(), cell.CellY(), obj);
132 else
133 grid->AddGridObject(cell.CellX(), cell.CellY(), obj);
134
135 obj->SetCurrentCell(cell);
136}
void SetCurrentCell(Cell const &cell)
Definition Object.h:411

References MapGrid< WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES >::AddGridObject(), MapGrid< WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES >::AddWorldObject(), Cell::CellX(), Cell::CellY(), GetMapGrid(), Cell::GridX(), Cell::GridY(), WorldObject::IsWorldObject(), and MovableMapObject::SetCurrentCell().

◆ AddToGrid() [3/5]

template<>
void Map::AddToGrid ( DynamicObject obj,
Cell const &  cell 
)
149{
150 MapGridType* grid = GetMapGrid(cell.GridX(), cell.GridY());
151 if (obj->IsWorldObject())
152 grid->AddWorldObject(cell.CellX(), cell.CellY(), obj);
153 else
154 grid->AddGridObject(cell.CellX(), cell.CellY(), obj);
155
156 obj->SetCurrentCell(cell);
157}

References MapGrid< WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES >::AddGridObject(), MapGrid< WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES >::AddWorldObject(), Cell::CellX(), Cell::CellY(), GetMapGrid(), Cell::GridX(), Cell::GridY(), WorldObject::IsWorldObject(), and MovableMapObject::SetCurrentCell().

◆ AddToGrid() [4/5]

template<>
void Map::AddToGrid ( GameObject obj,
Cell const &  cell 
)
140{
141 MapGridType* grid = GetMapGrid(cell.GridX(), cell.GridY());
142 grid->AddGridObject(cell.CellX(), cell.CellY(), obj);
143
144 obj->SetCurrentCell(cell);
145}

References MapGrid< WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES >::AddGridObject(), Cell::CellX(), Cell::CellY(), GetMapGrid(), Cell::GridX(), Cell::GridY(), and MovableMapObject::SetCurrentCell().

◆ AddToGrid() [5/5]

template<class T >
void Map::AddToGrid ( T *  object,
Cell const &  cell 
)
protected

◆ AddToMap() [1/2]

template<>
bool Map::AddToMap ( MotionTransport obj,
bool   
)
378{
379 //TODO: Needs clean up. An object should not be added to map twice.
380 if (obj->IsInWorld())
381 return true;
382
384 if (!cellCoord.IsCoordValid())
385 {
386 LOG_ERROR("maps", "Map::Add: Object {} has invalid coordinates X:{} Y:{} grid cell [{}:{}]",
387 obj->GetGUID().ToString(), obj->GetPositionX(), obj->GetPositionY(), cellCoord.x_coord, cellCoord.y_coord);
388 return false; //Should delete object
389 }
390
391 Cell cell(cellCoord);
392 if (obj->isActiveObject())
393 EnsureGridLoaded(cell);
394
395 obj->AddToWorld();
396
397 if (obj->isActiveObject())
398 AddToActive(obj);
399
400 _transports.insert(obj);
401
402 // Broadcast creation to players
403 if (!GetPlayers().IsEmpty())
404 {
405 for (Map::PlayerList::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
406 {
407 if (itr->GetSource()->GetTransport() != obj)
408 {
409 UpdateData data;
410 obj->BuildCreateUpdateBlockForPlayer(&data, itr->GetSource());
411 WorldPacket packet;
412 data.BuildPacket(packet);
413 itr->GetSource()->SendDirectMessage(&packet);
414 }
415 }
416 }
417
418 return true;
419}
void AddToWorld() override
Definition GameObject.cpp:140
iterator begin()
Definition GridRefMgr.h:35
Definition LinkedList.h:139
bool IsEmpty() const
Definition LinkedList.h:97
iterator end()
Definition MapRefMgr.h:37
void AddToActive(T *obj)
Definition Map.cpp:1828
bool EnsureGridLoaded(Cell const &cell)
Definition Map.cpp:199
PlayerList const & GetPlayers() const
Definition Map.h:324
bool IsInWorld() const
Definition Object.h:108
virtual void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition Object.cpp:189
Definition UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition UpdateData.cpp:48
bool isActiveObject() const
Definition Object.h:633
Definition WorldPacket.h:26

References _transports, AddToActive(), GameObject::AddToWorld(), GridRefMgr< MapGridType >::begin(), Object::BuildCreateUpdateBlockForPlayer(), UpdateData::BuildPacket(), Acore::ComputeCellCoord(), MapRefMgr::end(), EnsureGridLoaded(), Object::GetGUID(), GetPlayers(), Position::GetPositionX(), Position::GetPositionY(), WorldObject::isActiveObject(), CoordPair< LIMIT >::IsCoordValid(), LinkedListHead::IsEmpty(), Object::IsInWorld(), LOG_ERROR, ObjectGuid::ToString(), CoordPair< LIMIT >::x_coord, and CoordPair< LIMIT >::y_coord.

◆ AddToMap() [2/2]

template<class T >
bool Map::AddToMap ( T *  obj,
bool  checkTransport = false 
)
321{
322 //TODO: Needs clean up. An object should not be added to map twice.
323 if (obj->IsInWorld())
324 {
325 ASSERT(obj->IsInGrid());
326 obj->UpdateObjectVisibilityOnCreate();
327 return true;
328 }
329
330 CellCoord cellCoord = Acore::ComputeCellCoord(obj->GetPositionX(), obj->GetPositionY());
331 //It will create many problems (including crashes) if an object is not added to grid after creation
332 //The correct way to fix it is to make AddToMap return false and delete the object if it is not added to grid
333 //But now AddToMap is used in too many places, I will just see how many ASSERT failures it will cause
334 ASSERT(cellCoord.IsCoordValid());
335 if (!cellCoord.IsCoordValid())
336 {
337 LOG_ERROR("maps", "Map::AddToMap: Object {} has invalid coordinates X:{} Y:{} grid cell [{}:{}]",
338 obj->GetGUID().ToString(), obj->GetPositionX(), obj->GetPositionY(), cellCoord.x_coord, cellCoord.y_coord);
339 return false; //Should delete object
340 }
341
342 Cell cell(cellCoord);
343 if (obj->isActiveObject())
344 EnsureGridLoaded(cell);
345 else
346 EnsureGridCreated(GridCoord(cell.GridX(), cell.GridY()));
347
348 AddToGrid(obj, cell);
349
350 //Must already be set before AddToMap. Usually during obj->Create.
351 //obj->SetMap(this);
352 obj->AddToWorld();
353
354 if (checkTransport)
355 if (!(obj->IsGameObject() && obj->ToGameObject()->IsTransport())) // dont add transport to transport ;d
356 if (Transport* transport = GetTransportForPos(obj->GetPhaseMask(), obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), obj))
357 transport->AddPassenger(obj, true);
358
359 InitializeObject(obj);
360
361 if (obj->isActiveObject())
362 AddToActive(obj);
363
364 //something, such as vehicle, needs to be update immediately
365 //also, trigger needs to cast spell, if not update, cannot see visual
366 obj->UpdateObjectVisibility(true);
367
368 // Xinef: little hack for vehicles, accessories have to be added after visibility update so they wont fall off the vehicle, moved from Creature::AIM_Initialize
369 // Initialize vehicle, this is done only for summoned npcs, DB creatures are handled by grid loaders
370 if (obj->IsCreature())
371 if (Vehicle* vehicle = obj->ToCreature()->GetVehicleKit())
372 vehicle->Reset();
373 return true;
374}
CoordPair< MAX_NUMBER_OF_GRIDS > GridCoord
Definition GridDefines.h:167
void InitializeObject(T *obj)
Definition Map.cpp:303
Transport * GetTransportForPos(uint32 phase, float x, float y, float z, WorldObject *worldobject=nullptr)
Definition Map.cpp:1095
void EnsureGridCreated(GridCoord const &gridCoord)
Definition Map.cpp:194
Definition Transport.h:30
Definition Vehicle.h:28

References AddToActive(), AddToGrid(), ASSERT, Acore::ComputeCellCoord(), EnsureGridCreated(), EnsureGridLoaded(), GetTransportForPos(), Cell::GridX(), Cell::GridY(), InitializeObject(), CoordPair< LIMIT >::IsCoordValid(), LOG_ERROR, CoordPair< LIMIT >::x_coord, and CoordPair< LIMIT >::y_coord.

Referenced by Battleground::AddCreature(), Battleground::AddObject(), Player::BuildPlayerRepop(), ConvertCorpseToBones(), GameObject::Create(), MotionTransport::CreateGOPassenger(), MotionTransport::CreateNPCPassenger(), Player::CreatePet(), Player::CreatePet(), TransportMgr::CreateTransport(), MotionTransport::DelayedTeleportTransport(), Spell::EffectCreateTamedPet(), Spell::EffectDuel(), Spell::EffectSummonObject(), Spell::EffectSummonObjectWild(), Spell::EffectTameCreature(), Spell::EffectTransmitted(), GameEventMgr::GameEventSpawn(), debug_commandscript::HandleDebugSpawnVehicleCommand(), OutdoorPvPSI::HandleDropFlag(), Pet::LoadPetFromDB(), GameObject::Refresh(), ScriptsProcess(), Battlefield::SpawnCreature(), Battlefield::SpawnGameObject(), SummonCreature(), SummonGameObject(), WorldObject::SummonGameObject(), Player::SummonPet(), and GameObject::Update().

◆ AddUpdateObject()

void Map::AddUpdateObject ( Object obj)
inline
484 {
485 _updateObjects.insert(obj);
486 }
std::unordered_set< Object * > _updateObjects
Definition Map.h:638

References _updateObjects.

Referenced by WorldObject::AddToObjectUpdate().

◆ AddWorldObject()

void Map::AddWorldObject ( WorldObject obj)
inline
318{ i_worldObjects.insert(obj); }

References i_worldObjects.

Referenced by WorldObject::SetMap().

◆ AfterPlayerUnlinkFromMap()

void Map::AfterPlayerUnlinkFromMap ( )
virtual

◆ AllTransportsEmpty()

bool Map::AllTransportsEmpty ( ) const
2641{
2642 for (TransportsContainer::const_iterator itr = _transports.begin(); itr != _transports.end(); ++itr)
2643 if (!(*itr)->GetPassengers().empty())
2644 return false;
2645
2646 return true;
2647}

References _transports.

Referenced by MapInstanced::CreateInstanceForPlayer(), and UnloadAll().

◆ AllTransportsRemovePassengers()

void Map::AllTransportsRemovePassengers ( )
2650{
2651 for (TransportsContainer::const_iterator itr = _transports.begin(); itr != _transports.end(); ++itr)
2652 while (!(*itr)->GetPassengers().empty())
2653 (*itr)->RemovePassenger(*((*itr)->GetPassengers().begin()), true);
2654}

References _transports.

Referenced by MapInstanced::CreateInstanceForPlayer(), and UnloadAll().

◆ ApplyDynamicModeRespawnScaling()

uint32 Map::ApplyDynamicModeRespawnScaling ( WorldObject const *  obj,
uint32  respawnDelay 
) const
1710{
1711 ASSERT(obj->GetMap() == this);
1712
1713 float rate = sWorld->getFloatConfig(obj->IsGameObject() ? CONFIG_RESPAWN_DYNAMICRATE_GAMEOBJECT : CONFIG_RESPAWN_DYNAMICRATE_CREATURE);
1714
1715 if (rate == 1.0f)
1716 return respawnDelay;
1717
1718 // No instanced maps (dungeons, battlegrounds, arenas etc.)
1719 if (obj->GetMap()->Instanceable())
1720 return respawnDelay;
1721
1722 // No quest givers or world bosses
1723 if (Creature const* creature = obj->ToCreature())
1724 if (creature->IsQuestGiver() || creature->isWorldBoss()
1725 || (creature->GetCreatureTemplate()->rank == CREATURE_ELITE_RARE)
1726 || (creature->GetCreatureTemplate()->rank == CREATURE_ELITE_RAREELITE))
1727 return respawnDelay;
1728
1729 auto it = _zonePlayerCountMap.find(obj->GetZoneId());
1730 if (it == _zonePlayerCountMap.end())
1731 return respawnDelay;
1732 uint32 const playerCount = it->second;
1733 if (!playerCount)
1734 return respawnDelay;
1735 double const adjustFactor = rate / playerCount;
1736 if (adjustFactor >= 1.0) // nothing to do here
1737 return respawnDelay;
1738 uint32 const timeMinimum = sWorld->getIntConfig(obj->IsGameObject() ? CONFIG_RESPAWN_DYNAMICMINIMUM_GAMEOBJECT : CONFIG_RESPAWN_DYNAMICMINIMUM_CREATURE);
1739 if (respawnDelay <= timeMinimum)
1740 return respawnDelay;
1741
1742 return std::max<uint32>(std::ceil(respawnDelay * adjustFactor), timeMinimum);
1743}
std::uint32_t uint32
Definition Define.h:107
@ CREATURE_ELITE_RARE
Definition SharedDefines.h:2974
@ CREATURE_ELITE_RAREELITE
Definition SharedDefines.h:2972
@ CONFIG_RESPAWN_DYNAMICRATE_CREATURE
Definition WorldConfig.h:159
@ CONFIG_RESPAWN_DYNAMICMINIMUM_CREATURE
Definition WorldConfig.h:381
@ CONFIG_RESPAWN_DYNAMICRATE_GAMEOBJECT
Definition WorldConfig.h:158
@ CONFIG_RESPAWN_DYNAMICMINIMUM_GAMEOBJECT
Definition WorldConfig.h:380
#define sWorld
Definition World.h:320

References _zonePlayerCountMap, ASSERT, CONFIG_RESPAWN_DYNAMICMINIMUM_CREATURE, CONFIG_RESPAWN_DYNAMICMINIMUM_GAMEOBJECT, CONFIG_RESPAWN_DYNAMICRATE_CREATURE, CONFIG_RESPAWN_DYNAMICRATE_GAMEOBJECT, CREATURE_ELITE_RARE, CREATURE_ELITE_RAREELITE, WorldObject::GetMap(), WorldObject::GetZoneId(), Instanceable(), Object::IsGameObject(), sWorld, and Object::ToCreature().

Referenced by Creature::setDeathState(), and GameObject::Update().

◆ Balance()

void Map::Balance ( )
inline
void balance()
Definition DynamicTree.cpp:132
DynamicMapTree _dynamicTree
Definition Map.h:546

References _dynamicTree, and DynamicMapTree::balance().

Referenced by EnsureGridLoaded().

◆ CannotEnter()

virtual EnterState Map::CannotEnter ( Player ,
bool   
)
inlinevirtual

◆ CanReachPositionAndGetValidCoords() [1/3]

bool Map::CanReachPositionAndGetValidCoords ( WorldObject const *  source,
float &  destX,
float &  destY,
float &  destZ,
bool  failOnCollision = true,
bool  failOnSlopes = true 
) const

validate the new destination and set reachable coords Check if a given unit can reach a specific point on a segment and set the correct dest coords NOTE: use this method with small segments.

Parameters
failOnCollisionif true, the methods will return false when a collision occurs
failOnSlopesif true, the methods will return false when a non walkable slope is found
Returns
true if the destination is valid, false otherwise
2959{
2960 return CanReachPositionAndGetValidCoords(source, source->GetPositionX(), source->GetPositionY(), source->GetPositionZ(), destX, destY, destZ, failOnCollision, failOnSlopes);
2961}
bool CanReachPositionAndGetValidCoords(WorldObject const *source, PathGenerator *path, float &destX, float &destY, float &destZ, bool failOnCollision=true, bool failOnSlopes=true) const
Check if a given source can reach a specific point following a path and normalize the coords....
Definition Map.cpp:2918

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

◆ CanReachPositionAndGetValidCoords() [2/3]

bool Map::CanReachPositionAndGetValidCoords ( WorldObject const *  source,
float  startX,
float  startY,
float  startZ,
float &  destX,
float &  destY,
float &  destZ,
bool  failOnCollision = true,
bool  failOnSlopes = true 
) const
2964{
2965 if (!CheckCollisionAndGetValidCoords(source, startX, startY, startZ, destX, destY, destZ, failOnCollision))
2966 {
2967 return false;
2968 }
2969
2970 Unit const* unit = source->ToUnit();
2971 // if it's not an unit (Object) then we do not have to continue
2972 // with walkable checks
2973 if (!unit)
2974 {
2975 return true;
2976 }
2977
2978 /*
2979 * Walkable checks
2980 */
2981 bool isWaterNext = HasEnoughWater(unit, destX, destY, destZ);
2982 Creature const* creature = unit->ToCreature();
2983 bool cannotEnterWater = isWaterNext && (creature && !creature->CanEnterWater());
2984 bool cannotWalkOrFly = !isWaterNext && !source->ToPlayer() && !unit->CanFly() && (creature && !creature->CanWalk());
2985 if (cannotEnterWater || cannotWalkOrFly ||
2986 (failOnSlopes && !PathGenerator::IsWalkableClimb(startX, startY, startZ, destX, destY, destZ, source->GetCollisionHeight())))
2987 {
2988 return false;
2989 }
2990
2991 return true;
2992}
bool CanWalk() const
Definition Creature.h:79
bool CanEnterWater() const override
Definition Creature.cpp:3286
bool HasEnoughWater(WorldObject const *searcher, float x, float y, float z) const
Definition Map.cpp:1594
bool CheckCollisionAndGetValidCoords(WorldObject const *source, float startX, float startY, float startZ, float &destX, float &destY, float &destZ, bool failOnCollision=true) const
validate the new destination and set coords Check if a given unit can face collisions in a specific s...
Definition Map.cpp:3001
bool IsWalkableClimb(float const *v1, float const *v2) const
Definition PathGenerator.cpp:969
virtual bool CanFly() const =0

References Creature::CanEnterWater(), Unit::CanFly(), Creature::CanWalk(), CheckCollisionAndGetValidCoords(), WorldObject::GetCollisionHeight(), HasEnoughWater(), PathGenerator::IsWalkableClimb(), Object::ToCreature(), Object::ToPlayer(), and Object::ToUnit().

◆ CanReachPositionAndGetValidCoords() [3/3]

bool Map::CanReachPositionAndGetValidCoords ( WorldObject const *  source,
PathGenerator path,
float &  destX,
float &  destY,
float &  destZ,
bool  failOnCollision = true,
bool  failOnSlopes = true 
) const

Check if a given source can reach a specific point following a path and normalize the coords. Use this method for long paths, otherwise use the overloaded method with the start coords when you need to do a quick check on small segments.

2919{
2920 G3D::Vector3 prevPath = path->GetStartPosition();
2921 for (auto& vector : path->GetPath())
2922 {
2923 float x = vector.x;
2924 float y = vector.y;
2925 float z = vector.z;
2926
2927 if (!CanReachPositionAndGetValidCoords(source, prevPath.x, prevPath.y, prevPath.z, x, y, z, failOnCollision, failOnSlopes))
2928 {
2929 destX = x;
2930 destY = y;
2931 destZ = z;
2932 return false;
2933 }
2934
2935 prevPath = vector;
2936 }
2937
2938 destX = prevPath.x;
2939 destY = prevPath.y;
2940 destZ = prevPath.z;
2941
2942 return true;
2943}
G3D::Vector3 const & GetStartPosition() const
Definition PathGenerator.h:86

References CanReachPositionAndGetValidCoords(), PathGenerator::GetPath(), and PathGenerator::GetStartPosition().

Referenced by CanReachPositionAndGetValidCoords(), CanReachPositionAndGetValidCoords(), MotionMaster::MoveBackwards(), and MotionMaster::MoveForwards().

◆ CanUnload()

bool Map::CanUnload ( uint32  diff)
inline
169 {
170 if (!m_unloadTimer)
171 return false;
172
173 if (m_unloadTimer <= diff)
174 return true;
175
176 m_unloadTimer -= diff;
177 return false;
178 }

References m_unloadTimer.

◆ CheckCollisionAndGetValidCoords()

bool Map::CheckCollisionAndGetValidCoords ( WorldObject const *  source,
float  startX,
float  startY,
float  startZ,
float &  destX,
float &  destY,
float &  destZ,
bool  failOnCollision = true 
) const

validate the new destination and set coords Check if a given unit can face collisions in a specific segment

Returns
true if the destination is valid, false otherwise
3002{
3003 // Prevent invalid coordinates here, position is unchanged
3004 if (!Acore::IsValidMapCoord(startX, startY, startZ) || !Acore::IsValidMapCoord(destX, destY, destZ))
3005 {
3006 LOG_FATAL("maps", "Map::CheckCollisionAndGetValidCoords invalid coordinates startX: {}, startY: {}, startZ: {}, destX: {}, destY: {}, destZ: {}", startX, startY, startZ, destX, destY, destZ);
3007 return false;
3008 }
3009
3010 bool isWaterNext = IsInWater(source->GetPhaseMask(), destX, destY, destZ, source->GetCollisionHeight());
3011
3012 PathGenerator path(source);
3013
3014 // Use a detour raycast to get our first collision point
3015 path.SetUseRaycast(true);
3016 bool result = path.CalculatePath(startX, startY, startZ, destX, destY, destZ, false);
3017
3018 Unit const* unit = source->ToUnit();
3019 bool notOnGround = path.GetPathType() & PATHFIND_NOT_USING_PATH
3020 || isWaterNext || (unit && unit->IsFlying());
3021
3022 // Check for valid path types before we proceed
3023 if (!result || (!notOnGround && path.GetPathType() & ~(PATHFIND_NORMAL | PATHFIND_SHORTCUT | PATHFIND_INCOMPLETE | PATHFIND_FARFROMPOLY_END)))
3024 {
3025 return false;
3026 }
3027
3028 G3D::Vector3 endPos = path.GetPath().back();
3029 destX = endPos.x;
3030 destY = endPos.y;
3031 destZ = endPos.z;
3032
3033 // collision check
3034 bool collided = false;
3035
3036 // check static LOS
3037 float halfHeight = source->GetCollisionHeight() * 0.5f;
3038
3039 // Unit is not on the ground, check for potential collision via vmaps
3040 if (notOnGround)
3041 {
3042 bool col = VMAP::VMapFactory::createOrGetVMapMgr()->GetObjectHitPos(source->GetMapId(),
3043 startX, startY, startZ + halfHeight,
3044 destX, destY, destZ + halfHeight,
3045 destX, destY, destZ, -CONTACT_DISTANCE);
3046
3047 destZ -= halfHeight;
3048
3049 // Collided with static LOS object, move back to collision point
3050 if (col)
3051 {
3052 collided = true;
3053 }
3054 }
3055
3056 // check dynamic collision
3057 bool col = source->GetMap()->GetObjectHitPos(source->GetPhaseMask(),
3058 startX, startY, startZ + halfHeight,
3059 destX, destY, destZ + halfHeight,
3060 destX, destY, destZ, -CONTACT_DISTANCE);
3061
3062 destZ -= halfHeight;
3063
3064 // Collided with a gameobject, move back to collision point
3065 if (col)
3066 {
3067 collided = true;
3068 }
3069
3070 float groundZ = VMAP_INVALID_HEIGHT_VALUE;
3071 source->UpdateAllowedPositionZ(destX, destY, destZ, &groundZ);
3072
3073 // position has no ground under it (or is too far away)
3074 if (groundZ <= INVALID_HEIGHT && unit && !unit->CanFly())
3075 {
3076 // fall back to gridHeight if any
3077 float gridHeight = GetGridHeight(destX, destY);
3078 if (gridHeight > INVALID_HEIGHT)
3079 {
3080 destZ = gridHeight + unit->GetHoverHeight();
3081 }
3082 else
3083 {
3084 return false;
3085 }
3086 }
3087
3088 return !failOnCollision || !collided;
3089}
#define INVALID_HEIGHT
Definition GridTerrainData.h:27
#define VMAP_INVALID_HEIGHT_VALUE
Definition IVMapMgr.h:49
#define LOG_FATAL(filterType__,...)
Definition Log.h:154
#define CONTACT_DISTANCE
Definition ObjectDefines.h:23
@ PATHFIND_FARFROMPOLY_END
Definition PathGenerator.h:54
@ PATHFIND_NOT_USING_PATH
Definition PathGenerator.h:51
@ PATHFIND_NORMAL
Definition PathGenerator.h:47
@ PATHFIND_SHORTCUT
Definition PathGenerator.h:48
@ PATHFIND_INCOMPLETE
Definition PathGenerator.h:49
bool IsInWater(uint32 phaseMask, float x, float y, float z, float collisionHeight) const
Definition Map.cpp:1582
float GetGridHeight(float x, float y) const
Definition Map.cpp:1159
Definition PathGenerator.h:59
float GetCollisionHeight() const override
Return collision height sent to client.
Definition Unit.cpp:20965
float GetHoverHeight() const
Definition Unit.h:1630
bool IsFlying() const
Definition Unit.h:1627
static VMapMgr2 * createOrGetVMapMgr()
Definition VMapFactory.cpp:27
bool GetObjectHitPos(unsigned int mapId, float x1, float y1, float z1, float x2, float y2, float z2, float &rx, float &ry, float &rz, float modifyDist) override
Definition VMapMgr2.cpp:201
bool IsValidMapCoord(float c)
Definition GridDefines.h:206

References PathGenerator::CalculatePath(), CanFly, CONTACT_DISTANCE, VMAP::VMapFactory::createOrGetVMapMgr(), WorldObject::GetCollisionHeight(), GetGridHeight(), Unit::GetHoverHeight(), WorldObject::GetMap(), WorldLocation::GetMapId(), GetObjectHitPos(), VMAP::VMapMgr2::GetObjectHitPos(), PathGenerator::GetPath(), PathGenerator::GetPathType(), WorldObject::GetPhaseMask(), INVALID_HEIGHT, Unit::IsFlying(), IsInWater(), Acore::IsValidMapCoord(), LOG_FATAL, PATHFIND_FARFROMPOLY_END, PATHFIND_INCOMPLETE, PATHFIND_NORMAL, PATHFIND_NOT_USING_PATH, PATHFIND_SHORTCUT, PathGenerator::SetUseRaycast(), Object::ToUnit(), WorldObject::UpdateAllowedPositionZ(), and VMAP_INVALID_HEIGHT_VALUE.

Referenced by CanReachPositionAndGetValidCoords().

◆ ContainsGameObjectModel()

bool Map::ContainsGameObjectModel ( const GameObjectModel model) const
inline
399{ return _dynamicTree.contains(model);}
bool contains(const GameObjectModel &) const
Definition DynamicTree.cpp:127

References _dynamicTree, and DynamicMapTree::contains().

◆ ConvertCorpseToBones()

Corpse * Map::ConvertCorpseToBones ( ObjectGuid const  ownerGuid,
bool  insignia = false 
)
2706{
2707 Corpse* corpse = GetCorpseByPlayer(ownerGuid);
2708 if (!corpse)
2709 return nullptr;
2710
2711 RemoveCorpse(corpse);
2712
2713 // remove corpse from DB
2714 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2715 corpse->DeleteFromDB(trans);
2716 CharacterDatabase.CommitTransaction(trans);
2717
2718 Corpse* bones = NULL;
2719
2720 // create the bones only if the map and the grid is loaded at the corpse's location
2721 // ignore bones creating option in case insignia
2722 if ((insignia ||
2724 IsGridLoaded(corpse->GetPositionX(), corpse->GetPositionY()))
2725 {
2726 // Create bones, don't change Corpse
2727 bones = new Corpse();
2728 bones->Create(corpse->GetGUID().GetCounter());
2729
2730 for (uint8 i = OBJECT_FIELD_TYPE + 1; i < CORPSE_END; ++i) // don't overwrite guid and object type
2731 bones->SetUInt32Value(i, corpse->GetUInt32Value(i));
2732
2733 bones->SetCellCoord(corpse->GetCellCoord());
2734 bones->Relocate(corpse->GetPositionX(), corpse->GetPositionY(), corpse->GetPositionZ(), corpse->GetOrientation());
2735 bones->SetPhaseMask(corpse->GetPhaseMask(), false);
2736
2738 bones->SetGuidValue(CORPSE_FIELD_OWNER, corpse->GetOwnerGUID());
2739
2740 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
2741 if (corpse->GetUInt32Value(CORPSE_FIELD_ITEM + i))
2742 bones->SetUInt32Value(CORPSE_FIELD_ITEM + i, 0);
2743
2744 AddCorpse(bones);
2745
2746 bones->UpdatePositionData();
2747
2748 // add bones in grid store if grid loaded where corpse placed
2749 AddToMap(bones);
2750 }
2751
2752 // all references to the corpse should be removed at this point
2753 delete corpse;
2754
2755 return bones;
2756}
@ CORPSE_FLAG_BONES
Definition Corpse.h:40
@ CORPSE_FLAG_UNK2
Definition Corpse.h:42
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
@ EQUIPMENT_SLOT_END
Definition Player.h:701
@ CORPSE_FIELD_FLAGS
Definition UpdateFields.h:427
@ CORPSE_END
Definition UpdateFields.h:430
@ CORPSE_FIELD_ITEM
Definition UpdateFields.h:423
@ CORPSE_FIELD_OWNER
Definition UpdateFields.h:420
@ OBJECT_FIELD_TYPE
Definition UpdateFields.h:26
@ CONFIG_DEATH_BONES_BG_OR_ARENA
Definition WorldConfig.h:65
@ CONFIG_DEATH_BONES_WORLD
Definition WorldConfig.h:64
Definition Corpse.h:49
bool Create(ObjectGuid::LowType guidlow)
Definition Corpse.cpp:61
CellCoord const & GetCellCoord() const
Definition Corpse.h:74
void SetCellCoord(CellCoord const &cellCoord)
Definition Corpse.h:75
void DeleteFromDB(CharacterDatabaseTransaction trans)
Definition Corpse.cpp:119
bool IsBattlegroundOrArena() const
Definition Map.h:298
void AddCorpse(Corpse *corpse)
Definition Map.cpp:2672
bool IsGridLoaded(GridCoord const &gridCoord) const
Definition Map.cpp:217
Corpse * GetCorpseByPlayer(ObjectGuid const &ownerGuid) const
Definition Map.h:371
bool AddToMap(T *, bool checkTransport=false)
Definition Map.cpp:320
void RemoveCorpse(Corpse *corpse)
Definition Map.cpp:2684
LowType GetCounter() const
Definition ObjectGuid.h:145
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:305
void SetGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:723
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:650
virtual void SetPhaseMask(uint32 newPhaseMask, bool update)
Definition Object.cpp:2882
uint32 GetPhaseMask() const
Definition Object.h:502
void UpdatePositionData()
Definition Object.cpp:1146
float GetPositionZ() const
Definition Position.h:123
float GetOrientation() const
Definition Position.h:124
void Relocate(float x, float y)
Definition Position.h:77

References AddCorpse(), AddToMap(), CharacterDatabase, CONFIG_DEATH_BONES_BG_OR_ARENA, CONFIG_DEATH_BONES_WORLD, CORPSE_END, CORPSE_FIELD_FLAGS, CORPSE_FIELD_ITEM, CORPSE_FIELD_OWNER, CORPSE_FLAG_BONES, CORPSE_FLAG_UNK2, Corpse::Create(), Corpse::DeleteFromDB(), EQUIPMENT_SLOT_END, Corpse::GetCellCoord(), GetCorpseByPlayer(), ObjectGuid::GetCounter(), Object::GetGUID(), Position::GetOrientation(), Corpse::GetOwnerGUID(), WorldObject::GetPhaseMask(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::GetUInt32Value(), IsBattlegroundOrArena(), IsGridLoaded(), OBJECT_FIELD_TYPE, Position::Relocate(), RemoveCorpse(), Corpse::SetCellCoord(), Object::SetGuidValue(), WorldObject::SetPhaseMask(), Object::SetUInt32Value(), sWorld, and WorldObject::UpdatePositionData().

Referenced by AddPlayerToMap(), Player::RemovedInsignia(), and RemoveOldCorpses().

◆ CreatureRelocation()

void Map::CreatureRelocation ( Creature creature,
float  x,
float  y,
float  z,
float  o 
)
794{
795 Cell old_cell = creature->GetCurrentCell();
796 Cell new_cell(x, y);
797
798 if (old_cell.DiffGrid(new_cell) || old_cell.DiffCell(new_cell))
799 {
800 if (old_cell.DiffGrid(new_cell))
801 EnsureGridLoaded(new_cell);
802
803 AddCreatureToMoveList(creature);
804 }
805 else
807
808 creature->Relocate(x, y, z, o);
809 if (creature->IsVehicle())
810 creature->GetVehicleKit()->RelocatePassengers();
811 creature->UpdatePositionData();
812 creature->UpdateObjectVisibility(false);
813}
void AddCreatureToMoveList(Creature *c)
Definition Map.cpp:856
void RemoveCreatureFromMoveList(Creature *c)
Definition Map.cpp:863
Cell const & GetCurrentCell() const
Definition Object.h:408
bool IsVehicle() const
Definition Unit.h:750
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition Unit.cpp:19218
Vehicle * GetVehicleKit() const
Definition Unit.h:1838
void RelocatePassengers()
Definition Vehicle.cpp:514
bool DiffGrid(const Cell &cell) const
Definition Cell.h:63
bool DiffCell(const Cell &cell) const
Definition Cell.h:57

References AddCreatureToMoveList(), Cell::DiffCell(), Cell::DiffGrid(), EnsureGridLoaded(), MovableMapObject::GetCurrentCell(), Unit::GetVehicleKit(), Unit::IsVehicle(), Position::Relocate(), Vehicle::RelocatePassengers(), RemoveCreatureFromMoveList(), Unit::UpdateObjectVisibility(), and WorldObject::UpdatePositionData().

Referenced by Creature::SetPosition(), StaticTransport::UpdatePassengerPositions(), MotionTransport::UpdatePassengerPositions(), and Unit::UpdatePosition().

◆ DelayedUpdate()

void Map::DelayedUpdate ( const uint32  diff)
virtual

Reimplemented in MapInstanced.

1746{
1748 {
1751
1752 if (!transport->IsInWorld())
1753 continue;
1754
1755 transport->DelayedUpdate(t_diff);
1756 }
1757
1759}
void RemoveAllObjectsInRemoveList()
Definition Map.cpp:1771
Definition Transport.h:49
void DelayedUpdate(uint32 diff)
Definition Transport.cpp:240

References _transports, _transportsUpdateIter, MotionTransport::DelayedUpdate(), Object::IsInWorld(), and RemoveAllObjectsInRemoveList().

Referenced by MapInstanced::DelayedUpdate().

◆ DeleteCorpseData()

void Map::DeleteCorpseData ( )
3129{
3130 // DELETE FROM corpse WHERE mapId = ? AND instanceId = ?
3132 stmt->SetData(0, GetId());
3133 stmt->SetData(1, GetInstanceId());
3134 CharacterDatabase.Execute(stmt);
3135}
@ CHAR_DEL_CORPSES_FROM_MAP
Definition CharacterDatabase.h:249
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157

References CHAR_DEL_CORPSES_FROM_MAP, CharacterDatabase, GetId(), GetInstanceId(), and PreparedStatementBase::SetData().

Referenced by InstanceMap::UnloadAll().

◆ DeleteFromWorld() [1/2]

template<>
void Map::DeleteFromWorld ( Player player)
187{
189
190 RemoveUpdateObject(player); //TODO: I do not know why we need this, it should be removed in ~Object anyway
191 delete player;
192}
void RemoveUpdateObject(Object *obj)
Definition Map.h:488
void RemoveObject(T *object)
Definition ObjectAccessor.h:95

References ObjectAccessor::RemoveObject(), and RemoveUpdateObject().

◆ DeleteFromWorld() [2/2]

template<class T >
void Map::DeleteFromWorld ( T *  obj)
private
180{
181 // Note: In case resurrectable corpse and pet its removed from global lists in own destructor
182 delete obj;
183}

Referenced by RemoveFromMap(), RemoveFromMap(), and RemovePlayerFromMap().

◆ DeleteRespawnTimes()

void Map::DeleteRespawnTimes ( )
2526{
2527 _creatureRespawnTimes.clear();
2528 _goRespawnTimes.clear();
2529
2531}
static void DeleteRespawnTimesInDB(uint16 mapId, uint32 instanceId)
Definition Map.cpp:2533
std::unordered_map< ObjectGuid::LowType, time_t > _creatureRespawnTimes
Definition Map.h:612
std::unordered_map< ObjectGuid::LowType, time_t > _goRespawnTimes
Definition Map.h:613

References _creatureRespawnTimes, _goRespawnTimes, DeleteRespawnTimesInDB(), GetId(), and GetInstanceId().

Referenced by InstanceMap::UnloadAll().

◆ DeleteRespawnTimesInDB()

void Map::DeleteRespawnTimesInDB ( uint16  mapId,
uint32  instanceId 
)
static
2534{
2536 stmt->SetData(0, mapId);
2537 stmt->SetData(1, instanceId);
2538 CharacterDatabase.Execute(stmt);
2539
2540 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GO_RESPAWN_BY_INSTANCE);
2541 stmt->SetData(0, mapId);
2542 stmt->SetData(1, instanceId);
2543 CharacterDatabase.Execute(stmt);
2544}
@ CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE
Definition CharacterDatabase.h:255
@ CHAR_DEL_GO_RESPAWN_BY_INSTANCE
Definition CharacterDatabase.h:260

References CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE, CHAR_DEL_GO_RESPAWN_BY_INSTANCE, CharacterDatabase, and PreparedStatementBase::SetData().

Referenced by InstanceSaveMgr::_ResetSave(), InstanceSaveMgr::DeleteInstanceSaveIfNeeded(), and DeleteRespawnTimes().

◆ DoForAllPlayers()

void Map::DoForAllPlayers ( std::function< void(Player *)>  exec)
2902{
2903 for (auto const& it : GetPlayers())
2904 {
2905 if (Player* player = it.GetSource())
2906 {
2907 exec(player);
2908 }
2909 }
2910}

References GetPlayers().

Referenced by Battleground::_ProcessProgress(), ArenaSeasonMgr::BroadcastUpdatedWorldState(), WorldState::BuffAdalsSongOfBattle(), WorldState::BuffMagtheridonTeam(), BattlegroundSA::CaptureGraveyard(), WorldState::DispelAdalsSongOfBattle(), WorldState::DispelMagtheridonTeam(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), InstanceScript::DoCastSpellOnPlayers(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), InstanceScript::DoSendNotifyToInstance(), InstanceScript::DoStartTimedAchievement(), InstanceScript::DoStopTimedAchievement(), InstanceScript::DoUpdateAchievementCriteria(), BattlegroundSA::EventPlayerDamagedGO(), BattlegroundSA::EventPlayerUsedGO(), boss_azuregos::boss_azuregosAI::JustDied(), boss_rajaxx::JustDied(), boss_alar::JustDied(), boss_felblood_kaelthas::LapseAction(), BattlegroundSA::PostUpdateImpl(), spell_fire_festival_fortitude::PrepareSpellScript(), boss_azuregos::boss_azuregosAI::Reset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::Reset(), npc_minigob_manabonk::SelectTargetInDalaran(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::SetBossState(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::SetData(), Battleground::SpiritOfCompetitionEvent(), boss_nefarian::UpdateAI(), boss_cthun::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), and npc_midsummer_bonfire::UpdateBonfireBlessingBuffs().

◆ DynamicObjectRelocation()

void Map::DynamicObjectRelocation ( DynamicObject go,
float  x,
float  y,
float  z,
float  o 
)
837{
838 Cell old_cell = dynObj->GetCurrentCell();
839 Cell new_cell(x, y);
840
841 if (old_cell.DiffGrid(new_cell) || old_cell.DiffCell(new_cell))
842 {
843 if (old_cell.DiffGrid(new_cell))
844 EnsureGridLoaded(new_cell);
845
847 }
848 else
850
851 dynObj->Relocate(x, y, z, o);
852 dynObj->SetPositionDataUpdate();
853 dynObj->UpdateObjectVisibility(false);
854}
void RemoveDynamicObjectFromMoveList(DynamicObject *go)
Definition Map.cpp:889
void AddDynamicObjectToMoveList(DynamicObject *go)
Definition Map.cpp:882

References AddDynamicObjectToMoveList(), Cell::DiffCell(), Cell::DiffGrid(), EnsureGridLoaded(), MovableMapObject::GetCurrentCell(), Position::Relocate(), RemoveDynamicObjectFromMoveList(), WorldObject::SetPositionDataUpdate(), and WorldObject::UpdateObjectVisibility().

Referenced by StaticTransport::UpdatePassengerPositions(), and MotionTransport::UpdatePassengerPositions().

◆ EnsureGridCreated()

void Map::EnsureGridCreated ( GridCoord const &  gridCoord)
195{
196 _mapGridManager.CreateGrid(gridCoord.x_coord, gridCoord.y_coord);
197}
void CreateGrid(uint16 const x, uint16 const y)
Definition MapGridManager.cpp:5

References _mapGridManager, MapGridManager::CreateGrid(), CoordPair< LIMIT >::x_coord, and CoordPair< LIMIT >::y_coord.

Referenced by AddToMap(), EnsureGridLoaded(), GetGridTerrainData(), and GetGridTerrainDataSharedPtr().

◆ EnsureGridLoaded()

bool Map::EnsureGridLoaded ( Cell const &  cell)
private
200{
201 EnsureGridCreated(GridCoord(cell.GridX(), cell.GridY()));
202
203 if (_mapGridManager.LoadGrid(cell.GridX(), cell.GridY()))
204 {
205 Balance();
206 return true;
207 }
208
209 return false;
210}
bool LoadGrid(uint16 const x, uint16 const y)
Definition MapGridManager.cpp:22
void Balance()
Definition Map.h:396

References _mapGridManager, Balance(), EnsureGridCreated(), Cell::GridX(), Cell::GridY(), and MapGridManager::LoadGrid().

Referenced by AddToMap(), AddToMap(), CreatureRelocation(), DynamicObjectRelocation(), GameObjectRelocation(), LoadGrid(), LoadGridsInRange(), MoveAllCreaturesInMoveList(), MoveAllDynamicObjectsInMoveList(), MoveAllGameObjectsInMoveList(), PlayerRelocation(), and SummonCreature().

◆ GameObjectRelocation()

void Map::GameObjectRelocation ( GameObject go,
float  x,
float  y,
float  z,
float  o 
)
816{
817 Cell old_cell = go->GetCurrentCell();
818 Cell new_cell(x, y);
819
820 if (old_cell.DiffGrid(new_cell) || old_cell.DiffCell(new_cell))
821 {
822 if (old_cell.DiffGrid(new_cell))
823 EnsureGridLoaded(new_cell);
824
826 }
827 else
829
830 go->Relocate(x, y, z, o);
833 go->UpdateObjectVisibility(false);
834}
void UpdateModelPosition()
Definition GameObject.cpp:2895
void AddGameObjectToMoveList(GameObject *go)
Definition Map.cpp:869
void RemoveGameObjectFromMoveList(GameObject *go)
Definition Map.cpp:876
void SetPositionDataUpdate()
Definition Object.cpp:1137
virtual void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false)
Definition Object.cpp:2978

References AddGameObjectToMoveList(), Cell::DiffCell(), Cell::DiffGrid(), EnsureGridLoaded(), MovableMapObject::GetCurrentCell(), Position::Relocate(), RemoveGameObjectFromMoveList(), WorldObject::SetPositionDataUpdate(), GameObject::UpdateModelPosition(), and WorldObject::UpdateObjectVisibility().

Referenced by GameObject::SetPosition(), StaticTransport::UpdatePassengerPositions(), MotionTransport::UpdatePassengerPositions(), and StaticTransport::UpdatePosition().

◆ GenerateLowGuid()

◆ GetActiveNonPlayersCount()

std::size_t Map::GetActiveNonPlayersCount ( ) const
inline
494 {
495 return m_activeNonPlayers.size();
496 }

References m_activeNonPlayers.

Referenced by debug_commandscript::HandleDebugObjectCountMap().

◆ GetAllTransports()

TransportsContainer const & Map::GetAllTransports ( ) const
inline
472{ return _transports; }

References _transports.

Referenced by npc_preparations_for_war_vehicle::UpdateAI().

◆ GetAreaId()

uint32 Map::GetAreaId ( uint32  phaseMask,
float  x,
float  y,
float  z 
) const
1230{
1231 uint32 mogpFlags;
1232 int32 adtId, rootId, groupId;
1233 float vmapZ = z;
1234 bool hasVmapArea = GetAreaInfo(phaseMask, x, y, vmapZ, mogpFlags, adtId, rootId, groupId);
1235
1236 uint32 gridAreaId = 0;
1237 float gridMapHeight = INVALID_HEIGHT;
1238 if (GridTerrainData* gmap = const_cast<Map*>(this)->GetGridTerrainData(x, y))
1239 {
1240 gridAreaId = gmap->getArea(x, y);
1241 gridMapHeight = gmap->getHeight(x, y);
1242 }
1243
1244 uint16 areaId = 0;
1245
1246 // floor is the height we are closer to (but only if above)
1247 if (hasVmapArea && G3D::fuzzyGe(z, vmapZ - GROUND_HEIGHT_TOLERANCE) && (G3D::fuzzyLt(z, gridMapHeight - GROUND_HEIGHT_TOLERANCE) || vmapZ > gridMapHeight))
1248 {
1249 // wmo found
1250 if (WMOAreaTableEntry const* wmoEntry = GetWMOAreaTableEntryByTripple(rootId, adtId, groupId))
1251 areaId = wmoEntry->areaId;
1252
1253 if (!areaId)
1254 areaId = gridAreaId;
1255 }
1256 else
1257 areaId = gridAreaId;
1258
1259 if (!areaId)
1260 areaId = i_mapEntry->linked_zone;
1261
1262 return areaId;
1263}
WMOAreaTableEntry const * GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid, int32 groupid)
Definition DBCStores.cpp:694
std::uint16_t uint16
Definition Define.h:108
float const GROUND_HEIGHT_TOLERANCE
Definition SharedDefines.h:26
Definition GridTerrainData.h:222
Definition Map.h:158
bool GetAreaInfo(uint32 phaseMask, float x, float y, float z, uint32 &mogpflags, int32 &adtId, int32 &rootId, int32 &groupId) const
Definition Map.cpp:1180
GridTerrainData * GetGridTerrainData(GridCoord const &gridCoord)
Definition Map.cpp:1058
uint32 linked_zone
Definition DBCStructure.h:1334
Definition DBCStructure.h:2132

References GetAreaInfo(), GetGridTerrainData(), GetWMOAreaTableEntryByTripple(), GROUND_HEIGHT_TOLERANCE, i_mapEntry, INVALID_HEIGHT, and MapEntry::linked_zone.

Referenced by MapMgr::GetAreaId(), GetLiquidData(), GetZoneAndAreaId(), and GetZoneId().

◆ GetAreaInfo()

bool Map::GetAreaInfo ( uint32  phaseMask,
float  x,
float  y,
float  z,
uint32 mogpflags,
int32 adtId,
int32 rootId,
int32 groupId 
) const
1181{
1182 float vmap_z = z;
1183 float dynamic_z = z;
1184 float check_z = z;
1186 uint32 vflags;
1187 int32 vadtId;
1188 int32 vrootId;
1189 int32 vgroupId;
1190 uint32 dflags;
1191 int32 dadtId;
1192 int32 drootId;
1193 int32 dgroupId;
1194
1195 bool hasVmapAreaInfo = vmgr->GetAreaInfo(GetId(), x, y, vmap_z, vflags, vadtId, vrootId, vgroupId);
1196 bool hasDynamicAreaInfo = _dynamicTree.GetAreaInfo(x, y, dynamic_z, phaseMask, dflags, dadtId, drootId, dgroupId);
1197 auto useVmap = [&]() { check_z = vmap_z; flags = vflags; adtId = vadtId; rootId = vrootId; groupId = vgroupId; };
1198 auto useDyn = [&]() { check_z = dynamic_z; flags = dflags; adtId = dadtId; rootId = drootId; groupId = dgroupId; };
1199
1200 if (hasVmapAreaInfo)
1201 {
1202 if (hasDynamicAreaInfo && dynamic_z > vmap_z)
1203 useDyn();
1204 else
1205 useVmap();
1206 }
1207 else if (hasDynamicAreaInfo)
1208 {
1209 useDyn();
1210 }
1211
1212 if (hasVmapAreaInfo || hasDynamicAreaInfo)
1213 {
1214 // check if there's terrain between player height and object height
1215 if (GridTerrainData* gmap = const_cast<Map*>(this)->GetGridTerrainData(x, y))
1216 {
1217 float mapHeight = gmap->getHeight(x, y);
1218 // z + 2.0f condition taken from GetHeight(), not sure if it's such a great choice...
1219 if (z + 2.0f > mapHeight && mapHeight > check_z)
1220 return false;
1221 }
1222
1223 return true;
1224 }
1225
1226 return false;
1227}
bool GetAreaInfo(float x, float y, float &z, uint32 phasemask, uint32 &flags, int32 &adtId, int32 &rootId, int32 &groupId) const
Definition DynamicTree.cpp:311
Definition IVMapMgr.h:78
virtual bool GetAreaInfo(uint32 pMapId, float x, float y, float &z, uint32 &flags, int32 &adtId, int32 &rootId, int32 &groupId) const =0

References _dynamicTree, VMAP::VMapFactory::createOrGetVMapMgr(), DynamicMapTree::GetAreaInfo(), VMAP::IVMapMgr::GetAreaInfo(), GetGridTerrainData(), and GetId().

Referenced by GetAreaId().

◆ GetCorpse()

Corpse * Map::GetCorpse ( ObjectGuid const  guid)
2385{
2386 return _objectsStore.Find<Corpse>(guid);
2387}
MapStoredObjectTypesContainer _objectsStore
Definition Map.h:631
SPECIFIC_TYPE * Find(KEY_TYPE const &handle)
Definition TypeContainer.h:144

References _objectsStore, and TypeUnorderedMapContainer< OBJECT_TYPES, KEY_TYPE >::Find().

Referenced by ObjectAccessor::GetCorpse(), and ScriptsProcess().

◆ GetCorpseByPlayer()

Corpse * Map::GetCorpseByPlayer ( ObjectGuid const &  ownerGuid) const
inline
372 {
373 auto itr = _corpsesByPlayer.find(ownerGuid);
374 if (itr != _corpsesByPlayer.end())
375 return itr->second;
376
377 return nullptr;
378 }

References _corpsesByPlayer.

Referenced by ConvertCorpseToBones(), Player::GetCorpse(), and WorldSession::HandleMoveWorldportAck().

◆ GetCorpsesInGrid()

std::unordered_set< Corpse * > const * Map::GetCorpsesInGrid ( uint32  gridId) const
inline
363 {
364 auto itr = _corpsesByGrid.find(gridId);
365 if (itr != _corpsesByGrid.end())
366 return &itr->second;
367
368 return nullptr;
369 }

References _corpsesByGrid.

Referenced by GridObjectLoader::LoadAllCellsInGrid().

◆ GetCreatedCellsInGridCount()

uint32 Map::GetCreatedCellsInGridCount ( uint16 const  x,
uint16 const  y 
)
3157{
3159}
uint32 GetCreatedCellsInGridCount(uint16 const x, uint16 const y)
Definition MapGridManager.cpp:98

References _mapGridManager, and MapGridManager::GetCreatedCellsInGridCount().

Referenced by debug_commandscript::HandleDebugMapDataCommand().

◆ GetCreatedCellsInMapCount()

uint32 Map::GetCreatedCellsInMapCount ( )
3162{
3164}
uint32 GetCreatedCellsInMapCount()
Definition MapGridManager.cpp:107

References _mapGridManager, and MapGridManager::GetCreatedCellsInMapCount().

Referenced by debug_commandscript::HandleDebugMapDataCommand().

◆ GetCreatedGridsCount()

uint32 Map::GetCreatedGridsCount ( )
3147{
3149}
uint32 GetCreatedGridsCount()
Definition MapGridManager.cpp:88

References _mapGridManager, and MapGridManager::GetCreatedGridsCount().

Referenced by debug_commandscript::HandleDebugMapDataCommand().

◆ GetCreature()

Creature * Map::GetCreature ( ObjectGuid const  guid)
2390{
2391 return _objectsStore.Find<Creature>(guid);
2392}

References _objectsStore, and TypeUnorderedMapContainer< OBJECT_TYPES, KEY_TYPE >::Find().

Referenced by Battleground::_ProcessResurrect(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ActivatePrisoners(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::AddWave1(), boss_tyrannus::boss_tyrannusAI::boss_tyrannusAI(), instance_ruins_of_ahnqiraj::instance_ruins_of_ahnqiraj_InstanceMapScript::CallNextRajaxxLeader(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::CheckAchievementCriteriaMeet(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::CheckAchievementCriteriaMeet(), instance_obsidian_sanctum::instance_obsidian_sanctum_InstanceMapScript::CheckAchievementCriteriaMeet(), spell_sha_fire_nova::CheckFireTotem(), instance_molten_core::instance_molten_core_InstanceMapScript::CheckMajordomoExecutus(), boss_prince_valanar_icc::boss_prince_valanarAI::CheckRoom(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), instance_stratholme::instance_stratholme_InstanceMapScript::CheckZiggurats(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::CleanupInstance(), violet_hold_trashAI::ClearDoorSealAura(), npc_hor_lich_king::npc_hor_lich_kingAI::DoAction(), npc_vh_void_sentry::npc_vh_void_sentryAI::DoAction(), instance_molten_core::instance_molten_core_InstanceMapScript::DoAction(), boss_ayamiss::DoAction(), instance_obsidian_sanctum::instance_obsidian_sanctum_InstanceMapScript::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_black_knight::boss_black_knightAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), InstanceScript::DoCastSpellOnPlayer(), WorldSession::DoLootRelease(), InstanceScript::DoRespawnCreature(), InstanceScript::DoRespawnCreature(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::DoSummonGrandChampion(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::DoWipe1(), instance_blackrock_spire::instance_blackrock_spireMapScript::Dragonspireroomcheck(), Spell::EffectDestroyAllTotems(), Spell::EffectScriptEffect(), boss_tyrannus::boss_tyrannusAI::EnterEvadeMode(), BattlegroundEY::EventTeamCapturedPoint(), WorldState::GetActiveZones(), Battleground::GetBGCreature(), boss_erekem::boss_erekemAI::GetChainHealTargetGUID(), Battlefield::GetCreature(), InstanceScript::GetCreature(), ObjectAccessor::GetCreature(), npc_ranshalla::npc_ranshallaAI::GetSpeakerByEntry(), SmartScript::GetTargets(), WorldState::HandleActiveZone(), WorldSession::HandleAreaSpiritHealerQueryOpcode(), WorldSession::HandleAreaSpiritHealerQueueOpcode(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattlemasterHelloOpcode(), WorldSession::HandleBattlemasterJoinArena(), BattlegroundIC::HandleCapturedNodes(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::HandleDropAttempt(), spell_sha_fire_nova::HandleDummy(), WorldSession::HandleLootMasterGiveOpcode(), WorldSession::HandleLootMoneyOpcode(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::HandleOutro(), WorldSession::HandleTotemDestroyed(), wp_commandscript::HandleWpModifyCommand(), wp_commandscript::HandleWpShowCommand(), TempSummon::InitStats(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::InstanceCleanup(), instance_violet_hold::instance_violet_hold_InstanceMapScript::InstanceCleanup(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::InstanceCleanup(), Unit::isAttackingPlayer(), instance_ulduar::instance_ulduar_InstanceMapScript::IsEncounterInProgress(), instance_zulfarrak::instance_zulfarrak_InstanceMapScript::IsWaveAllDead(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), boss_rajaxx::JustDied(), boss_jormungarAI::JustDied(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::JustDied(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::JustDied(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::JustDied(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::JustDied(), boss_skarvald_the_constructor::JustDied(), boss_dalronn_the_controller::JustDied(), npc_ichor_globule::npc_ichor_globuleAI::JustDied(), npc_vh_void_sentry::npc_vh_void_sentryAI::JustDied(), boss_anubarak_trial::boss_anubarak_trialAI::JustEngagedWith(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_skarvald_the_constructor::JustEngagedWith(), boss_dalronn_the_controller::JustEngagedWith(), boss_erekem::boss_erekemAI::JustEngagedWith(), npc_erekem_guard::npc_erekem_guardAI::JustEngagedWith(), Player::KilledMonsterCredit(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), instance_zulfarrak::instance_zulfarrak_InstanceMapScript::MoveNPCIfAlive(), BattlegroundAB::NodeOccupied(), npc_pos_leader_second::npc_pos_leader_secondAI::npc_pos_leader_secondAI(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::npc_pos_martin_or_gorkun_secondAI(), instance_blackwing_lair::instance_blackwing_lair_InstanceMapScript::OnCreatureCreate(), instance_shadowfang_keep::instance_shadowfang_keep_InstanceMapScript::OnCreatureCreate(), instance_ruby_sanctum::instance_ruby_sanctum_InstanceMapScript::OnCreatureCreate(), instance_pit_of_saron::instance_pit_of_saron_InstanceScript::OnCreatureCreate(), instance_ulduar::instance_ulduar_InstanceMapScript::OnCreatureCreate(), WorldState::OnDisable(), WorldState::OnDisable(), instance_molten_core::instance_molten_core_InstanceMapScript::OnGameObjectCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnGameObjectCreate(), instance_ruby_sanctum::instance_ruby_sanctum_InstanceMapScript::OnPlayerEnter(), instance_vault_of_archavon::instance_vault_of_archavon_InstanceMapScript::OnPlayerEnter(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::OnPlayerEnter(), instance_pit_of_saron::instance_pit_of_saron_InstanceScript::OnPlayerEnter(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnUnitDeath(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnUnitDeath(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnUnitDeath(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnUnitDeath(), instance_ulduar::instance_ulduar_InstanceMapScript::OnUnitDeath(), BattlegroundAV::PopulateNode(), BattlegroundIC::PostUpdateImpl(), BattlegroundRV::PostUpdateImpl(), instance_blackrock_spire::instance_blackrock_spireMapScript::ProcessEvent(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::ProcessEvent(), instance_stratholme::instance_stratholme_InstanceMapScript::ProcessSlaughterEvent(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::RandomizeCompositionsAndShow(), instance_zulgurub::instance_zulgurub_InstanceMapScript::RemoveHakkarPowerStack(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::ReplaceMoiraIfSaved(), instance_zulaman::instance_zulaman_InstanceMapScript::ResetAkilzonGauntlet(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoners(), ScheduleCreatureRespawn(), ScriptsProcess(), instance_zulfarrak::instance_zulfarrak_InstanceMapScript::SendAddsUpStairs(), Player::SendLoot(), instance_molten_core::instance_molten_core_InstanceMapScript::SetBossState(), instance_magtheridons_lair::instance_magtheridons_lair_InstanceMapScript::SetBossState(), instance_blackrock_spire::instance_blackrock_spireMapScript::SetBossState(), instance_blackwing_lair::instance_blackwing_lair_InstanceMapScript::SetBossState(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::SetBossState(), instance_ruby_sanctum::instance_ruby_sanctum_InstanceMapScript::SetBossState(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::SetBossState(), instance_black_temple::instance_black_temple_InstanceMapScript::SetBossState(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::SetData(), instance_blackrock_spire::instance_blackrock_spireMapScript::SetData(), instance_blackwing_lair::instance_blackwing_lair_InstanceMapScript::SetData(), instance_karazhan::instance_karazhan_InstanceMapScript::SetData(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::SetData(), instance_scholomance::instance_scholomance_InstanceMapScript::SetData(), instance_shadowfang_keep::instance_shadowfang_keep_InstanceMapScript::SetData(), instance_stratholme::instance_stratholme_InstanceMapScript::SetData(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::SetData(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::SetData(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::SetData(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::SetData(), instance_dire_maul::instance_dire_maul_InstanceMapScript::SetData(), instance_wailing_caverns::instance_wailing_caverns_InstanceMapScript::SetData(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::SetData(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::SetData(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::SetData(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::SetData(), instance_oculus::instance_oculus_InstanceMapScript::SetData(), instance_halls_of_stone::instance_halls_of_stone_InstanceMapScript::SetData(), instance_ulduar::instance_ulduar_InstanceMapScript::SetData(), instance_utgarde_keep::instance_utgarde_keep_InstanceMapScript::SetData(), instance_utgarde_pinnacle::instance_utgarde_pinnacle_InstanceMapScript::SetData(), instance_violet_hold::instance_violet_hold_InstanceMapScript::SetData(), instance_magtheridons_lair::instance_magtheridons_lair_InstanceMapScript::SetData(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::SetData(), Unit::SetPhaseMask(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::SpawnAnubArak(), instance_ulduar::instance_ulduar_InstanceMapScript::SpawnLeviathanEncounterVehicles(), instance_zulaman::instance_zulaman_InstanceMapScript::StartAkilzonGauntlet(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), instance_molten_core::instance_molten_core_InstanceMapScript::SummonMajordomoExecutus(), WorldState::SummonMouth(), WorldState::SummonPallid(), instance_blackrock_spire::instance_blackrock_spireMapScript::SummonSolakarWave(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::TombOfSevenEvent(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::TombOfSevenReset(), instance_blackwing_lair::instance_blackwing_lair_InstanceMapScript::Update(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Update(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Update(), instance_zulfarrak::instance_zulfarrak_InstanceMapScript::Update(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::Update(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::Update(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::Update(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::Update(), instance_ulduar::instance_ulduar_InstanceMapScript::Update(), instance_vault_of_archavon::instance_vault_of_archavon_InstanceMapScript::Update(), instance_violet_hold::instance_violet_hold_InstanceMapScript::Update(), instance_shattered_halls::instance_shattered_halls_InstanceMapScript::Update(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_ichor_globule::npc_ichor_globuleAI::UpdateAI(), and Player::UpdateTriggerVisibility().

◆ GetCreatureBySpawnIdStore()

◆ GetCreatureRespawnTime()

time_t Map::GetCreatureRespawnTime ( ObjectGuid::LowType  dbGuid) const
inline
411 {
412 std::unordered_map<ObjectGuid::LowType /*dbGUID*/, time_t>::const_iterator itr = _creatureRespawnTimes.find(dbGuid);
413 if (itr != _creatureRespawnTimes.end())
414 return itr->second;
415
416 return time_t(0);
417 }

References _creatureRespawnTimes.

Referenced by GetLinkedRespawnTime(), and Creature::LoadCreatureFromDB().

◆ GetDebugInfo()

std::string Map::GetDebugInfo ( ) const
virtual

Reimplemented in InstanceMap.

3138{
3139 std::stringstream sstr;
3140 sstr << std::boolalpha
3141 << "Id: " << GetId() << " InstanceId: " << GetInstanceId() << " Difficulty: " << std::to_string(GetDifficulty())
3142 << " HasPlayers: " << HavePlayers();
3143 return sstr.str();
3144}
bool HavePlayers() const
Definition Map.h:315
Difficulty GetDifficulty() const
Definition Map.h:285

References GetDifficulty(), GetId(), GetInstanceId(), and HavePlayers().

Referenced by InstanceMap::GetDebugInfo().

◆ GetDifficulty()

◆ GetDynamicMapTree()

DynamicMapTree const & Map::GetDynamicMapTree ( ) const
inline
400{ return _dynamicTree; }

References _dynamicTree.

Referenced by BattlegroundRV::CheckPositionForUnit().

◆ GetDynamicObject()

DynamicObject * Map::GetDynamicObject ( ObjectGuid const  guid)
2414{
2415 return _objectsStore.Find<DynamicObject>(guid);
2416}
Definition DynamicObject.h:35

References _objectsStore, and TypeUnorderedMapContainer< OBJECT_TYPES, KEY_TYPE >::Find().

Referenced by ObjectAccessor::GetDynamicObject().

◆ GetEntrancePos()

bool Map::GetEntrancePos ( int32 mapid,
float &  x,
float &  y 
)
inline
302 {
303 if (!i_mapEntry)
304 return false;
305 return i_mapEntry->GetEntrancePos(mapid, x, y);
306 }
bool GetEntrancePos(int32 &mapid, float &x, float &y) const
Definition DBCStructure.h:1361

References MapEntry::GetEntrancePos(), and i_mapEntry.

◆ GetEntry()

MapEntry const * Map::GetEntry ( ) const
inline

◆ GetFullTerrainStatusForPosition()

void Map::GetFullTerrainStatusForPosition ( uint32  phaseMask,
float  x,
float  y,
float  z,
float  collisionHeight,
PositionFullTerrainStatus data,
uint8  reqLiquidType = MAP_ALL_LIQUIDS 
)
1370{
1371 GridTerrainData* gmap = GetGridTerrainData(x, y);
1372
1374 VMAP::AreaAndLiquidData vmapData;
1375 // VMAP::AreaAndLiquidData dynData;
1376 VMAP::AreaAndLiquidData* wmoData = nullptr;
1377 vmgr->GetAreaAndLiquidData(GetId(), x, y, z, reqLiquidType, vmapData);
1378 // _dynamicTree.GetAreaAndLiquidData(x, y, z, phaseMask, reqLiquidType, dynData);
1379
1380 uint32 gridAreaId = 0;
1381 float gridMapHeight = INVALID_HEIGHT;
1382 if (gmap)
1383 {
1384 gridAreaId = gmap->getArea(x, y);
1385 gridMapHeight = gmap->getHeight(x, y);
1386 }
1387
1388 bool useGridLiquid = true;
1389
1390 // floor is the height we are closer to (but only if above)
1392 if (gridMapHeight > INVALID_HEIGHT && G3D::fuzzyGe(z, gridMapHeight - GROUND_HEIGHT_TOLERANCE))
1393 data.floorZ = gridMapHeight;
1394
1395 if (vmapData.floorZ > VMAP_INVALID_HEIGHT && G3D::fuzzyGe(z, vmapData.floorZ - GROUND_HEIGHT_TOLERANCE) &&
1396 (G3D::fuzzyLt(z, gridMapHeight - GROUND_HEIGHT_TOLERANCE) || vmapData.floorZ > gridMapHeight))
1397 {
1398 data.floorZ = vmapData.floorZ;
1399 wmoData = &vmapData;
1400 }
1401
1402 // NOTE: Objects will not detect a case when a wmo providing area/liquid despawns from under them
1403 // but this is fine as these kind of objects are not meant to be spawned and despawned a lot
1404 // example: Lich King platform
1405 /*
1406 if (dynData.floorZ > VMAP_INVALID_HEIGHT && G3D::fuzzyGe(z, dynData.floorZ - GROUND_HEIGHT_TOLERANCE) &&
1407 (G3D::fuzzyLt(z, gridMapHeight - GROUND_HEIGHT_TOLERANCE) || dynData.floorZ > gridMapHeight) &&
1408 (G3D::fuzzyLt(z, vmapData.floorZ - GROUND_HEIGHT_TOLERANCE) || dynData.floorZ > vmapData.floorZ))
1409 {
1410 data.floorZ = dynData.floorZ;
1411 wmoData = &dynData;
1412 }
1413 */
1414
1415 if (wmoData)
1416 {
1417 if (wmoData->areaInfo)
1418 {
1419 // wmo found
1420 WMOAreaTableEntry const* wmoEntry = GetWMOAreaTableEntryByTripple(wmoData->areaInfo->rootId, wmoData->areaInfo->adtId, wmoData->areaInfo->groupId);
1421 data.outdoors = (wmoData->areaInfo->mogpFlags & 0x8) != 0;
1422 if (wmoEntry)
1423 {
1424 data.areaId = wmoEntry->areaId;
1425 if (wmoEntry->Flags & 4)
1426 data.outdoors = true;
1427 else if (wmoEntry->Flags & 2)
1428 data.outdoors = false;
1429 }
1430
1431 if (!data.areaId)
1432 data.areaId = gridAreaId;
1433
1434 useGridLiquid = !IsInWMOInterior(wmoData->areaInfo->mogpFlags);
1435 }
1436 }
1437 else
1438 {
1439 data.outdoors = true;
1440 data.areaId = gridAreaId;
1441 if (AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(data.areaId))
1442 data.outdoors = (areaEntry->flags & (AREA_FLAG_INSIDE | AREA_FLAG_OUTSIDE)) != AREA_FLAG_INSIDE;
1443 }
1444
1445 if (!data.areaId)
1447
1448 AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(data.areaId);
1449
1450 // liquid processing
1451 if (wmoData && wmoData->liquidInfo && wmoData->liquidInfo->level > wmoData->floorZ)
1452 {
1453 uint32 liquidType = wmoData->liquidInfo->type;
1454 if (GetId() == MAP_OUTLAND && liquidType == 2) // gotta love blizzard hacks
1455 liquidType = 15;
1456
1457 uint32 liquidFlagType = 0;
1458 if (LiquidTypeEntry const* liquidData = sLiquidTypeStore.LookupEntry(liquidType))
1459 liquidFlagType = liquidData->Type;
1460
1461 if (liquidType && liquidType < 21 && areaEntry)
1462 {
1463 uint32 overrideLiquid = areaEntry->LiquidTypeOverride[liquidFlagType];
1464 if (!overrideLiquid && areaEntry->zone)
1465 {
1466 AreaTableEntry const* zoneEntry = sAreaTableStore.LookupEntry(areaEntry->zone);
1467 if (zoneEntry)
1468 overrideLiquid = zoneEntry->LiquidTypeOverride[liquidFlagType];
1469 }
1470
1471 if (LiquidTypeEntry const* overrideData = sLiquidTypeStore.LookupEntry(overrideLiquid))
1472 {
1473 liquidType = overrideLiquid;
1474 liquidFlagType = overrideData->Type;
1475 }
1476 }
1477
1478 data.liquidInfo.Level = wmoData->liquidInfo->level;
1479 data.liquidInfo.DepthLevel = wmoData->floorZ;
1480 data.liquidInfo.Entry = liquidType;
1481 data.liquidInfo.Flags = 1 << liquidFlagType;
1482
1483 // Get position delta
1484 float delta = wmoData->liquidInfo->level - z;
1485
1486 if (delta > collisionHeight)
1488 else if (delta > 0.0f)
1490 else if (delta > -0.1f)
1492 else
1494 }
1495
1496 // look up liquid data from grid map
1497 if (gmap && useGridLiquid)
1498 {
1499 LiquidData const& gridLiquidData = gmap->GetLiquidData(x, y, z, collisionHeight, reqLiquidType);
1500 if (gridLiquidData.Status != LIQUID_MAP_NO_WATER && (!wmoData || gridLiquidData.Level > wmoData->floorZ))
1501 {
1502 uint32 liquidEntry = gridLiquidData.Entry;
1503 if (GetId() == MAP_OUTLAND && liquidEntry == 2)
1504 liquidEntry = 15;
1505
1506 data.liquidInfo = gridLiquidData;
1507 data.liquidInfo.Entry = liquidEntry;
1508 }
1509 }
1510}
@ MAP_OUTLAND
Definition AreaDefines.h:216
@ AREA_FLAG_OUTSIDE
Definition DBCEnums.h:260
@ AREA_FLAG_INSIDE
Definition DBCEnums.h:259
DBCStorage< AreaTableEntry > sAreaTableStore(AreaTableEntryfmt)
DBCStorage< LiquidTypeEntry > sLiquidTypeStore(LiquidTypefmt)
@ LIQUID_MAP_UNDER_WATER
Definition GridTerrainData.h:195
@ LIQUID_MAP_NO_WATER
Definition GridTerrainData.h:191
@ LIQUID_MAP_IN_WATER
Definition GridTerrainData.h:194
@ LIQUID_MAP_ABOVE_WATER
Definition GridTerrainData.h:192
@ LIQUID_MAP_WATER_WALK
Definition GridTerrainData.h:193
#define VMAP_INVALID_HEIGHT
Definition IVMapMgr.h:48
static bool IsInWMOInterior(uint32 mogpFlags)
Definition Map.cpp:1175
float getHeight(float x, float y) const
Definition GridTerrainData.h:249
uint16 getArea(float x, float y) const
Definition GridTerrainData.cpp:214
LiquidData const GetLiquidData(float x, float y, float z, float collisionHeight, uint8 ReqLiquidType) const
Definition GridTerrainData.cpp:530
virtual void GetAreaAndLiquidData(uint32 mapId, float x, float y, float z, uint8 reqLiquidType, AreaAndLiquidData &data) const =0
Definition DBCStructure.h:519
uint32 zone
Definition DBCStructure.h:522
uint32 LiquidTypeOverride[4]
Definition DBCStructure.h:530
Definition GridTerrainData.h:199
float Level
Definition GridTerrainData.h:204
uint32 Flags
Definition GridTerrainData.h:203
uint32 Entry
Definition GridTerrainData.h:202
LiquidStatus Status
Definition GridTerrainData.h:206
float DepthLevel
Definition GridTerrainData.h:205
Definition DBCStructure.h:1284
float floorZ
Definition Map.h:95
uint32 areaId
Definition Map.h:94
LiquidData liquidInfo
Definition Map.h:97
bool outdoors
Definition Map.h:96
Definition IVMapMgr.h:52
Optional< AreaInfo > areaInfo
Definition IVMapMgr.h:72
Optional< LiquidInfo > liquidInfo
Definition IVMapMgr.h:73
float floorZ
Definition IVMapMgr.h:71
uint32 Flags
Definition DBCStructure.h:2142
uint32 areaId
Definition DBCStructure.h:2143

References AREA_FLAG_INSIDE, AREA_FLAG_OUTSIDE, PositionFullTerrainStatus::areaId, WMOAreaTableEntry::areaId, VMAP::AreaAndLiquidData::areaInfo, VMAP::VMapFactory::createOrGetVMapMgr(), LiquidData::DepthLevel, LiquidData::Entry, LiquidData::Flags, WMOAreaTableEntry::Flags, VMAP::AreaAndLiquidData::floorZ, PositionFullTerrainStatus::floorZ, GridTerrainData::getArea(), VMAP::IVMapMgr::GetAreaAndLiquidData(), GetGridTerrainData(), GridTerrainData::getHeight(), GetId(), GridTerrainData::GetLiquidData(), GetWMOAreaTableEntryByTripple(), GROUND_HEIGHT_TOLERANCE, i_mapEntry, INVALID_HEIGHT, IsInWMOInterior(), LiquidData::Level, MapEntry::linked_zone, LIQUID_MAP_ABOVE_WATER, LIQUID_MAP_IN_WATER, LIQUID_MAP_NO_WATER, LIQUID_MAP_UNDER_WATER, LIQUID_MAP_WATER_WALK, VMAP::AreaAndLiquidData::liquidInfo, PositionFullTerrainStatus::liquidInfo, AreaTableEntry::LiquidTypeOverride, MAP_OUTLAND, PositionFullTerrainStatus::outdoors, sAreaTableStore, sLiquidTypeStore, LiquidData::Status, VMAP_INVALID_HEIGHT, and AreaTableEntry::zone.

Referenced by Creature::Create(), and WorldObject::UpdatePositionData().

◆ GetGameObject()

GameObject * Map::GetGameObject ( ObjectGuid const  guid)
2395{
2396 return _objectsStore.Find<GameObject>(guid);
2397}

References _objectsStore, and TypeUnorderedMapContainer< OBJECT_TYPES, KEY_TYPE >::Find().

Referenced by boss_sjonnir::boss_sjonnirAI::ActivatePipe(), Spell::CheckCast(), Player::CheckDuelDistance(), Spell::CheckEffectTarget(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::CheckLichKingAvailability(), instance_stratholme::instance_stratholme_InstanceMapScript::CheckZiggurats(), boss_hodir::boss_hodirAI::DoAction(), instance_obsidian_sanctum::instance_obsidian_sanctum_InstanceMapScript::DoAction(), Spell::DoAllEffectOnTarget(), npc_rocknot::npc_rocknotAI::DoGo(), WorldSession::DoLootRelease(), InstanceScript::DoRespawnGameObject(), InstanceScript::DoRespawnGameObject(), InstanceScript::DoUseDoorOrButton(), instance_blackrock_spire::instance_blackrock_spireMapScript::Dragonspireroomcheck(), instance_blackrock_spire::instance_blackrock_spireMapScript::Dragonspireroomstore(), Player::DuelComplete(), Spell::EffectSummonObject(), Battleground::GetBGObject(), Battlefield::GetGameObject(), InstanceScript::GetGameObject(), ObjectAccessor::GetGameObject(), Player::GetNextQuest(), BattlegroundRV::GetPillarAtPosition(), GetTransport(), WorldSession::HandleAutostoreLootItemOpcode(), InstanceScript::HandleGameObject(), WorldSession::HandleGameobjectReportUse(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandleLootMasterGiveOpcode(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMovementOpcodes(), boss_urok_doomhowl::boss_urok_doomhowlAI::InitializeAI(), instance_violet_hold::instance_violet_hold_InstanceMapScript::InstanceCleanup(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::InstanceCleanup(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), boss_rend_blackhand::boss_rend_blackhandAI::JustDied(), boss_shade_of_aran::JustDied(), npc_gunship::npc_gunshipAI::JustDied(), boss_sjonnir::boss_sjonnirAI::JustDied(), boss_kologarn::boss_kologarnAI::JustDied(), boss_shade_of_aran::JustEngagedWith(), boss_sjonnir::boss_sjonnirAI::JustEngagedWith(), boss_kologarn::boss_kologarnAI::JustEngagedWith(), instance_temple_of_ahnqiraj::instance_temple_of_ahnqiraj_InstanceMapScript::OnCreatureCreate(), instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), instance_temple_of_ahnqiraj::instance_temple_of_ahnqiraj_InstanceMapScript::OnUnitDeath(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::OpenDoors(), Player::PrepareQuestMenu(), instance_blackrock_spire::instance_blackrock_spireMapScript::ProcessEvent(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::ProcessEvent(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::ProcessEvent(), instance_stratholme::instance_stratholme_InstanceMapScript::ProcessSlaughterEvent(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::ReadSaveDataMore(), boss_sartharion_dragonAI::RemoveTwilightPortal(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_shade_of_aran::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), ScriptsProcess(), Player::SendLoot(), Player::SendQuestGiverStatusMultiple(), Acore::VisibleNotifier::SendToSelf(), instance_molten_core::instance_molten_core_InstanceMapScript::SetBossState(), instance_magtheridons_lair::instance_magtheridons_lair_InstanceMapScript::SetBossState(), instance_blackwing_lair::instance_blackwing_lair_InstanceMapScript::SetBossState(), instance_gundrak::instance_gundrak_InstanceMapScript::SetBossState(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::SetBossState(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::SetBossState(), instance_hellfire_ramparts::instance_hellfire_ramparts_InstanceMapScript::SetBossState(), instance_ulduar::instance_ulduar_InstanceMapScript::setChestsLootable(), instance_blackrock_spire::instance_blackrock_spireMapScript::SetData(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::SetData(), instance_scholomance::instance_scholomance_InstanceMapScript::SetData(), instance_stratholme::instance_stratholme_InstanceMapScript::SetData(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::SetData(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::SetData(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::SetData(), instance_pit_of_saron::instance_pit_of_saron_InstanceScript::SetData(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::SetData(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::SetData(), instance_oculus::instance_oculus_InstanceMapScript::SetData(), instance_halls_of_stone::instance_halls_of_stone_InstanceMapScript::SetData(), instance_ulduar::instance_ulduar_InstanceMapScript::SetData(), instance_magtheridons_lair::instance_magtheridons_lair_InstanceMapScript::SetData(), instance_gundrak::instance_gundrak_InstanceMapScript::SetData(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::SetData(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::SetData(), instance_halls_of_lightning::instance_halls_of_lightning_InstanceMapScript::SetData(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SetData(), boss_rend_blackhand::boss_rend_blackhandAI::SummonWave(), brann_bronzebeard::brann_bronzebeardAI::SwitchHeadVisaul(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Update(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::Update(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::Update(), instance_gundrak::instance_gundrak_InstanceMapScript::Update(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::Update(), instance_violet_hold::instance_violet_hold_InstanceMapScript::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_freya_nature_bomb::boss_freya_nature_bombAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), BattlegroundRV::UpdatePillars(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateRunes(), Player::UpdateTriggerVisibility(), npc_ranshalla::npc_ranshallaAI::WaypointReached(), and npc_arthas::npc_arthasAI::WaypointReached().

◆ GetGameObjectBySpawnIdStore()

◆ GetGameObjectFloor()

float Map::GetGameObjectFloor ( uint32  phasemask,
float  x,
float  y,
float  z,
float  maxSearchDist = DEFAULT_HEIGHT_SEARCH 
) const
inline
403 {
404 return _dynamicTree.getHeight(x, y, z, maxSearchDist, phasemask);
405 }
float getHeight(float x, float y, float z, float maxSearchDist, uint32 phasemask) const
Definition DynamicTree.cpp:294

References _dynamicTree, and DynamicMapTree::getHeight().

◆ GetGORespawnTime()

time_t Map::GetGORespawnTime ( ObjectGuid::LowType  dbGuid) const
inline
420 {
421 std::unordered_map<ObjectGuid::LowType /*dbGUID*/, time_t>::const_iterator itr = _goRespawnTimes.find(dbGuid);
422 if (itr != _goRespawnTimes.end())
423 return itr->second;
424
425 return time_t(0);
426 }

References _goRespawnTimes.

Referenced by GetLinkedRespawnTime(), and GameObject::LoadGameObjectFromDB().

◆ GetGridHeight()

float Map::GetGridHeight ( float  x,
float  y 
) const
1160{
1161 if (GridTerrainData* gmap = const_cast<Map*>(this)->GetGridTerrainData(x, y))
1162 return gmap->getHeight(x, y);
1163
1164 return INVALID_HEIGHT;
1165}

References GetGridTerrainData(), and INVALID_HEIGHT.

Referenced by CheckCollisionAndGetValidCoords(), and GetHeight().

◆ GetGridTerrainData() [1/2]

GridTerrainData * Map::GetGridTerrainData ( float  x,
float  y 
)
1069{
1070 GridCoord const gridCoord = Acore::ComputeGridCoord(x, y);
1071 return GetGridTerrainData(gridCoord);
1072}

References Acore::ComputeGridCoord(), and GetGridTerrainData().

◆ GetGridTerrainData() [2/2]

GridTerrainData * Map::GetGridTerrainData ( GridCoord const &  gridCoord)
1059{
1060 if (!MapGridManager::IsValidGridCoordinates(gridCoord.x_coord, gridCoord.y_coord))
1061 return nullptr;
1062
1063 // ensure GridMap is created
1064 EnsureGridCreated(gridCoord);
1065 return _mapGridManager.GetGrid(gridCoord.x_coord, gridCoord.y_coord)->GetTerrainData();
1066}
MapGridType * GetGrid(uint16 const x, uint16 const y)
Definition MapGridManager.cpp:80
static bool IsValidGridCoordinates(uint16 const x, uint16 const y)
Definition MapGridManager.h:42
GridTerrainData * GetTerrainData() const
Definition MapGrid.h:100

References _mapGridManager, EnsureGridCreated(), MapGridManager::GetGrid(), MapGrid< WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES >::GetTerrainData(), MapGridManager::IsValidGridCoordinates(), CoordPair< LIMIT >::x_coord, and CoordPair< LIMIT >::y_coord.

Referenced by GetAreaId(), GetAreaInfo(), GetFullTerrainStatusForPosition(), GetGridHeight(), GetGridTerrainData(), GetLiquidData(), GetMinHeight(), and GetWaterLevel().

◆ GetGridTerrainDataSharedPtr()

std::shared_ptr< GridTerrainData > Map::GetGridTerrainDataSharedPtr ( GridCoord const &  gridCoord)
1052{
1053 // ensure GridMap is created
1054 EnsureGridCreated(gridCoord);
1055 return _mapGridManager.GetGrid(gridCoord.x_coord, gridCoord.y_coord)->GetTerrainDataSharedPtr();
1056}
std::shared_ptr< GridTerrainData > GetTerrainDataSharedPtr()
Definition MapGrid.h:101

References _mapGridManager, EnsureGridCreated(), MapGridManager::GetGrid(), MapGrid< WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES >::GetTerrainDataSharedPtr(), CoordPair< LIMIT >::x_coord, and CoordPair< LIMIT >::y_coord.

Referenced by GridTerrainLoader::LoadMap().

◆ GetGuidSequenceGenerator()

template<HighGuid high>
ObjectGuidGeneratorBase & Map::GetGuidSequenceGenerator ( )
inlineprivate
622 {
623 auto itr = _guidGenerators.find(high);
624 if (itr == _guidGenerators.end())
625 itr = _guidGenerators.insert(std::make_pair(high, std::unique_ptr<ObjectGuidGenerator<high>>(new ObjectGuidGenerator<high>()))).first;
626
627 return *itr->second;
628 }
std::map< HighGuid, std::unique_ptr< ObjectGuidGeneratorBase > > _guidGenerators
Definition Map.h:630
Definition ObjectGuid.h:297

References _guidGenerators.

◆ GetHeight() [1/2]

float Map::GetHeight ( float  x,
float  y,
float  z,
bool  checkVMap = true,
float  maxSearchDist = DEFAULT_HEIGHT_SEARCH 
) const
1123{
1124 // find raw .map surface under Z coordinates
1125 float mapHeight = VMAP_INVALID_HEIGHT_VALUE;
1126 float gridHeight = GetGridHeight(x, y);
1127 if (G3D::fuzzyGe(z, gridHeight - GROUND_HEIGHT_TOLERANCE))
1128 mapHeight = gridHeight;
1129
1130 float vmapHeight = VMAP_INVALID_HEIGHT_VALUE;
1131 if (checkVMap)
1132 {
1134 vmapHeight = vmgr->getHeight(GetId(), x, y, z, maxSearchDist); // look from a bit higher pos to find the floor
1135 }
1136
1137 // mapHeight set for any above raw ground Z or <= INVALID_HEIGHT
1138 // vmapheight set for any under Z value or <= INVALID_HEIGHT
1139 if (vmapHeight > INVALID_HEIGHT)
1140 {
1141 if (mapHeight > INVALID_HEIGHT)
1142 {
1143 // we have mapheight and vmapheight and must select more appropriate
1144
1145 // we are already under the surface or vmap height above map heigt
1146 // or if the distance of the vmap height is less the land height distance
1147 if (vmapHeight > mapHeight || std::fabs(mapHeight - z) > std::fabs(vmapHeight - z))
1148 return vmapHeight;
1149 else
1150 return mapHeight; // better use .map surface height
1151 }
1152 else
1153 return vmapHeight; // we have only vmapHeight (if have)
1154 }
1155
1156 return mapHeight; // explicitly use map data
1157}
virtual float getHeight(unsigned int pMapId, float x, float y, float z, float maxSearchDist)=0

References VMAP::VMapFactory::createOrGetVMapMgr(), GetGridHeight(), VMAP::IVMapMgr::getHeight(), GetId(), GROUND_HEIGHT_TOLERANCE, INVALID_HEIGHT, and VMAP_INVALID_HEIGHT_VALUE.

Referenced by BattlegroundRV::CheckPositionForUnit(), boss_ick::boss_ickAI::DamageTaken(), GetHeight(), WorldObject::GetMapHeight(), GetTransportForPos(), GetWaterOrGroundLevel(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoXYZCommand(), go_commandscript::HandleGoZoneXYCommand(), spell_winter_veil_racer_rocket_slam::HandleTriggerSpell(), spell_svalna_revive_champion::Land(), Creature::LoadCreatureFromDB(), Spell::SelectImplicitCasterDestTargets(), and npc_cork_gizelton::npc_cork_gizeltonAI::WaypointReached().

◆ GetHeight() [2/2]

float Map::GetHeight ( uint32  phasemask,
float  x,
float  y,
float  z,
bool  vmap = true,
float  maxSearchDist = DEFAULT_HEIGHT_SEARCH 
) const
1575{
1576 float h1, h2;
1577 h1 = GetHeight(x, y, z, vmap, maxSearchDist);
1578 h2 = _dynamicTree.getHeight(x, y, z, maxSearchDist, phasemask);
1579 return std::max<float>(h1, h2);
1580}
float GetHeight(float x, float y, float z, bool checkVMap=true, float maxSearchDist=DEFAULT_HEIGHT_SEARCH) const
Definition Map.cpp:1122

References _dynamicTree, GetHeight(), and DynamicMapTree::getHeight().

◆ GetId()

uint32 Map::GetId ( ) const
inline
224{ return i_mapEntry->MapID; }
uint32 MapID
Definition DBCStructure.h:1327

References i_mapEntry, and MapEntry::MapID.

Referenced by Group::_cancelHomebindIfInstance(), AddObjectToRemoveList(), InstanceMap::AddPlayerToMap(), WorldState::BroadcastSIWorldstates(), WorldState::BuffAdalsSongOfBattle(), WorldState::BuffMagtheridonTeam(), spell_gen_consumption::CalculateDamage(), MapUpdateRequest::call(), MapPreloadRequest::call(), InstanceMap::CannotEnter(), Player::CanRollForItemInLFG(), InstanceScript::CheckAchievementCriteriaMeet(), Spell::CheckCast(), GameObject::Create(), StaticTransport::Create(), MapInstanced::CreateBattleground(), MapInstanced::CreateInstance(), MapInstanced::CreateInstanceForPlayer(), InstanceMap::CreateInstanceScript(), TransportMgr::CreateInstanceTransports(), OPvPCapturePoint::DelCreature(), DeleteCorpseData(), DeleteRespawnTimes(), WorldState::DispelAdalsSongOfBattle(), WorldState::DispelMagtheridonTeam(), CreatureAI::DoZoneInCombat(), GetAreaInfo(), GetDebugInfo(), GetFullTerrainStatusForPosition(), GetHeight(), GetLiquidData(), GetMapDifficulty(), debug_commandscript::HandleDebugObjectCountMap(), spell_valkyr_touch_aura::HandleEffectPeriodic(), gobject_commandscript::HandleGameObjectAddCommand(), go_commandscript::HandleGoZoneXYCommand(), WorldSession::HandleMoveWorldportAck(), npc_commandscript::HandleNpcAddCommand(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandleSetRaidDifficultyOpcode(), wp_commandscript::HandleWpModifyCommand(), wp_commandscript::HandleWpShowCommand(), InitVisibilityDistance(), InstanceMap::InitVisibilityDistance(), Player::inRandomLfgDungeon(), isInLineOfSight(), DisableMgr::IsPathfindingEnabled(), InstanceScript::IsTwoFactionInstance(), GridObjectLoader::LoadAllCellsInGrid(), LoadCorpseData(), GridTerrainLoader::LoadMap(), GridTerrainLoader::LoadMMap(), LoadRespawnTimes(), GridTerrainLoader::LoadVMap(), LogEncounterFinished(), AchievementCriteriaData::Meets(), MotionMaster::MoveFall(), lfg::LFGPlayerScript::OnPlayerMapChanged(), InstanceMap::PermBindAllPlayers(), RemoveAllPlayers(), RemoveCreatureRespawnTime(), RemoveGORespawnTime(), InstanceMap::Reset(), Player::RewardReputation(), SaveCreatureRespawnTime(), SaveGORespawnTime(), InstanceMap::SendResetWarnings(), World::SetInitialWorldSettings(), WorldObject::SetMap(), Player::SetMover(), SummonCreatureGroup(), MotionTransport::TeleportTransport(), UnloadGrid(), GridTerrainUnloader::UnloadTerrain(), Update(), UpdateEncounterState(), and ~Map().

◆ GetInstanceId()

◆ GetInstanceResetPeriod()

time_t Map::GetInstanceResetPeriod ( ) const
inline

◆ GetLinkedRespawnTime()

time_t Map::GetLinkedRespawnTime ( ObjectGuid  guid) const
2657{
2658 ObjectGuid linkedGuid = sObjectMgr->GetLinkedRespawnGuid(guid);
2659 switch (linkedGuid.GetHigh())
2660 {
2661 case HighGuid::Unit:
2662 return GetCreatureRespawnTime(linkedGuid.GetCounter());
2664 return GetGORespawnTime(linkedGuid.GetCounter());
2665 default:
2666 break;
2667 }
2668
2669 return time_t(0);
2670}
#define sObjectMgr
Definition ObjectMgr.h:1650
time_t GetCreatureRespawnTime(ObjectGuid::LowType dbGuid) const
Definition Map.h:410
time_t GetGORespawnTime(ObjectGuid::LowType dbGuid) const
Definition Map.h:419
Definition ObjectGuid.h:118
HighGuid GetHigh() const
Definition ObjectGuid.h:143

References GameObject, ObjectGuid::GetCounter(), GetCreatureRespawnTime(), GetGORespawnTime(), ObjectGuid::GetHigh(), sObjectMgr, and Unit.

Referenced by Creature::Respawn(), and GameObject::Update().

◆ GetLiquidData()

LiquidData const Map::GetLiquidData ( uint32  phaseMask,
float  x,
float  y,
float  z,
float  collisionHeight,
uint8  ReqLiquidType 
)
1284{
1285 LiquidData liquidData;
1286
1288 float liquid_level = INVALID_HEIGHT;
1289 float ground_level = INVALID_HEIGHT;
1290 uint32 liquid_type = 0;
1291 uint32 mogpFlags = 0;
1292 bool useGridLiquid = true;
1293 if (vmgr->GetLiquidLevel(GetId(), x, y, z, ReqLiquidType, liquid_level, ground_level, liquid_type, mogpFlags))
1294 {
1295 useGridLiquid = !IsInWMOInterior(mogpFlags);
1296 LOG_DEBUG("maps", "GetLiquidStatus(): vmap liquid level: {} ground: {} type: {}", liquid_level, ground_level, liquid_type);
1297 // Check water level and ground level
1298 if (liquid_level > ground_level && G3D::fuzzyGe(z, ground_level - GROUND_HEIGHT_TOLERANCE))
1299 {
1300 // hardcoded in client like this
1301 if (GetId() == MAP_OUTLAND && liquid_type == 2)
1302 liquid_type = 15;
1303
1304 uint32 liquidFlagType = 0;
1305 if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(liquid_type))
1306 liquidFlagType = liq->Type;
1307
1308 if (liquid_type && liquid_type < 21)
1309 {
1310 if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(GetAreaId(phaseMask, x, y, z)))
1311 {
1312 uint32 overrideLiquid = area->LiquidTypeOverride[liquidFlagType];
1313 if (!overrideLiquid && area->zone)
1314 {
1315 area = sAreaTableStore.LookupEntry(area->zone);
1316 if (area)
1317 overrideLiquid = area->LiquidTypeOverride[liquidFlagType];
1318 }
1319
1320 if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(overrideLiquid))
1321 {
1322 liquid_type = overrideLiquid;
1323 liquidFlagType = liq->Type;
1324 }
1325 }
1326 }
1327
1328 liquidData.Level = liquid_level;
1329 liquidData.DepthLevel = ground_level;
1330 liquidData.Entry = liquid_type;
1331 liquidData.Flags = 1 << liquidFlagType;
1332 }
1333
1334 float delta = liquid_level - z;
1335
1336 // Get position delta
1337 if (delta > collisionHeight)
1338 liquidData.Status = LIQUID_MAP_UNDER_WATER;
1339 else if (delta > 0.0f)
1340 liquidData.Status = LIQUID_MAP_IN_WATER;
1341 else if (delta > -0.1f)
1342 liquidData.Status = LIQUID_MAP_WATER_WALK;
1343 else
1344 liquidData.Status = LIQUID_MAP_ABOVE_WATER;
1345 }
1346
1347 if (useGridLiquid)
1348 {
1349 if (GridTerrainData* gmap = const_cast<Map*>(this)->GetGridTerrainData(x, y))
1350 {
1351 LiquidData const& map_data = gmap->GetLiquidData(x, y, z, collisionHeight, ReqLiquidType);
1352 // Not override LIQUID_MAP_ABOVE_WATER with LIQUID_MAP_NO_WATER:
1353 if (map_data.Status != LIQUID_MAP_NO_WATER && (map_data.Level > ground_level))
1354 {
1355 // hardcoded in client like this
1356 uint32 liquidEntry = map_data.Entry;
1357 if (GetId() == MAP_OUTLAND && liquidEntry == 2)
1358 liquidEntry = 15;
1359
1360 liquidData = map_data;
1361 liquidData.Entry = liquidEntry;
1362 }
1363 }
1364 }
1365
1366 return liquidData;
1367}
uint32 GetAreaId(uint32 phaseMask, float x, float y, float z) const
Definition Map.cpp:1229
virtual bool GetLiquidLevel(uint32 pMapId, float x, float y, float z, uint8 ReqLiquidType, float &level, float &floor, uint32 &type, uint32 &mogpFlags) const =0

References VMAP::VMapFactory::createOrGetVMapMgr(), LiquidData::DepthLevel, LiquidData::Entry, LiquidData::Flags, GetAreaId(), GetGridTerrainData(), GetId(), VMAP::IVMapMgr::GetLiquidLevel(), GROUND_HEIGHT_TOLERANCE, INVALID_HEIGHT, IsInWMOInterior(), LiquidData::Level, LIQUID_MAP_ABOVE_WATER, LIQUID_MAP_IN_WATER, LIQUID_MAP_NO_WATER, LIQUID_MAP_UNDER_WATER, LIQUID_MAP_WATER_WALK, LOG_DEBUG, MAP_OUTLAND, sAreaTableStore, sLiquidTypeStore, and LiquidData::Status.

Referenced by PathGenerator::BuildPolyPath(), PathGenerator::GetNavTerrain(), GetWaterOrGroundLevel(), HasEnoughWater(), IsInWater(), IsUnderWater(), Spell::SelectImplicitCasterDestTargets(), and spell_spawn_blood_pool::SetDest().

◆ GetLoadedGridsCount()

uint32 Map::GetLoadedGridsCount ( )
3152{
3154}
uint32 GetLoadedGridsCount()
Definition MapGridManager.cpp:93

References _mapGridManager, and MapGridManager::GetLoadedGridsCount().

Referenced by debug_commandscript::HandleDebugMapDataCommand().

◆ GetMapDifficulty()

MapDifficulty const * Map::GetMapDifficulty ( ) const
2285{
2287}
MapDifficulty const * GetMapDifficultyData(uint32 mapId, Difficulty difficulty)
Definition DBCStores.cpp:761

References GetDifficulty(), GetId(), and GetMapDifficultyData().

Referenced by InstanceMap::GetMaxPlayers(), and InstanceMap::GetMaxResetDelay().

◆ GetMapGrid()

MapGridType * Map::GetMapGrid ( uint16 const  x,
uint16 const  y 
)
private

◆ GetMapName()

char const * Map::GetMapName ( ) const

◆ GetMinHeight()

float Map::GetMinHeight ( float  x,
float  y 
) const
1168{
1169 if (GridTerrainData const* grid = const_cast<Map*>(this)->GetGridTerrainData(x, y))
1170 return grid->getMinHeight(x, y);
1171
1172 return MIN_HEIGHT;
1173}
#define MIN_HEIGHT
Definition GridTerrainData.h:29

References GetGridTerrainData(), and MIN_HEIGHT.

Referenced by WorldSession::HandleMovementOpcodes().

◆ GetMMapLock()

std::shared_mutex & Map::GetMMapLock ( ) const
inline
229{ return *(const_cast<std::shared_mutex*>(&MMapLock)); }
std::shared_mutex MMapLock
Definition Map.h:538

References MMapLock.

◆ GetObjectHitPos()

bool Map::GetObjectHitPos ( uint32  phasemask,
float  x1,
float  y1,
float  z1,
float  x2,
float  y2,
float  z2,
float &  rx,
float &  ry,
float &  rz,
float  modifyDist 
)
1561{
1562 G3D::Vector3 startPos(x1, y1, z1);
1563 G3D::Vector3 dstPos(x2, y2, z2);
1564
1565 G3D::Vector3 resultPos;
1566 bool result = _dynamicTree.GetObjectHitPos(phasemask, startPos, dstPos, resultPos, modifyDist);
1567
1568 rx = resultPos.x;
1569 ry = resultPos.y;
1570 rz = resultPos.z;
1571 return result;
1572}
bool GetObjectHitPos(uint32 phasemask, const G3D::Vector3 &pPos1, const G3D::Vector3 &pPos2, G3D::Vector3 &pResultHitPos, float pModifyDist) const
Definition DynamicTree.cpp:230

References _dynamicTree, and DynamicMapTree::GetObjectHitPos().

Referenced by CheckCollisionAndGetValidCoords(), and Spell::SelectImplicitCasterDestTargets().

◆ GetObjectsStore()

◆ GetParent()

Map const * Map::GetParent ( ) const
inline
226{ return m_parentMap; }

References m_parentMap.

Referenced by GridTerrainLoader::LoadMap().

◆ GetPet()

Pet * Map::GetPet ( ObjectGuid const  guid)
2400{
2401 return _objectsStore.Find<Pet>(guid);
2402}
Definition Pet.h:41

References _objectsStore, and TypeUnorderedMapContainer< OBJECT_TYPES, KEY_TYPE >::Find().

Referenced by ObjectAccessor::GetPet(), and ScriptsProcess().

◆ GetPlayers()

PlayerList const & Map::GetPlayers ( ) const
inline
324{ return m_mapRefMgr; }
MapRefMgr m_mapRefMgr
Definition Map.h:549

References m_mapRefMgr.

Referenced by AddToMap(), boss_hadronox::boss_hadronoxAI::AnyPlayerValid(), MotionTransport::BuildUpdate(), StaticTransport::BuildUpdate(), InstanceMap::CannotEnter(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), boss_gothik::boss_gothikAI::CheckGroupSplitted(), boss_volazj::CheckPhaseMinions(), boss_skadi_grauf::boss_skadi_graufAI::CheckPlayers(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::ChromieWhisper(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_arthas::npc_arthasAI::DoAction(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::DoCheckDedicatedInsanity(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoCheckHeraldOfTheTitans(), DoForAllPlayers(), instance_violet_hold::instance_violet_hold_InstanceMapScript::DoNeedCleanup(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::DoNeedCleanup(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::DoNeedCleanup(), ScriptedAI::DoPlayMusic(), InstanceScript::DoSendNotifyToInstance(), ScriptedAI::DoTeleportAll(), boss_icehowl::boss_icehowlAI::DoTrampleIfValid(), InstanceScript::DoUpdateWorldState(), CreatureAI::DoZoneInCombat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), boss_thorim::boss_thorimAI::GetArenaPlayer(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_valkyr_touch_aura::HandleEffectPeriodic(), spell_yogg_saron_brain_link_aura::HandleOnEffectApply(), WorldSession::HandleSetRaidDifficultyOpcode(), boss_ichoron::boss_ichoronAI::IchoronDoCastToAllHostilePlayers(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::InstanceCleanup(), boss_halion::boss_halionAI::IsAnyPlayerValid(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::IsEncounterInProgress(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), npc_coren_direbrew::JustDied(), boss_headless_horseman::JustDied(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustDied(), boss_yoggsaron::boss_yoggsaronAI::JustDied(), boss_ahune::JustDied(), boss_four_horsemen::boss_four_horsemenAI::JustDied(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), boss_gothik::boss_gothikAI::JustSummoned(), LogEncounterFinished(), WorldSession::LogoutPlayer(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), PlayDirectSoundToMap(), SmartScript::ProcessAction(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::RemoveBackPack(), RemoveFromMap(), boss_krystallus::boss_krystallusAI::RemoveStonedEffect(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::ReplaceMoiraIfSaved(), boss_volazj::ResetPlayersPhaseMask(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::SelectConstrictTarget(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::SelectCorruptionTarget(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), spell_gen_rallying_cry_of_the_dragonslayer::SelectTarget(), ScriptedAI::SelectTargetFromPlayerList(), CreatureTextMgr::SendChatPacket(), CreatureTextMgr::SendNonChatPacket(), SendPacketToPlayers(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::SendUpdateWorldState(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::SetData(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::SetData(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::SetData(), instance_ulduar::instance_ulduar_InstanceMapScript::SetData(), GameObject::SetLootRecipient(), Creature::SetLootRecipient(), SetZoneMusic(), SetZoneOverrideLight(), SetZoneWeather(), boss_hodir::boss_hodirAI::SpawnHelpers(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Update(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::Update(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::Update(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::Update(), instance_vault_of_archavon::instance_vault_of_archavon_InstanceMapScript::Update(), boss_chromaggus::boss_chromaggusAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_icc_gauntlet_controller::npc_icc_gauntlet_controllerAI::UpdateAI(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI(), boss_heigan::boss_heiganAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), boss_keristrasza::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_flames_initial::npc_ulduar_flames_initialAI::UpdateAI(), UpdateEncounterState(), npc_grimstone::npc_grimstoneAI::UpdateEscortAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateWorldState(), and npc_thrall_bfu::npc_thrall_bfuAI::UpdateWorldState().

◆ GetPlayersCountExceptGMs()

◆ GetSpawnMode()

◆ GetTransport()

Transport * Map::GetTransport ( ObjectGuid const  guid)

◆ GetTransportForPos()

Transport * Map::GetTransportForPos ( uint32  phase,
float  x,
float  y,
float  z,
WorldObject worldobject = nullptr 
)
1096{
1097 G3D::Vector3 v(x, y, z + 2.0f);
1098 G3D::Ray r(v, G3D::Vector3(0, 0, -1));
1099 for (TransportsContainer::const_iterator itr = _transports.begin(); itr != _transports.end(); ++itr)
1100 if ((*itr)->IsInWorld() && (*itr)->GetExactDistSq(x, y, z) < 75.0f * 75.0f && (*itr)->m_model)
1101 {
1102 float dist = 30.0f;
1103 bool hit = (*itr)->m_model->intersectRay(r, dist, false, phase, VMAP::ModelIgnoreFlags::Nothing);
1104 if (hit)
1105 return *itr;
1106 }
1107
1108 if (worldobject)
1109 if (GameObject* staticTrans = worldobject->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_TRANSPORT, 75.0f))
1110 if (staticTrans->m_model)
1111 {
1112 float dist = 10.0f;
1113 bool hit = staticTrans->m_model->intersectRay(r, dist, false, phase, VMAP::ModelIgnoreFlags::Nothing);
1114 if (hit)
1115 if (GetHeight(phase, x, y, z, true, 30.0f) < (v.z - dist + 1.0f))
1116 return staticTrans->ToTransport();
1117 }
1118
1119 return nullptr;
1120}
@ GAMEOBJECT_TYPE_TRANSPORT
Definition SharedDefines.h:1571
phase
Definition boss_skadi.cpp:103
GameObject * FindNearestGameObjectOfType(GameobjectTypes type, float range) const
Definition Object.cpp:2459

References _transports, WorldObject::FindNearestGameObjectOfType(), GAMEOBJECT_TYPE_TRANSPORT, GetHeight(), and VMAP::Nothing.

Referenced by AddToMap(), and Creature::Update().

◆ GetVisibilityRange()

◆ GetWaterLevel()

float Map::GetWaterLevel ( float  x,
float  y 
) const
1513{
1514 if (GridTerrainData* gmap = const_cast<Map*>(this)->GetGridTerrainData(x, y))
1515 return gmap->getLiquidLevel(x, y);
1516
1517 return INVALID_HEIGHT;
1518}

References GetGridTerrainData(), and INVALID_HEIGHT.

Referenced by go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoXYZCommand(), and go_commandscript::HandleGoZoneXYCommand().

◆ GetWaterOrGroundLevel()

float Map::GetWaterOrGroundLevel ( uint32  phasemask,
float  x,
float  y,
float  z,
float *  ground = nullptr,
bool  swim = false,
float  collisionHeight = DEFAULT_COLLISION_HEIGHT 
) const
1075{
1076 // we need ground level (including grid height version) for proper return water level in point
1077 float ground_z = GetHeight(phasemask, x, y, z + Z_OFFSET_FIND_HEIGHT, true, 50.0f);
1078 if (ground)
1079 *ground = ground_z;
1080
1081 LiquidData const& liquidData = const_cast<Map*>(this)->GetLiquidData(phasemask, x, y, ground_z, collisionHeight, MAP_ALL_LIQUIDS);
1082 switch (liquidData.Status)
1083 {
1085 return std::max<float>(liquidData.Level, ground_z);
1087 return ground_z;
1088 default:
1089 return liquidData.Level;
1090 }
1091
1093}
#define MAP_ALL_LIQUIDS
Definition GridTerrainData.h:40
constexpr float Z_OFFSET_FIND_HEIGHT
Definition SharedDefines.h:27
LiquidData const GetLiquidData(uint32 phaseMask, float x, float y, float z, float collisionHeight, uint8 ReqLiquidType)
Definition Map.cpp:1283

References GetHeight(), GetLiquidData(), LiquidData::Level, LIQUID_MAP_ABOVE_WATER, LIQUID_MAP_NO_WATER, MAP_ALL_LIQUIDS, LiquidData::Status, VMAP_INVALID_HEIGHT_VALUE, and Z_OFFSET_FIND_HEIGHT.

Referenced by WorldObject::GetMapWaterOrGroundLevel().

◆ GetZoneAndAreaId()

void Map::GetZoneAndAreaId ( uint32  phaseMask,
uint32 zoneid,
uint32 areaid,
float  x,
float  y,
float  z 
) const
1276{
1277 areaid = zoneid = GetAreaId(phaseMask, x, y, z);
1278 if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaid))
1279 if (area->zone)
1280 zoneid = area->zone;
1281}

References GetAreaId(), and sAreaTableStore.

Referenced by WorldObject::AddToWorld(), and MapMgr::GetZoneAndAreaId().

◆ GetZoneId()

uint32 Map::GetZoneId ( uint32  phaseMask,
float  x,
float  y,
float  z 
) const
1266{
1267 uint32 areaId = GetAreaId(phaseMask, x, y, z);
1268 if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId))
1269 if (area->zone)
1270 return area->zone;
1271
1272 return areaId;
1273}

References GetAreaId(), and sAreaTableStore.

Referenced by MapMgr::GetZoneId().

◆ HandleDelayedVisibility()

void Map::HandleDelayedVisibility ( )
653{
655 return;
656 for (std::unordered_set<Unit*>::iterator itr = i_objectsForDelayedVisibility.begin(); itr != i_objectsForDelayedVisibility.end(); ++itr)
657 (*itr)->ExecuteDelayedUnitRelocationEvent();
659}
std::unordered_set< Unit * > i_objectsForDelayedVisibility
Definition Map.h:231

References i_objectsForDelayedVisibility.

Referenced by Update().

◆ HasEnoughWater() [1/2]

bool Map::HasEnoughWater ( WorldObject const *  searcher,
float  x,
float  y,
float  z 
) const
1595{
1596 LiquidData const& liquidData = const_cast<Map*>(this)->GetLiquidData(
1597 searcher->GetPhaseMask(), x, y, z, searcher->GetCollisionHeight(), MAP_ALL_LIQUIDS);
1598
1599 if ((liquidData.Status & MAP_LIQUID_STATUS_SWIMMING) == 0)
1600 return false;
1601
1602 float minHeightInWater = searcher->GetMinHeightInWater();
1603 return liquidData.Level > INVALID_HEIGHT &&
1604 liquidData.Level > liquidData.DepthLevel &&
1605 liquidData.Level - liquidData.DepthLevel >= minHeightInWater;
1606}
#define MAP_LIQUID_STATUS_SWIMMING
Definition GridTerrainData.h:31

References LiquidData::DepthLevel, WorldObject::GetCollisionHeight(), GetLiquidData(), WorldObject::GetMinHeightInWater(), WorldObject::GetPhaseMask(), INVALID_HEIGHT, LiquidData::Level, MAP_ALL_LIQUIDS, MAP_LIQUID_STATUS_SWIMMING, and LiquidData::Status.

Referenced by CanReachPositionAndGetValidCoords().

◆ HasEnoughWater() [2/2]

bool Map::HasEnoughWater ( WorldObject const *  searcher,
LiquidData const &  liquidData 
) const

◆ HavePlayers()

◆ InitializeObject() [1/3]

template<>
void Map::InitializeObject ( Creature )
309{
310 //obj->_moveState = MAP_OBJECT_CELL_MOVE_NONE;
311}

◆ InitializeObject() [2/3]

template<>
void Map::InitializeObject ( GameObject )
315{
316 //obj->_moveState = MAP_OBJECT_CELL_MOVE_NONE;
317}

◆ InitializeObject() [3/3]

template<class T >
void Map::InitializeObject ( T *  obj)
private
304{
305}

Referenced by AddToMap().

◆ InitVisibilityDistance()

void Map::InitVisibilityDistance ( )
virtual

Reimplemented in InstanceMap, BattlegroundMap, and MapInstanced.

100{
101 //init visibility for continents
103
104 switch (GetId())
105 {
106 case MAP_EBON_HOLD: // Scarlet Enclave (DK starting zone)
107 m_VisibleDistance = 125.0f;
108 break;
109 case MAP_SCOTT_TEST: // (box map)
110 m_VisibleDistance = 200.0f;
111 break;
112 }
113}
@ MAP_EBON_HOLD
Definition AreaDefines.h:258
@ MAP_SCOTT_TEST
Definition AreaDefines.h:187
static float GetMaxVisibleDistanceOnContinents()
Definition World.h:215

References GetId(), World::GetMaxVisibleDistanceOnContinents(), m_VisibleDistance, MAP_EBON_HOLD, and MAP_SCOTT_TEST.

Referenced by MapInstanced::InitVisibilityDistance(), and Map().

◆ InsertGameObjectModel()

void Map::InsertGameObjectModel ( const GameObjectModel model)
inline
398{ _dynamicTree.insert(model); }
void insert(const GameObjectModel &)
Definition DynamicTree.cpp:117

References _dynamicTree, and DynamicMapTree::insert().

Referenced by GameObject::AddToWorld(), GameObject::UpdateModel(), and GameObject::UpdateModelPosition().

◆ Instanceable()

◆ Is25ManRaid()

bool Map::Is25ManRaid ( ) const
inline

◆ IsBattleArena()

◆ IsBattleground()

bool Map::IsBattleground ( ) const
inline
296{ return i_mapEntry && i_mapEntry->IsBattleground(); }
bool IsBattleground() const
Definition DBCStructure.h:1356

References i_mapEntry, and MapEntry::IsBattleground().

Referenced by SpellMgr::GetSpellIdForDifficulty(), and AuraEffect::HandleAuraDummy().

◆ IsBattlegroundOrArena()

◆ isCellMarked()

bool Map::isCellMarked ( uint32  pCellId)
inline
312{ return marked_cells.test(pCellId); }
std::bitset< TOTAL_NUMBER_OF_CELLS_PER_MAP *TOTAL_NUMBER_OF_CELLS_PER_MAP > marked_cells
Definition Map.h:574

References marked_cells.

◆ IsDungeon()

bool Map::IsDungeon ( ) const
inline
290{ return i_mapEntry && i_mapEntry->IsDungeon(); }
bool IsDungeon() const
Definition DBCStructure.h:1352

References i_mapEntry, and MapEntry::IsDungeon().

Referenced by Group::_cancelHomebindIfInstance(), Group::_homebindIfInstance(), InstanceSaveMgr::_ResetOrWarnAll(), InstanceMap::AddPlayerToMap(), GameObject::AddToSkillupList(), Spell::CheckCast(), TransportMgr::CreateTransport(), Spell::DoAllEffectOnTarget(), ScriptedAI::DoTeleportAll(), CreatureAI::DoZoneInCombat(), Spell::EffectTeleportUnits(), SmartScript::FillScript(), Acore::XP::Gain(), WorldObject::GetInstanceScript(), Unit::GetMeleeAttackPoint(), SpellMgr::GetSpellIdForDifficulty(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleAreaTriggerOpcode(), spell_freezing_circle::HandleDamage(), spell_item_nitro_boots::HandleDummy(), instance_commandscript::HandleInstanceSaveDataCommand(), WorldSession::HandleSetDungeonDifficultyOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSummonCommand(), InstanceSave::InsertToDB(), Player::IsAtGroupRewardDistance(), boss_ossirian::JustEngagedWith(), Unit::Kill(), WorldSession::LogoutPlayer(), Condition::Meets(), AchievementCriteriaData::Meets(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), InstanceMap::PermBindAllPlayers(), SmartScript::ProcessAction(), boss_krystallus::boss_krystallusAI::RemoveStonedEffect(), CreatureTextMgr::SendChatPacket(), Player::SetEntryPoint(), Creature::SetLootRecipient(), lfg::LFGMgr::TeleportPlayer(), ToInstanceMap(), ToInstanceMap(), and AchievementMgr::UpdateAchievementCriteria().

◆ IsGridCreated() [1/2]

bool Map::IsGridCreated ( float  x,
float  y 
) const
inline
210 {
212 }
bool IsGridCreated(GridCoord const &gridCoord) const
Definition Map.cpp:222

References Acore::ComputeGridCoord(), and IsGridCreated().

◆ IsGridCreated() [2/2]

bool Map::IsGridCreated ( GridCoord const &  gridCoord) const
223{
224 return _mapGridManager.IsGridCreated(gridCoord.x_coord, gridCoord.y_coord);
225}
bool IsGridCreated(uint16 const x, uint16 const y) const
Definition MapGridManager.cpp:64

References _mapGridManager, MapGridManager::IsGridCreated(), CoordPair< LIMIT >::x_coord, and CoordPair< LIMIT >::y_coord.

Referenced by IsGridCreated().

◆ IsGridLoaded() [1/2]

bool Map::IsGridLoaded ( float  x,
float  y 
) const
inline
205 {
207 }

References Acore::ComputeGridCoord(), and IsGridLoaded().

◆ IsGridLoaded() [2/2]

bool Map::IsGridLoaded ( GridCoord const &  gridCoord) const

◆ IsHeroic()

bool Map::IsHeroic ( ) const
inline
@ DUNGEON_DIFFICULTY_HEROIC
Definition DBCEnums.h:270
@ RAID_DIFFICULTY_10MAN_HEROIC
Definition DBCEnums.h:275

References DUNGEON_DIFFICULTY_HEROIC, i_spawnMode, IsRaid(), and RAID_DIFFICULTY_10MAN_HEROIC.

Referenced by spell_svala_ritual_strike_aura::CalculateAmount(), boss_eregos::boss_eregosAI::DamageTaken(), npc_orb_carrier::npc_orb_carrierAI::DoAction(), npc_molten_golem::npc_molten_golemAI::DoAction(), BattleExperienceEvent::Execute(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::GetData(), spell_freezing_circle::HandleDamage(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::InstanceCleanup(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::IsHeroic(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsHeroic(), boss_loken::boss_lokenAI::JustEngagedWith(), boss_krystallus::boss_krystallusAI::JustEngagedWith(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_frost_tomb::npc_frost_tomb(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::OnPlayerEnter(), at_shattered_halls_execution::OnTrigger(), spell_blood_queen_pact_of_the_darkfallen_dmg_aura::PeriodicTick(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::ReadSaveDataMore(), npc_tirion_fordring_tft::npc_tirion_fordringAI::Reset(), ScriptedAI::ScriptedAI(), instance_gundrak::instance_gundrak_InstanceMapScript::SetBossState(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::SetBossState(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::SetData(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::SetData(), instance_oculus::instance_oculus_InstanceMapScript::SetData(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), boss_skadi_grauf::boss_skadi_graufAI::SpawnFlameTriggers(), boss_skadi_grauf::boss_skadi_graufAI::SpellHitTarget(), boss_ionar::boss_ionarAI::Split(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Update(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::Update(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::Update(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::Update(), npc_time_rift::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), UpdateEncounterState(), and instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::WriteSaveDataMore().

◆ isInLineOfSight()

bool Map::isInLineOfSight ( float  x1,
float  y1,
float  z1,
float  x2,
float  y2,
float  z2,
uint32  phasemask,
LineOfSightChecks  checks,
VMAP::ModelIgnoreFlags  ignoreFlags 
) const
1521{
1522 if (!sWorld->getBoolConfig(CONFIG_VMAP_BLIZZLIKE_PVP_LOS))
1523 {
1525 {
1526 ignoreFlags = VMAP::ModelIgnoreFlags::Nothing;
1527 }
1528 }
1529
1530 if (!sWorld->getBoolConfig(CONFIG_VMAP_BLIZZLIKE_LOS_OPEN_WORLD))
1531 {
1532 if (IsWorldMap())
1533 {
1534 ignoreFlags = VMAP::ModelIgnoreFlags::Nothing;
1535 }
1536 }
1537
1538 if ((checks & LINEOFSIGHT_CHECK_VMAP) && !VMAP::VMapFactory::createOrGetVMapMgr()->isInLineOfSight(GetId(), x1, y1, z1, x2, y2, z2, ignoreFlags))
1539 {
1540 return false;
1541 }
1542
1543 if (sWorld->getBoolConfig(CONFIG_CHECK_GOBJECT_LOS) && (checks & LINEOFSIGHT_CHECK_GOBJECT_ALL))
1544 {
1545 ignoreFlags = VMAP::ModelIgnoreFlags::Nothing;
1546 if (!(checks & LINEOFSIGHT_CHECK_GOBJECT_M2))
1547 {
1548 ignoreFlags = VMAP::ModelIgnoreFlags::M2;
1549 }
1550
1551 if (!_dynamicTree.isInLineOfSight(x1, y1, z1, x2, y2, z2, phasemask, ignoreFlags))
1552 {
1553 return false;
1554 }
1555 }
1556
1557 return true;
1558}
@ LINEOFSIGHT_CHECK_GOBJECT_M2
Definition Map.h:104
@ LINEOFSIGHT_CHECK_VMAP
Definition Map.h:102
@ LINEOFSIGHT_CHECK_GOBJECT_ALL
Definition Map.h:106
@ CONFIG_CHECK_GOBJECT_LOS
Definition WorldConfig.h:113
@ CONFIG_VMAP_BLIZZLIKE_LOS_OPEN_WORLD
Definition WorldConfig.h:134
@ CONFIG_VMAP_BLIZZLIKE_PVP_LOS
Definition WorldConfig.h:133
bool isInLineOfSight(float x1, float y1, float z1, float x2, float y2, float z2, uint32 phasemask, VMAP::ModelIgnoreFlags ignoreFlags) const
Definition DynamicTree.cpp:276
bool IsWorldMap() const
Definition Map.h:299
bool isInLineOfSight(float x1, float y1, float z1, float x2, float y2, float z2, uint32 phasemask, LineOfSightChecks checks, VMAP::ModelIgnoreFlags ignoreFlags) const
Definition Map.cpp:1520

References _dynamicTree, CONFIG_CHECK_GOBJECT_LOS, CONFIG_VMAP_BLIZZLIKE_LOS_OPEN_WORLD, CONFIG_VMAP_BLIZZLIKE_PVP_LOS, VMAP::VMapFactory::createOrGetVMapMgr(), GetId(), IsBattlegroundOrArena(), isInLineOfSight(), DynamicMapTree::isInLineOfSight(), IsWorldMap(), LINEOFSIGHT_CHECK_GOBJECT_ALL, LINEOFSIGHT_CHECK_GOBJECT_M2, LINEOFSIGHT_CHECK_VMAP, VMAP::M2, VMAP::Nothing, and sWorld.

Referenced by RandomMovementGenerator< T >::_setRandomLocation(), isInLineOfSight(), WorldObject::IsWithinLOS(), WorldObject::IsWithinLOSInMap(), npc_ulduar_snow_mound::MoveInLineOfSight(), spell_blood_council_summon_shadow_resonance::SetDest(), and PathGenerator::ShortenPathUntilDist().

◆ IsInWater()

bool Map::IsInWater ( uint32  phaseMask,
float  x,
float  y,
float  z,
float  collisionHeight 
) const

◆ IsNonRaidDungeon()

bool Map::IsNonRaidDungeon ( ) const
inline
291{ return i_mapEntry && i_mapEntry->IsNonRaidDungeon(); }
bool IsNonRaidDungeon() const
Definition DBCStructure.h:1353

References i_mapEntry, and MapEntry::IsNonRaidDungeon().

Referenced by WorldSession::HandleSetDungeonDifficultyOpcode(), and Player::RewardReputation().

◆ IsRaid()

◆ IsRaidOrHeroicDungeon()

bool Map::IsRaidOrHeroicDungeon ( ) const
inline
@ DUNGEON_DIFFICULTY_NORMAL
Definition DBCEnums.h:269

References DUNGEON_DIFFICULTY_NORMAL, i_spawnMode, and IsRaid().

Referenced by Unit::Kill(), and WorldSession::LogoutPlayer().

◆ IsRegularDifficulty()

bool Map::IsRegularDifficulty ( ) const
inline
286{ return GetDifficulty() == REGULAR_DIFFICULTY; }
@ REGULAR_DIFFICULTY
Definition DBCEnums.h:267

References GetDifficulty(), and REGULAR_DIFFICULTY.

◆ IsUnderWater()

bool Map::IsUnderWater ( uint32  phaseMask,
float  x,
float  y,
float  z,
float  collisionHeight 
) const
1589{
1590 LiquidData const& liquidData = const_cast<Map*>(this)->GetLiquidData(phaseMask, x, y, z, collisionHeight, MAP_LIQUID_TYPE_WATER | MAP_LIQUID_TYPE_OCEAN);
1591 return liquidData.Status == LIQUID_MAP_UNDER_WATER;
1592}
#define MAP_LIQUID_TYPE_WATER
Definition GridTerrainData.h:35
#define MAP_LIQUID_TYPE_OCEAN
Definition GridTerrainData.h:36

References GetLiquidData(), LIQUID_MAP_UNDER_WATER, MAP_LIQUID_TYPE_OCEAN, MAP_LIQUID_TYPE_WATER, and LiquidData::Status.

Referenced by WorldSession::HandleMovementOpcodes().

◆ IsWorldMap()

bool Map::IsWorldMap ( ) const
inline
299{ return i_mapEntry && i_mapEntry->IsWorldMap(); }
bool IsWorldMap() const
Definition DBCStructure.h:1359

References i_mapEntry, and MapEntry::IsWorldMap().

Referenced by isInLineOfSight().

◆ LoadAllGrids()

void Map::LoadAllGrids ( )
233{
234 for (uint32 cellX = 0; cellX < TOTAL_NUMBER_OF_CELLS_PER_MAP; cellX++)
235 for (uint32 cellY = 0; cellY < TOTAL_NUMBER_OF_CELLS_PER_MAP; cellY++)
237}
#define TOTAL_NUMBER_OF_CELLS_PER_MAP
Definition GridDefines.h:47
#define CENTER_GRID_CELL_ID
Definition GridDefines.h:44
#define SIZE_OF_GRID_CELL
Definition GridDefines.h:42
void LoadGrid(float x, float y)
Definition Map.cpp:227

References CENTER_GRID_CELL_ID, LoadGrid(), SIZE_OF_GRID_CELL, and TOTAL_NUMBER_OF_CELLS_PER_MAP.

Referenced by MapPreloadRequest::call(), OnCreateMap(), and World::SetInitialWorldSettings().

◆ LoadCorpseData()

void Map::LoadCorpseData ( )
3092{
3094 stmt->SetData(0, GetId());
3095 stmt->SetData(1, GetInstanceId());
3096
3097 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
3098 // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, guildId, flags, dynFlags, time, corpseType, instanceId, phaseMask, guid FROM corpse WHERE mapId = ? AND instanceId = ?
3099 PreparedQueryResult result = CharacterDatabase.Query(stmt);
3100 if (!result)
3101 return;
3102
3103 do
3104 {
3105 Field* fields = result->Fetch();
3106 CorpseType type = CorpseType(fields[13].Get<uint8>());
3107 uint32 guid = fields[16].Get<uint32>();
3108 if (type >= MAX_CORPSE_TYPE || type == CORPSE_BONES)
3109 {
3110 LOG_ERROR("maps", "Corpse (guid: {}) have wrong corpse type ({}), not loading.", guid, type);
3111 continue;
3112 }
3113
3114 Corpse* corpse = new Corpse(type);
3115
3116 if (!corpse->LoadCorpseFromDB(GenerateLowGuid<HighGuid::Corpse>(), fields))
3117 {
3118 delete corpse;
3119 continue;
3120 }
3121
3122 AddCorpse(corpse);
3123
3124 corpse->UpdatePositionData();
3125 } while (result->NextRow());
3126}
@ CHAR_SEL_CORPSES
Definition CharacterDatabase.h:246
CorpseType
Definition Corpse.h:27
#define MAX_CORPSE_TYPE
Definition Corpse.h:32
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition DatabaseEnvFwd.h:45
bool LoadCorpseFromDB(ObjectGuid::LowType guid, Field *fields)
Definition Corpse.cpp:131
Class used to access individual fields of database query result.
Definition Field.h:98
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:112

References AddCorpse(), CHAR_SEL_CORPSES, CharacterDatabase, CORPSE_BONES, Field::Get(), GetId(), GetInstanceId(), Corpse::LoadCorpseFromDB(), LOG_ERROR, MAX_CORPSE_TYPE, PreparedStatementBase::SetData(), and WorldObject::UpdatePositionData().

Referenced by MapMgr::CreateBaseMap().

◆ LoadGrid()

◆ LoadGridsInRange()

void Map::LoadGridsInRange ( Position const &  center,
float  radius 
)
240{
242 return;
243
244 float const x = center.GetPositionX();
245 float const y = center.GetPositionY();
246
247 CellCoord cellCoord(Acore::ComputeCellCoord(x, y));
248 if (!cellCoord.IsCoordValid())
249 return;
250
251 if (radius > SIZE_OF_GRIDS)
252 radius = SIZE_OF_GRIDS;
253
254 CellArea area = Cell::CalculateCellArea(x, y, radius);
255 if (!area)
256 return;
257
258 for (uint32 x = area.low_bound.x_coord; x <= area.high_bound.x_coord; ++x)
259 {
260 for (uint32 y = area.low_bound.y_coord; y <= area.high_bound.y_coord; ++y)
261 {
262 CellCoord cellCoord(x, y);
263 Cell cell(cellCoord);
264 EnsureGridLoaded(cell);
265 }
266 }
267}
#define SIZE_OF_GRIDS
Definition MapDefines.h:26
bool IsGridsFullyLoaded() const
Definition MapGridManager.cpp:126
Definition Cell.h:28
CellCoord high_bound
Definition Cell.h:41
CellCoord low_bound
Definition Cell.h:40
static CellArea CalculateCellArea(float x, float y, float radius)
Definition CellImpl.h:42

References _mapGridManager, Cell::CalculateCellArea(), Acore::ComputeCellCoord(), EnsureGridLoaded(), Position::GetPositionX(), Position::GetPositionY(), CellArea::high_bound, CoordPair< LIMIT >::IsCoordValid(), MapGridManager::IsGridsFullyLoaded(), CellArea::low_bound, SIZE_OF_GRIDS, CoordPair< LIMIT >::x_coord, and CoordPair< LIMIT >::y_coord.

Referenced by AddPlayerToMap(), and Unit::ExecuteDelayedUnitRelocationEvent().

◆ LoadRespawnTimes()

void Map::LoadRespawnTimes ( )
2493{
2495 stmt->SetData(0, GetId());
2496 stmt->SetData(1, GetInstanceId());
2497 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
2498 {
2499 do
2500 {
2501 Field* fields = result->Fetch();
2502 ObjectGuid::LowType lowguid = fields[0].Get<uint32>();
2503 uint32 respawnTime = fields[1].Get<uint32>();
2504
2505 _creatureRespawnTimes[lowguid] = time_t(respawnTime);
2506 } while (result->NextRow());
2507 }
2508
2509 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GO_RESPAWNS);
2510 stmt->SetData(0, GetId());
2511 stmt->SetData(1, GetInstanceId());
2512 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
2513 {
2514 do
2515 {
2516 Field* fields = result->Fetch();
2517 ObjectGuid::LowType lowguid = fields[0].Get<uint32>();
2518 uint32 respawnTime = fields[1].Get<uint32>();
2519
2520 _goRespawnTimes[lowguid] = time_t(respawnTime);
2521 } while (result->NextRow());
2522 }
2523}
@ CHAR_SEL_CREATURE_RESPAWNS
Definition CharacterDatabase.h:252
@ CHAR_SEL_GO_RESPAWNS
Definition CharacterDatabase.h:257

References _creatureRespawnTimes, _goRespawnTimes, CHAR_SEL_CREATURE_RESPAWNS, CHAR_SEL_GO_RESPAWNS, CharacterDatabase, Field::Get(), GetId(), GetInstanceId(), and PreparedStatementBase::SetData().

Referenced by MapMgr::CreateBaseMap().

◆ LogEncounterFinished()

void Map::LogEncounterFinished ( EncounterCreditType  type,
uint32  creditEntry 
)
2612{
2613 if (!IsRaid() || !GetEntry() || GetEntry()->Expansion() < 2) // only for wotlk raids, because logs take up tons of mysql memory
2614 return;
2615 InstanceMap* map = ToInstanceMap();
2616 if (!map)
2617 return;
2618 std::string playersInfo;
2619 char buffer[16384], buffer2[255];
2620 Map::PlayerList const& pl = map->GetPlayers();
2621 for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
2622 if (Player* p = itr->GetSource())
2623 {
2624 std::string auraStr;
2625 const Unit::AuraApplicationMap& a = p->GetAppliedAuras();
2626 for (auto iterator = a.begin(); iterator != a.end(); ++iterator)
2627 {
2628 snprintf(buffer2, 255, "%u(%u) ", iterator->first, iterator->second->GetEffectMask());
2629 auraStr += buffer2;
2630 }
2631
2632 snprintf(buffer, 16384, "%s (%s, acc: %u, ip: %s, guild: %u), xyz: (%.1f, %.1f, %.1f), auras: %s\n",
2633 p->GetName().c_str(), p->GetGUID().ToString().c_str(), p->GetSession()->GetAccountId(), p->GetSession()->GetRemoteAddress().c_str(), p->GetGuildId(), p->GetPositionX(), p->GetPositionY(), p->GetPositionZ(), auraStr.c_str());
2634 playersInfo += buffer;
2635 }
2636 CleanStringForMysqlQuery(playersInfo);
2637 CharacterDatabase.Execute("INSERT INTO log_encounter VALUES(NOW(), {}, {}, {}, {}, '{}')", GetId(), (uint32)GetDifficulty(), type, creditEntry, playersInfo);
2638}
void CleanStringForMysqlQuery(std::string &str)
Definition Common.cpp:61
LinkedListHead::Iterator< GridReference< MapGridType > > iterator
Definition GridRefMgr.h:30
Definition Map.h:655
Definition MapRefMgr.h:26
InstanceMap * ToInstanceMap()
Definition Map.h:383
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition Unit.h:629

References MapRefMgr::begin(), CharacterDatabase, CleanStringForMysqlQuery(), MapRefMgr::end(), GetDifficulty(), GetEntry(), GetId(), GetPlayers(), IsRaid(), and ToInstanceMap().

Referenced by UpdateEncounterState().

◆ markCell()

void Map::markCell ( uint32  pCellId)
inline
313{ marked_cells.set(pCellId); }

References marked_cells.

Referenced by MarkNearbyCellsOf().

◆ MarkNearbyCellsOf()

void Map::MarkNearbyCellsOf ( WorldObject obj)
422{
423 // Check for valid position
424 if (!obj->IsPositionValid())
425 return;
426
427 // Update mobs/objects in ALL visible cells around object!
429 for (uint32 x = area.low_bound.x_coord; x <= area.high_bound.x_coord; ++x)
430 {
431 for (uint32 y = area.low_bound.y_coord; y <= area.high_bound.y_coord; ++y)
432 {
433 // marked cells are those that have been visited
434 uint32 cell_id = (y * TOTAL_NUMBER_OF_CELLS_PER_MAP) + x;
435 markCell(cell_id);
436 }
437 }
438}
void markCell(uint32 pCellId)
Definition Map.h:313
float GetGridActivationRange() const
Definition Object.cpp:1616
bool IsPositionValid() const
Definition Position.cpp:176

References Cell::CalculateCellArea(), WorldObject::GetGridActivationRange(), Position::GetPositionX(), Position::GetPositionY(), CellArea::high_bound, Position::IsPositionValid(), CellArea::low_bound, markCell(), TOTAL_NUMBER_OF_CELLS_PER_MAP, CoordPair< LIMIT >::x_coord, and CoordPair< LIMIT >::y_coord.

Referenced by Update().

◆ MoveAllCreaturesInMoveList()

void Map::MoveAllCreaturesInMoveList ( )
896{
897 for (std::vector<Creature*>::iterator itr = _creaturesToMove.begin(); itr != _creaturesToMove.end(); ++itr)
898 {
899 Creature* c = *itr;
900 if (c->FindMap() != this)
901 continue;
902
904 {
906 continue;
907 }
908
910 if (!c->IsInWorld())
911 continue;
912
913 Cell const& old_cell = c->GetCurrentCell();
914 Cell new_cell(c->GetPositionX(), c->GetPositionY());
915
916 c->RemoveFromGrid();
917 if (old_cell.DiffGrid(new_cell))
918 EnsureGridLoaded(new_cell);
919 AddToGrid(c, new_cell);
920 }
921 _creaturesToMove.clear();
922}
void RemoveFromGrid()
Definition Object.h:363
Map * FindMap() const
Definition Object.h:588

References _creaturesToMove, MovableMapObject::_moveState, AddToGrid(), Cell::DiffGrid(), EnsureGridLoaded(), WorldObject::FindMap(), MovableMapObject::GetCurrentCell(), Position::GetPositionX(), Position::GetPositionY(), Object::IsInWorld(), MAP_OBJECT_CELL_MOVE_ACTIVE, MAP_OBJECT_CELL_MOVE_NONE, and GridObject< T >::RemoveFromGrid().

Referenced by Update().

◆ MoveAllDynamicObjectsInMoveList()

void Map::MoveAllDynamicObjectsInMoveList ( )
954{
955 for (std::vector<DynamicObject*>::iterator itr = _dynamicObjectsToMove.begin(); itr != _dynamicObjectsToMove.end(); ++itr)
956 {
957 DynamicObject* dynObj = *itr;
958 if (dynObj->FindMap() != this)
959 continue;
960
962 {
964 continue;
965 }
966
968 if (!dynObj->IsInWorld())
969 continue;
970
971 Cell const& old_cell = dynObj->GetCurrentCell();
972 Cell new_cell(dynObj->GetPositionX(), dynObj->GetPositionY());
973
974 dynObj->RemoveFromGrid();
975 if (old_cell.DiffGrid(new_cell))
976 EnsureGridLoaded(new_cell);
977 AddToGrid(dynObj, new_cell);
978 }
979 _dynamicObjectsToMove.clear();
980}

References _dynamicObjectsToMove, MovableMapObject::_moveState, AddToGrid(), Cell::DiffGrid(), EnsureGridLoaded(), WorldObject::FindMap(), MovableMapObject::GetCurrentCell(), Position::GetPositionX(), Position::GetPositionY(), Object::IsInWorld(), MAP_OBJECT_CELL_MOVE_ACTIVE, MAP_OBJECT_CELL_MOVE_NONE, and GridObject< T >::RemoveFromGrid().

Referenced by Update().

◆ MoveAllGameObjectsInMoveList()

void Map::MoveAllGameObjectsInMoveList ( )
925{
926 for (std::vector<GameObject*>::iterator itr = _gameObjectsToMove.begin(); itr != _gameObjectsToMove.end(); ++itr)
927 {
928 GameObject* go = *itr;
929 if (go->FindMap() != this)
930 continue;
931
933 {
935 continue;
936 }
937
939 if (!go->IsInWorld())
940 continue;
941
942 Cell const& old_cell = go->GetCurrentCell();
943 Cell new_cell(go->GetPositionX(), go->GetPositionY());
944
945 go->RemoveFromGrid();
946 if (old_cell.DiffGrid(new_cell))
947 EnsureGridLoaded(new_cell);
948 AddToGrid(go, new_cell);
949 }
950 _gameObjectsToMove.clear();
951}

References _gameObjectsToMove, MovableMapObject::_moveState, AddToGrid(), Cell::DiffGrid(), EnsureGridLoaded(), WorldObject::FindMap(), MovableMapObject::GetCurrentCell(), Position::GetPositionX(), Position::GetPositionY(), Object::IsInWorld(), MAP_OBJECT_CELL_MOVE_ACTIVE, MAP_OBJECT_CELL_MOVE_NONE, and GridObject< T >::RemoveFromGrid().

Referenced by Update().

◆ OnCreateMap()

void Map::OnCreateMap ( )
91{
92 // Instances load all grids by default (both base map and child maps)
93 if (GetInstanceId())
95
96 sScriptMgr->OnCreateMap(this);
97}
void LoadAllGrids()
Definition Map.cpp:232

References GetInstanceId(), LoadAllGrids(), and sScriptMgr.

Referenced by MapMgr::CreateBaseMap(), and MapInstanced::CreateBattleground().

◆ PlayDirectSoundToMap()

void Map::PlayDirectSoundToMap ( uint32  soundId,
uint32  zoneId = 0 
)
2822{
2823 Map::PlayerList const& players = GetPlayers();
2824 if (!players.IsEmpty())
2825 {
2827 data << uint32(soundId);
2828
2829 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
2830 if (Player* player = itr->GetSource())
2831 if (!zoneId || player->GetZoneId() == zoneId)
2832 player->SendDirectMessage(&data);
2833 }
2834}
@ SMSG_PLAY_SOUND
Definition Opcodes.h:752

References MapRefMgr::begin(), MapRefMgr::end(), GetPlayers(), LinkedListHead::IsEmpty(), and SMSG_PLAY_SOUND.

Referenced by instance_naxxramas::Update().

◆ PlayerRelocation()

void Map::PlayerRelocation ( Player player,
float  x,
float  y,
float  z,
float  o 
)
772{
773 Cell old_cell(player->GetPositionX(), player->GetPositionY());
774 Cell new_cell(x, y);
775
776 if (old_cell.DiffGrid(new_cell) || old_cell.DiffCell(new_cell))
777 {
778 player->RemoveFromGrid();
779
780 if (old_cell.DiffGrid(new_cell))
781 EnsureGridLoaded(new_cell);
782
783 AddToGrid(player, new_cell);
784 }
785
786 player->Relocate(x, y, z, o);
787 if (player->IsVehicle())
789 player->UpdatePositionData();
790 player->UpdateObjectVisibility(false);
791}

References AddToGrid(), Cell::DiffCell(), Cell::DiffGrid(), EnsureGridLoaded(), Position::GetPositionX(), Position::GetPositionY(), Unit::GetVehicleKit(), Unit::IsVehicle(), Position::Relocate(), Vehicle::RelocatePassengers(), GridObject< T >::RemoveFromGrid(), Player::UpdateObjectVisibility(), and WorldObject::UpdatePositionData().

Referenced by at_icc_saurfang_portal::OnTrigger(), StaticTransport::UpdatePassengerPositions(), MotionTransport::UpdatePassengerPositions(), and Unit::UpdatePosition().

◆ RemoveAllObjectsInRemoveList()

void Map::RemoveAllObjectsInRemoveList ( )
1772{
1773 while (!i_objectsToRemove.empty())
1774 {
1775 std::unordered_set<WorldObject*>::iterator itr = i_objectsToRemove.begin();
1776 WorldObject* obj = *itr;
1777 i_objectsToRemove.erase(itr);
1778
1779 switch (obj->GetTypeId())
1780 {
1781 case TYPEID_CORPSE:
1782 {
1783 Corpse* corpse = ObjectAccessor::GetCorpse(*obj, obj->GetGUID());
1784 if (!corpse)
1785 LOG_ERROR("maps", "Tried to delete corpse/bones {} that is not in map.", obj->GetGUID().ToString());
1786 else
1787 RemoveFromMap(corpse, true);
1788 break;
1789 }
1791 RemoveFromMap((DynamicObject*)obj, true);
1792 break;
1793 case TYPEID_GAMEOBJECT:
1794 if (MotionTransport* transport = obj->ToGameObject()->ToMotionTransport())
1795 RemoveFromMap(transport, true);
1796 else
1797 RemoveFromMap(obj->ToGameObject(), true);
1798 break;
1799 case TYPEID_UNIT:
1800 // in case triggered sequence some spell can continue casting after prev CleanupsBeforeDelete call
1801 // make sure that like sources auras/etc removed before destructor start
1803 RemoveFromMap(obj->ToCreature(), true);
1804 break;
1805 default:
1806 LOG_ERROR("maps", "Non-grid object (TypeId: {}) is in grid object remove list, ignored.", obj->GetTypeId());
1807 break;
1808 }
1809 }
1810}
@ TYPEID_DYNAMICOBJECT
Definition ObjectGuid.h:38
@ TYPEID_GAMEOBJECT
Definition ObjectGuid.h:37
@ TYPEID_UNIT
Definition ObjectGuid.h:35
@ TYPEID_CORPSE
Definition ObjectGuid.h:39
MotionTransport * ToMotionTransport()
Definition GameObject.h:326
void RemoveFromMap(T *, bool)
Definition Map.cpp:703
void CleanupsBeforeDelete(bool finalCleanup=true) override
Definition Unit.cpp:15849
Corpse * GetCorpse(WorldObject const &u, ObjectGuid const guid)
Definition ObjectAccessor.cpp:179

References Unit::CleanupsBeforeDelete(), ObjectAccessor::GetCorpse(), Object::GetGUID(), Object::GetTypeId(), i_objectsToRemove, LOG_ERROR, RemoveFromMap(), Object::ToCreature(), Object::ToGameObject(), GameObject::ToMotionTransport(), ObjectGuid::ToString(), TYPEID_CORPSE, TYPEID_DYNAMICOBJECT, TYPEID_GAMEOBJECT, and TYPEID_UNIT.

Referenced by DelayedUpdate(), and MapGridManager::UnloadGrid().

◆ RemoveAllPlayers()

void Map::RemoveAllPlayers ( )
virtual

Reimplemented in BattlegroundMap.

992{
993 if (HavePlayers())
994 {
995 for (MapRefMgr::iterator itr = m_mapRefMgr.begin(); itr != m_mapRefMgr.end(); ++itr)
996 {
997 Player* player = itr->GetSource();
998 if (!player->IsBeingTeleportedFar())
999 {
1000 // this is happening for bg
1001 LOG_ERROR("maps", "Map::UnloadAll: player {} is still in map {} during unload, this should not happen!", player->GetName(), GetId());
1002 player->TeleportTo(player->m_homebindMapId, player->m_homebindX, player->m_homebindY, player->m_homebindZ, player->GetOrientation());
1003 }
1004 }
1005 }
1006}
float m_homebindZ
Definition Player.h:2392
bool IsBeingTeleportedFar() const
Definition Player.h:2111
uint32 m_homebindMapId
Definition Player.h:2388
float m_homebindY
Definition Player.h:2391
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1342
float m_homebindX
Definition Player.h:2390
std::string const & GetName() const
Definition Object.h:514

References MapRefMgr::begin(), MapRefMgr::end(), GetId(), WorldObject::GetName(), Position::GetOrientation(), HavePlayers(), Player::IsBeingTeleportedFar(), LOG_ERROR, Player::m_homebindMapId, Player::m_homebindX, Player::m_homebindY, Player::m_homebindZ, m_mapRefMgr, and Player::TeleportTo().

◆ RemoveCorpse()

void Map::RemoveCorpse ( Corpse corpse)
2685{
2686 ASSERT(corpse);
2687 GridCoord const gridCoord = Acore::ComputeGridCoord(corpse->GetPositionX(), corpse->GetPositionY());
2688
2689 corpse->DestroyForNearbyPlayers();
2690 if (corpse->IsInGrid())
2691 RemoveFromMap(corpse, false);
2692 else
2693 {
2694 corpse->RemoveFromWorld();
2695 corpse->ResetMap();
2696 }
2697
2698 _corpsesByGrid[gridCoord.GetId()].erase(corpse);
2699 if (corpse->GetType() != CORPSE_BONES)
2700 _corpsesByPlayer.erase(corpse->GetOwnerGUID());
2701 else
2702 _corpseBones.erase(corpse);
2703}
void RemoveFromWorld() override
Definition Corpse.cpp:52
bool IsInGrid() const
Definition Object.h:361
void DestroyForNearbyPlayers()
Definition Object.cpp:2951

References _corpseBones, _corpsesByGrid, _corpsesByPlayer, ASSERT, Acore::ComputeGridCoord(), CORPSE_BONES, WorldObject::DestroyForNearbyPlayers(), CoordPair< LIMIT >::GetId(), Corpse::GetOwnerGUID(), Position::GetPositionX(), Position::GetPositionY(), Corpse::GetType(), GridObject< T >::IsInGrid(), RemoveFromMap(), Corpse::RemoveFromWorld(), and WorldObject::ResetMap().

Referenced by ConvertCorpseToBones(), and RemoveOldCorpses().

◆ RemoveCreatureFromMoveList()

void Map::RemoveCreatureFromMoveList ( Creature c)
private

◆ RemoveCreatureRespawnTime()

void Map::RemoveCreatureRespawnTime ( ObjectGuid::LowType  dbGuid)
2448{
2449 _creatureRespawnTimes.erase(spawnId);
2450
2452 stmt->SetData(0, spawnId);
2453 stmt->SetData(1, GetId());
2454 stmt->SetData(2, GetInstanceId());
2455 CharacterDatabase.Execute(stmt);
2456}
@ CHAR_DEL_CREATURE_RESPAWN
Definition CharacterDatabase.h:254

References _creatureRespawnTimes, CHAR_DEL_CREATURE_RESPAWN, CharacterDatabase, GetId(), GetInstanceId(), and PreparedStatementBase::SetData().

Referenced by Creature::DeleteFromDB(), Creature::Respawn(), and SaveCreatureRespawnTime().

◆ RemoveDynamicObjectFromMoveList()

void Map::RemoveDynamicObjectFromMoveList ( DynamicObject go)
private

◆ RemoveFromActive() [1/4]

template<>
void Map::RemoveFromActive ( Creature c)
1865{
1867}
void RemoveFromActiveHelper(WorldObject *obj)
Definition Map.h:591

References RemoveFromActiveHelper().

◆ RemoveFromActive() [2/4]

template<>
void Map::RemoveFromActive ( DynamicObject obj)
1871{
1873}

References RemoveFromActiveHelper().

◆ RemoveFromActive() [3/4]

template<>
void Map::RemoveFromActive ( GameObject obj)
1877{
1879}

References RemoveFromActiveHelper().

◆ RemoveFromActive() [4/4]

template<class T >
void Map::RemoveFromActive ( T *  obj)

◆ RemoveFromActiveHelper()

void Map::RemoveFromActiveHelper ( WorldObject obj)
inlineprivate
592 {
593 // Map::Update for active object in proccess
595 {
596 ActiveNonPlayers::iterator itr = m_activeNonPlayers.find(obj);
597 if (itr == m_activeNonPlayers.end())
598 return;
599 if (itr == m_activeNonPlayersIter)
601 m_activeNonPlayers.erase(itr);
602 }
603 else
604 m_activeNonPlayers.erase(obj);
605 }

References m_activeNonPlayers, and m_activeNonPlayersIter.

Referenced by RemoveFromActive(), RemoveFromActive(), RemoveFromActive(), and RemoveFromActive().

◆ RemoveFromMap() [1/2]

template<>
void Map::RemoveFromMap ( MotionTransport obj,
bool  remove 
)
727{
728 obj->RemoveFromWorld();
729 if (obj->isActiveObject())
730 RemoveFromActive(obj);
731
732 Map::PlayerList const& players = GetPlayers();
733 if (!players.IsEmpty())
734 {
735 UpdateData data;
736 obj->BuildOutOfRangeUpdateBlock(&data);
737 WorldPacket packet;
738 data.BuildPacket(packet);
739 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
740 if (itr->GetSource()->GetTransport() != obj)
741 itr->GetSource()->SendDirectMessage(&packet);
742 }
743
745 {
746 TransportsContainer::iterator itr = _transports.find(obj);
747 if (itr == _transports.end())
748 return;
749 if (itr == _transportsUpdateIter)
751 _transports.erase(itr);
752 }
753 else
754 _transports.erase(obj);
755
756 obj->ResetMap();
757
758 // Transports are never actually deleted, but it *should* be safe to clear
759 // from update list when removing from world
761
762 if (remove)
763 {
764 // if option set then object already saved at this moment
765 if (!sWorld->getBoolConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY))
766 obj->SaveRespawnTime();
767 DeleteFromWorld(obj);
768 }
769}
@ CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY
Definition WorldConfig.h:52
void RemoveFromWorld() override
Definition GameObject.cpp:168
void SaveRespawnTime() override
Definition GameObject.h:243
void RemoveFromActive(T *obj)
Definition Map.cpp:1858
void RemoveObjectFromMapUpdateList(WorldObject *obj)
Definition Map.cpp:640
void DeleteFromWorld(T *)
Definition Map.cpp:179
void BuildOutOfRangeUpdateBlock(UpdateData *data) const
Definition Object.cpp:269

References _transports, _transportsUpdateIter, MapRefMgr::begin(), Object::BuildOutOfRangeUpdateBlock(), UpdateData::BuildPacket(), CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY, DeleteFromWorld(), MapRefMgr::end(), GetPlayers(), WorldObject::isActiveObject(), LinkedListHead::IsEmpty(), RemoveFromActive(), GameObject::RemoveFromWorld(), RemoveObjectFromMapUpdateList(), WorldObject::ResetMap(), GameObject::SaveRespawnTime(), and sWorld.

◆ RemoveFromMap() [2/2]

template<class T >
void Map::RemoveFromMap ( T *  obj,
bool  remove 
)
704{
705 bool inWorld = obj->IsInWorld() && obj->GetTypeId() >= TYPEID_UNIT && obj->GetTypeId() <= TYPEID_GAMEOBJECT;
706 obj->RemoveFromWorld();
707
708 if (obj->isActiveObject())
709 RemoveFromActive(obj);
710
711 if (!inWorld) // pussywizard: if was in world, RemoveFromWorld() called DestroyForNearbyPlayers()
712 obj->DestroyForNearbyPlayers(); // pussywizard: previous player->UpdateObjectVisibility()
713
714 obj->RemoveFromGrid();
715
716 obj->ResetMap();
717
718 if (remove)
719 {
721 DeleteFromWorld(obj);
722 }
723}

References DeleteFromWorld(), RemoveFromActive(), RemoveObjectFromMapUpdateList(), TYPEID_GAMEOBJECT, and TYPEID_UNIT.

Referenced by MotionTransport::DelayedTeleportTransport(), RemoveAllObjectsInRemoveList(), and RemoveCorpse().

◆ RemoveGameObjectFromMoveList()

void Map::RemoveGameObjectFromMoveList ( GameObject go)
private

◆ RemoveGameObjectModel()

void Map::RemoveGameObjectModel ( const GameObjectModel model)
inline
397{ _dynamicTree.remove(model); }
void remove(const GameObjectModel &)
Definition DynamicTree.cpp:122

References _dynamicTree, and DynamicMapTree::remove().

Referenced by GameObject::RemoveFromWorld(), GameObject::UpdateModel(), and GameObject::UpdateModelPosition().

◆ RemoveGORespawnTime()

void Map::RemoveGORespawnTime ( ObjectGuid::LowType  dbGuid)
2482{
2483 _goRespawnTimes.erase(spawnId);
2484
2486 stmt->SetData(0, spawnId);
2487 stmt->SetData(1, GetId());
2488 stmt->SetData(2, GetInstanceId());
2489 CharacterDatabase.Execute(stmt);
2490}
@ CHAR_DEL_GO_RESPAWN
Definition CharacterDatabase.h:259

References _goRespawnTimes, CHAR_DEL_GO_RESPAWN, CharacterDatabase, GetId(), GetInstanceId(), and PreparedStatementBase::SetData().

Referenced by GameObject::DeleteFromDB(), GameObject::LoadGameObjectFromDB(), GameObject::Respawn(), and SaveGORespawnTime().

◆ RemoveObjectFromMapUpdateList()

void Map::RemoveObjectFromMapUpdateList ( WorldObject obj)

◆ RemoveOldCorpses()

void Map::RemoveOldCorpses ( )
2759{
2760 time_t now = GameTime::GetGameTime().count();
2761
2762 std::vector<ObjectGuid> corpses;
2763 corpses.reserve(_corpsesByPlayer.size());
2764
2765 for (auto const& p : _corpsesByPlayer)
2766 if (p.second->IsExpired(now))
2767 corpses.push_back(p.first);
2768
2769 for (ObjectGuid const& ownerGuid : corpses)
2770 ConvertCorpseToBones(ownerGuid);
2771
2772 std::vector<Corpse*> expiredBones;
2773 for (Corpse* bones : _corpseBones)
2774 if (bones->IsExpired(now))
2775 expiredBones.push_back(bones);
2776
2777 for (Corpse* bones : expiredBones)
2778 {
2779 RemoveCorpse(bones);
2780 delete bones;
2781 }
2782}
Seconds GetGameTime()
Definition GameTime.cpp:38

References _corpseBones, _corpsesByPlayer, ConvertCorpseToBones(), GameTime::GetGameTime(), and RemoveCorpse().

Referenced by World::Update().

◆ RemovePlayerFromMap()

void Map::RemovePlayerFromMap ( Player player,
bool  remove 
)
virtual

Reimplemented in InstanceMap, and BattlegroundMap.

674{
675 // Before leaving map, update zone/area for stats
676 player->UpdateZone(MAP_INVALID_ZONE, 0);
677 player->getHostileRefMgr().deleteReferences(true); // pussywizard: multithreading crashfix
678
679 bool inWorld = player->IsInWorld();
680 player->RemoveFromWorld();
681 SendRemoveTransports(player);
682
683 if (!inWorld) // pussywizard: if was in world, RemoveFromWorld() called DestroyForNearbyPlayers()
684 player->DestroyForNearbyPlayers(); // pussywizard: previous player->UpdateObjectVisibility(true)
685
686 if (player->IsInGrid())
687 player->RemoveFromGrid();
688 else
689 ASSERT(remove); //maybe deleted in logoutplayer when player is not in a map
690
691 sScriptMgr->OnPlayerLeaveMap(this, player);
692 if (remove)
693 {
694 DeleteFromWorld(player);
695 }
696}
#define MAP_INVALID_ZONE
Definition Map.cpp:47
void deleteReferences(bool removeFromMap=false)
Definition HostileRefMgr.cpp:125
void SendRemoveTransports(Player *player)
Definition Map.cpp:1661
void UpdateZone(uint32 newZone, uint32 newArea, bool force=false)
Definition PlayerUpdates.cpp:1252
void RemoveFromWorld() override
Definition Player.cpp:1722
HostileRefMgr & getHostileRefMgr()
Definition Unit.h:902

References ASSERT, DeleteFromWorld(), HostileRefMgr::deleteReferences(), WorldObject::DestroyForNearbyPlayers(), Unit::getHostileRefMgr(), GridObject< T >::IsInGrid(), Object::IsInWorld(), MAP_INVALID_ZONE, GridObject< T >::RemoveFromGrid(), Player::RemoveFromWorld(), SendRemoveTransports(), sScriptMgr, and Player::UpdateZone().

Referenced by WorldSession::HandleMoveWorldportAck(), WorldSession::HandleSetRaidDifficultyOpcode(), InstanceMap::RemovePlayerFromMap(), BattlegroundMap::RemovePlayerFromMap(), and Player::TeleportTo().

◆ RemoveUpdateObject()

void Map::RemoveUpdateObject ( Object obj)
inline
489 {
490 _updateObjects.erase(obj);
491 }

References _updateObjects.

Referenced by DeleteFromWorld(), and WorldObject::RemoveFromObjectUpdate().

◆ RemoveWorldObject()

void Map::RemoveWorldObject ( WorldObject obj)
inline
319{ i_worldObjects.erase(obj); }

References i_worldObjects.

Referenced by WorldObject::ResetMap().

◆ resetMarkedCells()

void Map::resetMarkedCells ( )
inline
311{ marked_cells.reset(); }

References marked_cells.

Referenced by Update().

◆ SaveCreatureRespawnTime()

void Map::SaveCreatureRespawnTime ( ObjectGuid::LowType  dbGuid,
time_t &  respawnTime 
)
2425{
2426 if (!respawnTime)
2427 {
2428 // Delete only
2430 return;
2431 }
2432
2433 time_t now = GameTime::GetGameTime().count();
2434 if (GetInstanceResetPeriod() > 0 && respawnTime - now + 5 >= GetInstanceResetPeriod())
2435 respawnTime = now + YEAR;
2436
2437 _creatureRespawnTimes[spawnId] = respawnTime;
2438
2440 stmt->SetData(0, spawnId);
2441 stmt->SetData(1, uint32(respawnTime));
2442 stmt->SetData(2, GetId());
2443 stmt->SetData(3, GetInstanceId());
2444 CharacterDatabase.Execute(stmt);
2445}
@ CHAR_REP_CREATURE_RESPAWN
Definition CharacterDatabase.h:253
constexpr auto YEAR
Definition Common.h:52
time_t GetInstanceResetPeriod() const
Definition Map.h:434
void RemoveCreatureRespawnTime(ObjectGuid::LowType dbGuid)
Definition Map.cpp:2447

References _creatureRespawnTimes, CHAR_REP_CREATURE_RESPAWN, CharacterDatabase, GameTime::GetGameTime(), GetId(), GetInstanceId(), GetInstanceResetPeriod(), RemoveCreatureRespawnTime(), PreparedStatementBase::SetData(), and YEAR.

Referenced by Creature::SaveRespawnTime().

◆ SaveGORespawnTime()

void Map::SaveGORespawnTime ( ObjectGuid::LowType  dbGuid,
time_t &  respawnTime 
)
2459{
2460 if (!respawnTime)
2461 {
2462 // Delete only
2463 RemoveGORespawnTime(spawnId);
2464 return;
2465 }
2466
2467 time_t now = GameTime::GetGameTime().count();
2468 if (GetInstanceResetPeriod() > 0 && respawnTime - now + 5 >= GetInstanceResetPeriod())
2469 respawnTime = now + YEAR;
2470
2471 _goRespawnTimes[spawnId] = respawnTime;
2472
2474 stmt->SetData(0, spawnId);
2475 stmt->SetData(1, uint32(respawnTime));
2476 stmt->SetData(2, GetId());
2477 stmt->SetData(3, GetInstanceId());
2478 CharacterDatabase.Execute(stmt);
2479}
@ CHAR_REP_GO_RESPAWN
Definition CharacterDatabase.h:258
void RemoveGORespawnTime(ObjectGuid::LowType dbGuid)
Definition Map.cpp:2481

References _goRespawnTimes, CHAR_REP_GO_RESPAWN, CharacterDatabase, GameTime::GetGameTime(), GetId(), GetInstanceId(), GetInstanceResetPeriod(), RemoveGORespawnTime(), PreparedStatementBase::SetData(), and YEAR.

Referenced by GameObject::SaveRespawnTime().

◆ ScheduleCreatureRespawn()

void Map::ScheduleCreatureRespawn ( ObjectGuid  creatureGuid,
Milliseconds  respawnTimer,
Position  pos = Position() 
)
2785{
2786 _creatureRespawnScheduler.Schedule(respawnTimer, [this, creatureGuid, pos](TaskContext)
2787 {
2788 if (Creature* creature = GetCreature(creatureGuid))
2789 creature->Respawn();
2790 else
2791 SummonCreature(creatureGuid.GetEntry(), pos);
2792 });
2793}
TaskScheduler _creatureRespawnScheduler
Definition Map.h:439
Creature * GetCreature(ObjectGuid const guid)
Definition Map.cpp:2389
TempSummon * SummonCreature(uint32 entry, Position const &pos, SummonPropertiesEntry const *properties=nullptr, uint32 duration=0, WorldObject *summoner=nullptr, uint32 spellId=0, uint32 vehId=0, bool visibleBySummonerOnly=false)
Definition Object.cpp:2156
uint32 GetEntry() const
Definition ObjectGuid.h:144
Definition TaskScheduler.h:421
TaskScheduler & Schedule(std::chrono::duration< _Rep, _Period > const &time, task_handler_t const &task)
Definition TaskScheduler.h:232

References _creatureRespawnScheduler, GetCreature(), ObjectGuid::GetEntry(), TaskScheduler::Schedule(), and SummonCreature().

Referenced by Creature::DespawnOnEvade(), and Creature::ForcedDespawn().

◆ ScriptCommandStart()

void Map::ScriptCommandStart ( ScriptInfo const &  script,
uint32  delay,
Object source,
Object target 
)
  • If effects should be immediate, launch the script execution
70{
71 // NOTE: script record _must_ exist until command executed
72
73 // prepare static data
74 ObjectGuid sourceGUID = source ? source->GetGUID() : ObjectGuid::Empty;
75 ObjectGuid targetGUID = target ? target->GetGUID() : ObjectGuid::Empty;
76 ObjectGuid ownerGUID = (source && source->IsItem()) ? ((Item*)source)->GetOwnerGUID() : ObjectGuid::Empty;
77
78 ScriptAction sa;
79 sa.sourceGUID = sourceGUID;
80 sa.targetGUID = targetGUID;
81 sa.ownerGUID = ownerGUID;
82
83 sa.script = &script;
84 m_scriptSchedule.insert(ScriptScheduleMap::value_type(time_t(GameTime::GetGameTime().count() + delay), sa));
85
86 sScriptMgr->IncreaseScheduledScriptsCount();
87
89 if (delay == 0 && !i_scriptLock)
90 {
91 i_scriptLock = true;
93 i_scriptLock = false;
94 }
95}
Definition Item.h:220
void ScriptsProcess()
Process queued scripts.
Definition MapScripts.cpp:277
static ObjectGuid const Empty
Definition ObjectGuid.h:120
bool IsItem() const
Definition Object.h:225
Definition Map.h:80
ObjectGuid targetGUID
Definition Map.h:82
ObjectGuid ownerGUID
Definition Map.h:83
ObjectGuid sourceGUID
Definition Map.h:81
ScriptInfo const * script
Definition Map.h:84

References ObjectGuid::Empty, GameTime::GetGameTime(), Object::GetGUID(), i_scriptLock, Object::IsItem(), m_scriptSchedule, ScriptAction::ownerGUID, ScriptAction::script, ScriptsProcess(), ScriptAction::sourceGUID, sScriptMgr, and ScriptAction::targetGUID.

◆ ScriptsProcess()

void Map::ScriptsProcess ( )
private

Process queued scripts.

  • Process overdue queued scripts
Todo:
: Allow gameobjects to be targets and casters
278{
279 if (m_scriptSchedule.empty())
280 return;
281
283 ScriptScheduleMap::iterator iter = m_scriptSchedule.begin();
284 // ok as multimap is a *sorted* associative container
285 while (!m_scriptSchedule.empty() && (iter->first <= GameTime::GetGameTime().count()))
286 {
287 ScriptAction const& step = iter->second;
288
289 Object* source = nullptr;
290 if (step.sourceGUID)
291 {
292 switch (step.sourceGUID.GetHigh())
293 {
294 case HighGuid::Item: // as well as HIGHGUID_CONTAINER
295 if (Player* player = ObjectAccessor::GetPlayer(this, step.ownerGUID))
296 source = player->GetItemByGuid(step.sourceGUID);
297 break;
298 case HighGuid::Unit:
300 source = GetCreature(step.sourceGUID);
301 break;
302 case HighGuid::Pet:
303 source = GetPet(step.sourceGUID);
304 break;
305 case HighGuid::Player:
307 break;
310 source = GetGameObject(step.sourceGUID);
311 break;
312 case HighGuid::Corpse:
313 source = GetCorpse(step.sourceGUID);
314 break;
316 source = GetTransport(step.sourceGUID);
317 break;
318 default:
319 LOG_ERROR("maps.script", "{} source with unsupported high guid ({}).",
320 step.script->GetDebugInfo(), step.sourceGUID.ToString());
321 break;
322 }
323 }
324
325 WorldObject* target = nullptr;
326 if (step.targetGUID)
327 {
328 switch (step.targetGUID.GetHigh())
329 {
330 case HighGuid::Unit:
332 target = GetCreature(step.targetGUID);
333 break;
334 case HighGuid::Pet:
335 target = GetPet(step.targetGUID);
336 break;
337 case HighGuid::Player: // empty GUID case also
339 break;
342 target = GetGameObject(step.targetGUID);
343 break;
344 case HighGuid::Corpse:
345 target = GetCorpse(step.targetGUID);
346 break;
348 target = GetTransport(step.targetGUID);
349 break;
350 default:
351 LOG_ERROR("maps.script", "{} target with unsupported high guid ({}).",
352 step.script->GetDebugInfo(), step.targetGUID.ToString());
353 break;
354 }
355 }
356
357 switch (step.script->command)
358 {
360 {
362 {
363 LOG_ERROR("maps.script", "{} invalid chat type ({}) specified, skipping.", step.script->GetDebugInfo(), step.script->Talk.ChatType);
364 break;
365 }
366
368 {
369 source = _GetScriptPlayerSourceOrTarget(source, target, step.script);
370 }
371 else
372 {
373 source = _GetScriptCreatureSourceOrTarget(source, target, step.script);
374 }
375
376 if (source)
377 {
378 Unit* sourceUnit = source->ToUnit();
379 if (!sourceUnit)
380 {
381 LOG_ERROR("scripts", "{} source object ({}) is not an unit, skipping.", step.script->GetDebugInfo(), source->GetGUID().ToString());
382 break;
383 }
384
385 switch (step.script->Talk.ChatType)
386 {
387 case CHAT_TYPE_SAY:
388 sourceUnit->Say(step.script->Talk.TextID, target);
389 break;
390 case CHAT_TYPE_YELL:
391 sourceUnit->Yell(step.script->Talk.TextID, target);
392 break;
395 sourceUnit->TextEmote(step.script->Talk.TextID, target, step.script->Talk.ChatType == CHAT_TYPE_BOSS_EMOTE);
396 break;
399 {
400 Player* receiver = target ? target->ToPlayer() : nullptr;
401 if (!receiver)
402 LOG_ERROR("scripts", "{} attempt to whisper to non-player unit, skipping.", step.script->GetDebugInfo());
403 else
404 sourceUnit->Whisper(step.script->Talk.TextID, receiver, step.script->Talk.ChatType == CHAT_MSG_RAID_BOSS_WHISPER);
405 break;
406 }
407 default:
408 break; // must be already checked at load
409 }
410 }
411 break;
412 }
414 // Source or target must be Creature.
415 if (Creature* cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script))
416 {
418 cSource->SetUInt32Value(UNIT_NPC_EMOTESTATE, step.script->Emote.EmoteID);
419 else
420 cSource->HandleEmoteCommand(step.script->Emote.EmoteID);
421 }
422 break;
423
425 // Source or target must be Creature.
426 if (Creature* cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script))
427 {
428 // Validate field number.
429 if (step.script->FieldSet.FieldID <= OBJECT_FIELD_ENTRY || step.script->FieldSet.FieldID >= cSource->GetValuesCount())
430 LOG_ERROR("maps.script", "{} wrong field {} (max count: {}) in object ({}) specified, skipping.",
431 step.script->GetDebugInfo(), step.script->FieldSet.FieldID, cSource->GetValuesCount(), cSource->GetGUID().ToString());
432 else
433 cSource->SetUInt32Value(step.script->FieldSet.FieldID, step.script->FieldSet.FieldValue);
434 }
435 break;
436
438 // Source or target must be Creature.
439 if (Creature* cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script))
440 {
441 Unit* unit = (Unit*)cSource;
442 if (step.script->MoveTo.TravelTime != 0)
443 {
444 float speed = unit->GetDistance(step.script->MoveTo.DestX, step.script->MoveTo.DestY, step.script->MoveTo.DestZ) / ((float)step.script->MoveTo.TravelTime * 0.001f);
445 unit->MonsterMoveWithSpeed(step.script->MoveTo.DestX, step.script->MoveTo.DestY, step.script->MoveTo.DestZ, speed);
446 }
447 else
449 }
450 break;
451
453 // Source or target must be Creature.
454 if (Creature* cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script))
455 {
456 // Validate field number.
457 if (step.script->FlagToggle.FieldID <= OBJECT_FIELD_ENTRY || step.script->FlagToggle.FieldID >= cSource->GetValuesCount())
458 LOG_ERROR("maps.script", "{} wrong field {} (max count: {}) in object ({}) specified, skipping.",
459 step.script->GetDebugInfo(), step.script->FlagToggle.FieldID, cSource->GetValuesCount(), cSource->GetGUID().ToString());
460 else
461 cSource->SetFlag(step.script->FlagToggle.FieldID, step.script->FlagToggle.FieldValue);
462 }
463 break;
464
466 // Source or target must be Creature.
467 if (Creature* cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script))
468 {
469 // Validate field number.
470 if (step.script->FlagToggle.FieldID <= OBJECT_FIELD_ENTRY || step.script->FlagToggle.FieldID >= cSource->GetValuesCount())
471 LOG_ERROR("maps.script", "{} wrong field {} (max count: {}) in object ({}) specified, skipping.",
472 step.script->GetDebugInfo(), step.script->FlagToggle.FieldID, cSource->GetValuesCount(), cSource->GetGUID().ToString());
473 else
474 cSource->RemoveFlag(step.script->FlagToggle.FieldID, step.script->FlagToggle.FieldValue);
475 }
476 break;
477
480 {
481 // Source or target must be Creature.
482 if (Creature* cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script, true))
483 cSource->NearTeleportTo(step.script->TeleportTo.DestX, step.script->TeleportTo.DestY, step.script->TeleportTo.DestZ, step.script->TeleportTo.Orientation);
484 }
485 else
486 {
487 // Source or target must be Player.
488 if (Player* player = _GetScriptPlayerSourceOrTarget(source, target, step.script))
489 player->TeleportTo(step.script->TeleportTo.MapID, step.script->TeleportTo.DestX, step.script->TeleportTo.DestY, step.script->TeleportTo.DestZ, step.script->TeleportTo.Orientation);
490 }
491 break;
492
494 {
495 if (!source)
496 {
497 LOG_ERROR("maps.script", "{} source object is nullptr.", step.script->GetDebugInfo());
498 break;
499 }
500 if (!target)
501 {
502 LOG_ERROR("maps.script", "{} target object is nullptr.", step.script->GetDebugInfo());
503 break;
504 }
505
506 // when script called for item spell casting then target == (unit or GO) and source is player
507 WorldObject* worldObject;
508 Player* player = target->ToPlayer();
509 if (player)
510 {
511 if (!source->IsCreature() && !source->IsGameObject() && !source->IsPlayer())
512 {
513 LOG_ERROR("maps.script", "{} source is not unit, gameobject or player ({}), skipping.", step.script->GetDebugInfo(), source->GetGUID().ToString());
514 break;
515 }
516 worldObject = dynamic_cast<WorldObject*>(source);
517 }
518 else
519 {
520 player = source->ToPlayer();
521 if (player)
522 {
523 if (!target->IsCreature() && !target->IsGameObject() && !target->IsPlayer())
524 {
525 LOG_ERROR("maps.script", "{} target is not unit, gameobject or player ({}), skipping.", step.script->GetDebugInfo(), target->GetGUID().ToString());
526 break;
527 }
528 worldObject = dynamic_cast<WorldObject*>(target);
529 }
530 else
531 {
532 LOG_ERROR("maps.script", "{} neither source nor target is player (source: {}; target: {}), skipping.",
533 step.script->GetDebugInfo(), source->GetGUID().ToString(), target->GetGUID().ToString());
534 break;
535 }
536 }
537
538 // quest id and flags checked at script loading
539 if ((!worldObject->IsCreature() || ((Unit*)worldObject)->IsAlive()) &&
540 (step.script->QuestExplored.Distance == 0 || worldObject->IsWithinDistInMap(player, float(step.script->QuestExplored.Distance))))
541 player->GroupEventHappens(step.script->QuestExplored.QuestID, worldObject);
542 else
543 player->FailQuest(step.script->QuestExplored.QuestID);
544
545 break;
546 }
547
549 // Source or target must be Player.
550 if (Player* player = _GetScriptPlayerSourceOrTarget(source, target, step.script))
551 {
554 else
556 }
557 break;
558
561 {
562 LOG_ERROR("maps.script", "{} gameobject guid (datalong) is not specified.", step.script->GetDebugInfo());
563 break;
564 }
565
566 // Source or target must be WorldObject.
567 if (WorldObject* pSummoner = _GetScriptWorldObject(source, true, step.script))
568 {
570 if (!pGO)
571 {
572 LOG_ERROR("maps.script", "{} gameobject was not found (guid: {}).", step.script->GetDebugInfo(), step.script->RespawnGameobject.GOGuid);
573 break;
574 }
575
580 {
581 LOG_ERROR("maps.script", "{} can not be used with gameobject of type {} (guid: {}).",
583 break;
584 }
585
586 // Check that GO is not spawned
587 if (!pGO->isSpawned())
588 {
589 int32 nTimeToDespawn = std::max(5, int32(step.script->RespawnGameobject.DespawnDelay));
591 pGO->SetRespawnTime(nTimeToDespawn);
592
593 pGO->GetMap()->AddToMap(pGO);
594 }
595 }
596 break;
597
599 {
600 // Source must be WorldObject.
601 if (WorldObject* pSummoner = _GetScriptWorldObject(source, true, step.script))
602 {
604 LOG_ERROR("maps.script", "{} creature entry (datalong) is not specified.", step.script->GetDebugInfo());
605 else
606 {
608
609 float x = step.script->TempSummonCreature.PosX;
610 float y = step.script->TempSummonCreature.PosY;
611 float z = step.script->TempSummonCreature.PosZ;
612 float o = step.script->TempSummonCreature.Orientation;
613
615 if (Unit* trigger = pSummoner->SummonTrigger(x, y, z, o, 1))
616 if (trigger->FindNearestCreature(entry, 60.0f))
617 break;
618
619 if (!pSummoner->SummonCreature(entry, x, y, z, o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, step.script->TempSummonCreature.DespawnDelay))
620 LOG_ERROR("maps.script", "{} creature was not spawned (entry: {}).", step.script->GetDebugInfo(), step.script->TempSummonCreature.CreatureEntry);
621 }
622 }
623 break;
624 }
625
628 _ScriptProcessDoor(source, target, step.script);
629 break;
630
632 // Source must be Unit.
633 if (Unit* unit = _GetScriptUnit(source, true, step.script))
634 {
635 // Target must be GameObject.
636 if (!target)
637 {
638 LOG_ERROR("maps.script", "{} target object is nullptr.", step.script->GetDebugInfo());
639 break;
640 }
641
642 if (!target->IsGameObject())
643 {
644 LOG_ERROR("maps.script", "{} target object is not gameobject ({}), skipping.", step.script->GetDebugInfo(), target->GetGUID().ToString());
645 break;
646 }
647
648 if (GameObject* pGO = target->ToGameObject())
649 pGO->Use(unit);
650 }
651 break;
652
654 {
655 // Source (datalong2 != 0) or target (datalong2 == 0) must be Unit.
656 bool bReverse = step.script->RemoveAura.Flags & SF_REMOVEAURA_REVERSE;
657 if (Unit* unit = _GetScriptUnit(bReverse ? source : target, bReverse, step.script))
658 unit->RemoveAurasDueToSpell(step.script->RemoveAura.SpellID);
659 break;
660 }
661
663 {
665 if (!source && !target)
666 {
667 LOG_ERROR("maps.script", "{} source and target objects are nullptr.", step.script->GetDebugInfo());
668 break;
669 }
670
671 Unit* uSource = nullptr;
672 Unit* uTarget = nullptr;
673 // source/target cast spell at target/source (script->datalong2: 0: s->t 1: s->s 2: t->t 3: t->s
674 switch (step.script->CastSpell.Flags)
675 {
676 case SF_CASTSPELL_SOURCE_TO_TARGET: // source -> target
677 uSource = source ? source->ToUnit() : nullptr;
678 uTarget = target ? target->ToUnit() : nullptr;
679 break;
680 case SF_CASTSPELL_SOURCE_TO_SOURCE: // source -> source
681 uSource = source ? source->ToUnit() : nullptr;
682 uTarget = uSource;
683 break;
684 case SF_CASTSPELL_TARGET_TO_TARGET: // target -> target
685 uSource = target ? target->ToUnit() : nullptr;
686 uTarget = uSource;
687 break;
688 case SF_CASTSPELL_TARGET_TO_SOURCE: // target -> source
689 uSource = target ? target->ToUnit() : nullptr;
690 uTarget = source ? source->ToUnit() : nullptr;
691 break;
692 case SF_CASTSPELL_SEARCH_CREATURE: // source -> creature with entry
693 uSource = source ? source->ToUnit() : nullptr;
694 uTarget = uSource ? GetClosestCreatureWithEntry(uSource, std::abs(step.script->CastSpell.CreatureEntry), step.script->CastSpell.SearchRadius) : nullptr;
695 break;
696 }
697
698 if (!uSource || !uSource->IsUnit())
699 {
700 LOG_ERROR("maps.script", "{} no source unit found for spell {}", step.script->GetDebugInfo(), step.script->CastSpell.SpellID);
701 break;
702 }
703
704 if (!uTarget || !uTarget->IsUnit())
705 {
706 LOG_ERROR("maps.script", "{} no target unit found for spell {}", step.script->GetDebugInfo(), step.script->CastSpell.SpellID);
707 break;
708 }
709
710 bool triggered = (step.script->CastSpell.Flags != 4) ?
712 step.script->CastSpell.CreatureEntry < 0;
713 uSource->CastSpell(uTarget, step.script->CastSpell.SpellID, triggered);
714 break;
715 }
716
718 // Source must be WorldObject.
719 if (WorldObject* object = _GetScriptWorldObject(source, true, step.script))
720 {
721 // Playsound.Flags bitmask: 0/1=anyone/target
722 Player* player = nullptr;
724 {
725 // Target must be Player.
726 player = _GetScriptPlayer(target, false, step.script);
727 if (!target)
728 break;
729 }
730
731 // Playsound.Flags bitmask: 0/2/4=without/with distance dependent/radius
733 object->PlayRadiusSound(step.script->Playsound.SoundID, step.script->Playsound.Radius);
735 object->PlayDistanceSound(step.script->Playsound.SoundID, player);
736 else
737 object->PlayDirectSound(step.script->Playsound.SoundID, player);
738 }
739 break;
740
742 // Target or source must be Player.
743 if (Player* pReceiver = _GetScriptPlayerSourceOrTarget(source, target, step.script))
744 {
745 ItemPosCountVec dest;
746 InventoryResult msg = pReceiver->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, step.script->CreateItem.ItemEntry, step.script->CreateItem.Amount);
747 if (msg == EQUIP_ERR_OK)
748 {
749 if (Item* item = pReceiver->StoreNewItem(dest, step.script->CreateItem.ItemEntry, true))
750 pReceiver->SendNewItem(item, step.script->CreateItem.Amount, false, true);
751 }
752 else
753 pReceiver->SendEquipError(msg, nullptr, nullptr, step.script->CreateItem.ItemEntry);
754 }
755 break;
756
758 // Target or source must be Creature.
759 if (Creature* cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script, true))
760 cSource->DespawnOrUnsummon(step.script->DespawnSelf.DespawnDelay);
761 break;
762
764 // Source must be Unit.
765 if (Unit* unit = _GetScriptUnit(source, true, step.script))
766 {
767 if (!sWaypointMgr->GetPath(step.script->LoadPath.PathID))
768 LOG_ERROR("maps.script", "{} source object has an invalid path ({}), skipping.", step.script->GetDebugInfo(), step.script->LoadPath.PathID);
769 else
771 }
772 break;
773
775 {
777 {
778 LOG_ERROR("maps.script", "{} creature entry is not specified, skipping.", step.script->GetDebugInfo());
779 break;
780 }
781 if (!step.script->CallScript.ScriptID)
782 {
783 LOG_ERROR("maps.script", "{} script id is not specified, skipping.", step.script->GetDebugInfo());
784 break;
785 }
786
787 Creature* cTarget = nullptr;
788 auto creatureBounds = _creatureBySpawnIdStore.equal_range(step.script->CallScript.CreatureEntry);
789 if (creatureBounds.first != creatureBounds.second)
790 {
791 // Prefer alive (last respawned) creature
792 auto creatureItr = std::find_if(creatureBounds.first, creatureBounds.second, [](Map::CreatureBySpawnIdContainer::value_type const& pair)
793 {
794 return pair.second->IsAlive();
795 });
796 cTarget = creatureItr != creatureBounds.second ? creatureItr->second : creatureBounds.first->second;
797 }
798
799 if (!cTarget)
800 {
801 LOG_ERROR("maps.script", "{} target was not found (entry: {})", step.script->GetDebugInfo(), step.script->CallScript.CreatureEntry);
802 break;
803 }
804
805 //Lets choose our ScriptMap map
807 //if no scriptmap present...
808 if (!datamap)
809 {
810 LOG_ERROR("maps.script", "{} unknown scriptmap ({}) specified, skipping.", step.script->GetDebugInfo(), step.script->CallScript.ScriptType);
811 break;
812 }
813
814 // Insert script into schedule but do not start it
815 ScriptsStart(*datamap, step.script->CallScript.ScriptID, cTarget, nullptr);
816 break;
817 }
818
820 // Source or target must be Creature.
821 if (Creature* cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script))
822 {
823 if (cSource->isDead())
824 LOG_ERROR("maps.script", "{} creature is already dead ({})", step.script->GetDebugInfo(), cSource->GetGUID().ToString());
825 else
826 {
827 cSource->setDeathState(DeathState::JustDied);
828 if (step.script->Kill.RemoveCorpse == 1)
829 cSource->RemoveCorpse();
830 }
831 }
832 break;
833
835 // Source must be Unit.
836 if (Unit* sourceUnit = _GetScriptUnit(source, true, step.script))
837 {
839 {
840 // Target must be Unit.
841 Unit* targetUnit = _GetScriptUnit(target, false, step.script);
842 if (!targetUnit)
843 break;
844
845 sourceUnit->SetFacingToObject(targetUnit);
846 }
847 else
848 sourceUnit->SetFacingTo(step.script->Orientation.Orientation);
849 }
850 break;
851
853 // Source must be Creature.
854 if (Creature* cSource = _GetScriptCreature(source, true, step.script))
855 cSource->LoadEquipment(step.script->Equip.EquipmentID);
856 break;
857
859 // Source must be Creature.
860 if (Creature* cSource = _GetScriptCreature(source, true, step.script))
861 cSource->SetDisplayId(step.script->Model.ModelID);
862 break;
863
865 // Source must be Player.
866 if (Player* player = _GetScriptPlayer(source, true, step.script))
868 break;
869
871 // Source must be Player.
872 if (Player* player = _GetScriptPlayer(source, true, step.script))
873 player->SendMovieStart(step.script->PlayMovie.MovieID);
874 break;
875
877 // Source must be Creature.
878 if (Creature* cSource = _GetScriptCreature(source, true, step.script))
879 {
880 if (!cSource->IsAlive())
881 return;
882
883 cSource->GetMotionMaster()->MovementExpired();
884 cSource->GetMotionMaster()->MoveIdle();
885
886 switch (step.script->Movement.MovementType)
887 {
889 cSource->GetMotionMaster()->MoveRandom((float)step.script->Movement.MovementDistance);
890 break;
892 cSource->GetMotionMaster()->MovePath(step.script->Movement.Path, false);
893 break;
894 }
895 }
896 break;
897
898 default:
899 LOG_ERROR("maps.script", "Unknown script command {}.", step.script->GetDebugInfo());
900 break;
901 }
902
903 m_scriptSchedule.erase(iter);
904 iter = m_scriptSchedule.begin();
905 sScriptMgr->DecreaseScheduledScriptCount();
906 }
907}
@ CHAT_TYPE_SAY
Definition CreatureData.h:421
@ CHAT_TYPE_TEXT_EMOTE
Definition CreatureData.h:423
@ CHAT_TYPE_BOSS_EMOTE
Definition CreatureData.h:424
@ CHAT_TYPE_WHISPER
Definition CreatureData.h:425
@ CHAT_TYPE_YELL
Definition CreatureData.h:422
@ GO_READY
Definition GameObject.h:111
InventoryResult
Definition Item.h:46
@ EQUIP_ERR_OK
Definition Item.h:47
@ NULL_BAG
Definition Item.h:40
@ NULL_SLOT
Definition Item.h:41
@ WAYPOINT_MOTION_TYPE
Definition MotionMaster.h:41
@ RANDOM_MOTION_TYPE
Definition MotionMaster.h:40
ScriptMapMap * GetScriptsMapByType(ScriptsType type)
Definition ObjectMgr.cpp:83
@ SF_CASTSPELL_SOURCE_TO_SOURCE
Definition ObjectMgr.h:174
@ SF_CASTSPELL_SOURCE_TO_TARGET
Definition ObjectMgr.h:173
@ SF_CASTSPELL_TRIGGERED
Definition ObjectMgr.h:178
@ SF_CASTSPELL_TARGET_TO_SOURCE
Definition ObjectMgr.h:176
@ SF_REMOVEAURA_REVERSE
Definition ObjectMgr.h:170
@ SF_PLAYSOUND_DISTANCE_SOUND
Definition ObjectMgr.h:182
@ SF_TALK_USE_PLAYER
Definition ObjectMgr.h:158
@ SF_TELEPORT_USE_CREATURE
Definition ObjectMgr.h:164
@ SF_KILLCREDIT_REWARD_GROUP
Definition ObjectMgr.h:167
@ SF_PLAYSOUND_TARGET_PLAYER
Definition ObjectMgr.h:181
@ SF_CASTSPELL_TARGET_TO_TARGET
Definition ObjectMgr.h:175
@ SF_EMOTE_USE_STATE
Definition ObjectMgr.h:161
@ SF_CASTSPELL_SEARCH_CREATURE
Definition ObjectMgr.h:177
@ SF_PLAYSOUND_DISTANCE_RADIUS
Definition ObjectMgr.h:183
@ SF_ORIENTATION_FACE_TARGET
Definition ObjectMgr.h:186
@ SCRIPT_COMMAND_EMOTE
Definition ObjectMgr.h:93
@ SCRIPT_COMMAND_CREATE_ITEM
Definition ObjectMgr.h:109
@ SCRIPT_COMMAND_DESPAWN_SELF
Definition ObjectMgr.h:110
@ SCRIPT_COMMAND_CAST_SPELL
Definition ObjectMgr.h:107
@ SCRIPT_COMMAND_RESPAWN_GAMEOBJECT
Definition ObjectMgr.h:101
@ SCRIPT_COMMAND_QUEST_EXPLORED
Definition ObjectMgr.h:99
@ SCRIPT_COMMAND_ACTIVATE_OBJECT
Definition ObjectMgr.h:105
@ SCRIPT_COMMAND_TALK
Definition ObjectMgr.h:92
@ SCRIPT_COMMAND_EQUIP
Definition ObjectMgr.h:118
@ SCRIPT_COMMAND_FIELD_SET
Definition ObjectMgr.h:94
@ SCRIPT_COMMAND_PLAYMOVIE
Definition ObjectMgr.h:121
@ SCRIPT_COMMAND_CALLSCRIPT_TO_UNIT
Definition ObjectMgr.h:113
@ SCRIPT_COMMAND_TELEPORT_TO
Definition ObjectMgr.h:98
@ SCRIPT_COMMAND_MOVE_TO
Definition ObjectMgr.h:95
@ SCRIPT_COMMAND_FLAG_SET
Definition ObjectMgr.h:96
@ SCRIPT_COMMAND_TEMP_SUMMON_CREATURE
Definition ObjectMgr.h:102
@ SCRIPT_COMMAND_MOVEMENT
Definition ObjectMgr.h:122
@ SCRIPT_COMMAND_KILL_CREDIT
Definition ObjectMgr.h:100
@ SCRIPT_COMMAND_KILL
Definition ObjectMgr.h:114
@ SCRIPT_COMMAND_LOAD_PATH
Definition ObjectMgr.h:112
@ SCRIPT_COMMAND_ORIENTATION
Definition ObjectMgr.h:117
@ SCRIPT_COMMAND_PLAY_SOUND
Definition ObjectMgr.h:108
@ SCRIPT_COMMAND_MODEL
Definition ObjectMgr.h:119
@ SCRIPT_COMMAND_CLOSE_GOSSIP
Definition ObjectMgr.h:120
@ SCRIPT_COMMAND_REMOVE_AURA
Definition ObjectMgr.h:106
@ SCRIPT_COMMAND_FLAG_REMOVE
Definition ObjectMgr.h:97
std::map< uint32, ScriptMap > ScriptMapMap
Definition ObjectMgr.h:386
ScriptsType
Definition ObjectMgr.h:145
@ TEMPSUMMON_TIMED_OR_DEAD_DESPAWN
Definition Object.h:47
std::vector< ItemPosCount > ItemPosCountVec
Definition Player.h:778
Creature * GetClosestCreatureWithEntry(WorldObject *source, uint32 entry, float maxSearchRange, bool alive)
Definition ScriptedCreature.cpp:865
@ GAMEOBJECT_TYPE_TRAP
Definition SharedDefines.h:1566
@ GAMEOBJECT_TYPE_FISHINGNODE
Definition SharedDefines.h:1577
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition SharedDefines.h:3433
@ UNIT_NPC_EMOTESTATE
Definition UpdateFields.h:140
@ OBJECT_FIELD_ENTRY
Definition UpdateFields.h:27
#define sWaypointMgr
Definition WaypointMgr.h:78
bool isSpawned() const
Definition GameObject.h:189
void SetLootState(LootState s, Unit *unit=nullptr)
Definition GameObject.cpp:2427
void SetRespawnTime(int32 respawn)
Definition GameObject.cpp:1288
void Use(Unit *user)
Definition GameObject.cpp:1464
static T * Find(ObjectGuid guid)
Definition ObjectAccessor.cpp:53
Corpse * GetCorpse(ObjectGuid const guid)
Definition Map.cpp:2384
void ScriptsStart(std::map< uint32, std::multimap< uint32, ScriptInfo > > const &scripts, uint32 id, Object *source, Object *target)
Put scripts in the execution queue.
Definition MapScripts.cpp:31
Creature * _GetScriptCreature(Object *obj, bool isSource, const ScriptInfo *scriptInfo) const
Definition MapScripts.cpp:186
Creature * _GetScriptCreatureSourceOrTarget(Object *source, Object *target, const ScriptInfo *scriptInfo, bool bReverse=false) const
Definition MapScripts.cpp:120
WorldObject * _GetScriptWorldObject(Object *obj, bool isSource, const ScriptInfo *scriptInfo) const
Definition MapScripts.cpp:201
Player * _GetScriptPlayerSourceOrTarget(Object *source, Object *target, const ScriptInfo *scriptInfo) const
Definition MapScripts.cpp:98
Pet * GetPet(ObjectGuid const guid)
Definition Map.cpp:2399
void _ScriptProcessDoor(Object *source, Object *target, const ScriptInfo *scriptInfo) const
Definition MapScripts.cpp:217
Player * _GetScriptPlayer(Object *obj, bool isSource, const ScriptInfo *scriptInfo) const
Definition MapScripts.cpp:171
Unit * _GetScriptUnit(Object *obj, bool isSource, const ScriptInfo *scriptInfo) const
Definition MapScripts.cpp:153
Transport * GetTransport(ObjectGuid const guid)
Definition Map.cpp:2404
void MovePath(uint32 path_id, bool repeatable)
Move the unit following a specific path. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:852
Definition Object.h:104
bool IsPlayer() const
Definition Object.h:201
bool IsGameObject() const
Definition Object.h:213
bool IsCreature() const
Definition Object.h:205
void SendCloseGossip()
Definition GossipDef.cpp:239
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition PlayerQuest.cpp:1927
void GroupEventHappens(uint32 questId, WorldObject const *pEventObject)
Definition PlayerQuest.cpp:1818
void SendMovieStart(uint32 MovieId)
Definition Player.cpp:5751
void FailQuest(uint32 quest_id)
Definition PlayerQuest.cpp:886
PlayerMenu * PlayerTalkClass
Definition Player.h:2258
void RewardPlayerAndGroupAtEvent(uint32 creature_id, WorldObject *pRewardSource)
Definition Player.cpp:12713
void SetFacingTo(float ori)
Definition Unit.cpp:20368
virtual void Say(std::string_view text, Language language, WorldObject const *target=nullptr)
Definition Unit.cpp:20998
virtual void Yell(std::string_view text, Language language, WorldObject const *target=nullptr)
Definition Unit.cpp:21003
MotionMaster * GetMotionMaster()
Definition Unit.h:1673
void SetFacingToObject(WorldObject *object)
Definition Unit.cpp:20378
void MonsterMoveWithSpeed(float x, float y, float z, float speed)
Definition Unit.cpp:530
virtual void TextEmote(std::string_view text, WorldObject const *target=nullptr, bool isBossEmote=false)
Definition Unit.cpp:21008
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1193
void NearTeleportTo(Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
Definition Unit.cpp:19800
virtual void Whisper(std::string_view text, Language language, Player *target, bool isBossWhisper=false)
Definition Unit.cpp:21013
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition Object.cpp:1314
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1238
Creature * SummonTrigger(float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
Definition Object.cpp:2399
Player * GetPlayer(Map const *, ObjectGuid const guid)
Definition ObjectAccessor.cpp:220
Definition ChatCommandTags.h:253
float Orientation
Definition ObjectMgr.h:250
struct ScriptInfo::@266::@277 RespawnGameobject
uint32 Flags
Definition ObjectMgr.h:207
uint32 FieldID
Definition ObjectMgr.h:219
uint32 QuestID
Definition ObjectMgr.h:255
float SearchRadius
Definition ObjectMgr.h:304
int32 TextID
Definition ObjectMgr.h:208
uint32 MovementType
Definition ObjectMgr.h:376
uint32 MovementDistance
Definition ObjectMgr.h:377
struct ScriptInfo::@266::@281 CastSpell
struct ScriptInfo::@266::@273 FlagToggle
float DestX
Definition ObjectMgr.h:229
uint32 ItemEntry
Definition ObjectMgr.h:316
uint32 ChatType
Definition ObjectMgr.h:206
uint32 SoundID
Definition ObjectMgr.h:309
uint32 CheckIfExists
Definition ObjectMgr.h:275
struct ScriptInfo::@266::@269 Talk
struct ScriptInfo::@266::@284 DespawnSelf
struct ScriptInfo::@266::@291 PlayMovie
struct ScriptInfo::@266::@270 Emote
struct ScriptInfo::@266::@280 RemoveAura
struct ScriptInfo::@266::@289 Equip
uint32 ScriptID
Definition ObjectMgr.h:334
struct ScriptInfo::@266::@274 TeleportTo
uint32 ModelID
Definition ObjectMgr.h:364
uint32 FieldValue
Definition ObjectMgr.h:220
float PosY
Definition ObjectMgr.h:278
float DestY
Definition ObjectMgr.h:230
uint32 PathID
Definition ObjectMgr.h:327
struct ScriptInfo::@266::@275 QuestExplored
uint32 MapID
Definition ObjectMgr.h:243
uint32 IsRepeatable
Definition ObjectMgr.h:328
int32 Path
Definition ObjectMgr.h:378
struct ScriptInfo::@266::@292 Movement
int32 RemoveCorpse
Definition ObjectMgr.h:342
float PosZ
Definition ObjectMgr.h:279
struct ScriptInfo::@266::@283 CreateItem
uint32 ScriptType
Definition ObjectMgr.h:335
struct ScriptInfo::@266::@285 LoadPath
struct ScriptInfo::@266::@286 CallScript
struct ScriptInfo::@266::@272 MoveTo
uint32 DespawnDelay
Definition ObjectMgr.h:268
float PosX
Definition ObjectMgr.h:277
int32 Radius
Definition ObjectMgr.h:311
uint32 TravelTime
Definition ObjectMgr.h:226
uint32 Distance
Definition ObjectMgr.h:256
struct ScriptInfo::@266::@276 KillCredit
uint32 SpellID
Definition ObjectMgr.h:294
float DestZ
Definition ObjectMgr.h:231
struct ScriptInfo::@266::@282 Playsound
uint32 MovieID
Definition ObjectMgr.h:371
struct ScriptInfo::@266::@290 Model
uint32 EquipmentID
Definition ObjectMgr.h:359
struct ScriptInfo::@266::@271 FieldSet
struct ScriptInfo::@266::@287 Kill
uint32 CreatureEntry
Definition ObjectMgr.h:261
uint32 Amount
Definition ObjectMgr.h:317
struct ScriptInfo::@266::@278 TempSummonCreature
uint32 EmoteID
Definition ObjectMgr.h:213

References _creatureBySpawnIdStore, _FindGameObject(), _GetScriptCreature(), _GetScriptCreatureSourceOrTarget(), _GetScriptPlayer(), _GetScriptPlayerSourceOrTarget(), _GetScriptUnit(), _GetScriptWorldObject(), _ScriptProcessDoor(), AddToMap(), ScriptInfo::Amount, ScriptInfo::CallScript, Unit::CastSpell(), ScriptInfo::CastSpell, CHAT_MSG_RAID_BOSS_WHISPER, CHAT_TYPE_BOSS_EMOTE, CHAT_TYPE_SAY, CHAT_TYPE_TEXT_EMOTE, CHAT_TYPE_WHISPER, CHAT_TYPE_YELL, ScriptInfo::ChatType, ScriptInfo::CheckIfExists, ScriptInfo::command, Corpse, ScriptInfo::CreateItem, ScriptInfo::CreatureEntry, ScriptInfo::DespawnDelay, ScriptInfo::DespawnSelf, ScriptInfo::DestX, ScriptInfo::DestY, ScriptInfo::DestZ, ScriptInfo::Distance, ScriptInfo::Emote, ScriptInfo::EmoteID, ScriptInfo::Equip, EQUIP_ERR_OK, ScriptInfo::EquipmentID, Player::FailQuest(), ScriptInfo::FieldID, ScriptInfo::FieldSet, ScriptInfo::FieldValue, HashMapHolder< T >::Find(), ScriptInfo::Flags, ScriptInfo::FlagToggle, GameObject, GAMEOBJECT_TYPE_BUTTON, GAMEOBJECT_TYPE_DOOR, GAMEOBJECT_TYPE_FISHINGNODE, GAMEOBJECT_TYPE_TRAP, GetClosestCreatureWithEntry(), GetCorpse(), GetCreature(), ScriptInfo::GetDebugInfo(), WorldObject::GetDistance(), GetGameObject(), GameTime::GetGameTime(), GameObject::GetGoType(), Object::GetGUID(), ObjectGuid::GetHigh(), WorldObject::GetMap(), Position::GetOrientation(), GetPet(), ObjectAccessor::GetPlayer(), GetScriptsMapByType(), GetTransport(), GO_READY, ScriptInfo::GOGuid, Player::GroupEventHappens(), Object::IsCreature(), Object::IsGameObject(), Object::IsPlayer(), ScriptInfo::IsRepeatable, GameObject::isSpawned(), Object::IsUnit(), WorldObject::IsWithinDistInMap(), Item, ScriptInfo::ItemEntry, JustDied, ScriptInfo::Kill, ScriptInfo::KillCredit, ScriptInfo::LoadPath, LOG_ERROR, m_scriptSchedule, ScriptInfo::MapID, Mo_Transport, ScriptInfo::Model, ScriptInfo::ModelID, Unit::MonsterMoveWithSpeed(), ScriptInfo::Movement, ScriptInfo::MovementDistance, ScriptInfo::MovementType, ScriptInfo::MoveTo, ScriptInfo::MovieID, Unit::NearTeleportTo(), NULL_BAG, NULL_SLOT, OBJECT_FIELD_ENTRY, ScriptInfo::Orientation, ScriptAction::ownerGUID, ScriptInfo::Path, ScriptInfo::PathID, Pet, Player, ScriptInfo::PlayMovie, ScriptInfo::Playsound, ScriptInfo::PosX, ScriptInfo::PosY, ScriptInfo::PosZ, ScriptInfo::QuestExplored, ScriptInfo::QuestID, ScriptInfo::Radius, RANDOM_MOTION_TYPE, ScriptInfo::RemoveAura, ScriptInfo::RemoveCorpse, ScriptInfo::RespawnGameobject, Unit::Say(), ScriptAction::script, SCRIPT_COMMAND_ACTIVATE_OBJECT, SCRIPT_COMMAND_CALLSCRIPT_TO_UNIT, SCRIPT_COMMAND_CAST_SPELL, SCRIPT_COMMAND_CLOSE_DOOR, SCRIPT_COMMAND_CLOSE_GOSSIP, SCRIPT_COMMAND_CREATE_ITEM, SCRIPT_COMMAND_DESPAWN_SELF, SCRIPT_COMMAND_EMOTE, SCRIPT_COMMAND_EQUIP, SCRIPT_COMMAND_FIELD_SET, SCRIPT_COMMAND_FLAG_REMOVE, SCRIPT_COMMAND_FLAG_SET, SCRIPT_COMMAND_KILL, SCRIPT_COMMAND_KILL_CREDIT, SCRIPT_COMMAND_LOAD_PATH, SCRIPT_COMMAND_MODEL, SCRIPT_COMMAND_MOVE_TO, SCRIPT_COMMAND_MOVEMENT, SCRIPT_COMMAND_OPEN_DOOR, SCRIPT_COMMAND_ORIENTATION, SCRIPT_COMMAND_PLAY_SOUND, SCRIPT_COMMAND_PLAYMOVIE, SCRIPT_COMMAND_QUEST_EXPLORED, SCRIPT_COMMAND_REMOVE_AURA, SCRIPT_COMMAND_RESPAWN_GAMEOBJECT, SCRIPT_COMMAND_TALK, SCRIPT_COMMAND_TELEPORT_TO, SCRIPT_COMMAND_TEMP_SUMMON_CREATURE, ScriptInfo::ScriptID, ScriptsStart(), ScriptInfo::ScriptType, ScriptInfo::SearchRadius, GameObject::SetLootState(), GameObject::SetRespawnTime(), SF_CASTSPELL_SEARCH_CREATURE, SF_CASTSPELL_SOURCE_TO_SOURCE, SF_CASTSPELL_SOURCE_TO_TARGET, SF_CASTSPELL_TARGET_TO_SOURCE, SF_CASTSPELL_TARGET_TO_TARGET, SF_CASTSPELL_TRIGGERED, SF_EMOTE_USE_STATE, SF_KILLCREDIT_REWARD_GROUP, SF_ORIENTATION_FACE_TARGET, SF_PLAYSOUND_DISTANCE_RADIUS, SF_PLAYSOUND_DISTANCE_SOUND, SF_PLAYSOUND_TARGET_PLAYER, SF_REMOVEAURA_REVERSE, SF_TALK_USE_PLAYER, SF_TELEPORT_USE_CREATURE, ScriptInfo::SoundID, ScriptAction::sourceGUID, ScriptInfo::SpellID, sScriptMgr, WorldObject::SummonTrigger(), sWaypointMgr, ScriptInfo::Talk, ScriptAction::targetGUID, ScriptInfo::TeleportTo, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, ScriptInfo::TempSummonCreature, Unit::TextEmote(), ScriptInfo::TextID, Object::ToGameObject(), Object::ToPlayer(), ObjectGuid::ToString(), Object::ToUnit(), Transport, ScriptInfo::TravelTime, Unit, UNIT_NPC_EMOTESTATE, Vehicle, WAYPOINT_MOTION_TYPE, Unit::Whisper(), and Unit::Yell().

Referenced by ScriptCommandStart(), ScriptsStart(), and Update().

◆ ScriptsStart()

void Map::ScriptsStart ( std::map< uint32, std::multimap< uint32, ScriptInfo > > const &  scripts,
uint32  id,
Object source,
Object target 
)

Put scripts in the execution queue.

  • Find the script map
  • Schedule script execution for all scripts in the script map
  • If one of the effects should be immediate, launch the script execution
32{
34 ScriptMapMap::const_iterator s = scripts.find(id);
35 if (s == scripts.end())
36 return;
37
38 // prepare static data
39 ObjectGuid sourceGUID = source ? source->GetGUID() : ObjectGuid::Empty; //some script commands doesn't have source
40 ObjectGuid targetGUID = target ? target->GetGUID() : ObjectGuid::Empty;
41 ObjectGuid ownerGUID = (source && source->IsItem()) ? ((Item*)source)->GetOwnerGUID() : ObjectGuid::Empty;
42
44 ScriptMap const* s2 = &(s->second);
45 bool immedScript = false;
46 for (ScriptMap::const_iterator iter = s2->begin(); iter != s2->end(); ++iter)
47 {
48 ScriptAction sa;
49 sa.sourceGUID = sourceGUID;
50 sa.targetGUID = targetGUID;
51 sa.ownerGUID = ownerGUID;
52
53 sa.script = &iter->second;
54 m_scriptSchedule.insert(ScriptScheduleMap::value_type(time_t(GameTime::GetGameTime().count() + iter->first), sa));
55 if (iter->first == 0)
56 immedScript = true;
57
58 sScriptMgr->IncreaseScheduledScriptsCount();
59 }
61 if (/*start &&*/ immedScript && !i_scriptLock)
62 {
63 i_scriptLock = true;
65 i_scriptLock = false;
66 }
67}
std::multimap< uint32, ScriptInfo > ScriptMap
Definition ObjectMgr.h:385

References ObjectGuid::Empty, GameTime::GetGameTime(), Object::GetGUID(), i_scriptLock, Object::IsItem(), m_scriptSchedule, ScriptAction::ownerGUID, ScriptAction::script, ScriptsProcess(), ScriptAction::sourceGUID, sScriptMgr, and ScriptAction::targetGUID.

Referenced by MotionTransport::DoEventIfAny(), FlightPathMovementGenerator::DoEventIfAny(), WorldSession::DoLootRelease(), Spell::EffectDummy(), Spell::EffectScriptEffect(), Spell::EffectSendEvent(), WaypointMovementGenerator< Creature >::OnArrived(), ScriptsProcess(), and GameObject::Use().

◆ SendInitSelf()

void Map::SendInitSelf ( Player player)
1614{
1615 LOG_DEBUG("maps", "Creating player data for himself {}", player->GetGUID().ToString());
1616
1617 WorldPacket packet;
1618 UpdateData data;
1619
1620 // attach to player data current transport data
1621 if (Transport* transport = player->GetTransport())
1622 transport->BuildCreateUpdateBlockForPlayer(&data, player);
1623
1624 // build data for self presence in world at own client (one time for map)
1625 player->BuildCreateUpdateBlockForPlayer(&data, player);
1626
1627 // build and send self update packet before sending to player his own auras
1628 data.BuildPacket(packet);
1629 player->SendDirectMessage(&packet);
1630
1631 // send to player his own auras (this is needed here for timely initialization of some fields on client)
1632 player->GetAurasForTarget(player, true);
1633
1634 // clean buffers for further work
1635 packet.clear();
1636 data.Clear();
1637
1638 // build other passengers at transport also (they always visible and marked as visible and will not send at visibility update at add to map
1639 if (Transport* transport = player->GetTransport())
1640 for (Transport::PassengerSet::const_iterator itr = transport->GetPassengers().begin(); itr != transport->GetPassengers().end(); ++itr)
1641 if (player != (*itr) && player->HaveAtClient(*itr))
1642 (*itr)->BuildCreateUpdateBlockForPlayer(&data, player);
1643
1644 data.BuildPacket(packet);
1645 player->SendDirectMessage(&packet);
1646}
void clear()
Definition ByteBuffer.h:122
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5735
bool HaveAtClient(WorldObject const *u) const
Definition Player.cpp:11394
void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) override
Definition Player.cpp:3839
void GetAurasForTarget(Unit *target, bool force=false)
Definition Player.cpp:12042
void Clear()
Definition UpdateData.cpp:71
Transport * GetTransport() const
Definition Object.h:648

References Player::BuildCreateUpdateBlockForPlayer(), UpdateData::BuildPacket(), UpdateData::Clear(), ByteBuffer::clear(), Player::GetAurasForTarget(), Object::GetGUID(), WorldObject::GetTransport(), Player::HaveAtClient(), LOG_DEBUG, Player::SendDirectMessage(), and ObjectGuid::ToString().

Referenced by AddPlayerToMap(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendInitTransports()

void Map::SendInitTransports ( Player player)
1649{
1650 // Hack to send out transports
1651 UpdateData transData;
1652 for (TransportsContainer::const_iterator itr = _transports.begin(); itr != _transports.end(); ++itr)
1653 if (*itr != player->GetTransport())
1654 (*itr)->BuildCreateUpdateBlockForPlayer(&transData, player);
1655
1656 WorldPacket packet;
1657 transData.BuildPacket(packet);
1658 player->GetSession()->SendPacket(&packet);
1659}
WorldSession * GetSession() const
Definition Player.h:2016
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition WorldSession.cpp:251

References _transports, UpdateData::BuildPacket(), Player::GetSession(), WorldObject::GetTransport(), and WorldSession::SendPacket().

Referenced by AddPlayerToMap(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendObjectUpdates()

void Map::SendObjectUpdates ( )
private
1687{
1688 UpdateDataMapType update_players;
1689 UpdatePlayerSet player_set;
1690
1691 while (!_updateObjects.empty())
1692 {
1693 Object* obj = *_updateObjects.begin();
1694 ASSERT(obj->IsInWorld());
1695
1696 _updateObjects.erase(_updateObjects.begin());
1697 obj->BuildUpdate(update_players, player_set);
1698 }
1699
1700 WorldPacket packet; // here we allocate a std::vector with a size of 0x10000
1701 for (UpdateDataMapType::iterator iter = update_players.begin(); iter != update_players.end(); ++iter)
1702 {
1703 iter->second.BuildPacket(packet);
1704 iter->first->GetSession()->SendPacket(&packet);
1705 packet.clear(); // clean the string
1706 }
1707}
GuidUnorderedSet UpdatePlayerSet
Definition Object.h:99
std::unordered_map< Player *, UpdateData > UpdateDataMapType
Definition Object.h:98
virtual void BuildUpdate(UpdateDataMapType &, UpdatePlayerSet &)
Definition Object.h:192

References _updateObjects, ASSERT, Object::BuildUpdate(), ByteBuffer::clear(), and Object::IsInWorld().

Referenced by Update().

◆ SendRemoveTransports()

void Map::SendRemoveTransports ( Player player)
1662{
1663 // Hack to send out transports
1664 UpdateData transData;
1665 for (TransportsContainer::const_iterator itr = _transports.begin(); itr != _transports.end(); ++itr)
1666 if (*itr != player->GetTransport())
1667 (*itr)->BuildOutOfRangeUpdateBlock(&transData);
1668
1669 // pussywizard: remove static transports from client
1670 for (GuidUnorderedSet::const_iterator it = player->m_clientGUIDs.begin(); it != player->m_clientGUIDs.end(); )
1671 {
1672 if ((*it).IsTransport())
1673 {
1674 transData.AddOutOfRangeGUID(*it);
1675 it = player->m_clientGUIDs.erase(it);
1676 }
1677 else
1678 ++it;
1679 }
1680
1681 WorldPacket packet;
1682 transData.BuildPacket(packet);
1683 player->GetSession()->SendPacket(&packet);
1684}
void AddOutOfRangeGUID(ObjectGuid guid)
Definition UpdateData.cpp:31

References _transports, UpdateData::AddOutOfRangeGUID(), UpdateData::BuildPacket(), Player::GetSession(), WorldObject::GetTransport(), Player::m_clientGUIDs, and WorldSession::SendPacket().

Referenced by RemovePlayerFromMap().

◆ SendToPlayers()

void Map::SendToPlayers ( WorldPacket const *  data) const
1822{
1823 for (MapRefMgr::const_iterator itr = m_mapRefMgr.begin(); itr != m_mapRefMgr.end(); ++itr)
1824 itr->GetSource()->GetSession()->SendPacket(data);
1825}

References MapRefMgr::begin(), MapRefMgr::end(), and m_mapRefMgr.

Referenced by boss_ossirian::JustEngagedWith(), and InstanceScript::SendEncounterUnit().

◆ SendZoneDynamicInfo()

void Map::SendZoneDynamicInfo ( Player player)
2796{
2797 uint32 zoneId = player->GetZoneId();
2798 ZoneDynamicInfoMap::const_iterator itr = _zoneDynamicInfo.find(zoneId);
2799 if (itr == _zoneDynamicInfo.end())
2800 return;
2801
2802 if (uint32 music = itr->second.MusicId)
2803 player->SendDirectMessage(WorldPackets::Misc::PlayMusic(music).Write());
2804
2805 if (WeatherState weatherId = itr->second.WeatherId)
2806 {
2807 WorldPackets::Misc::Weather weather(weatherId, itr->second.WeatherGrade);
2808 player->SendDirectMessage(weather.Write());
2809 }
2810
2811 if (uint32 overrideLight = itr->second.OverrideLightId)
2812 {
2813 WorldPacket data(SMSG_OVERRIDE_LIGHT, 4 + 4 + 1);
2814 data << uint32(_defaultLight);
2815 data << uint32(overrideLight);
2816 data << uint32(itr->second.LightFadeInTime);
2817 player->SendDirectMessage(&data);
2818 }
2819}
ZoneDynamicInfoMap _zoneDynamicInfo
Definition Map.h:617
uint32 GetZoneId() const
Definition Object.cpp:3144
Definition MiscPackets.h:58
Definition MiscPackets.h:32
@ SMSG_OVERRIDE_LIGHT
Definition Opcodes.h:1072
WeatherState
Definition Weather.h:45

References _defaultLight, _zoneDynamicInfo, WorldObject::GetZoneId(), Player::SendDirectMessage(), SMSG_OVERRIDE_LIGHT, and WorldPackets::Misc::Weather::Write().

Referenced by AddPlayerToMap(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SetVisibilityRange()

◆ SetZoneMusic()

void Map::SetZoneMusic ( uint32  zoneId,
uint32  musicId 
)

◆ SetZoneOverrideLight()

void Map::SetZoneOverrideLight ( uint32  zoneId,
uint32  lightId,
Milliseconds  fadeInTime 
)
2878{
2879 if (_zoneDynamicInfo.find(zoneId) == _zoneDynamicInfo.end())
2880 _zoneDynamicInfo.insert(ZoneDynamicInfoMap::value_type(zoneId, ZoneDynamicInfo()));
2881
2882 ZoneDynamicInfo& info = _zoneDynamicInfo[zoneId];
2883 info.OverrideLightId = lightId;
2884 info.LightFadeInTime = static_cast<uint32>(fadeInTime.count());
2885 Map::PlayerList const& players = GetPlayers();
2886
2887 if (!players.IsEmpty())
2888 {
2889 WorldPacket data(SMSG_OVERRIDE_LIGHT, 4 + 4 + 4);
2890 data << uint32(_defaultLight);
2891 data << uint32(lightId);
2892 data << uint32(static_cast<uint32>(fadeInTime.count()));
2893
2894 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
2895 if (Player* player = itr->GetSource())
2896 if (player->GetZoneId() == zoneId)
2897 player->SendDirectMessage(&data);
2898 }
2899}
uint32 LightFadeInTime
Definition Map.h:138
uint32 OverrideLightId
Definition Map.h:137

References _defaultLight, _zoneDynamicInfo, MapRefMgr::begin(), MapRefMgr::end(), GetPlayers(), LinkedListHead::IsEmpty(), ZoneDynamicInfo::LightFadeInTime, ZoneDynamicInfo::OverrideLightId, and SMSG_OVERRIDE_LIGHT.

Referenced by boss_the_lich_king::boss_the_lich_kingAI::DoAction(), boss_malygos::boss_malygosAI::EnterEvadeMode(), boss_malygos::boss_malygosAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::SpellHitTarget(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), and boss_malygos::boss_malygosAI::UpdateAI().

◆ SetZoneWeather()

void Map::SetZoneWeather ( uint32  zoneId,
WeatherState  weatherId,
float  weatherGrade 
)
2857{
2858 if (_zoneDynamicInfo.find(zoneId) == _zoneDynamicInfo.end())
2859 _zoneDynamicInfo.insert(ZoneDynamicInfoMap::value_type(zoneId, ZoneDynamicInfo()));
2860
2861 ZoneDynamicInfo& info = _zoneDynamicInfo[zoneId];
2862 info.WeatherId = weatherId;
2863 info.WeatherGrade = weatherGrade;
2864 Map::PlayerList const& players = GetPlayers();
2865
2866 if (!players.IsEmpty())
2867 {
2868 WorldPackets::Misc::Weather weather(weatherId, weatherGrade);
2869
2870 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
2871 if (Player* player = itr->GetSource())
2872 if (player->GetZoneId() == zoneId)
2873 player->SendDirectMessage(weather.Write());
2874 }
2875}
WeatherState WeatherId
Definition Map.h:135
float WeatherGrade
Definition Map.h:136

References _zoneDynamicInfo, MapRefMgr::begin(), MapRefMgr::end(), GetPlayers(), LinkedListHead::IsEmpty(), ZoneDynamicInfo::WeatherGrade, ZoneDynamicInfo::WeatherId, and WorldPackets::Misc::Weather::Write().

Referenced by boss_the_lich_king::boss_the_lich_kingAI::DoAction(), boss_akilzon::SetWeather(), boss_the_lich_king::boss_the_lich_kingAI::SpellHitTarget(), and npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI().

◆ SummonCreature()

TempSummon * Map::SummonCreature ( uint32  entry,
Position const &  pos,
SummonPropertiesEntry const *  properties = nullptr,
uint32  duration = 0,
WorldObject summoner = nullptr,
uint32  spellId = 0,
uint32  vehId = 0,
bool  visibleBySummonerOnly = false 
)
2157{
2158 uint32 mask = UNIT_MASK_SUMMON;
2159 if (properties)
2160 {
2161 switch (properties->Category)
2162 {
2164 mask = UNIT_MASK_GUARDIAN;
2165 break;
2167 mask = UNIT_MASK_PUPPET;
2168 break;
2170 mask = UNIT_MASK_MINION;
2171 break;
2175 {
2176 switch (properties->Type)
2177 {
2178 case SUMMON_TYPE_MINION:
2181 mask = UNIT_MASK_GUARDIAN;
2182 break;
2183 case SUMMON_TYPE_TOTEM:
2185 mask = UNIT_MASK_TOTEM;
2186 break;
2189 mask = UNIT_MASK_SUMMON;
2190 break;
2192 case SUMMON_TYPE_JEEVES:
2193 mask = UNIT_MASK_MINION;
2194 break;
2195 default:
2196 if (properties->Flags & 512) // Mirror Image, Summon Gargoyle
2197 mask = UNIT_MASK_GUARDIAN;
2198 break;
2199 }
2200 break;
2201 }
2202 default:
2203 return nullptr;
2204 }
2205 }
2206
2208 if (summoner)
2209 phase = summoner->GetPhaseMask();
2210
2211 TempSummon* summon = nullptr;
2212 switch (mask)
2213 {
2214 case UNIT_MASK_SUMMON:
2215 summon = new TempSummon(properties, summoner ? summoner->GetGUID() : ObjectGuid::Empty, false);
2216 break;
2217 case UNIT_MASK_GUARDIAN:
2218 summon = new Guardian(properties, summoner ? summoner->GetGUID() : ObjectGuid::Empty, false);
2219 break;
2220 case UNIT_MASK_PUPPET:
2221 summon = new Puppet(properties, summoner ? summoner->GetGUID() : ObjectGuid::Empty);
2222 break;
2223 case UNIT_MASK_TOTEM:
2224 summon = new Totem(properties, summoner ? summoner->GetGUID() : ObjectGuid::Empty);
2225 break;
2226 case UNIT_MASK_MINION:
2227 summon = new Minion(properties, summoner ? summoner->GetGUID() : ObjectGuid::Empty, false);
2228 break;
2229 default:
2230 return nullptr;
2231 }
2232
2233 EnsureGridLoaded(Cell(pos.GetPositionX(), pos.GetPositionY()));
2234 if (!summon->Create(GenerateLowGuid<HighGuid::Unit>(), this, phase, entry, vehId, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()))
2235 {
2236 delete summon;
2237 return nullptr;
2238 }
2239
2240 summon->SetUInt32Value(UNIT_CREATED_BY_SPELL, spellId);
2241
2242 summon->SetHomePosition(pos);
2243
2244 summon->InitStats(duration);
2245
2246 summon->SetVisibleBySummonerOnly(visibleBySummonerOnly);
2247
2248 bool summonerHasTransport = summoner && summoner->GetTransport();
2249 bool summonerIsVehicle = summoner && summoner->IsUnit() && summoner->ToUnit()->IsVehicle();
2250 bool checkTransport = summon->GetOwnerGUID().IsPlayer() || (summonerHasTransport && !summonerIsVehicle);
2251 if (!AddToMap(summon->ToCreature(), checkTransport))
2252 {
2253 delete summon;
2254 return nullptr;
2255 }
2256
2257 summon->InitSummon();
2258
2259 // call MoveInLineOfSight for nearby creatures
2260 Acore::AIRelocationNotifier notifier(*summon);
2261 Cell::VisitAllObjects(summon, notifier, GetVisibilityRange());
2262
2263 return summon;
2264}
@ PHASEMASK_NORMAL
Definition Object.h:61
@ SUMMON_TYPE_VEHICLE2
Definition SharedDefines.h:3543
@ SUMMON_TYPE_LIGHTWELL
Definition SharedDefines.h:3544
@ SUMMON_TYPE_MINION
Definition SharedDefines.h:3536
@ SUMMON_TYPE_GUARDIAN
Definition SharedDefines.h:3535
@ SUMMON_TYPE_JEEVES
Definition SharedDefines.h:3545
@ SUMMON_TYPE_TOTEM
Definition SharedDefines.h:3537
@ SUMMON_TYPE_VEHICLE
Definition SharedDefines.h:3542
@ SUMMON_TYPE_MINIPET
Definition SharedDefines.h:3538
@ SUMMON_TYPE_GUARDIAN2
Definition SharedDefines.h:3539
@ SUMMON_CATEGORY_PET
Definition SharedDefines.h:3524
@ SUMMON_CATEGORY_VEHICLE
Definition SharedDefines.h:3526
@ SUMMON_CATEGORY_ALLY
Definition SharedDefines.h:3523
@ SUMMON_CATEGORY_PUPPET
Definition SharedDefines.h:3525
@ SUMMON_CATEGORY_WILD
Definition SharedDefines.h:3522
@ SUMMON_CATEGORY_UNK
Definition SharedDefines.h:3527
@ UNIT_MASK_PUPPET
Definition UnitDefines.h:162
@ UNIT_MASK_TOTEM
Definition UnitDefines.h:159
@ UNIT_MASK_SUMMON
Definition UnitDefines.h:156
@ UNIT_MASK_GUARDIAN
Definition UnitDefines.h:158
@ UNIT_MASK_MINION
Definition UnitDefines.h:157
@ UNIT_CREATED_BY_SPELL
Definition UpdateFields.h:138
void SetHomePosition(float x, float y, float z, float o)
Definition Creature.h:340
bool Create(ObjectGuid::LowType guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 vehId, float x, float y, float z, float ang, const CreatureData *data=nullptr)
Definition Creature.cpp:1136
Definition TemporarySummon.h:96
float GetVisibilityRange() const
Definition Map.h:190
Definition TemporarySummon.h:77
bool IsPlayer() const
Definition ObjectGuid.h:168
Definition TemporarySummon.h:115
Definition TemporarySummon.h:40
virtual void InitSummon()
Definition TemporarySummon.cpp:252
virtual void InitStats(uint32 lifetime)
Definition TemporarySummon.cpp:200
void SetVisibleBySummonerOnly(bool visibleBySummonerOnly)
Definition TemporarySummon.h:61
Definition Totem.h:51
ObjectGuid GetOwnerGUID() const
Definition Unit.h:668
void SetUInt32Value(uint16 index, uint32 value)
Definition Unit.cpp:21181
Definition GridNotifiers.h:91
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:185

References AddToMap(), SummonPropertiesEntry::Category, Creature::Create(), ObjectGuid::Empty, EnsureGridLoaded(), SummonPropertiesEntry::Flags, Object::GetGUID(), Position::GetOrientation(), Unit::GetOwnerGUID(), WorldObject::GetPhaseMask(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransport(), GetVisibilityRange(), TempSummon::InitStats(), TempSummon::InitSummon(), ObjectGuid::IsPlayer(), Object::IsUnit(), Unit::IsVehicle(), PHASEMASK_NORMAL, Creature::SetHomePosition(), Unit::SetUInt32Value(), TempSummon::SetVisibleBySummonerOnly(), SUMMON_CATEGORY_ALLY, SUMMON_CATEGORY_PET, SUMMON_CATEGORY_PUPPET, SUMMON_CATEGORY_UNK, SUMMON_CATEGORY_VEHICLE, SUMMON_CATEGORY_WILD, SUMMON_TYPE_GUARDIAN, SUMMON_TYPE_GUARDIAN2, SUMMON_TYPE_JEEVES, SUMMON_TYPE_LIGHTWELL, SUMMON_TYPE_MINION, SUMMON_TYPE_MINIPET, SUMMON_TYPE_TOTEM, SUMMON_TYPE_VEHICLE, SUMMON_TYPE_VEHICLE2, Object::ToCreature(), Object::ToUnit(), SummonPropertiesEntry::Type, UNIT_CREATED_BY_SPELL, UNIT_MASK_GUARDIAN, UNIT_MASK_MINION, UNIT_MASK_PUPPET, UNIT_MASK_SUMMON, UNIT_MASK_TOTEM, and Cell::VisitAllObjects().

Referenced by instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::ChromieWhisper(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::DoSummonGrandChampion(), Spell::EffectSummonType(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::HandleOutro(), spell_temple_of_atal_hakkar_awaken_the_soulflayer::HandleSendEvent(), spell_halion_damage_aoe_summon::HandleSummon(), spell_putricide_mutated_transformation::HandleSummon(), spell_wintergrasp_create_vehicle::HandleSummon(), boss_varos::boss_varosAI::JustDied(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::OnPlayerEnter(), instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), at_tyrannus_event_starter::OnTrigger(), instance_karazhan::instance_karazhan_InstanceMapScript::OnUnitDeath(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnUnitDeath(), spell_halion_twilight_phasing::Phase(), instance_magisters_terrace::instance_magisters_terrace_InstanceMapScript::ProcessEvent(), instance_sethekk_halls::instance_sethekk_halls_InstanceMapScript::ProcessEvent(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::ProcessEvent(), instance_stratholme::instance_stratholme_InstanceMapScript::ProcessSlaughterEvent(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::ReplaceMoiraIfSaved(), boss_ossirian::Reset(), ScheduleCreatureRespawn(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::ScheduleNextPortal(), instance_gundrak::instance_gundrak_InstanceMapScript::SetBossState(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::SetBossState(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::SetData(), instance_scholomance::instance_scholomance_InstanceMapScript::SetData(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::SetData(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::SetData(), instance_pit_of_saron::instance_pit_of_saron_InstanceScript::SetData(), instance_ulduar::instance_ulduar_InstanceMapScript::SetData(), instance_violet_hold::instance_violet_hold_InstanceMapScript::SetData(), instance_ulduar::instance_ulduar_InstanceMapScript::SpawnLeviathanEncounterVehicles(), instance_zulfarrak::instance_zulfarrak_InstanceMapScript::SpawnPyramidWave(), SummonCreatureGroup(), Spell::SummonGuardian(), instance_zulaman::instance_zulaman_InstanceMapScript::SummonHostage(), instance_molten_core::instance_molten_core_InstanceMapScript::SummonMajordomoExecutus(), WorldState::SummonMouth(), WorldState::SummonPallid(), instance_blackrock_spire::instance_blackrock_spireMapScript::SummonSolakarWave(), instance_blackwing_lair::instance_blackwing_lair_InstanceMapScript::Update(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Update(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::Update(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::Update(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::Update(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::UpdateAI(), and instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::UpdateEventState().

◆ SummonCreatureGroup()

void Map::SummonCreatureGroup ( uint8  group,
std::list< TempSummon * > *  list = nullptr 
)

Summons group of creatures.

Parameters
groupId of group to summon.
listList to store pointers to summoned creatures.
2274{
2275 std::vector<TempSummonData> const* data = sObjectMgr->GetSummonGroup(GetId(), SUMMONER_TYPE_MAP, group);
2276 if (!data)
2277 return;
2278
2279 for (std::vector<TempSummonData>::const_iterator itr = data->begin(); itr != data->end(); ++itr)
2280 if (TempSummon* summon = SummonCreature(itr->entry, itr->pos, nullptr, itr->time))
2281 if (list)
2282 list->push_back(summon);
2283}
@ SUMMONER_TYPE_MAP
Definition TemporarySummon.h:27

References GetId(), sObjectMgr, SummonCreature(), and SUMMONER_TYPE_MAP.

Referenced by at_ancient_leaf::OnTrigger(), and instance_hyjal::instance_mount_hyjal_InstanceMapScript::ScheduleWaves().

◆ SummonGameObject() [1/2]

GameObject * Map::SummonGameObject ( uint32  entry,
float  x,
float  y,
float  z,
float  ang,
float  rotation0,
float  rotation1,
float  rotation2,
float  rotation3,
uint32  respawnTime,
bool  checkTransport = true 
)
2298{
2299 GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(entry);
2300 if (!goinfo)
2301 {
2302 LOG_ERROR("sql.sql", "Gameobject template {} not found in database!", entry);
2303 return nullptr;
2304 }
2305
2306 GameObject* go = sObjectMgr->IsGameObjectStaticTransport(entry) ? new StaticTransport() : new GameObject();
2307 if (!go->Create(GenerateLowGuid<HighGuid::GameObject>(), entry, this, PHASEMASK_NORMAL, x, y, z, ang, G3D::Quat(rotation0, rotation1, rotation2, rotation3), 100, GO_STATE_READY))
2308 {
2309 delete go;
2310 return nullptr;
2311 }
2312
2313 // Xinef: if gameobject is temporary, set custom spellid
2314 if (respawnTime)
2315 go->SetSpellId(1);
2316
2317 go->SetRespawnTime(respawnTime);
2318 go->SetSpawnedByDefault(false);
2319 AddToMap(go, checkTransport);
2320 return go;
2321}
virtual bool Create(ObjectGuid::LowType guidlow, uint32 name_id, Map *map, uint32 phaseMask, float x, float y, float z, float ang, G3D::Quat const &rotation, uint32 animprogress, GOState go_state, uint32 artKit=0)
Definition GameObject.cpp:254
void SetSpawnedByDefault(bool b)
Definition GameObject.h:196
void SetSpellId(uint32 id)
Definition GameObject.h:176
Definition Transport.h:113
Definition GameObjectData.h:31

References AddToMap(), GameObject::Create(), GO_STATE_READY, LOG_ERROR, PHASEMASK_NORMAL, GameObject::SetRespawnTime(), GameObject::SetSpawnedByDefault(), GameObject::SetSpellId(), and sObjectMgr.

Referenced by instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnGameObjectCreate(), SummonGameObject(), and instance_sunken_temple::instance_sunken_temple_InstanceMapScript::Update().

◆ SummonGameObject() [2/2]

GameObject * Map::SummonGameObject ( uint32  entry,
Position const &  pos,
float  rotation0 = 0.0f,
float  rotation1 = 0.0f,
float  rotation2 = 0.0f,
float  rotation3 = 0.0f,
uint32  respawnTime = 100,
bool  checkTransport = true 
)
2324{
2325 return SummonGameObject(entry, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), rotation0, rotation1, rotation2, rotation3, respawnTime, checkTransport);
2326}
GameObject * SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true)
Definition Object.cpp:2297

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and SummonGameObject().

◆ ToBattlegroundMap() [1/2]

◆ ToBattlegroundMap() [2/2]

BattlegroundMap const * Map::ToBattlegroundMap ( ) const
inline
387{ if (IsBattlegroundOrArena()) return reinterpret_cast<BattlegroundMap const*>(this); return nullptr; }

References IsBattlegroundOrArena().

◆ ToInstanceMap() [1/2]

◆ ToInstanceMap() [2/2]

InstanceMap const * Map::ToInstanceMap ( ) const
inline
384{ if (IsDungeon()) return (const InstanceMap*)((InstanceMap*)this); else return nullptr; }

References IsDungeon().

◆ ToMapInstanced() [1/2]

MapInstanced * Map::ToMapInstanced ( )
inline
380{ if (Instanceable()) return reinterpret_cast<MapInstanced*>(this); else return nullptr; }
Definition MapInstanced.h:26
bool Instanceable() const
Definition Map.h:289

References Instanceable().

Referenced by MapMgr::DoForAllMaps(), and MapMgr::DoForAllMapsWithMapId().

◆ ToMapInstanced() [2/2]

MapInstanced const * Map::ToMapInstanced ( ) const
inline
381{ if (Instanceable()) return (const MapInstanced*)((MapInstanced*)this); else return nullptr; }

References Instanceable().

◆ UnloadAll()

void Map::UnloadAll ( )
virtual

Reimplemented in InstanceMap, and MapInstanced.

1009{
1010 // clear all delayed moves, useless anyway do this moves before map unload.
1011 _creaturesToMove.clear();
1012 _gameObjectsToMove.clear();
1013
1015 {
1016 MapGridType& grid(*i->GetSource());
1017 ++i;
1018 UnloadGrid(grid); // deletes the grid and removes it from the GridRefMgr
1019 }
1020
1021 // pussywizard: crashfix, some npc can be left on transport (not a default passenger)
1022 if (!AllTransportsEmpty())
1024
1025 for (TransportsContainer::iterator itr = _transports.begin(); itr != _transports.end();)
1026 {
1027 MotionTransport* transport = *itr;
1028 ++itr;
1029
1030 transport->RemoveFromWorld();
1031 delete transport;
1032 }
1033
1034 _transports.clear();
1035
1036 for (auto& cellCorpsePair : _corpsesByGrid)
1037 {
1038 for (Corpse* corpse : cellCorpsePair.second)
1039 {
1040 corpse->RemoveFromWorld();
1041 corpse->ResetMap();
1042 delete corpse;
1043 }
1044 }
1045
1046 _corpsesByGrid.clear();
1047 _corpsesByPlayer.clear();
1048 _corpseBones.clear();
1049}
Definition GridRefMgr.h:28
iterator end()
Definition GridRefMgr.h:36
void AllTransportsRemovePassengers()
Definition Map.cpp:2649
bool UnloadGrid(MapGridType &grid)
Definition Map.cpp:982
bool AllTransportsEmpty() const
Definition Map.cpp:2640

References _corpseBones, _corpsesByGrid, _corpsesByPlayer, _creaturesToMove, _gameObjectsToMove, _transports, AllTransportsEmpty(), AllTransportsRemovePassengers(), GridRefMgr< OBJECT >::end(), GameObject::RemoveFromWorld(), and UnloadGrid().

Referenced by InstanceMap::UnloadAll(), and MapInstanced::UnloadAll().

◆ UnloadGrid()

bool Map::UnloadGrid ( MapGridType grid)
983{
984 _mapGridManager.UnloadGrid(grid.GetX(), grid.GetY());
985
986 ASSERT(i_objectsToRemove.empty());
987 LOG_DEBUG("maps", "Unloading grid[{}, {}] for map {} finished", grid.GetX(), grid.GetY(), GetId());
988 return true;
989}
void UnloadGrid(uint16 const x, uint16 const y)
Definition MapGridManager.cpp:38
uint16 GetX() const
Definition MapGrid.h:42
uint16 GetY() const
Definition MapGrid.h:43

References _mapGridManager, ASSERT, GetId(), MapGrid< WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES >::GetX(), MapGrid< WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES >::GetY(), i_objectsToRemove, LOG_DEBUG, and MapGridManager::UnloadGrid().

Referenced by UnloadAll().

◆ Update()

void Map::Update ( const uint32  t_diff,
const uint32  s_diff,
bool  thread = true 
)
virtual
  • Process necessary scripts

Reimplemented in InstanceMap, and MapInstanced.

458{
459 if (t_diff)
460 _dynamicTree.update(t_diff);
461
462 // Update world sessions and players
464 {
465 Player* player = m_mapRefIter->GetSource();
466 if (player && player->IsInWorld())
467 {
468 // Update session
469 WorldSession* session = player->GetSession();
470 MapSessionFilter updater(session);
471 session->Update(s_diff, updater);
472
473 // update players at tick
474 if (!t_diff)
475 player->Update(s_diff);
476 }
477 }
478
480
481 if (!t_diff)
482 {
484 return;
485 }
486
489
490 // Update players
492 {
493 Player* player = m_mapRefIter->GetSource();
494
495 if (!player || !player->IsInWorld())
496 continue;
497
498 player->Update(s_diff);
499
501 {
502 MarkNearbyCellsOf(player);
503
504 // If player is using far sight, update viewpoint
505 if (WorldObject* viewPoint = player->GetViewpoint())
506 {
507 if (Creature* viewCreature = viewPoint->ToCreature())
508 MarkNearbyCellsOf(viewCreature);
509 else if (DynamicObject* viewObject = viewPoint->ToDynObject())
510 MarkNearbyCellsOf(viewObject);
511 }
512 }
513 }
514
516 {
517 // Mark all cells near active objects
519 {
521 if (!obj || !obj->IsInWorld())
522 continue;
523
525 }
526 }
527
529
531
533 if (!m_scriptSchedule.empty())
534 {
535 i_scriptLock = true;
537 i_scriptLock = false;
538 }
539
543
545
546 sScriptMgr->OnMapUpdate(this, t_diff);
547
548 METRIC_VALUE("map_creatures", uint64(GetObjectsStore().Size<Creature>()),
549 METRIC_TAG("map_id", std::to_string(GetId())),
550 METRIC_TAG("map_instanceid", std::to_string(GetInstanceId())));
551
552 METRIC_VALUE("map_gameobjects", uint64(GetObjectsStore().Size<GameObject>()),
553 METRIC_TAG("map_id", std::to_string(GetId())),
554 METRIC_TAG("map_instanceid", std::to_string(GetInstanceId())));
555}
std::uint64_t uint64
Definition Define.h:106
#define METRIC_VALUE(category, value,...)
Definition Metric.h:197
#define METRIC_TAG(name, value)
Definition Metric.h:163
void update(uint32 diff)
Definition DynamicTree.cpp:142
Definition WorldSession.h:244
void HandleDelayedVisibility()
Definition Map.cpp:652
MapStoredObjectTypesContainer & GetObjectsStore()
Definition Map.h:354
void MoveAllGameObjectsInMoveList()
Definition Map.cpp:924
void UpdateNonPlayerObjects(uint32 const diff)
Definition Map.cpp:557
void MarkNearbyCellsOf(WorldObject *obj)
Definition Map.cpp:421
void resetMarkedCells()
Definition Map.h:311
void MoveAllDynamicObjectsInMoveList()
Definition Map.cpp:953
void MoveAllCreaturesInMoveList()
Definition Map.cpp:895
MapRefMgr::iterator m_mapRefIter
Definition Map.h:550
void SendObjectUpdates()
Definition Map.cpp:1686
DynamicObject * ToDynObject()
Definition Object.h:222
void Update(uint32 time) override
Definition PlayerUpdates.cpp:53
WorldObject * GetViewpoint() const
Definition Player.cpp:13191
FROM * GetSource() const
Definition Reference.h:97
TaskScheduler & Update(success_t const &callback=EmptyCallback)
Definition TaskScheduler.cpp:27
Player session in the World.
Definition WorldSession.h:330
bool Update(uint32 diff, PacketFilter &updater)
Update the WorldSession (triggered by World update)
Definition WorldSession.cpp:326
bool Passed()
Definition Timer.h:161
void Update(time_t diff)
Definition Timer.h:152

References _creatureRespawnScheduler, _dynamicTree, _updatableObjectListRecheckTimer, MapRefMgr::begin(), MapRefMgr::end(), GetId(), GetInstanceId(), GetObjectsStore(), Player::GetSession(), Reference< TO, FROM >::GetSource(), Player::GetViewpoint(), HandleDelayedVisibility(), i_scriptLock, Object::IsInWorld(), m_activeNonPlayers, m_activeNonPlayersIter, m_mapRefIter, m_mapRefMgr, m_scriptSchedule, MarkNearbyCellsOf(), METRIC_TAG, METRIC_VALUE, MoveAllCreaturesInMoveList(), MoveAllDynamicObjectsInMoveList(), MoveAllGameObjectsInMoveList(), IntervalTimer::Passed(), resetMarkedCells(), ScriptsProcess(), SendObjectUpdates(), sScriptMgr, Object::ToCreature(), Object::ToDynObject(), TaskScheduler::Update(), IntervalTimer::Update(), DynamicMapTree::update(), WorldSession::Update(), Player::Update(), and UpdateNonPlayerObjects().

Referenced by MapUpdateRequest::call(), InstanceMap::Update(), and MapInstanced::Update().

◆ UpdateEncounterState()

void Map::UpdateEncounterState ( EncounterCreditType  type,
uint32  creditEntry,
Unit source 
)
2547{
2548 Difficulty difficulty_fixed = (IsSharedDifficultyMap(GetId()) ? Difficulty(GetDifficulty() % 2) : GetDifficulty());
2549 DungeonEncounterList const* encounters;
2550 // 631 : ICC - 724 : Ruby Sanctum --- For heroic difficulties, for some reason, we don't have an encounter list, so we get the encounter list from normal diff. We shouldn't change difficulty_fixed variable.
2551 if ((GetId() == 631 || GetId() == 724) && IsHeroic())
2552 {
2553 encounters = sObjectMgr->GetDungeonEncounterList(GetId(), !Is25ManRaid() ? RAID_DIFFICULTY_10MAN_NORMAL : RAID_DIFFICULTY_25MAN_NORMAL);
2554 }
2555 else
2556 {
2557 encounters = sObjectMgr->GetDungeonEncounterList(GetId(), difficulty_fixed);
2558 }
2559
2560 if (!encounters)
2561 {
2562 return;
2563 }
2564
2565 uint32 dungeonId = 0;
2566 bool updated = false;
2567
2568 for (DungeonEncounterList::const_iterator itr = encounters->begin(); itr != encounters->end(); ++itr)
2569 {
2570 DungeonEncounter const* encounter = *itr;
2571 if (encounter->creditType == type && encounter->creditEntry == creditEntry)
2572 {
2573 if (source)
2574 if (InstanceScript* instanceScript = source->GetInstanceScript())
2575 {
2576 uint32 prevMask = instanceScript->GetCompletedEncounterMask();
2577 instanceScript->SetCompletedEncountersMask((1 << encounter->dbcEntry->encounterIndex) | instanceScript->GetCompletedEncounterMask(), true);
2578 if (prevMask != instanceScript->GetCompletedEncounterMask())
2579 updated = true;
2580 }
2581
2582 if (encounter->lastEncounterDungeon)
2583 {
2584 dungeonId = encounter->lastEncounterDungeon;
2585 break;
2586 }
2587 }
2588 }
2589
2590 // pussywizard:
2591 LogEncounterFinished(type, creditEntry);
2592
2593 sScriptMgr->OnAfterUpdateEncounterState(this, type, creditEntry, source, difficulty_fixed, encounters, dungeonId, updated);
2594
2595 if (dungeonId)
2596 {
2597 Map::PlayerList const& players = GetPlayers();
2598 for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
2599 {
2600 if (Player* player = i->GetSource())
2601 if (Group* grp = player->GetGroup())
2602 if (grp->isLFGGroup())
2603 {
2604 sLFGMgr->FinishDungeon(grp->GetGUID(), dungeonId, this);
2605 return;
2606 }
2607 }
2608 }
2609}
@ RAID_DIFFICULTY_10MAN_NORMAL
Definition DBCEnums.h:273
@ RAID_DIFFICULTY_25MAN_NORMAL
Definition DBCEnums.h:274
bool IsSharedDifficultyMap(uint32 mapid)
Definition DBCStores.cpp:829
#define sLFGMgr
Definition LFGMgr.h:641
std::list< DungeonEncounter const * > DungeonEncounterList
Definition ObjectMgr.h:711
Definition Group.h:169
Definition InstanceScript.h:143
bool Is25ManRaid() const
Definition Map.h:295
void LogEncounterFinished(EncounterCreditType type, uint32 creditEntry)
Definition Map.cpp:2611
bool IsHeroic() const
Definition Map.h:294
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1185
uint32 encounterIndex
Definition DBCStructure.h:871
Definition ObjectMgr.h:701
DungeonEncounterEntry const * dbcEntry
Definition ObjectMgr.h:705
EncounterCreditType creditType
Definition ObjectMgr.h:706
uint32 lastEncounterDungeon
Definition ObjectMgr.h:708
uint32 creditEntry
Definition ObjectMgr.h:707

References MapRefMgr::begin(), DungeonEncounter::creditEntry, DungeonEncounter::creditType, DungeonEncounter::dbcEntry, DungeonEncounterEntry::encounterIndex, MapRefMgr::end(), GetDifficulty(), GetId(), WorldObject::GetInstanceScript(), GetPlayers(), Is25ManRaid(), IsHeroic(), IsSharedDifficultyMap(), DungeonEncounter::lastEncounterDungeon, LogEncounterFinished(), RAID_DIFFICULTY_10MAN_NORMAL, RAID_DIFFICULTY_25MAN_NORMAL, sLFGMgr, sObjectMgr, and sScriptMgr.

Referenced by boss_eadric::boss_eadricAI::DamageTaken(), boss_illidari_council::DoAction(), Spell::finish(), instance_karazhan::instance_karazhan_InstanceMapScript::SetBossState(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), and npc_grimstone::npc_grimstoneAI::WaypointReached().

◆ UpdateIteratorBack()

void Map::UpdateIteratorBack ( Player player)
2419{
2420 if (m_mapRefIter == player->GetMapRef())
2422}
MapReference const * nocheck_prev() const
Definition MapReference.h:49
MapReference & GetMapRef()
Definition Player.h:2510

References Player::GetMapRef(), m_mapRefIter, and MapReference::nocheck_prev().

Referenced by Player::ResetMap().

◆ UpdateNonPlayerObjects()

void Map::UpdateNonPlayerObjects ( uint32 const  diff)
private
558{
562
564 {
565 for (uint32 i = 0; i < _updatableObjectList.size();)
566 {
568 if (!obj->IsInWorld())
569 {
570 ++i;
571 continue;
572 }
573
574 obj->Update(diff);
575
576 if (!obj->IsUpdateNeeded())
577 {
579 // Intentional no iteration here, obj is swapped with last element in
580 // _updatableObjectList so next loop will update that object at the same index
581 }
582 else
583 ++i;
584 }
586 }
587 else
588 {
589 for (uint32 i = 0; i < _updatableObjectList.size(); ++i)
590 {
592 if (!obj->IsInWorld())
593 continue;
594
595 obj->Update(diff);
596 }
597 }
598}
void _AddObjectToUpdateList(WorldObject *obj)
Definition Map.cpp:614
virtual bool IsUpdateNeeded()
Definition Object.cpp:3220
virtual void Update(uint32 diff)
Definition Object.cpp:1061
void Reset()
Definition Timer.h:166

References _AddObjectToUpdateList(), _pendingAddUpdatableObjectList, _RemoveObjectFromUpdateList(), _updatableObjectList, _updatableObjectListRecheckTimer, Object::IsInWorld(), WorldObject::IsUpdateNeeded(), IntervalTimer::Passed(), IntervalTimer::Reset(), and WorldObject::Update().

Referenced by Update().

◆ UpdatePlayerZoneStats()

void Map::UpdatePlayerZoneStats ( uint32  oldZone,
uint32  newZone 
)
441{
442 // Nothing to do if no change
443 if (oldZone == newZone)
444 return;
445
446 if (oldZone != MAP_INVALID_ZONE)
447 {
448 uint32& oldZoneCount = _zonePlayerCountMap[oldZone];
449 if (!oldZoneCount)
450 LOG_ERROR("maps", "A player left zone {} (went to {}) - but there were no players in the zone!", oldZone, newZone);
451 else
452 --oldZoneCount;
453 }
454 ++_zonePlayerCountMap[newZone];
455}

References _zonePlayerCountMap, LOG_ERROR, and MAP_INVALID_ZONE.

Referenced by Player::UpdateZone().

◆ Visit()

template<class T , class CONTAINER >
void Map::Visit ( const Cell cell,
TypeContainerVisitor< T, CONTAINER > &  visitor 
)
inline
710{
711 uint32 const grid_x = cell.GridX();
712 uint32 const grid_y = cell.GridY();
713
714 // If grid is not loaded, nothing to visit.
715 if (!IsGridLoaded(GridCoord(grid_x, grid_y)))
716 return;
717
718 GetMapGrid(grid_x, grid_y)->VisitCell(cell.CellX(), cell.CellY(), visitor);
719}
void VisitCell(uint16 const x, uint16 const y, TypeContainerVisitor< T, TypeMapContainer< TT > > &visitor)
Definition MapGrid.h:86
uint32 GridX() const
Definition Cell.h:71
uint32 GridY() const
Definition Cell.h:72
uint32 CellX() const
Definition Cell.h:69
uint32 CellY() const
Definition Cell.h:70

References Cell::CellX(), Cell::CellY(), GetMapGrid(), Cell::GridX(), Cell::GridY(), IsGridLoaded(), and MapGrid< WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES >::VisitCell().

Referenced by Cell::Visit(), and Cell::VisitCircle().

Friends And Related Symbol Documentation

◆ GridObjectLoader

friend class GridObjectLoader
friend

◆ MapReference

friend class MapReference
friend

Member Data Documentation

◆ _corpseBones

std::unordered_set<Corpse*> Map::_corpseBones
private

◆ _corpsesByGrid

std::unordered_map<uint32, std::unordered_set<Corpse*> > Map::_corpsesByGrid
private

◆ _corpsesByPlayer

std::unordered_map<ObjectGuid, Corpse*> Map::_corpsesByPlayer
private

◆ _creatureBySpawnIdStore

CreatureBySpawnIdContainer Map::_creatureBySpawnIdStore
private

◆ _creatureRespawnScheduler

TaskScheduler Map::_creatureRespawnScheduler

Referenced by ScheduleCreatureRespawn(), and Update().

◆ _creatureRespawnTimes

std::unordered_map<ObjectGuid::LowType , time_t> Map::_creatureRespawnTimes
private

◆ _creaturesToMove

std::vector<Creature*> Map::_creaturesToMove
private

◆ _defaultLight

uint32 Map::_defaultLight
private

◆ _dynamicObjectsToMove

std::vector<DynamicObject*> Map::_dynamicObjectsToMove
private

◆ _dynamicTree

◆ _gameobjectBySpawnIdStore

GameObjectBySpawnIdContainer Map::_gameobjectBySpawnIdStore
private

◆ _gameObjectsToMove

std::vector<GameObject*> Map::_gameObjectsToMove
private

◆ _goRespawnTimes

std::unordered_map<ObjectGuid::LowType , time_t> Map::_goRespawnTimes
private

◆ _guidGenerators

std::map<HighGuid, std::unique_ptr<ObjectGuidGeneratorBase> > Map::_guidGenerators
private

◆ _instanceResetPeriod

time_t Map::_instanceResetPeriod
protected

◆ _mapGridManager

◆ _objectsStore

◆ _pendingAddUpdatableObjectList

◆ _transports

◆ _transportsUpdateIter

TransportsContainer::iterator Map::_transportsUpdateIter
protected

Referenced by DelayedUpdate(), and RemoveFromMap().

◆ _updatableObjectList

◆ _updatableObjectListRecheckTimer

IntervalTimer Map::_updatableObjectListRecheckTimer
private

Referenced by Map(), Update(), and UpdateNonPlayerObjects().

◆ _updateObjects

std::unordered_set<Object*> Map::_updateObjects
private

◆ _zoneDynamicInfo

◆ _zonePlayerCountMap

std::unordered_map<uint32, uint32> Map::_zonePlayerCountMap
private

◆ CreatureGroupHolder

◆ CustomData

DataMap Map::CustomData

◆ i_InstanceId

uint32 Map::i_InstanceId
protected

Referenced by GetInstanceId(), and ~Map().

◆ i_mapEntry

◆ i_objectsForDelayedVisibility

std::unordered_set<Unit*> Map::i_objectsForDelayedVisibility

◆ i_objectsToRemove

std::unordered_set<WorldObject*> Map::i_objectsToRemove
private

◆ i_scriptLock

bool Map::i_scriptLock
private

◆ i_spawnMode

uint8 Map::i_spawnMode
protected

◆ i_worldObjects

std::unordered_set<WorldObject*> Map::i_worldObjects
private

◆ Lock

std::mutex Map::Lock
protected

◆ m_activeNonPlayers

ActiveNonPlayers Map::m_activeNonPlayers
protected

◆ m_activeNonPlayersIter

ActiveNonPlayers::iterator Map::m_activeNonPlayersIter
protected

Referenced by RemoveFromActiveHelper(), and Update().

◆ m_mapRefIter

MapRefMgr::iterator Map::m_mapRefIter
protected

Referenced by Update(), and UpdateIteratorBack().

◆ m_mapRefMgr

◆ m_parentMap

Map* Map::m_parentMap
private

Referenced by GetParent(), and Map().

◆ m_scriptSchedule

ScriptScheduleMap Map::m_scriptSchedule
private

◆ m_unloadTimer

◆ m_VisibleDistance

◆ marked_cells

std::bitset<TOTAL_NUMBER_OF_CELLS_PER_MAP * TOTAL_NUMBER_OF_CELLS_PER_MAP> Map::marked_cells
private

◆ MMapLock

std::shared_mutex Map::MMapLock
protected

Referenced by GetMMapLock().


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