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 TestMap

Classes

struct  RespawnEntry
 

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
 
void HandleDelayedVisibility ()
 
float GetHeight (float x, float y, float z, bool checkVMap=true, float maxSearchDist=DEFAULT_HEIGHT_SEARCH) const
 
float GetHeight (Position const &pos, 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, Optional< uint8 > reqLiquidType={})
 
LiquidData const GetLiquidData (uint32 phaseMask, float x, float y, float z, float collisionHeight, Optional< 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 (bool aliveOnly=false) const
 
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)
 
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)
 
void SummonGameObjectGroup (uint8 group, std::list< GameObject * > *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
 
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)
 
std::unordered_map< ObjectGuid::LowType, time_t > const & GetCreatureRespawnTimes () const
 
std::unordered_map< ObjectGuid::LowType, time_t > const & GetGORespawnTimes () const
 
void LoadRespawnTimes ()
 
void DeleteRespawnTimes ()
 
time_t GetInstanceResetPeriod () const
 
void UpdatePlayerZoneStats (uint32 oldZone, uint32 newZone)
 
uint32 ApplyDynamicModeRespawnScaling (WorldObject const *obj, uint32 respawnDelay) const
 
bool SpawnGroupSpawn (uint32 groupId, bool ignoreRespawn=false, bool force=false)
 
bool SpawnGroupDespawn (uint32 groupId, bool deleteRespawnTimes=false)
 
bool IsSpawnGroupActive (uint32 groupId) const
 
void ProcessRespawns ()
 
void ProcessCreatureRespawn (ObjectGuid::LowType spawnId)
 
void ProcessGameObjectRespawn (ObjectGuid::LowType spawnId)
 
time_t GetRespawnTime (SpawnObjectType type, ObjectGuid::LowType spawnId) const
 
void RemoveRespawnTime (SpawnObjectType type, ObjectGuid::LowType spawnId)
 
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 ()
 
bool SendZoneMessage (uint32 zone, WorldPacket const *packet, WorldSession const *self=nullptr, TeamId teamId=TEAM_NEUTRAL) const
 Send a packet to all players (or players selected team) in the zone (except self if mentioned)
 
void SendZoneText (uint32 zoneId, char const *text, WorldSession const *self=nullptr, TeamId teamId=TEAM_NEUTRAL) const
 Send a System Message to all players in the zone (except self if mentioned)
 
void SendInitTransports (Player *player)
 
void SendRemoveTransports (Player *player)
 
void SendZoneDynamicInfo (uint32 zoneId, Player *player) const
 
void SendZoneWeather (uint32 zoneId, Player *player) const
 
void SendZoneWeather (ZoneDynamicInfo const &zoneDynamicInfo, Player *player) const
 
void SendInitSelf (Player *player)
 
void UpdateWeather (uint32 const diff)
 
void UpdateExpiredCorpses (uint32 const diff)
 
void PlayDirectSoundToMap (uint32 soundId, uint32 zoneId=0)
 
void SetZoneMusic (uint32 zoneId, uint32 musicId)
 
WeatherGetOrGenerateZoneDefaultWeather (uint32 zoneId)
 
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)
 
size_t GetUpdatableObjectsCount () 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)
 
void AddWorldObjectToFarVisibleMap (WorldObject *obj)
 
void RemoveWorldObjectFromFarVisibleMap (WorldObject *obj)
 
void AddWorldObjectToZoneWideVisibleMap (uint32 zoneId, WorldObject *obj)
 
void RemoveWorldObjectFromZoneWideVisibleMap (uint32 zoneId, WorldObject *obj)
 
ZoneWideVisibleWorldObjectsSet const * GetZoneWideVisibleWorldObjectsForZone (uint32 zoneId) const
 
uint32 GetPlayerCountInZone (uint32 zoneId) const
 
MapCollisionDataGetMapCollisionData ()
 
MapCollisionData const & GetMapCollisionData () const
 
template<>
void AddToGrid (Creature *obj, Cell const &cell)
 
template<>
void AddToGrid (GameObject *obj, Cell const &cell)
 
template<>
void AddToGrid (Player *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 (Transport *obj, bool)
 
template<>
void RemoveFromMap (Transport *obj, bool remove)
 
- 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
 
EventProcessor Events
 
DataMap CustomData
 

Protected Member Functions

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

Protected Attributes

std::mutex Lock
 
MapGridManager _mapGridManager
 
MapEntry const * i_mapEntry
 
MapCollisionData _mapCollisionData
 
uint8 i_spawnMode
 
uint32 i_InstanceId
 
uint32 m_unloadTimer
 
float m_VisibleDistance
 
time_t _instanceResetPeriod
 
MapRefMgr m_mapRefMgr
 
MapRefMgr::iterator m_mapRefIter
 
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 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
 
ScriptScheduleMap m_scriptSchedule
 
std::unordered_map< ObjectGuid::LowType, time_t > _creatureRespawnTimes
 
std::unordered_map< ObjectGuid::LowType, time_t > _goRespawnTimes
 
std::set< RespawnEntry_respawnQueue
 
std::unordered_set< uint32_toggledSpawnGroupIds
 
uint32 _respawnCheckTimer {0}
 
std::unordered_map< uint32, uint32_zonePlayerCountMap
 
ZoneDynamicInfoMap _zoneDynamicInfo
 
IntervalTimer _weatherUpdateTimer
 
uint32 _defaultLight
 
IntervalTimer _corpseUpdateTimer
 
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
 
ZoneWideVisibleWorldObjectsMap _zoneWideVisibleWorldObjectsMap
 

Friends

class MapReference
 
class GridObjectLoader
 

Detailed Description

Member Typedef Documentation

◆ 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 
272 {
273 CAN_ENTER = 0,
274 CANNOT_ENTER_ALREADY_IN_MAP = 1, // Player is already in the map
275 CANNOT_ENTER_NO_ENTRY, // No map entry was found for the target map ID
276 CANNOT_ENTER_UNINSTANCED_DUNGEON, // No instance template was found for dungeon map
277 CANNOT_ENTER_DIFFICULTY_UNAVAILABLE, // Requested instance difficulty is not available for target map
278 CANNOT_ENTER_NOT_IN_RAID, // Target instance is a raid instance and the player is not in a raid group
279 CANNOT_ENTER_CORPSE_IN_DIFFERENT_INSTANCE, // Player is dead and their corpse is not in target instance
280 CANNOT_ENTER_INSTANCE_BIND_MISMATCH, // Player's permanent instance save is not compatible with their group's current instance bind
281 CANNOT_ENTER_TOO_MANY_INSTANCES, // Player has entered too many instances recently
282 CANNOT_ENTER_MAX_PLAYERS, // Target map already has the maximum number of players allowed
283 CANNOT_ENTER_ZONE_IN_COMBAT, // A boss encounter is currently in progress on the target map
285 };
@ CANNOT_ENTER_CORPSE_IN_DIFFERENT_INSTANCE
Definition Map.h:279
@ CANNOT_ENTER_TOO_MANY_INSTANCES
Definition Map.h:281
@ CANNOT_ENTER_MAX_PLAYERS
Definition Map.h:282
@ CANNOT_ENTER_ZONE_IN_COMBAT
Definition Map.h:283
@ CAN_ENTER
Definition Map.h:273
@ CANNOT_ENTER_ALREADY_IN_MAP
Definition Map.h:274
@ CANNOT_ENTER_UNSPECIFIED_REASON
Definition Map.h:284
@ CANNOT_ENTER_NO_ENTRY
Definition Map.h:275
@ CANNOT_ENTER_DIFFICULTY_UNAVAILABLE
Definition Map.h:277
@ CANNOT_ENTER_INSTANCE_BIND_MISMATCH
Definition Map.h:280
@ CANNOT_ENTER_UNINSTANCED_DUNGEON
Definition Map.h:276
@ CANNOT_ENTER_NOT_IN_RAID
Definition Map.h:278

Constructor & Destructor Documentation

◆ Map()

Map::Map ( uint32  id,
uint32  InstanceId,
uint8  SpawnMode,
Map _parent = nullptr 
)
67 :
68 _mapGridManager(this), i_mapEntry(sMapStore.LookupEntry(id)), _mapCollisionData(*this, _parent),
69 i_spawnMode(SpawnMode), i_InstanceId(InstanceId), m_unloadTimer(0),
72{
73 m_parentMap = (_parent ? _parent : this);
74
75 _zonePlayerCountMap.clear();
77
78 //lets initialize visibility distance for map
80
83}
constexpr auto IN_MILLISECONDS
Definition Common.h:53
constexpr auto MINUTE
Definition Common.h:47
uint32 GetDefaultMapLight(uint32 mapId)
Definition DBCStores.cpp:880
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
#define UPDATABLE_OBJECT_LIST_RECHECK_TIMER
Definition Map.h:94
#define DEFAULT_VISIBILITY_DISTANCE
Definition ObjectDefines.h:39
MapEntry const * i_mapEntry
Definition Map.h:596
uint8 i_spawnMode
Definition Map.h:598
std::unordered_map< uint32, uint32 > _zonePlayerCountMap
Definition Map.h:664
TransportsContainer::iterator _transportsUpdateIter
Definition Map.h:608
uint32 m_unloadTimer
Definition Map.h:600
uint32 _defaultLight
Definition Map.h:668
IntervalTimer _weatherUpdateTimer
Definition Map.h:667
Map * m_parentMap
Definition Map.h:622
IntervalTimer _updatableObjectListRecheckTimer
Definition Map.h:694
MapCollisionData _mapCollisionData
Definition Map.h:597
bool i_scriptLock
Definition Map.h:626
IntervalTimer _corpseUpdateTimer
Definition Map.h:670
time_t _instanceResetPeriod
Definition Map.h:602
float m_VisibleDistance
Definition Map.h:601
MapGridManager _mapGridManager
Definition Map.h:595
virtual void InitVisibilityDistance()
Definition Map.cpp:95
TransportsContainer _transports
Definition Map.h:607
uint32 i_InstanceId
Definition Map.h:599
void SetInterval(time_t interval)
Definition Timer.h:179

References _corpseUpdateTimer, _updatableObjectListRecheckTimer, _weatherUpdateTimer, _zonePlayerCountMap, IN_MILLISECONDS, InitVisibilityDistance(), m_parentMap, MINUTE, IntervalTimer::SetInterval(), and UPDATABLE_OBJECT_LIST_RECHECK_TIMER.

◆ ~Map()

Map::~Map ( )
override
54{
55 // UnloadAll must be called before deleting the map
56
57 // Kill all scheduled events without executing them, since the map and its objects are being destroyed.
58 // This prevents events from running on invalid or deleted objects during map destruction.
59 Events.KillAllEvents(false);
60
61 sScriptMgr->OnDestroyMap(this);
62
63 if (!m_scriptSchedule.empty())
64 sScriptMgr->DecreaseScheduledScriptCount(m_scriptSchedule.size());
65}
#define sScriptMgr
Definition ScriptMgr.h:737
Events
Definition alterac_valley.cpp:53
ScriptScheduleMap m_scriptSchedule
Definition Map.h:630

References m_scriptSchedule, and sScriptMgr.

Member Function Documentation

◆ _AddObjectToUpdateList()

void Map::_AddObjectToUpdateList ( WorldObject obj)
private
590{
591 UpdatableMapObject* mapUpdatableObject = dynamic_cast<UpdatableMapObject*>(obj);
592 ASSERT(mapUpdatableObject && mapUpdatableObject->GetUpdateState() == UpdatableMapObject::UpdateState::PendingAdd);
593
595 mapUpdatableObject->SetMapUpdateListOffset(_updatableObjectList.size());
596 _updatableObjectList.push_back(obj);
597}
#define ASSERT
Definition Errors.h:68
UpdatableObjectList _updatableObjectList
Definition Map.h:692
Definition Object.h:432
void SetUpdateState(UpdateState state)
Definition Object.h:459
UpdateState GetUpdateState() const
Definition Object.h:464
@ PendingAdd
Definition Object.h:439
@ Updating
Definition Object.h:440
void SetMapUpdateListOffset(std::size_t const offset)
Definition Object.h:447

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:145
Definition Creature.h:47
Creature * ToCreature()
Definition Object.h:206
std::string ToString(Type &&val, Params &&... params)
Definition StringConvert.h:250
std::string GetDebugInfo() const
Definition ObjectMgr.cpp:202

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:173
TypeID GetTypeId() const
Definition Object.h:129

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

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

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}
Definition Object.h:475

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

Referenced by ScriptsProcess().

◆ _RemoveObjectFromUpdateList()

void Map::_RemoveObjectFromUpdateList ( WorldObject obj)
private
601{
602 UpdatableMapObject* mapUpdatableObject = dynamic_cast<UpdatableMapObject*>(obj);
603 ASSERT(mapUpdatableObject && mapUpdatableObject->GetUpdateState() == UpdatableMapObject::UpdateState::Updating);
604
605 if (obj != _updatableObjectList.back())
606 {
607 dynamic_cast<UpdatableMapObject*>(_updatableObjectList.back())->SetMapUpdateListOffset(mapUpdatableObject->GetMapUpdateListOffset());
608 std::swap(_updatableObjectList[mapUpdatableObject->GetMapUpdateListOffset()], _updatableObjectList.back());
609 }
610
611 _updatableObjectList.pop_back();
613}
size_t GetMapUpdateListOffset() const
Definition Object.h:453
@ NotUpdating
Definition Object.h:438

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:709
@ TYPEMASK_GAMEOBJECT
Definition ObjectGuid.h:51
@ SCRIPT_COMMAND_CLOSE_DOOR
Definition ObjectMgr.h:105
@ SCRIPT_COMMAND_OPEN_DOOR
Definition ObjectMgr.h:104
@ GAMEOBJECT_TYPE_BUTTON
Definition SharedDefines.h:1565
@ GAMEOBJECT_TYPE_DOOR
Definition SharedDefines.h:1564
Definition GameObject.h:120
void UseDoorOrButton(uint32 time_to_restore=0, bool alternative=false, Unit *user=nullptr)
Definition GameObject.cpp:1410
GOState GetGoState() const
Definition GameObject.h:205
GameobjectTypes GetGoType() const
Definition GameObject.h:203
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:130
GameObject * ToGameObject()
Definition Object.h:214
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114
ScriptCommands command
Definition ObjectMgr.h:195
uint32 ResetDelay
Definition ObjectMgr.h:288
struct ScriptInfo::@270::@283 ToggleDoor
uint32 GOGuid
Definition ObjectMgr.h:268

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)
2961{
2962 corpse->SetMap(this);
2963
2964 GridCoord const gridCoord = Acore::ComputeGridCoord(corpse->GetPositionX(), corpse->GetPositionY());
2965 _corpsesByGrid[gridCoord.GetId()].insert(corpse);
2966 if (corpse->GetType() != CORPSE_BONES)
2967 _corpsesByPlayer[corpse->GetOwnerGUID()] = corpse;
2968 else
2969 _corpseBones.insert(corpse);
2970}
@ 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:687
std::unordered_set< Corpse * > _corpseBones
Definition Map.h:688
std::unordered_map< uint32, std::unordered_set< Corpse * > > _corpsesByGrid
Definition Map.h:686
virtual void SetMap(Map *map)
Definition Object.cpp:2137
GridCoord ComputeGridCoord(float x, float y)
Definition GridDefines.h:185
Definition GridDefines.h:88
uint32 GetId() const
Definition GridDefines.h:150
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
880{
882 _creaturesToMove.push_back(c);
884}
@ MAP_OBJECT_CELL_MOVE_ACTIVE
Definition Object.h:409
@ MAP_OBJECT_CELL_MOVE_NONE
Definition Object.h:408
std::vector< Creature * > _creaturesToMove
Definition Map.h:577
MapObjectCellMoveState _moveState
Definition Object.h:428

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
906{
907 if (dynObj->_moveState == MAP_OBJECT_CELL_MOVE_NONE)
908 _dynamicObjectsToMove.push_back(dynObj);
909 dynObj->_moveState = MAP_OBJECT_CELL_MOVE_ACTIVE;
910}
std::vector< DynamicObject * > _dynamicObjectsToMove
Definition Map.h:579

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
893{
895 _gameObjectsToMove.push_back(go);
897}
std::vector< GameObject * > _gameObjectsToMove
Definition Map.h:578

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

Referenced by GameObjectRelocation().

◆ AddObjectToPendingUpdateList()

void Map::AddObjectToPendingUpdateList ( WorldObject obj)
576{
577 if (!obj->CanBeAddedToMapUpdateList())
578 return;
579
580 UpdatableMapObject* mapUpdatableObject = dynamic_cast<UpdatableMapObject*>(obj);
581 if (!mapUpdatableObject || mapUpdatableObject->GetUpdateState() != UpdatableMapObject::UpdateState::NotUpdating)
582 return;
583
586}
PendingAddUpdatableObjectList _pendingAddUpdatableObjectList
Definition Map.h:693
bool CanBeAddedToMapUpdateList()
Definition Object.cpp:3195

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

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

◆ AddObjectToRemoveList()

void Map::AddObjectToRemoveList ( WorldObject obj)
1775{
1776 ASSERT(obj->GetMapId() == GetId() && obj->GetInstanceId() == GetInstanceId());
1777
1778 obj->CleanupsBeforeDelete(false); // remove or simplify at least cross referenced links
1779
1780 i_objectsToRemove.insert(obj);
1781 //LOG_DEBUG("maps", "Object ({}) added to removing list.", obj->GetGUID().ToString());
1782}
std::unordered_set< WorldObject * > i_objectsToRemove
Definition Map.h:627
uint32 GetId() const
Definition Map.h:232
uint32 GetInstanceId() const
Definition Map.h:268
uint32 GetMapId() const
Definition Position.h:281
uint32 GetInstanceId() const
Definition Object.h:513
virtual void CleanupsBeforeDelete(bool finalCleanup=true)
Definition Object.cpp:1156

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.

256{
257 CellCoord cellCoord = Acore::ComputeCellCoord(player->GetPositionX(), player->GetPositionY());
258 if (!cellCoord.IsCoordValid())
259 {
260 LOG_ERROR("maps", "Map::Add: Player ({}) has invalid coordinates X:{} Y:{} grid cell [{}:{}]",
261 player->GetGUID().ToString(), player->GetPositionX(), player->GetPositionY(), cellCoord.x_coord, cellCoord.y_coord);
262 return false;
263 }
264
265 Cell cell(cellCoord);
267 AddToGrid(player, cell);
268
269 // Check if we are adding to correct map
270 ASSERT (player->GetMap() == this);
271 player->SetMap(this);
272 player->AddToWorld();
273
274 SendInitTransports(player);
275 SendInitSelf(player);
276
277 player->UpdateObjectVisibility(false);
278
279 if (player->IsAlive())
280 ConvertCorpseToBones(player->GetGUID());
281
282 sScriptMgr->OnPlayerEnterMap(this, player);
283 return true;
284}
#define MAX_VISIBILITY_DISTANCE
Definition ObjectDefines.h:30
void LoadGridsInRange(Position const &center, float radius)
Definition Map.cpp:225
Corpse * ConvertCorpseToBones(ObjectGuid const &ownerGuid, bool insignia=false)
Definition Map.cpp:2993
void SendInitSelf(Player *player)
Definition Map.cpp:1616
void AddToGrid(T *object, Cell const &cell)
Definition Map.cpp:113
void SendInitTransports(Player *player)
Definition Map.cpp:1662
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition PlayerUpdates.cpp:1613
void AddToWorld() override
Definition Player.cpp:1698
void SetMap(Map *map) override
Definition Player.cpp:14825
bool IsAlive() const
Definition Unit.h:1794
Map * GetMap() const
Definition Object.h:625
CellCoord ComputeCellCoord(float x, float y)
Definition GridDefines.h:197
Definition Cell.h:45
bool IsCoordValid() const
Definition GridDefines.h:138
uint32 x_coord
Definition GridDefines.h:155
uint32 y_coord
Definition GridDefines.h:156

References AddToGrid(), Player::AddToWorld(), ASSERT, Acore::ComputeCellCoord(), ConvertCorpseToBones(), Object::GetGUID(), WorldObject::GetMap(), Position::GetPositionX(), Position::GetPositionY(), Unit::IsAlive(), CoordPair< LIMIT >::IsCoordValid(), LoadGridsInRange(), LOG_ERROR, MAX_VISIBILITY_DISTANCE, SendInitSelf(), SendInitTransports(), 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().

◆ AddToGrid() [1/5]

template<>
void Map::AddToGrid ( Corpse obj,
Cell const &  cell 
)
152{
153 MapGridType* grid = GetMapGrid(cell.GridX(), cell.GridY());
154 // Corpses are a special object type - they can be added to grid via a call to AddToMap
155 // or loaded through ObjectGridLoader.
156 // Both corpses loaded from database and these freshly generated by Player::CreateCoprse are added to _corpsesByCell
157 // ObjectGridLoader loads all corpses from _corpsesByCell even if they were already added to grid before it was loaded
158 // so we need to explicitly check it here (Map::AddToGrid is only called from Player::BuildPlayerRepop, not from ObjectGridLoader)
159 // to avoid failing an assertion in GridObject::AddToGrid
160 if (grid->IsObjectDataLoaded())
161 grid->AddGridObject(cell.CellX(), cell.CellY(), obj);
162}
Definition MapGrid.h:33
void AddGridObject(uint16 const x, uint16 const y, SPECIFIC_OBJECT *obj)
Definition MapGrid.h:49
bool IsObjectDataLoaded() const
Definition MapGrid.h:46
MapGridType * GetMapGrid(uint16 const x, uint16 const y)
Definition Map.cpp:198

References MapGrid< GRID_OBJECT_TYPES, FAR_VISIBLE_OBJECT_TYPES >::AddGridObject(), Cell::CellX(), Cell::CellY(), GetMapGrid(), Cell::GridX(), Cell::GridY(), and MapGrid< GRID_OBJECT_TYPES, FAR_VISIBLE_OBJECT_TYPES >::IsObjectDataLoaded().

◆ AddToGrid() [2/5]

template<>
void Map::AddToGrid ( Creature obj,
Cell const &  cell 
)
123{
124 MapGridType* grid = GetMapGrid(cell.GridX(), cell.GridY());
125 grid->AddGridObject(cell.CellX(), cell.CellY(), obj);
126 if (obj->IsFarVisible())
127 grid->AddFarVisibleObject(cell.CellX(), cell.CellY(), obj);
128
129 obj->SetCurrentCell(cell);
130}
void AddFarVisibleObject(uint16 const x, uint16 const y, SPECIFIC_OBJECT *obj)
Definition MapGrid.h:59
void SetCurrentCell(Cell const &cell)
Definition Object.h:425
bool IsFarVisible() const
Definition Object.h:676

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

◆ AddToGrid() [3/5]

template<>
void Map::AddToGrid ( GameObject obj,
Cell const &  cell 
)

◆ AddToGrid() [4/5]

template<>
void Map::AddToGrid ( Player obj,
Cell const &  cell 
)
145{
146 MapGridType* grid = GetMapGrid(cell.GridX(), cell.GridY());
147 grid->AddGridObject(cell.CellX(), cell.CellY(), obj);
148}

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

◆ AddToGrid() [5/5]

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

◆ AddToMap() [1/2]

template<class T >
bool Map::AddToMap ( T *  obj,
bool  checkTransport = false 
)
305{
306 //TODO: Needs clean up. An object should not be added to map twice.
307 if (obj->IsInWorld())
308 {
309 ASSERT(obj->IsInGrid());
310 obj->UpdateObjectVisibilityOnCreate();
311 return true;
312 }
313
314 CellCoord cellCoord = Acore::ComputeCellCoord(obj->GetPositionX(), obj->GetPositionY());
315 //It will create many problems (including crashes) if an object is not added to grid after creation
316 //The correct way to fix it is to make AddToMap return false and delete the object if it is not added to grid
317 //But now AddToMap is used in too many places, I will just see how many ASSERT failures it will cause
318 ASSERT(cellCoord.IsCoordValid());
319 if (!cellCoord.IsCoordValid())
320 {
321 LOG_ERROR("maps", "Map::AddToMap: Object {} has invalid coordinates X:{} Y:{} grid cell [{}:{}]",
322 obj->GetGUID().ToString(), obj->GetPositionX(), obj->GetPositionY(), cellCoord.x_coord, cellCoord.y_coord);
323 return false; //Should delete object
324 }
325
326 Cell cell(cellCoord);
327 if (obj->isActiveObject())
328 EnsureGridLoaded(cell);
329 else
330 EnsureGridCreated(GridCoord(cell.GridX(), cell.GridY()));
331
332 AddToGrid(obj, cell);
333
334 //Must already be set before AddToMap. Usually during obj->Create.
335 //obj->SetMap(this);
336 obj->AddToWorld();
337
338 if (checkTransport)
339 if (!(obj->IsGameObject() && obj->ToGameObject()->IsTransport())) // dont add transport to transport ;d
340 if (Transport* transport = GetTransportForPos(obj->GetPhaseMask(), obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), obj))
341 transport->AddPassenger(obj, true);
342
343 InitializeObject(obj);
344
345 //something, such as vehicle, needs to be update immediately
346 //also, trigger needs to cast spell, if not update, cannot see visual
347 obj->UpdateObjectVisibility(true);
348
349 // Post-visibility so accessories seat after the vehicle's create packet reaches clients.
350 if (obj->IsCreature())
351 if (Vehicle* vehicle = obj->ToCreature()->GetVehicleKit())
352 vehicle->Reset();
353 return true;
354}
CoordPair< MAX_NUMBER_OF_GRIDS > GridCoord
Definition GridDefines.h:171
void InitializeObject(T *obj)
Definition Map.cpp:287
Transport * GetTransportForPos(uint32 phase, float x, float y, float z, WorldObject *worldobject=nullptr)
Definition Map.cpp:1129
void EnsureGridCreated(GridCoord const &gridCoord)
Definition Map.cpp:180
bool EnsureGridLoaded(Cell const &cell)
Definition Map.cpp:185
Definition Transport.h:30
Definition Vehicle.h:28

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

◆ AddToMap() [2/2]

template<>
bool Map::AddToMap ( Transport obj,
bool   
)
358{
359 //TODO: Needs clean up. An object should not be added to map twice.
360 if (obj->IsInWorld())
361 return true;
362
364 if (!cellCoord.IsCoordValid())
365 {
366 LOG_ERROR("maps", "Map::Add: Object {} has invalid coordinates X:{} Y:{} grid cell [{}:{}]",
367 obj->GetGUID().ToString(), obj->GetPositionX(), obj->GetPositionY(), cellCoord.x_coord, cellCoord.y_coord);
368 return false; //Should delete object
369 }
370
371 Cell cell(cellCoord);
372 EnsureGridLoaded(cell);
373
374 obj->AddToWorld();
375
376 _transports.insert(obj);
377
378 // Broadcast creation to players
379 for (Map::PlayerList::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
380 {
381 if (itr->GetSource()->GetTransport() != obj)
382 {
383 UpdateData data;
384 obj->BuildCreateUpdateBlockForPlayer(&data, itr->GetSource());
385 WorldPacket packet;
386 data.BuildPacket(packet);
387 itr->GetSource()->SendDirectMessage(&packet);
388 }
389 }
390
391 return true;
392}
void AddToWorld() override
Definition GameObject.cpp:156
iterator begin()
Definition GridRefMgr.h:35
Definition LinkedList.h:139
iterator end()
Definition MapRefMgr.h:37
PlayerList const & GetPlayers() const
Definition Map.h:329
bool IsInWorld() const
Definition Object.h:109
virtual void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition Object.cpp:178
Definition UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition UpdateData.cpp:48
Definition WorldPacket.h:26

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

◆ AddUpdateObject()

void Map::AddUpdateObject ( Object obj)
inline
526 {
527 _updateObjects.insert(obj);
528 }
std::unordered_set< Object * > _updateObjects
Definition Map.h:690

References _updateObjects.

Referenced by WorldObject::AddToObjectUpdate().

◆ AddWorldObjectToFarVisibleMap()

void Map::AddWorldObjectToFarVisibleMap ( WorldObject obj)
629{
630 if (Creature* creature = obj->ToCreature())
631 {
632 if (!creature->IsInGrid())
633 return;
634
635 Cell curr_cell = creature->GetCurrentCell();
636 MapGridType* grid = GetMapGrid(curr_cell.GridX(), curr_cell.GridY());
637 grid->AddFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), creature);
638 }
639 else if (GameObject* go = obj->ToGameObject())
640 {
641 if (!go->IsInGrid())
642 return;
643
644 Cell curr_cell = go->GetCurrentCell();
645 MapGridType* grid = GetMapGrid(curr_cell.GridX(), curr_cell.GridY());
646 grid->AddFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), go);
647 }
648}
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 MapGrid< GRID_OBJECT_TYPES, FAR_VISIBLE_OBJECT_TYPES >::AddFarVisibleObject(), Cell::CellX(), Cell::CellY(), GetMapGrid(), Cell::GridX(), Cell::GridY(), Object::ToCreature(), and Object::ToGameObject().

Referenced by WorldObject::AddToMapVisibilityOverrideContainers().

◆ AddWorldObjectToZoneWideVisibleMap()

void Map::AddWorldObjectToZoneWideVisibleMap ( uint32  zoneId,
WorldObject obj 
)
668{
669 _zoneWideVisibleWorldObjectsMap[zoneId].insert(obj);
670}
ZoneWideVisibleWorldObjectsMap _zoneWideVisibleWorldObjectsMap
Definition Map.h:695

References _zoneWideVisibleWorldObjectsMap.

Referenced by WorldObject::AddToMapVisibilityOverrideContainers(), WorldObject::AddToWorld(), and WorldObject::ProcessPositionDataChanged().

◆ AfterPlayerUnlinkFromMap()

void Map::AfterPlayerUnlinkFromMap ( )
virtual

◆ AllTransportsEmpty()

bool Map::AllTransportsEmpty ( ) const
2929{
2930 for (TransportsContainer::const_iterator itr = _transports.begin(); itr != _transports.end(); ++itr)
2931 if (!(*itr)->GetPassengers().empty())
2932 return false;
2933
2934 return true;
2935}

References _transports.

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

◆ AllTransportsRemovePassengers()

void Map::AllTransportsRemovePassengers ( )
2938{
2939 for (TransportsContainer::const_iterator itr = _transports.begin(); itr != _transports.end(); ++itr)
2940 while (!(*itr)->GetPassengers().empty())
2941 (*itr)->RemovePassenger(*((*itr)->GetPassengers().begin()), true);
2942}

References _transports.

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

◆ ApplyDynamicModeRespawnScaling()

uint32 Map::ApplyDynamicModeRespawnScaling ( WorldObject const *  obj,
uint32  respawnDelay 
) const
1723{
1724 ASSERT(obj->GetMap() == this);
1725
1726 float rate = sWorld->getFloatConfig(obj->IsGameObject() ? CONFIG_RESPAWN_DYNAMICRATE_GAMEOBJECT : CONFIG_RESPAWN_DYNAMICRATE_CREATURE);
1727
1728 if (rate == 1.0f)
1729 return respawnDelay;
1730
1731 // No instanced maps (dungeons, battlegrounds, arenas etc.)
1732 if (obj->GetMap()->Instanceable())
1733 return respawnDelay;
1734
1735 // No quest givers or world bosses
1736 if (Creature const* creature = obj->ToCreature())
1737 if (creature->IsQuestGiver() || creature->isWorldBoss()
1738 || (creature->GetCreatureTemplate()->rank == CREATURE_ELITE_RARE)
1739 || (creature->GetCreatureTemplate()->rank == CREATURE_ELITE_RAREELITE))
1740 return respawnDelay;
1741
1742 auto it = _zonePlayerCountMap.find(obj->GetZoneId());
1743 if (it == _zonePlayerCountMap.end())
1744 return respawnDelay;
1745 uint32 const playerCount = it->second;
1746 if (!playerCount)
1747 return respawnDelay;
1748 double const adjustFactor = rate / playerCount;
1749 if (adjustFactor >= 1.0) // nothing to do here
1750 return respawnDelay;
1751 uint32 const timeMinimum = sWorld->getIntConfig(obj->IsGameObject() ? CONFIG_RESPAWN_DYNAMICMINIMUM_GAMEOBJECT : CONFIG_RESPAWN_DYNAMICMINIMUM_CREATURE);
1752 if (respawnDelay <= timeMinimum)
1753 return respawnDelay;
1754
1755 return std::max<uint32>(std::ceil(respawnDelay * adjustFactor), timeMinimum);
1756}
std::uint32_t uint32
Definition Define.h:107
@ CREATURE_ELITE_RARE
Definition SharedDefines.h:2968
@ CREATURE_ELITE_RAREELITE
Definition SharedDefines.h:2966
@ CONFIG_RESPAWN_DYNAMICRATE_CREATURE
Definition WorldConfig.h:162
@ CONFIG_RESPAWN_DYNAMICMINIMUM_CREATURE
Definition WorldConfig.h:388
@ CONFIG_RESPAWN_DYNAMICRATE_GAMEOBJECT
Definition WorldConfig.h:161
@ CONFIG_RESPAWN_DYNAMICMINIMUM_GAMEOBJECT
Definition WorldConfig.h:387
#define sWorld
Definition World.h:317

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
DynamicVMapCollisionData & GetDynamicTree()
Definition MapCollisionData.h:82

References _mapCollisionData, DynamicMapTree::balance(), and MapCollisionData::GetDynamicTree().

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
3289{
3290 return CanReachPositionAndGetValidCoords(source, source->GetPositionX(), source->GetPositionY(), source->GetPositionZ(), destX, destY, destZ, failOnCollision, failOnSlopes);
3291}
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:3248

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
3294{
3295 if (!CheckCollisionAndGetValidCoords(source, startX, startY, startZ, destX, destY, destZ, failOnCollision))
3296 {
3297 return false;
3298 }
3299
3300 Unit const* unit = source->ToUnit();
3301 // if it's not an unit (Object) then we do not have to continue
3302 // with walkable checks
3303 if (!unit)
3304 {
3305 return true;
3306 }
3307
3308 /*
3309 * Walkable checks
3310 */
3311 bool isWaterNext = HasEnoughWater(unit, destX, destY, destZ);
3312 Creature const* creature = unit->ToCreature();
3313 bool cannotEnterWater = isWaterNext && (creature && !creature->CanEnterWater());
3314 bool cannotWalkOrFly = !isWaterNext && !source->ToPlayer() && !unit->CanFly() && (creature && !creature->CanWalk());
3315 if (cannotEnterWater || cannotWalkOrFly ||
3316 (failOnSlopes && !PathGenerator::IsWalkableClimb(startX, startY, startZ, destX, destY, destZ, source->GetCollisionHeight())))
3317 {
3318 return false;
3319 }
3320
3321 return true;
3322}
bool CanWalk() const
Definition Creature.h:84
bool CanEnterWater() const override
Definition Creature.cpp:3363
bool HasEnoughWater(WorldObject const *searcher, float x, float y, float z) const
Definition Map.cpp:1597
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:3331
bool IsWalkableClimb(float const *v1, float const *v2) const
Definition PathGenerator.cpp:966
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.

3249{
3250 G3D::Vector3 prevPath = path->GetStartPosition();
3251 for (auto& vector : path->GetPath())
3252 {
3253 float x = vector.x;
3254 float y = vector.y;
3255 float z = vector.z;
3256
3257 if (!CanReachPositionAndGetValidCoords(source, prevPath.x, prevPath.y, prevPath.z, x, y, z, failOnCollision, failOnSlopes))
3258 {
3259 destX = x;
3260 destY = y;
3261 destZ = z;
3262 return false;
3263 }
3264
3265 prevPath = vector;
3266 }
3267
3268 destX = prevPath.x;
3269 destY = prevPath.y;
3270 destZ = prevPath.z;
3271
3272 return true;
3273}
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
177 {
178 if (!m_unloadTimer || Events.HasEvents())
179 return false;
180
181 if (m_unloadTimer <= diff)
182 return true;
183
184 m_unloadTimer -= diff;
185 return false;
186 }

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
3332{
3333 // Prevent invalid coordinates here, position is unchanged
3334 if (!Acore::IsValidMapCoord(startX, startY, startZ) || !Acore::IsValidMapCoord(destX, destY, destZ))
3335 {
3336 LOG_FATAL("maps", "Map::CheckCollisionAndGetValidCoords invalid coordinates startX: {}, startY: {}, startZ: {}, destX: {}, destY: {}, destZ: {}", startX, startY, startZ, destX, destY, destZ);
3337 return false;
3338 }
3339
3340 bool isWaterNext = IsInWater(source->GetPhaseMask(), destX, destY, destZ, source->GetCollisionHeight());
3341
3342 PathGenerator path(source);
3343
3344 // Use a detour raycast to get our first collision point
3345 path.SetUseRaycast(true);
3346 bool result = path.CalculatePath(startX, startY, startZ, destX, destY, destZ, false);
3347
3348 Unit const* unit = source->ToUnit();
3349 bool notOnGround = path.GetPathType() & PATHFIND_NOT_USING_PATH
3350 || isWaterNext || (unit && unit->IsFlying());
3351
3352 // Check for valid path types before we proceed
3353 if (!result || (!notOnGround && path.GetPathType() & ~(PATHFIND_NORMAL | PATHFIND_SHORTCUT | PATHFIND_INCOMPLETE | PATHFIND_FARFROMPOLY_END)))
3354 {
3355 return false;
3356 }
3357
3358 G3D::Vector3 endPos = path.GetPath().back();
3359 destX = endPos.x;
3360 destY = endPos.y;
3361 destZ = endPos.z;
3362
3363 // collision check
3364 bool collided = false;
3365
3366 // check static LOS
3367 float halfHeight = source->GetCollisionHeight() * 0.5f;
3368
3369 // Unit is not on the ground, check for potential collision via vmaps
3370 if (notOnGround)
3371 {
3372 bool col = _mapCollisionData.GetStaticTree().GetObjectHitPos(startX, startY, startZ + halfHeight,
3373 destX, destY, destZ + halfHeight,
3374 destX, destY, destZ, -CONTACT_DISTANCE);
3375
3376 destZ -= halfHeight;
3377
3378 // Collided with static LOS object, move back to collision point
3379 if (col)
3380 {
3381 collided = true;
3382 }
3383 }
3384
3385 // check dynamic collision
3386 bool col = _mapCollisionData.GetDynamicTree().GetObjectHitPos(source->GetPhaseMask(),
3387 startX, startY, startZ + halfHeight,
3388 destX, destY, destZ + halfHeight,
3389 destX, destY, destZ, -CONTACT_DISTANCE);
3390
3391 destZ -= halfHeight;
3392
3393 // Collided with a gameobject, move back to collision point
3394 if (col)
3395 {
3396 collided = true;
3397 }
3398
3399 float groundZ = VMAP_INVALID_HEIGHT_VALUE;
3400 source->UpdateAllowedPositionZ(destX, destY, destZ, &groundZ);
3401
3402 // position has no ground under it (or is too far away)
3403 if (groundZ <= INVALID_HEIGHT && unit && !unit->CanFly())
3404 {
3405 // fall back to gridHeight if any
3406 float gridHeight = GetGridHeight(destX, destY);
3407 if (gridHeight > INVALID_HEIGHT)
3408 {
3409 destZ = gridHeight + unit->GetHoverHeight();
3410 }
3411 else
3412 {
3413 return false;
3414 }
3415 }
3416
3417 return !failOnCollision || !collided;
3418}
#define INVALID_HEIGHT
Definition GridTerrainData.h:27
#define VMAP_INVALID_HEIGHT_VALUE
Definition IVMapMgr.h:51
#define LOG_FATAL(filterType__,...)
Definition Log.h:141
#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 GetObjectHitPos(uint32 phasemask, float x1, float y1, float z1, float x2, float y2, float z2, float &rx, float &ry, float &rz, float modifyDist) const
Definition MapCollisionData.cpp:163
StaticVMapCollisionData & GetStaticTree()
Definition MapCollisionData.h:84
bool IsInWater(uint32 phaseMask, float x, float y, float z, float collisionHeight) const
Definition Map.cpp:1585
float GetGridHeight(float x, float y) const
Definition Map.cpp:1190
Definition PathGenerator.h:59
bool GetObjectHitPos(float x1, float y1, float z1, float x2, float y2, float z2, float &rx, float &ry, float &rz, float modifyDist) const
Definition MapCollisionData.cpp:89
float GetCollisionHeight() const override
Return collision height sent to client.
Definition Unit.cpp:17142
float GetHoverHeight() const
Definition Unit.h:1718
bool IsFlying() const
Definition Unit.h:1714
bool IsValidMapCoord(float c)
Definition GridDefines.h:210

References _mapCollisionData, PathGenerator::CalculatePath(), CanFly, CONTACT_DISTANCE, WorldObject::GetCollisionHeight(), MapCollisionData::GetDynamicTree(), GetGridHeight(), Unit::GetHoverHeight(), StaticVMapCollisionData::GetObjectHitPos(), DynamicVMapCollisionData::GetObjectHitPos(), PathGenerator::GetPath(), PathGenerator::GetPathType(), WorldObject::GetPhaseMask(), MapCollisionData::GetStaticTree(), 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
397{ return _mapCollisionData.GetDynamicTree().contains(model);}
bool contains(const GameObjectModel &) const
Definition DynamicTree.cpp:127

References _mapCollisionData, DynamicMapTree::contains(), and MapCollisionData::GetDynamicTree().

◆ ConvertCorpseToBones()

Corpse * Map::ConvertCorpseToBones ( ObjectGuid const &  ownerGuid,
bool  insignia = false 
)
2994{
2995 Corpse* corpse = GetCorpseByPlayer(ownerGuid);
2996 if (!corpse)
2997 return nullptr;
2998
2999 RemoveCorpse(corpse);
3000
3001 // remove corpse from DB
3002 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
3003 corpse->DeleteFromDB(trans);
3004 CharacterDatabase.CommitTransaction(trans);
3005
3006 Corpse* bones = NULL;
3007
3008 // create the bones only if the map and the grid is loaded at the corpse's location
3009 // ignore bones creating option in case insignia
3010 if ((insignia ||
3012 IsGridLoaded(corpse->GetPositionX(), corpse->GetPositionY()))
3013 {
3014 // Create bones, don't change Corpse
3015 bones = new Corpse();
3016 bones->Create(corpse->GetGUID().GetCounter());
3017
3018 for (uint8 i = OBJECT_FIELD_TYPE + 1; i < CORPSE_END; ++i) // don't overwrite guid and object type
3019 bones->SetUInt32Value(i, corpse->GetUInt32Value(i));
3020
3021 bones->SetCellCoord(corpse->GetCellCoord());
3022 bones->Relocate(corpse->GetPositionX(), corpse->GetPositionY(), corpse->GetPositionZ(), corpse->GetOrientation());
3023 bones->SetPhaseMask(corpse->GetPhaseMask(), false);
3024
3026 bones->SetGuidValue(CORPSE_FIELD_OWNER, corpse->GetOwnerGUID());
3027
3028 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
3029 if (corpse->GetUInt32Value(CORPSE_FIELD_ITEM + i))
3030 bones->SetUInt32Value(CORPSE_FIELD_ITEM + i, 0);
3031
3032 AddCorpse(bones);
3033
3034 bones->UpdatePositionData();
3035
3036 // add bones in grid store if grid loaded where corpse placed
3037 AddToMap(bones);
3038 }
3039
3040 // all references to the corpse should be removed at this point
3041 delete corpse;
3042
3043 return bones;
3044}
@ 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
std::uint8_t uint8
Definition Define.h:109
@ EQUIPMENT_SLOT_END
Definition Player.h:680
@ 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:61
@ CONFIG_DEATH_BONES_WORLD
Definition WorldConfig.h:60
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:305
void AddCorpse(Corpse *corpse)
Definition Map.cpp:2960
bool IsGridLoaded(GridCoord const &gridCoord) const
Definition Map.cpp:203
Corpse * GetCorpseByPlayer(ObjectGuid const &ownerGuid) const
Definition Map.h:369
bool AddToMap(T *, bool checkTransport=false)
Definition Map.cpp:304
void RemoveCorpse(Corpse *corpse)
Definition Map.cpp:2972
LowType GetCounter() const
Definition ObjectGuid.h:145
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:294
void SetGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:712
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:639
virtual void SetPhaseMask(uint32 newPhaseMask, bool update)
Definition Object.cpp:2939
uint32 GetPhaseMask() const
Definition Object.h:516
void UpdatePositionData()
Definition Object.cpp:1179
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 
)
817{
818 Cell old_cell = creature->GetCurrentCell();
819 Cell new_cell(x, y);
820
821 if (old_cell.DiffGrid(new_cell) || old_cell.DiffCell(new_cell))
822 {
823 if (old_cell.DiffGrid(new_cell))
824 EnsureGridLoaded(new_cell);
825
826 AddCreatureToMoveList(creature);
827 }
828 else
830
831 creature->Relocate(x, y, z, o);
832 if (creature->IsVehicle())
833 creature->GetVehicleKit()->RelocatePassengers();
834 creature->UpdatePositionData();
835 creature->UpdateObjectVisibility(false);
836}
void AddCreatureToMoveList(Creature *c)
Definition Map.cpp:879
void RemoveCreatureFromMoveList(Creature *c)
Definition Map.cpp:886
Cell const & GetCurrentCell() const
Definition Object.h:422
bool IsVehicle() const
Definition Unit.h:800
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition Unit.cpp:15372
Vehicle * GetVehicleKit() const
Definition Unit.h:1926
void RelocatePassengers()
Definition Vehicle.cpp:534
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.

1759{
1761 {
1762 Transport* transport = *_transportsUpdateIter;
1764
1765 if (!transport->IsInWorld())
1766 continue;
1767
1768 transport->DelayedUpdate(t_diff);
1769 }
1770
1772}
void RemoveAllObjectsInRemoveList()
Definition Map.cpp:1784
virtual void DelayedUpdate(uint32)
Definition Transport.h:41

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

Referenced by MapInstanced::DelayedUpdate().

◆ DeleteCorpseData()

void Map::DeleteCorpseData ( )
3458{
3459 // DELETE FROM corpse WHERE mapId = ? AND instanceId = ?
3461 stmt->SetData(0, GetId());
3462 stmt->SetData(1, GetInstanceId());
3463 CharacterDatabase.Execute(stmt);
3464}
@ 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)
173{
175
176 RemoveUpdateObject(player); //TODO: I do not know why we need this, it should be removed in ~Object anyway
177 delete player;
178}
void RemoveUpdateObject(Object *obj)
Definition Map.h:530
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
166{
167 // Note: In case resurrectable corpse and pet its removed from global lists in own destructor
168 delete obj;
169}

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

◆ DeleteRespawnTimes()

void Map::DeleteRespawnTimes ( )
2510{
2511 _creatureRespawnTimes.clear();
2512 _goRespawnTimes.clear();
2513 _respawnQueue.clear();
2514
2516}
static void DeleteRespawnTimesInDB(uint16 mapId, uint32 instanceId)
Definition Map.cpp:2518
std::unordered_map< ObjectGuid::LowType, time_t > _creatureRespawnTimes
Definition Map.h:640
std::set< RespawnEntry > _respawnQueue
Definition Map.h:659
std::unordered_map< ObjectGuid::LowType, time_t > _goRespawnTimes
Definition Map.h:641

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

Referenced by InstanceMap::UnloadAll().

◆ DeleteRespawnTimesInDB()

void Map::DeleteRespawnTimesInDB ( uint16  mapId,
uint32  instanceId 
)
static
2519{
2521 stmt->SetData(0, mapId);
2522 stmt->SetData(1, instanceId);
2523 CharacterDatabase.Execute(stmt);
2524
2525 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GO_RESPAWN_BY_INSTANCE);
2526 stmt->SetData(0, mapId);
2527 stmt->SetData(1, instanceId);
2528 CharacterDatabase.Execute(stmt);
2529}
@ 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)
3232{
3233 for (auto const& it : GetPlayers())
3234 {
3235 if (Player* player = it.GetSource())
3236 {
3237 exec(player);
3238 }
3239 }
3240}

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(), ScriptedAI::DoRewardPlayersInArea(), InstanceScript::DoSendNotifyToInstance(), InstanceScript::DoStartTimedAchievement(), InstanceScript::DoStopTimedAchievement(), InstanceScript::DoUpdateAchievementCriteria(), BattlegroundSA::EventPlayerDamagedGO(), BattlegroundSA::EventPlayerUsedGO(), boss_azuregos::boss_azuregosAI::JustDied(), boss_rajaxx::JustDied(), boss_alar::JustDied(), boss_devourer_of_souls::JustEngagedWith(), boss_felblood_kaelthas::LapseAction(), spell_malygos_vortex_visual::OnRemove(), BattlegroundSA::PostUpdateImpl(), spell_fire_festival_fortitude::PrepareSpellScript(), boss_azuregos::boss_azuregosAI::Reset(), boss_yoggsaron_sara::Reset(), npc_minigob_manabonk::SelectTargetInDalaran(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::SetBossState(), instance_halls_of_reflection::SetBossState(), instance_ulduar::instance_ulduar_InstanceMapScript::SetBossState(), instance_halls_of_reflection::SetData(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::SetData(), Battleground::SpiritOfCompetitionEvent(), boss_nefarian::UpdateAI(), boss_cthun::UpdateAI(), boss_malygos::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_midsummer_bonfire::UpdateBonfireBlessingBuffs(), instance_halls_of_reflection::UpdateOutro(), and instance_eye_of_eternity::VortexHandling().

◆ DynamicObjectRelocation()

void Map::DynamicObjectRelocation ( DynamicObject go,
float  x,
float  y,
float  z,
float  o 
)
860{
861 Cell old_cell = dynObj->GetCurrentCell();
862 Cell new_cell(x, y);
863
864 if (old_cell.DiffGrid(new_cell) || old_cell.DiffCell(new_cell))
865 {
866 if (old_cell.DiffGrid(new_cell))
867 EnsureGridLoaded(new_cell);
868
870 }
871 else
873
874 dynObj->Relocate(x, y, z, o);
875 dynObj->SetPositionDataUpdate();
876 dynObj->UpdateObjectVisibility(false);
877}
void RemoveDynamicObjectFromMoveList(DynamicObject *go)
Definition Map.cpp:912
void AddDynamicObjectToMoveList(DynamicObject *go)
Definition Map.cpp:905

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)
181{
182 _mapGridManager.CreateGrid(gridCoord.x_coord, gridCoord.y_coord);
183}
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(), MapGridManager::CreateGrid(), EnsureGridLoaded(), and GetGridTerrainData().

◆ EnsureGridLoaded()

bool Map::EnsureGridLoaded ( Cell const &  cell)
private
186{
187 EnsureGridCreated(GridCoord(cell.GridX(), cell.GridY()));
188
189 if (_mapGridManager.LoadGrid(cell.GridX(), cell.GridY()))
190 {
191 Balance();
192 return true;
193 }
194
195 return false;
196}
bool LoadGrid(uint16 const x, uint16 const y)
Definition MapGridManager.cpp:33
void Balance()
Definition Map.h:394

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 
)
839{
840 Cell old_cell = go->GetCurrentCell();
841 Cell new_cell(x, y);
842
843 if (old_cell.DiffGrid(new_cell) || old_cell.DiffCell(new_cell))
844 {
845 if (old_cell.DiffGrid(new_cell))
846 EnsureGridLoaded(new_cell);
847
849 }
850 else
852
853 go->Relocate(x, y, z, o);
856 go->UpdateObjectVisibility(false);
857}
void UpdateModelPosition()
Definition GameObject.cpp:2930
void AddGameObjectToMoveList(GameObject *go)
Definition Map.cpp:892
void RemoveGameObjectFromMoveList(GameObject *go)
Definition Map.cpp:899
void SetPositionDataUpdate()
Definition Object.cpp:1170
virtual void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false)
Definition Object.cpp:3012

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(), and MotionTransport::UpdatePassengerPositions().

◆ GenerateLowGuid()

◆ GetAllTransports()

TransportsContainer const & Map::GetAllTransports ( ) const
inline

◆ GetAreaId()

uint32 Map::GetAreaId ( uint32  phaseMask,
float  x,
float  y,
float  z 
) const
1251{
1252 uint32 mogpFlags;
1253 int32 adtId, rootId, groupId;
1254 float vmapZ = z;
1255 bool hasVmapArea = GetAreaInfo(phaseMask, x, y, vmapZ, mogpFlags, adtId, rootId, groupId);
1256
1257 uint32 gridAreaId = 0;
1258 float gridMapHeight = INVALID_HEIGHT;
1259 if (GridTerrainData* gmap = const_cast<Map*>(this)->GetGridTerrainData(x, y))
1260 {
1261 gridAreaId = gmap->getArea(x, y);
1262 gridMapHeight = gmap->getHeight(x, y);
1263 }
1264
1265 uint16 areaId = 0;
1266
1267 // floor is the height we are closer to (but only if above)
1268 if (hasVmapArea && G3D::fuzzyGe(z, vmapZ - GROUND_HEIGHT_TOLERANCE) && (G3D::fuzzyLt(z, gridMapHeight - GROUND_HEIGHT_TOLERANCE) || vmapZ > gridMapHeight))
1269 {
1270 // wmo found
1271 if (WMOAreaTableEntry const* wmoEntry = GetWMOAreaTableEntryByTripple(rootId, adtId, groupId))
1272 areaId = wmoEntry->areaId;
1273
1274 if (!areaId)
1275 areaId = gridAreaId;
1276 }
1277 else
1278 areaId = gridAreaId;
1279
1280 if (!areaId)
1281 areaId = i_mapEntry->linked_zone;
1282
1283 return areaId;
1284}
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:166
bool GetAreaInfo(uint32 phaseMask, float x, float y, float z, uint32 &mogpflags, int32 &adtId, int32 &rootId, int32 &groupId) const
Definition Map.cpp:1211
GridTerrainData * GetGridTerrainData(GridCoord const &gridCoord)
Definition Map.cpp:1092
uint32 linked_zone
Definition DBCStructure.h:1333
Definition DBCStructure.h:2131

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
1212{
1213 float check_z = z;
1216
1217 bool hasVmapAreaInfo = _mapCollisionData.GetStaticTree().GetAreaAndLiquidData(x, y, z, {}, vdata) && vdata.areaInfo.has_value();
1218 bool hasDynamicAreaInfo = _mapCollisionData.GetDynamicTree().GetAreaAndLiquidData(x, y, z, phaseMask, {}, ddata) && ddata.areaInfo.has_value();
1219 auto useVmap = [&] { check_z = vdata.floorZ; groupId = vdata.areaInfo->groupId; adtId = vdata.areaInfo->adtId; rootId = vdata.areaInfo->rootId; flags = vdata.areaInfo->mogpFlags; };
1220 auto useDyn = [&] { check_z = ddata.floorZ; groupId = ddata.areaInfo->groupId; adtId = ddata.areaInfo->adtId; rootId = ddata.areaInfo->rootId; flags = ddata.areaInfo->mogpFlags; };
1221 if (hasVmapAreaInfo)
1222 {
1223 if (hasDynamicAreaInfo && ddata.floorZ > vdata.floorZ)
1224 useDyn();
1225 else
1226 useVmap();
1227 }
1228 else if (hasDynamicAreaInfo)
1229 {
1230 useDyn();
1231 }
1232
1233 if (hasVmapAreaInfo || hasDynamicAreaInfo)
1234 {
1235 // check if there's terrain between player height and object height
1236 if (GridTerrainData* gmap = const_cast<Map*>(this)->GetGridTerrainData(x, y))
1237 {
1238 float mapHeight = gmap->getHeight(x, y);
1239 // z + 2.0f condition taken from GetHeight(), not sure if it's such a great choice...
1240 if (z + 2.0f > mapHeight && mapHeight > check_z)
1241 return false;
1242 }
1243
1244 return true;
1245 }
1246
1247 return false;
1248}
bool GetAreaAndLiquidData(float x, float y, float z, uint32 phasemask, Optional< uint8 > reqLiquidType, VMAP::AreaAndLiquidData &data) const
Definition DynamicTree.cpp:292
bool GetAreaAndLiquidData(float x, float y, float z, Optional< uint8 > reqLiquidType, VMAP::AreaAndLiquidData &data) const
Definition MapCollisionData.cpp:136
Definition IVMapMgr.h:54
Optional< AreaInfo > areaInfo
Definition IVMapMgr.h:77
float floorZ
Definition IVMapMgr.h:76

References _mapCollisionData, VMAP::AreaAndLiquidData::areaInfo, VMAP::AreaAndLiquidData::floorZ, StaticVMapCollisionData::GetAreaAndLiquidData(), DynamicMapTree::GetAreaAndLiquidData(), MapCollisionData::GetDynamicTree(), GetGridTerrainData(), and MapCollisionData::GetStaticTree().

Referenced by GetAreaId().

◆ GetCorpse()

Corpse * Map::GetCorpse ( ObjectGuid const &  guid)
2345{
2346 return _objectsStore.Find<Corpse>(guid);
2347}
MapStoredObjectTypesContainer _objectsStore
Definition Map.h:683
SPECIFIC_TYPE * Find(KEY_TYPE const &handle)
Definition TypeContainer.h:189

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

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

◆ GetCorpseByPlayer()

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

References _corpsesByPlayer.

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

◆ GetCorpsesInGrid()

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

References _corpsesByGrid.

Referenced by GridObjectLoader::LoadAllCellsInGrid().

◆ GetCreatedCellsInGridCount()

uint32 Map::GetCreatedCellsInGridCount ( uint16 const  x,
uint16 const  y 
)
3486{
3488}
uint32 GetCreatedCellsInGridCount(uint16 const x, uint16 const y)
Definition MapGridManager.cpp:106

References _mapGridManager, and MapGridManager::GetCreatedCellsInGridCount().

Referenced by debug_commandscript::HandleDebugMapDataCommand().

◆ GetCreatedCellsInMapCount()

uint32 Map::GetCreatedCellsInMapCount ( )
3491{
3493}
uint32 GetCreatedCellsInMapCount()
Definition MapGridManager.cpp:115

References _mapGridManager, and MapGridManager::GetCreatedCellsInMapCount().

Referenced by debug_commandscript::HandleDebugMapDataCommand().

◆ GetCreatedGridsCount()

uint32 Map::GetCreatedGridsCount ( )
3476{
3478}
uint32 GetCreatedGridsCount()
Definition MapGridManager.cpp:96

References _mapGridManager, and MapGridManager::GetCreatedGridsCount().

Referenced by debug_commandscript::HandleDebugMapDataCommand().

◆ GetCreature()

Creature * Map::GetCreature ( ObjectGuid const &  guid)
2350{
2351 return _objectsStore.Find<Creature>(guid);
2352}

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

Referenced by Battleground::_ProcessResurrect(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ActivatePrisoners(), 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(), spell_sha_fire_nova::CheckFireTotem(), instance_molten_core::CheckMajordomoExecutus(), boss_prince_valanar_icc::boss_prince_valanarAI::CheckRoom(), instance_blackrock_depths::CheckTombReset(), instance_stratholme::instance_stratholme_InstanceMapScript::CheckZiggurats(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::CleanupInstance(), instance_molten_core::DoAction(), boss_ayamiss::DoAction(), npc_vh_void_sentry::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_blackrock_spire::Dragonspireroomcheck(), Spell::EffectDestroyAllTotems(), boss_tyrannus::boss_tyrannusAI::EnterEvadeMode(), BattlegroundEY::EventTeamCapturedPoint(), boss_erekem::ExecuteEvent(), boss_xevozz::ExecuteEvent(), WorldState::GetActiveZones(), Battleground::GetBGCreature(), boss_erekem::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(), BattlegroundIC::HandleContestedNodes(), 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(), spell_sha_stoneclaw_totem::HandleScriptEffect(), WorldSession::HandleTotemDestroyed(), instance_halls_of_reflection::HandleWaveWipe(), 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(), boss_skarvald_the_constructor::JustDied(), boss_dalronn_the_controller::JustDied(), npc_vh_void_sentry::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::JustEngagedWith(), instance_nexus::instance_nexus_InstanceMapScript::KillAllFrayers(), Player::KilledMonsterCredit(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), npc_hor_lich_king::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::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(), WorldState::OnDisable(), WorldState::OnDisable(), instance_molten_core::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::OnUnitDeath(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnUnitDeath(), instance_azjol_nerub::instance_azjol_nerub_InstanceScript::OnUnitDeath(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnUnitDeath(), BattlegroundAV::PopulateNode(), BattlegroundIC::PostUpdateImpl(), BattlegroundRV::PostUpdateImpl(), instance_blackrock_spire::ProcessEvent(), instance_stratholme::instance_stratholme_InstanceMapScript::ProcessSlaughterEvent(), instance_halls_of_reflection::RandomizeCompositionsAndShow(), instance_zulgurub::instance_zulgurub_InstanceMapScript::RemoveHakkarPowerStack(), instance_blackrock_depths::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::SetBossState(), instance_magtheridons_lair::instance_magtheridons_lair_InstanceMapScript::SetBossState(), instance_blackrock_spire::SetBossState(), instance_blackwing_lair::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::SetData(), instance_blackrock_spire::SetData(), instance_blackwing_lair::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::SetData(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::SetData(), instance_oculus::instance_oculus_InstanceMapScript::SetData(), instance_halls_of_stone::instance_halls_of_stone_InstanceMapScript::SetData(), instance_utgarde_keep::instance_utgarde_keep_InstanceMapScript::SetData(), instance_utgarde_pinnacle::instance_utgarde_pinnacle_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_halls_of_reflection::StartNextWave(), instance_molten_core::SummonMajordomoExecutus(), WorldState::SummonMouth(), WorldState::SummonPallid(), instance_blackrock_spire::SummonSolakarWave(), instance_blackrock_depths::TombOfSevenEvent(), instance_blackrock_depths::TombOfSevenReset(), instance_blackwing_lair::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::Update(), instance_icecrown_citadel::instance_icecrown_citadel_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::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_hor_lich_king::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_vh_teleportation_portal::UpdateAI(), and instance_eye_of_eternity::VortexHandling().

◆ GetCreatureBySpawnIdStore()

◆ GetCreatureRespawnTime()

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

References _creatureRespawnTimes.

Referenced by MotionTransport::CreateNPCPassenger(), GetLinkedRespawnTime(), GetRespawnTime(), and Creature::LoadCreatureFromDB().

◆ GetCreatureRespawnTimes()

std::unordered_map< ObjectGuid::LowType, time_t > const & Map::GetCreatureRespawnTimes ( ) const
inline

◆ GetDebugInfo()

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

Reimplemented in InstanceMap.

3467{
3468 std::stringstream sstr;
3469 sstr << std::boolalpha
3470 << "Id: " << GetId() << " InstanceId: " << GetInstanceId() << " Difficulty: " << std::to_string(GetDifficulty())
3471 << " HasPlayers: " << HavePlayers();
3472 return sstr.str();
3473}
bool HavePlayers() const
Definition Map.h:322
Difficulty GetDifficulty() const
Definition Map.h:292

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

Referenced by InstanceMap::GetDebugInfo().

◆ GetDifficulty()

◆ GetDynamicMapTree()

DynamicMapTree const & Map::GetDynamicMapTree ( ) const
inline

◆ GetDynamicObject()

DynamicObject * Map::GetDynamicObject ( ObjectGuid const &  guid)
2374{
2375 return _objectsStore.Find<DynamicObject>(guid);
2376}
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
309 {
310 if (!i_mapEntry)
311 return false;
312 return i_mapEntry->GetEntrancePos(mapid, x, y);
313 }
bool GetEntrancePos(int32 &mapid, float &x, float &y) const
Definition DBCStructure.h:1360

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,
Optional< uint8 reqLiquidType = {} 
)
1388{
1389 GridTerrainData* gmap = GetGridTerrainData(x, y);
1390
1391 VMAP::AreaAndLiquidData vmapData;
1392 // VMAP::AreaAndLiquidData dynData;
1393 VMAP::AreaAndLiquidData* wmoData = nullptr;
1394 _mapCollisionData.GetStaticTree().GetAreaAndLiquidData(x, y, z, reqLiquidType, vmapData);
1395 // _dynamicTree.GetAreaAndLiquidData(x, y, z, phaseMask, reqLiquidType, dynData);
1396
1397 uint32 gridAreaId = 0;
1398 float gridMapHeight = INVALID_HEIGHT;
1399 if (gmap)
1400 {
1401 gridAreaId = gmap->getArea(x, y);
1402 gridMapHeight = gmap->getHeight(x, y);
1403 }
1404
1405 bool useGridLiquid = true;
1406
1407 // floor is the height we are closer to (but only if above)
1409 if (gridMapHeight > INVALID_HEIGHT && G3D::fuzzyGe(z, gridMapHeight - GROUND_HEIGHT_TOLERANCE))
1410 data.floorZ = gridMapHeight;
1411
1412 if (vmapData.floorZ > VMAP_INVALID_HEIGHT && G3D::fuzzyGe(z, vmapData.floorZ - GROUND_HEIGHT_TOLERANCE) &&
1413 (G3D::fuzzyLt(z, gridMapHeight - GROUND_HEIGHT_TOLERANCE) || vmapData.floorZ > gridMapHeight))
1414 {
1415 data.floorZ = vmapData.floorZ;
1416 wmoData = &vmapData;
1417 }
1418
1419 // NOTE: Objects will not detect a case when a wmo providing area/liquid despawns from under them
1420 // but this is fine as these kind of objects are not meant to be spawned and despawned a lot
1421 // example: Lich King platform
1422 /*
1423 if (dynData.floorZ > VMAP_INVALID_HEIGHT && G3D::fuzzyGe(z, dynData.floorZ - GROUND_HEIGHT_TOLERANCE) &&
1424 (G3D::fuzzyLt(z, gridMapHeight - GROUND_HEIGHT_TOLERANCE) || dynData.floorZ > gridMapHeight) &&
1425 (G3D::fuzzyLt(z, vmapData.floorZ - GROUND_HEIGHT_TOLERANCE) || dynData.floorZ > vmapData.floorZ))
1426 {
1427 data.floorZ = dynData.floorZ;
1428 wmoData = &dynData;
1429 }
1430 */
1431
1432 if (wmoData)
1433 {
1434 if (wmoData->areaInfo)
1435 {
1436 // wmo found
1437 WMOAreaTableEntry const* wmoEntry = GetWMOAreaTableEntryByTripple(wmoData->areaInfo->rootId, wmoData->areaInfo->adtId, wmoData->areaInfo->groupId);
1438 data.outdoors = (wmoData->areaInfo->mogpFlags & 0x8) != 0;
1439 if (wmoEntry)
1440 {
1441 data.areaId = wmoEntry->areaId;
1442 if (wmoEntry->Flags & 4)
1443 data.outdoors = true;
1444 else if (wmoEntry->Flags & 2)
1445 data.outdoors = false;
1446 }
1447
1448 if (!data.areaId)
1449 data.areaId = gridAreaId;
1450
1451 useGridLiquid = !IsInWMOInterior(wmoData->areaInfo->mogpFlags);
1452 }
1453 }
1454 else
1455 {
1456 data.outdoors = true;
1457 data.areaId = gridAreaId;
1458 if (AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(data.areaId))
1459 data.outdoors = (areaEntry->flags & (AREA_FLAG_INSIDE | AREA_FLAG_OUTSIDE)) != AREA_FLAG_INSIDE;
1460 }
1461
1462 if (!data.areaId)
1464
1465 AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(data.areaId);
1466
1467 // liquid processing
1468 if (wmoData && wmoData->liquidInfo && wmoData->liquidInfo->level > wmoData->floorZ)
1469 {
1470 uint32 liquidType = wmoData->liquidInfo->type;
1471 if (GetId() == MAP_OUTLAND && liquidType == 2) // gotta love blizzard hacks
1472 liquidType = 15;
1473
1474 uint32 liquidFlagType = 0;
1475 if (LiquidTypeEntry const* liquidData = sLiquidTypeStore.LookupEntry(liquidType))
1476 liquidFlagType = liquidData->Type;
1477
1478 if (liquidType && liquidType < 21 && areaEntry)
1479 {
1480 uint32 overrideLiquid = areaEntry->LiquidTypeOverride[liquidFlagType];
1481 if (!overrideLiquid && areaEntry->zone)
1482 {
1483 AreaTableEntry const* zoneEntry = sAreaTableStore.LookupEntry(areaEntry->zone);
1484 if (zoneEntry)
1485 overrideLiquid = zoneEntry->LiquidTypeOverride[liquidFlagType];
1486 }
1487
1488 if (LiquidTypeEntry const* overrideData = sLiquidTypeStore.LookupEntry(overrideLiquid))
1489 {
1490 liquidType = overrideLiquid;
1491 liquidFlagType = overrideData->Type;
1492 }
1493 }
1494
1495 data.liquidInfo.Level = wmoData->liquidInfo->level;
1496 data.liquidInfo.DepthLevel = wmoData->floorZ;
1497 data.liquidInfo.Entry = liquidType;
1498 data.liquidInfo.Flags = 1 << liquidFlagType;
1499
1500 // Get position delta
1501 float delta = wmoData->liquidInfo->level - z;
1502
1503 if (delta > collisionHeight)
1505 else if (delta > 0.0f)
1507 else if (delta > -0.1f)
1509 else
1511 }
1512
1513 // look up liquid data from grid map
1514 if (gmap && useGridLiquid)
1515 {
1516 LiquidData const& gridLiquidData = gmap->GetLiquidData(x, y, z, collisionHeight, reqLiquidType);
1517 if (gridLiquidData.Status != LIQUID_MAP_NO_WATER && (!wmoData || gridLiquidData.Level > wmoData->floorZ))
1518 {
1519 uint32 liquidEntry = gridLiquidData.Entry;
1520 if (GetId() == MAP_OUTLAND && liquidEntry == 2)
1521 liquidEntry = 15;
1522
1523 data.liquidInfo = gridLiquidData;
1524 data.liquidInfo.Entry = liquidEntry;
1525 }
1526 }
1527}
@ MAP_OUTLAND
Definition AreaDefines.h:217
@ 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:50
static bool IsInWMOInterior(uint32 mogpFlags)
Definition Map.cpp:1206
LiquidData const GetLiquidData(float x, float y, float z, float collisionHeight, Optional< uint8 > ReqLiquidType) const
Definition GridTerrainData.cpp:530
float getHeight(float x, float y) const
Definition GridTerrainData.h:249
uint16 getArea(float x, float y) const
Definition GridTerrainData.cpp:214
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:1283
float floorZ
Definition Map.h:100
uint32 areaId
Definition Map.h:99
LiquidData liquidInfo
Definition Map.h:102
bool outdoors
Definition Map.h:101
Optional< LiquidInfo > liquidInfo
Definition IVMapMgr.h:78
uint32 Flags
Definition DBCStructure.h:2141
uint32 areaId
Definition DBCStructure.h:2142

References _mapCollisionData, AREA_FLAG_INSIDE, AREA_FLAG_OUTSIDE, PositionFullTerrainStatus::areaId, WMOAreaTableEntry::areaId, VMAP::AreaAndLiquidData::areaInfo, LiquidData::DepthLevel, LiquidData::Entry, LiquidData::Flags, WMOAreaTableEntry::Flags, VMAP::AreaAndLiquidData::floorZ, PositionFullTerrainStatus::floorZ, GridTerrainData::getArea(), StaticVMapCollisionData::GetAreaAndLiquidData(), GetGridTerrainData(), GridTerrainData::getHeight(), GetId(), GridTerrainData::GetLiquidData(), MapCollisionData::GetStaticTree(), 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)
2355{
2356 return _objectsStore.Find<GameObject>(guid);
2357}

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(), instance_obsidian_sanctum::instance_obsidian_sanctum_InstanceMapScript::DoAction(), Spell::DoAllEffectOnTarget(), npc_rocknot::DoGo(), WorldSession::DoLootRelease(), InstanceScript::DoRespawnGameObject(), InstanceScript::DoRespawnGameObject(), InstanceScript::DoUseDoorOrButton(), instance_blackrock_spire::Dragonspireroomcheck(), instance_blackrock_spire::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::HandleMoverRelocation(), boss_urok_doomhowl::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::JustDied(), boss_shade_of_aran::JustDied(), npc_gunship::npc_gunshipAI::JustDied(), boss_sjonnir::boss_sjonnirAI::JustDied(), boss_shade_of_aran::JustEngagedWith(), boss_sjonnir::boss_sjonnirAI::JustEngagedWith(), instance_temple_of_ahnqiraj::instance_temple_of_ahnqiraj_InstanceMapScript::OnCreatureCreate(), instance_temple_of_ahnqiraj::instance_temple_of_ahnqiraj_InstanceMapScript::OnUnitDeath(), boss_pyroguard_emberseer::OpenDoors(), Player::PrepareQuestMenu(), instance_blackrock_spire::ProcessEvent(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::ProcessEvent(), instance_stratholme::instance_stratholme_InstanceMapScript::ProcessSlaughterEvent(), boss_sartharion_dragonAI::RemoveTwilightPortal(), boss_rend_blackhand::Reset(), boss_shade_of_aran::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), ScriptsProcess(), Player::SendLoot(), instance_molten_core::SetBossState(), instance_magtheridons_lair::instance_magtheridons_lair_InstanceMapScript::SetBossState(), instance_blackwing_lair::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_blackrock_spire::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_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(), boss_pyroguard_emberseer::SetData(), boss_rend_blackhand::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_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::Update(), instance_violet_hold::instance_violet_hold_InstanceMapScript::Update(), boss_rend_blackhand::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_freya_nature_bomb::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), BattlegroundRV::UpdatePillars(), boss_pyroguard_emberseer::UpdateRunes(), 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
400 {
401 return _mapCollisionData.GetDynamicTree().getHeight(x, y, z, maxSearchDist, phasemask);
402 }
float getHeight(float x, float y, float z, float maxSearchDist, uint32 phasemask) const
Definition DynamicTree.cpp:275

References _mapCollisionData, MapCollisionData::GetDynamicTree(), and DynamicMapTree::getHeight().

◆ GetGORespawnTime()

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

References _goRespawnTimes.

Referenced by MotionTransport::CreateGOPassenger(), GetLinkedRespawnTime(), GetRespawnTime(), and GameObject::LoadGameObjectFromDB().

◆ GetGORespawnTimes()

std::unordered_map< ObjectGuid::LowType, time_t > const & Map::GetGORespawnTimes ( ) const
inline

◆ GetGridHeight()

float Map::GetGridHeight ( float  x,
float  y 
) const
1191{
1192 if (GridTerrainData* gmap = const_cast<Map*>(this)->GetGridTerrainData(x, y))
1193 return gmap->getHeight(x, y);
1194
1195 return INVALID_HEIGHT;
1196}

References GetGridTerrainData(), and INVALID_HEIGHT.

Referenced by CheckCollisionAndGetValidCoords(), and GetHeight().

◆ GetGridTerrainData() [1/2]

GridTerrainData * Map::GetGridTerrainData ( float  x,
float  y 
)
1103{
1104 GridCoord const gridCoord = Acore::ComputeGridCoord(x, y);
1105 return GetGridTerrainData(gridCoord);
1106}

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

◆ GetGridTerrainData() [2/2]

GridTerrainData * Map::GetGridTerrainData ( GridCoord const &  gridCoord)
1093{
1094 if (!MapGridManager::IsValidGridCoordinates(gridCoord.x_coord, gridCoord.y_coord))
1095 return nullptr;
1096
1097 // ensure GridMap is created
1098 EnsureGridCreated(gridCoord);
1099 return _mapGridManager.GetGrid(gridCoord.x_coord, gridCoord.y_coord)->GetTerrainData();
1100}
MapGridType * GetGrid(uint16 const x, uint16 const y)
Definition MapGridManager.cpp:88
static bool IsValidGridCoordinates(uint16 const x, uint16 const y)
Definition MapGridManager.h:42
GridTerrainData * GetTerrainData() const
Definition MapGrid.h:101

References _mapGridManager, EnsureGridCreated(), MapGridManager::GetGrid(), MapGrid< GRID_OBJECT_TYPES, FAR_VISIBLE_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)
1086{
1087 MapGridType* grid = _mapGridManager.GetGrid(gridCoord.x_coord, gridCoord.y_coord);
1088 ASSERT(grid); // Grid should always exist during this call
1089 return grid->GetTerrainDataSharedPtr();
1090}
std::shared_ptr< GridTerrainData > GetTerrainDataSharedPtr()
Definition MapGrid.h:102

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

Referenced by GridTerrainLoader::LoadMap().

◆ GetGuidSequenceGenerator()

template<HighGuid high>
ObjectGuidGeneratorBase & Map::GetGuidSequenceGenerator ( )
inlineprivate
674 {
675 auto itr = _guidGenerators.find(high);
676 if (itr == _guidGenerators.end())
677 itr = _guidGenerators.insert(std::make_pair(high, std::unique_ptr<ObjectGuidGenerator<high>>(new ObjectGuidGenerator<high>()))).first;
678
679 return *itr->second;
680 }
std::map< HighGuid, std::unique_ptr< ObjectGuidGeneratorBase > > _guidGenerators
Definition Map.h:682
Definition ObjectGuid.h:297

References _guidGenerators.

◆ GetHeight() [1/3]

float Map::GetHeight ( float  x,
float  y,
float  z,
bool  checkVMap = true,
float  maxSearchDist = DEFAULT_HEIGHT_SEARCH 
) const
1157{
1158 // find raw .map surface under Z coordinates
1159 float mapHeight = VMAP_INVALID_HEIGHT_VALUE;
1160 float gridHeight = GetGridHeight(x, y);
1161 if (G3D::fuzzyGe(z, gridHeight - GROUND_HEIGHT_TOLERANCE))
1162 mapHeight = gridHeight;
1163
1164 float vmapHeight = VMAP_INVALID_HEIGHT_VALUE;
1165 if (checkVMap)
1166 vmapHeight = _mapCollisionData.GetStaticTree().getHeight(x, y, z, maxSearchDist); // look from a bit higher pos to find the floor
1167
1168 // mapHeight set for any above raw ground Z or <= INVALID_HEIGHT
1169 // vmapheight set for any under Z value or <= INVALID_HEIGHT
1170 if (vmapHeight > INVALID_HEIGHT)
1171 {
1172 if (mapHeight > INVALID_HEIGHT)
1173 {
1174 // we have mapheight and vmapheight and must select more appropriate
1175
1176 // we are already under the surface or vmap height above map heigt
1177 // or if the distance of the vmap height is less the land height distance
1178 if (vmapHeight > mapHeight || std::fabs(mapHeight - z) > std::fabs(vmapHeight - z))
1179 return vmapHeight;
1180 else
1181 return mapHeight; // better use .map surface height
1182 }
1183 else
1184 return vmapHeight; // we have only vmapHeight (if have)
1185 }
1186
1187 return mapHeight; // explicitly use map data
1188}
float getHeight(float x, float y, float z, float maxSearchDist) const
Definition MapCollisionData.cpp:116

References _mapCollisionData, GetGridHeight(), StaticVMapCollisionData::getHeight(), MapCollisionData::GetStaticTree(), 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_mimiron_magnetic_core_summon::ModDest(), Spell::SelectImplicitCasterDestTargets(), boss_yoggsaron_sara::SpawnTentacle(), and npc_cork_gizelton::npc_cork_gizeltonAI::WaypointReached().

◆ GetHeight() [2/3]

float Map::GetHeight ( Position const &  pos,
bool  checkVMap = true,
float  maxSearchDist = DEFAULT_HEIGHT_SEARCH 
) const
inline
243{ return GetHeight(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), checkVMap, maxSearchDist); }
float GetHeight(float x, float y, float z, bool checkVMap=true, float maxSearchDist=DEFAULT_HEIGHT_SEARCH) const
Definition Map.cpp:1156

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

Referenced by GetHeight().

◆ GetHeight() [3/3]

float Map::GetHeight ( uint32  phasemask,
float  x,
float  y,
float  z,
bool  vmap = true,
float  maxSearchDist = DEFAULT_HEIGHT_SEARCH 
) const
1578{
1579 float h1, h2;
1580 h1 = GetHeight(x, y, z, vmap, maxSearchDist);
1581 h2 = _mapCollisionData.GetDynamicTree().getHeight(x, y, z, maxSearchDist, phasemask);
1582 return std::max<float>(h1, h2);
1583}

References _mapCollisionData, MapCollisionData::GetDynamicTree(), GetHeight(), and DynamicMapTree::getHeight().

◆ GetId()

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

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(), GetDebugInfo(), GetFullTerrainStatusForPosition(), GetLiquidData(), GetMapDifficulty(), debug_commandscript::HandleDebugObjectCountMap(), spell_valkyr_touch_aura::HandleEffectPeriodic(), gobject_commandscript::HandleGameObjectAddCommand(), go_commandscript::HandleGoZoneXYCommand(), instance_commandscript::HandleInstanceGetBossStateCommand(), list_commandscript::HandleListRespawnsCommand(), WorldSession::HandleMoveWorldportAck(), npc_commandscript::HandleNpcAddCommand(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandleSetRaidDifficultyOpcode(), wp_commandscript::HandleWpModifyCommand(), wp_commandscript::HandleWpShowCommand(), InitVisibilityDistance(), InstanceMap::InitVisibilityDistance(), Player::inRandomLfgDungeon(), DisableMgr::IsPathfindingEnabled(), InstanceScript::IsTwoFactionInstance(), GridObjectLoader::LoadAllCellsInGrid(), LoadCorpseData(), GridTerrainLoader::LoadMap(), GridTerrainLoader::LoadMMap(), MapCollisionData::LoadMMapTile(), LoadRespawnTimes(), GridTerrainLoader::LoadVMap(), LogEncounterFinished(), MapCollisionData::MapCollisionData(), 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(), SpawnGroupDespawn(), SpawnGroupSpawn(), SummonCreatureGroup(), SummonGameObjectGroup(), MotionTransport::TeleportTransport(), UnloadGrid(), Update(), and UpdateEncounterState().

◆ GetInstanceId()

◆ GetInstanceResetPeriod()

time_t Map::GetInstanceResetPeriod ( ) const
inline

◆ GetLinkedRespawnTime()

time_t Map::GetLinkedRespawnTime ( ObjectGuid  guid) const
2945{
2946 ObjectGuid linkedGuid = sObjectMgr->GetLinkedRespawnGuid(guid);
2947 switch (linkedGuid.GetHigh())
2948 {
2949 case HighGuid::Unit:
2950 return GetCreatureRespawnTime(linkedGuid.GetCounter());
2952 return GetGORespawnTime(linkedGuid.GetCounter());
2953 default:
2954 break;
2955 }
2956
2957 return time_t(0);
2958}
#define sObjectMgr
Definition ObjectMgr.h:1723
time_t GetCreatureRespawnTime(ObjectGuid::LowType dbGuid) const
Definition Map.h:407
time_t GetGORespawnTime(ObjectGuid::LowType dbGuid) const
Definition Map.h:416
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,
Optional< uint8 ReqLiquidType 
)
1305{
1306 LiquidData liquidData;
1307 liquidData.Status = LIQUID_MAP_NO_WATER;
1308
1309 VMAP::AreaAndLiquidData vmapData;
1310 bool useGridLiquid = true;
1311 if (_mapCollisionData.GetStaticTree().GetAreaAndLiquidData(x, y, z, ReqLiquidType, vmapData) && vmapData.liquidInfo)
1312 {
1313 useGridLiquid = !vmapData.areaInfo || !IsInWMOInterior(vmapData.areaInfo->mogpFlags);
1314 LOG_DEBUG("maps", "GetLiquidStatus(): vmap liquid level: {} ground: {} type: {}", vmapData.liquidInfo->level, vmapData.floorZ, vmapData.liquidInfo->type);
1315 // Check water level and ground level
1316 if (vmapData.liquidInfo->level > vmapData.floorZ && G3D::fuzzyGe(z, vmapData.floorZ - GROUND_HEIGHT_TOLERANCE))
1317 {
1318 // hardcoded in client like this
1319 if (GetId() == MAP_OUTLAND && vmapData.liquidInfo->type == 2)
1320 vmapData.liquidInfo->type = 15;
1321
1322 uint32 liquidFlagType = 0;
1323 if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(vmapData.liquidInfo->type))
1324 liquidFlagType = liq->Type;
1325
1326 if (vmapData.liquidInfo->type && vmapData.liquidInfo->type < 21)
1327 {
1328 if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(GetAreaId(phaseMask, x, y, z)))
1329 {
1330 uint32 overrideLiquid = area->LiquidTypeOverride[liquidFlagType];
1331 if (!overrideLiquid && area->zone)
1332 {
1333 area = sAreaTableStore.LookupEntry(area->zone);
1334 if (area)
1335 overrideLiquid = area->LiquidTypeOverride[liquidFlagType];
1336 }
1337
1338 if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(overrideLiquid))
1339 {
1340 vmapData.liquidInfo->type = overrideLiquid;
1341 liquidFlagType = liq->Type;
1342 }
1343 }
1344 }
1345
1346 liquidData.Level = vmapData.liquidInfo->level;
1347 liquidData.DepthLevel = vmapData.floorZ;
1348 liquidData.Entry = vmapData.liquidInfo->type;
1349 liquidData.Flags = 1 << liquidFlagType;
1350 }
1351
1352 float delta = vmapData.liquidInfo->level - z;
1353
1354 // Get position delta
1355 if (delta > collisionHeight)
1356 liquidData.Status = LIQUID_MAP_UNDER_WATER;
1357 else if (delta > 0.0f)
1358 liquidData.Status = LIQUID_MAP_IN_WATER;
1359 else if (delta > -0.1f)
1360 liquidData.Status = LIQUID_MAP_WATER_WALK;
1361 else
1362 liquidData.Status = LIQUID_MAP_ABOVE_WATER;
1363 }
1364
1365 if (useGridLiquid)
1366 {
1367 if (GridTerrainData* gmap = const_cast<Map*>(this)->GetGridTerrainData(x, y))
1368 {
1369 LiquidData const& map_data = gmap->GetLiquidData(x, y, z, collisionHeight, ReqLiquidType);
1370 // Not override LIQUID_MAP_ABOVE_WATER with LIQUID_MAP_NO_WATER:
1371 if (map_data.Status != LIQUID_MAP_NO_WATER && (map_data.Level > vmapData.floorZ))
1372 {
1373 // hardcoded in client like this
1374 uint32 liquidEntry = map_data.Entry;
1375 if (GetId() == MAP_OUTLAND && liquidEntry == 2)
1376 liquidEntry = 15;
1377
1378 liquidData = map_data;
1379 liquidData.Entry = liquidEntry;
1380 }
1381 }
1382 }
1383
1384 return liquidData;
1385}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:157
uint32 GetAreaId(uint32 phaseMask, float x, float y, float z) const
Definition Map.cpp:1250

References _mapCollisionData, VMAP::AreaAndLiquidData::areaInfo, LiquidData::DepthLevel, LiquidData::Entry, LiquidData::Flags, VMAP::AreaAndLiquidData::floorZ, StaticVMapCollisionData::GetAreaAndLiquidData(), GetAreaId(), GetGridTerrainData(), GetId(), MapCollisionData::GetStaticTree(), GROUND_HEIGHT_TOLERANCE, IsInWMOInterior(), LiquidData::Level, LIQUID_MAP_ABOVE_WATER, LIQUID_MAP_IN_WATER, LIQUID_MAP_NO_WATER, LIQUID_MAP_UNDER_WATER, LIQUID_MAP_WATER_WALK, VMAP::AreaAndLiquidData::liquidInfo, 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 ( )
3481{
3483}
uint32 GetLoadedGridsCount()
Definition MapGridManager.cpp:101

References _mapGridManager, and MapGridManager::GetLoadedGridsCount().

Referenced by debug_commandscript::HandleDebugMapDataCommand().

◆ GetMapCollisionData() [1/2]

◆ GetMapCollisionData() [2/2]

MapCollisionData const & Map::GetMapCollisionData ( ) const
inline
565{ return _mapCollisionData; }

References _mapCollisionData.

◆ GetMapDifficulty()

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

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

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

◆ GetMapGrid()

◆ GetMapName()

char const * Map::GetMapName ( ) const

◆ GetMinHeight()

float Map::GetMinHeight ( float  x,
float  y 
) const
1199{
1200 if (GridTerrainData const* grid = const_cast<Map*>(this)->GetGridTerrainData(x, y))
1201 return grid->getMinHeight(x, y);
1202
1203 return MIN_HEIGHT;
1204}
#define MIN_HEIGHT
Definition GridTerrainData.h:29

References GetGridTerrainData(), and MIN_HEIGHT.

◆ GetObjectsStore()

◆ GetOrGenerateZoneDefaultWeather()

Weather * Map::GetOrGenerateZoneDefaultWeather ( uint32  zoneId)
3192{
3193 WeatherData const* weatherData = WeatherMgr::GetWeatherData(zoneId);
3194 if (!weatherData)
3195 return nullptr;
3196
3197 ZoneDynamicInfo& info = _zoneDynamicInfo[zoneId];
3198
3199 if (!info.DefaultWeather)
3200 {
3201 info.DefaultWeather = std::make_unique<Weather>(this, zoneId, weatherData);
3202 info.DefaultWeather->ReGenerate();
3203 info.DefaultWeather->UpdateWeather();
3204 }
3205
3206 return info.DefaultWeather.get();
3207}
ZoneDynamicInfoMap _zoneDynamicInfo
Definition Map.h:666
WeatherData const * GetWeatherData(uint32 zone_id)
Definition WeatherMgr.cpp:39
Definition Weather.h:40
Definition Map.h:136
std::unique_ptr< Weather > DefaultWeather
Definition Map.h:140

References _zoneDynamicInfo, ZoneDynamicInfo::DefaultWeather, and WeatherMgr::GetWeatherData().

Referenced by misc_commandscript::HandleChangeWeather(), npc_herald_of_the_lich_king::UpdateWeather(), npc_pallid_horror::UpdateWeather(), and Player::UpdateZone().

◆ GetParent()

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

References m_parentMap.

Referenced by MapGridManager::CreateGrid(), and GridTerrainLoader::LoadMap().

◆ GetPet()

Pet * Map::GetPet ( ObjectGuid const &  guid)
2360{
2361 return dynamic_cast<Pet*>(_objectsStore.Find<Creature>(guid));
2362}
Definition Pet.h:41

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

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

◆ GetPlayerCountInZone()

uint32 Map::GetPlayerCountInZone ( uint32  zoneId) const
inline
557 {
558 if (auto const& it = _zonePlayerCountMap.find(zoneId); it != _zonePlayerCountMap.end())
559 return it->second;
560
561 return 0;
562 };

References _zonePlayerCountMap.

Referenced by debug_commandscript::HandleDebugZoneStatsCommand().

◆ GetPlayers()

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

References m_mapRefMgr.

Referenced by AddToMap(), MotionTransport::BuildUpdate(), StaticTransport::BuildUpdate(), InstanceMap::CannotEnter(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), boss_gothik::boss_gothikAI::CheckGroupSplitted(), boss_volazj::CheckPhaseMinions(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::ChromieWhisper(), npc_arthas::npc_arthasAI::DoAction(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::DoCheckDedicatedInsanity(), boss_algalon_the_observer::DoCheckHeraldOfTheTitans(), DoForAllPlayers(), 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::GetArenaPlayer(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_valkyr_touch_aura::HandleEffectPeriodic(), spell_yogg_saron_brain_link_aura::HandleOnEffectApply(), WorldSession::HandleSetRaidDifficultyOpcode(), boss_ichoron::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::JustDied(), boss_ahune::JustDied(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), boss_gothik::boss_gothikAI::JustSummoned(), LogEncounterFinished(), WorldSession::LogoutPlayer(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), spell_hor_shared_suffering_aura::OnRemove(), PlayDirectSoundToMap(), SmartScript::ProcessAction(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::RemoveBackPack(), RemoveFromMap(), boss_krystallus::boss_krystallusAI::RemoveStonedEffect(), instance_blackrock_depths::ReplaceMoiraIfSaved(), boss_volazj::ResetPlayersPhaseMask(), boss_yoggsaron_constrictor_tentacle::SelectConstrictTarget(), boss_yoggsaron_corruptor_tentacle::SelectCorruptionTarget(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), boss_thorim_arena_npcs::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(), SendZoneMessage(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::SetData(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::SetData(), GameObject::SetLootRecipient(), Creature::SetLootRecipient(), boss_hodir::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::Update(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::Update(), instance_vault_of_archavon::instance_vault_of_archavon_InstanceMapScript::Update(), boss_chromaggus::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::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::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_gothik::boss_gothikAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_keristrasza::UpdateAI(), boss_freya::UpdateAI(), boss_vezax::UpdateAI(), boss_hodir::UpdateAI(), boss_ignis::UpdateAI(), boss_mimiron::UpdateAI(), npc_ulduar_leviathan_mkii::UpdateAI(), npc_ulduar_flames_initial::UpdateAI(), UpdateEncounterState(), npc_grimstone::UpdateEscortAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateWorldState(), and npc_thrall_bfu::npc_thrall_bfuAI::UpdateWorldState().

◆ GetPlayersCountExceptGMs()

◆ GetRespawnTime()

time_t Map::GetRespawnTime ( SpawnObjectType  type,
ObjectGuid::LowType  spawnId 
) const
inline
446 {
447 switch (type)
448 {
450 return GetCreatureRespawnTime(spawnId);
452 return GetGORespawnTime(spawnId);
453 default:
454 return time_t(0);
455 }
456 }
@ SPAWN_TYPE_GAMEOBJECT
Definition SpawnData.h:28
@ SPAWN_TYPE_CREATURE
Definition SpawnData.h:27

References GetCreatureRespawnTime(), GetGORespawnTime(), SPAWN_TYPE_CREATURE, and SPAWN_TYPE_GAMEOBJECT.

Referenced by SpawnGroupSpawn().

◆ GetSpawnMode()

◆ GetTransport()

Transport * Map::GetTransport ( ObjectGuid const &  guid)

◆ GetTransportForPos()

Transport * Map::GetTransportForPos ( uint32  phase,
float  x,
float  y,
float  z,
WorldObject worldobject = nullptr 
)
1130{
1131 G3D::Vector3 v(x, y, z + 2.0f);
1132 G3D::Ray r(v, G3D::Vector3(0, 0, -1));
1133 for (TransportsContainer::const_iterator itr = _transports.begin(); itr != _transports.end(); ++itr)
1134 if ((*itr)->IsInWorld() && (*itr)->GetExactDistSq(x, y, z) < 75.0f * 75.0f && (*itr)->m_model)
1135 {
1136 float dist = 30.0f;
1137 bool hit = (*itr)->m_model->intersectRay(r, dist, false, phase, VMAP::ModelIgnoreFlags::Nothing);
1138 if (hit)
1139 return *itr;
1140 }
1141
1142 if (worldobject)
1143 if (GameObject* staticTrans = worldobject->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_TRANSPORT, 75.0f))
1144 if (staticTrans->m_model)
1145 {
1146 float dist = 10.0f;
1147 bool hit = staticTrans->m_model->intersectRay(r, dist, false, phase, VMAP::ModelIgnoreFlags::Nothing);
1148 if (hit)
1149 if (GetHeight(phase, x, y, z, true, 30.0f) < (v.z - dist + 1.0f))
1150 return staticTrans->ToTransport();
1151 }
1152
1153 return nullptr;
1154}
@ GAMEOBJECT_TYPE_TRANSPORT
Definition SharedDefines.h:1575
GameObject * FindNearestGameObjectOfType(GameobjectTypes type, float range) const
Definition Object.cpp:2516

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

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

◆ GetUpdatableObjectsCount()

size_t Map::GetUpdatableObjectsCount ( ) const
inline

◆ GetVisibilityRange()

◆ GetWaterLevel()

float Map::GetWaterLevel ( float  x,
float  y 
) const
1530{
1531 if (GridTerrainData* gmap = const_cast<Map*>(this)->GetGridTerrainData(x, y))
1532 return gmap->getLiquidLevel(x, y);
1533
1534 return INVALID_HEIGHT;
1535}

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
1109{
1110 // we need ground level (including grid height version) for proper return water level in point
1111 float ground_z = GetHeight(phasemask, x, y, z + Z_OFFSET_FIND_HEIGHT, true, 50.0f);
1112 if (ground)
1113 *ground = ground_z;
1114
1115 LiquidData const& liquidData = const_cast<Map*>(this)->GetLiquidData(phasemask, x, y, ground_z, collisionHeight, {});
1116 switch (liquidData.Status)
1117 {
1119 return std::max<float>(liquidData.Level, ground_z);
1121 return ground_z;
1122 default:
1123 return liquidData.Level;
1124 }
1125
1127}
constexpr float Z_OFFSET_FIND_HEIGHT
Definition SharedDefines.h:27
LiquidData const GetLiquidData(uint32 phaseMask, float x, float y, float z, float collisionHeight, Optional< uint8 > ReqLiquidType)
Definition Map.cpp:1304

References GetHeight(), GetLiquidData(), LiquidData::Level, LIQUID_MAP_ABOVE_WATER, LIQUID_MAP_NO_WATER, 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
1297{
1298 areaid = zoneid = GetAreaId(phaseMask, x, y, z);
1299 if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaid))
1300 if (area->zone)
1301 zoneid = area->zone;
1302}

References GetAreaId(), and sAreaTableStore.

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

◆ GetZoneId()

uint32 Map::GetZoneId ( uint32  phaseMask,
float  x,
float  y,
float  z 
) const
1287{
1288 uint32 areaId = GetAreaId(phaseMask, x, y, z);
1289 if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId))
1290 if (area->zone)
1291 return area->zone;
1292
1293 return areaId;
1294}

References GetAreaId(), and sAreaTableStore.

Referenced by MapMgr::GetZoneId().

◆ GetZoneWideVisibleWorldObjectsForZone()

ZoneWideVisibleWorldObjectsSet const * Map::GetZoneWideVisibleWorldObjectsForZone ( uint32  zoneId) const
682{
683 ZoneWideVisibleWorldObjectsMap::const_iterator itr = _zoneWideVisibleWorldObjectsMap.find(zoneId);
684 if (itr == _zoneWideVisibleWorldObjectsMap.end())
685 return nullptr;
686
687 return &itr->second;
688}

References _zoneWideVisibleWorldObjectsMap.

Referenced by debug_commandscript::HandleDebugVisibilityDataCommand(), and Acore::VisibleNotifier::SendToSelf().

◆ HandleDelayedVisibility()

void Map::HandleDelayedVisibility ( )
691{
693 return;
694 for (std::unordered_set<Unit*>::iterator itr = i_objectsForDelayedVisibility.begin(); itr != i_objectsForDelayedVisibility.end(); ++itr)
695 (*itr)->ExecuteDelayedUnitRelocationEvent();
697}
std::unordered_set< Unit * > i_objectsForDelayedVisibility
Definition Map.h:237

References i_objectsForDelayedVisibility.

Referenced by Update().

◆ HasEnoughWater() [1/2]

bool Map::HasEnoughWater ( WorldObject const *  searcher,
float  x,
float  y,
float  z 
) const
1598{
1599 LiquidData const& liquidData = const_cast<Map*>(this)->GetLiquidData(
1600 searcher->GetPhaseMask(), x, y, z, searcher->GetCollisionHeight(), MAP_ALL_LIQUIDS);
1601
1602 if ((liquidData.Status & MAP_LIQUID_STATUS_SWIMMING) == 0)
1603 return false;
1604
1605 float minHeightInWater = searcher->GetMinHeightInWater();
1606 return liquidData.Level > INVALID_HEIGHT &&
1607 liquidData.Level > liquidData.DepthLevel &&
1608 liquidData.Level - liquidData.DepthLevel >= minHeightInWater;
1609}
#define MAP_ALL_LIQUIDS
Definition GridTerrainData.h:40
#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 )
293{
294 //obj->_moveState = MAP_OBJECT_CELL_MOVE_NONE;
295}

◆ InitializeObject() [2/3]

template<>
void Map::InitializeObject ( GameObject )
299{
300 //obj->_moveState = MAP_OBJECT_CELL_MOVE_NONE;
301}

◆ InitializeObject() [3/3]

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

Referenced by AddToMap().

◆ InitVisibilityDistance()

void Map::InitVisibilityDistance ( )
virtual

Reimplemented in InstanceMap, BattlegroundMap, and MapInstanced.

96{
97 //init visibility for continents
99
100 switch (GetId())
101 {
102 case MAP_EBON_HOLD: // Scarlet Enclave (DK starting zone)
103 m_VisibleDistance = 125.0f;
104 break;
105 case MAP_SCOTT_TEST: // (box map)
106 m_VisibleDistance = 200.0f;
107 break;
108 }
109}
@ MAP_EBON_HOLD
Definition AreaDefines.h:259
@ MAP_SCOTT_TEST
Definition AreaDefines.h:188
static float GetMaxVisibleDistanceOnContinents()
Definition World.h:213

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

◆ Instanceable()

◆ Is25ManRaid()

◆ IsBattleArena()

◆ IsBattleground()

bool Map::IsBattleground ( ) const
inline

◆ IsBattlegroundOrArena()

◆ isCellMarked()

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

References marked_cells.

◆ IsDungeon()

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

References i_mapEntry, and MapEntry::IsDungeon().

Referenced by Group::_cancelHomebindIfInstance(), Group::_homebindIfInstance(), InstanceSaveMgr::_ResetOrWarnAll(), InstanceMap::AddPlayerToMap(), GameObject::AddToSkillupList(), Spell::CheckCast(), TransportMgr::CreateTransport(), ScriptedAI::DoTeleportAll(), CreatureAI::DoZoneInCombat(), Spell::EffectSanctuary(), Spell::EffectTeleportUnits(), SmartScript::FillScript(), WorldObject::GetInstanceScript(), Unit::GetMeleeAttackPoint(), SpellMgr::GetSpellIdForDifficulty(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleAreaTriggerOpcode(), spell_freezing_circle::HandleDamage(), spell_item_nitro_boots::HandleDummy(), AuraEffect::HandleFeignDeath(), 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
218 {
220 }
bool IsGridCreated(GridCoord const &gridCoord) const
Definition Map.cpp:208

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

◆ IsGridCreated() [2/2]

bool Map::IsGridCreated ( GridCoord const &  gridCoord) const
209{
210 return _mapGridManager.IsGridCreated(gridCoord.x_coord, gridCoord.y_coord);
211}
bool IsGridCreated(uint16 const x, uint16 const y) const
Definition MapGridManager.cpp:72

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
213 {
215 }

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

◆ IsGridLoaded() [2/2]

◆ 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_molten_golem::DamageTaken(), npc_orb_carrier::npc_orb_carrierAI::DoAction(), BattleExperienceEvent::Execute(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::GetData(), spell_freezing_circle::HandleDamage(), instance_commandscript::HandleInstanceGetBossStateCommand(), 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_krystallus::boss_krystallusAI::JustEngagedWith(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_frost_tomb::npc_frost_tomb(), instance_gundrak::instance_gundrak_InstanceMapScript::OnGameObjectCreate(), instance_gundrak::instance_gundrak_InstanceMapScript::OnGameObjectRemove(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::OnPlayerEnter(), at_shattered_halls_execution::OnTrigger(), instance_gundrak::instance_gundrak_InstanceMapScript::OnUnitDeath(), 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_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(), 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(), npc_time_rift::UpdateAI(), UpdateEncounterState(), instance_halls_of_reflection::UpdateOutro(), 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
1538{
1539 if (!sWorld->getBoolConfig(CONFIG_VMAP_BLIZZLIKE_PVP_LOS))
1540 {
1542 {
1543 ignoreFlags = VMAP::ModelIgnoreFlags::Nothing;
1544 }
1545 }
1546
1547 if (!sWorld->getBoolConfig(CONFIG_VMAP_BLIZZLIKE_LOS_OPEN_WORLD))
1548 {
1549 if (IsWorldMap())
1550 {
1551 ignoreFlags = VMAP::ModelIgnoreFlags::Nothing;
1552 }
1553 }
1554
1555 if ((checks & LINEOFSIGHT_CHECK_VMAP) && !_mapCollisionData.GetStaticTree().isInLineOfSight(x1, y1, z1, x2, y2, z2, ignoreFlags))
1556 {
1557 return false;
1558 }
1559
1560 if (sWorld->getBoolConfig(CONFIG_CHECK_GOBJECT_LOS) && (checks & LINEOFSIGHT_CHECK_GOBJECT_ALL))
1561 {
1562 ignoreFlags = VMAP::ModelIgnoreFlags::Nothing;
1563 if (!(checks & LINEOFSIGHT_CHECK_GOBJECT_M2))
1564 {
1565 ignoreFlags = VMAP::ModelIgnoreFlags::M2;
1566 }
1567
1568 if (!_mapCollisionData.GetDynamicTree().isInLineOfSight(x1, y1, z1, x2, y2, z2, phasemask, ignoreFlags))
1569 {
1570 return false;
1571 }
1572 }
1573
1574 return true;
1575}
@ LINEOFSIGHT_CHECK_GOBJECT_M2
Definition Map.h:109
@ LINEOFSIGHT_CHECK_VMAP
Definition Map.h:107
@ LINEOFSIGHT_CHECK_GOBJECT_ALL
Definition Map.h:111
@ CONFIG_CHECK_GOBJECT_LOS
Definition WorldConfig.h:114
@ CONFIG_VMAP_BLIZZLIKE_LOS_OPEN_WORLD
Definition WorldConfig.h:136
@ CONFIG_VMAP_BLIZZLIKE_PVP_LOS
Definition WorldConfig.h:135
bool isInLineOfSight(float x1, float y1, float z1, float x2, float y2, float z2, uint32 phasemask, VMAP::ModelIgnoreFlags ignoreFlags) const
Definition DynamicTree.cpp:257
bool IsWorldMap() const
Definition Map.h:306
bool isInLineOfSight(float x1, float y1, float z1, float x2, float y2, float z2, VMAP::ModelIgnoreFlags ignoreFlags) const
Definition MapCollisionData.cpp:71

References _mapCollisionData, CONFIG_CHECK_GOBJECT_LOS, CONFIG_VMAP_BLIZZLIKE_LOS_OPEN_WORLD, CONFIG_VMAP_BLIZZLIKE_PVP_LOS, MapCollisionData::GetDynamicTree(), MapCollisionData::GetStaticTree(), IsBattlegroundOrArena(), DynamicMapTree::isInLineOfSight(), StaticVMapCollisionData::isInLineOfSight(), IsWorldMap(), LINEOFSIGHT_CHECK_GOBJECT_ALL, LINEOFSIGHT_CHECK_GOBJECT_M2, LINEOFSIGHT_CHECK_VMAP, VMAP::M2, VMAP::Nothing, and sWorld.

Referenced by Unit::_ExitVehicle(), RandomMovementGenerator< T >::_setRandomLocation(), 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
1586{
1587 LiquidData const& liquidData = const_cast<Map*>(this)->GetLiquidData(phaseMask, x, y, pZ, collisionHeight, {});
1588 return (liquidData.Status & MAP_LIQUID_STATUS_SWIMMING) != 0;
1589}

References GetLiquidData(), MAP_LIQUID_STATUS_SWIMMING, and LiquidData::Status.

Referenced by CheckCollisionAndGetValidCoords(), ConfusedMovementGenerator< T >::DoInitialize(), PathGenerator::IsSwimmableSegment(), and Spell::SelectImplicitCasterDestTargets().

◆ IsNonRaidDungeon()

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

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
293{ return GetDifficulty() == REGULAR_DIFFICULTY; }
@ REGULAR_DIFFICULTY
Definition DBCEnums.h:267

References GetDifficulty(), and REGULAR_DIFFICULTY.

◆ IsSpawnGroupActive()

bool Map::IsSpawnGroupActive ( uint32  groupId) const
2532{
2533 SpawnGroupTemplateData const* data = sObjectMgr->GetSpawnGroupData(groupId);
2534 if (!data)
2535 return false;
2536
2537 // System groups are always active
2538 if (data->flags & SPAWNGROUP_FLAG_SYSTEM)
2539 return true;
2540
2541 // Per-map toggled state: XOR with default.
2542 // MANUAL_SPAWN groups default to inactive; toggling makes them active.
2543 // Non-MANUAL groups default to active; toggling makes them inactive.
2544 bool toggled = _toggledSpawnGroupIds.count(groupId) != 0;
2545 bool defaultActive = !(data->flags & SPAWNGROUP_FLAG_MANUAL_SPAWN);
2546 return toggled != defaultActive; // XOR: toggled flips the default
2547}
@ SPAWNGROUP_FLAG_MANUAL_SPAWN
Definition SpawnData.h:46
@ SPAWNGROUP_FLAG_SYSTEM
Definition SpawnData.h:44
std::unordered_set< uint32 > _toggledSpawnGroupIds
Definition Map.h:661
Definition SpawnData.h:58
SpawnGroupFlags flags
Definition SpawnData.h:62

References _toggledSpawnGroupIds, SpawnGroupTemplateData::flags, sObjectMgr, SPAWNGROUP_FLAG_MANUAL_SPAWN, and SPAWNGROUP_FLAG_SYSTEM.

Referenced by GridObjectLoader::LoadCreatures(), GridObjectLoader::LoadGameObjects(), ProcessCreatureRespawn(), and ProcessGameObjectRespawn().

◆ IsUnderWater()

bool Map::IsUnderWater ( uint32  phaseMask,
float  x,
float  y,
float  z,
float  collisionHeight 
) const
1592{
1593 LiquidData const& liquidData = const_cast<Map*>(this)->GetLiquidData(phaseMask, x, y, z, collisionHeight, MAP_LIQUID_TYPE_WATER | MAP_LIQUID_TYPE_OCEAN);
1594 return liquidData.Status == LIQUID_MAP_UNDER_WATER;
1595}
#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::ProcessMovementInfo().

◆ IsWorldMap()

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

References i_mapEntry, and MapEntry::IsWorldMap().

Referenced by isInLineOfSight().

◆ LoadAllGrids()

void Map::LoadAllGrids ( )
219{
220 for (uint32 cellX = 0; cellX < TOTAL_NUMBER_OF_CELLS_PER_MAP; cellX++)
221 for (uint32 cellY = 0; cellY < TOTAL_NUMBER_OF_CELLS_PER_MAP; cellY++)
223}
#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:213

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 ( )
3421{
3423 stmt->SetData(0, GetId());
3424 stmt->SetData(1, GetInstanceId());
3425
3426 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
3427 // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, guildId, flags, dynFlags, time, corpseType, instanceId, phaseMask, guid FROM corpse WHERE mapId = ? AND instanceId = ?
3428 PreparedQueryResult result = CharacterDatabase.Query(stmt);
3429 if (!result)
3430 return;
3431
3432 do
3433 {
3434 Field* fields = result->Fetch();
3435 CorpseType type = CorpseType(fields[13].Get<uint8>());
3436 uint32 guid = fields[16].Get<uint32>();
3437 if (type >= MAX_CORPSE_TYPE || type == CORPSE_BONES)
3438 {
3439 LOG_ERROR("maps", "Corpse (guid: {}) have wrong corpse type ({}), not loading.", guid, type);
3440 continue;
3441 }
3442
3443 Corpse* corpse = new Corpse(type);
3444
3445 if (!corpse->LoadCorpseFromDB(GenerateLowGuid<HighGuid::Corpse>(), fields))
3446 {
3447 delete corpse;
3448 continue;
3449 }
3450
3451 AddCorpse(corpse);
3452
3453 corpse->UpdatePositionData();
3454 } while (result->NextRow());
3455}
@ 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 
)
226{
228 return;
229
230 float const x = center.GetPositionX();
231 float const y = center.GetPositionY();
232
233 CellCoord cellCoord(Acore::ComputeCellCoord(x, y));
234 if (!cellCoord.IsCoordValid())
235 return;
236
237 if (radius > SIZE_OF_GRIDS)
238 radius = SIZE_OF_GRIDS;
239
240 CellArea area = Cell::CalculateCellArea(x, y, radius);
241 if (!area)
242 return;
243
244 for (uint32 x = area.low_bound.x_coord; x <= area.high_bound.x_coord; ++x)
245 {
246 for (uint32 y = area.low_bound.y_coord; y <= area.high_bound.y_coord; ++y)
247 {
248 CellCoord cellCoord(x, y);
249 Cell cell(cellCoord);
250 EnsureGridLoaded(cell);
251 }
252 }
253}
#define SIZE_OF_GRIDS
Definition MapDefines.h:26
bool IsGridsFullyLoaded() const
Definition MapGridManager.cpp:134
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(), Unit::ExecuteDelayedUnitRelocationEvent(), CinematicMgr::StartCinematicCamera(), and CinematicMgr::UpdateCinematic().

◆ LoadRespawnTimes()

void Map::LoadRespawnTimes ( )
2475{
2477 stmt->SetData(0, GetId());
2478 stmt->SetData(1, GetInstanceId());
2479 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
2480 {
2481 do
2482 {
2483 Field* fields = result->Fetch();
2484 ObjectGuid::LowType lowguid = fields[0].Get<uint32>();
2485 time_t respawnTime = time_t(fields[1].Get<uint32>());
2486
2487 _creatureRespawnTimes[lowguid] = respawnTime;
2488 _respawnQueue.insert({respawnTime, SPAWN_TYPE_CREATURE, lowguid});
2489 } while (result->NextRow());
2490 }
2491
2492 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GO_RESPAWNS);
2493 stmt->SetData(0, GetId());
2494 stmt->SetData(1, GetInstanceId());
2495 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
2496 {
2497 do
2498 {
2499 Field* fields = result->Fetch();
2500 ObjectGuid::LowType lowguid = fields[0].Get<uint32>();
2501 time_t respawnTime = time_t(fields[1].Get<uint32>());
2502
2503 _goRespawnTimes[lowguid] = respawnTime;
2504 _respawnQueue.insert({respawnTime, SPAWN_TYPE_GAMEOBJECT, lowguid});
2505 } while (result->NextRow());
2506 }
2507}
@ CHAR_SEL_CREATURE_RESPAWNS
Definition CharacterDatabase.h:252
@ CHAR_SEL_GO_RESPAWNS
Definition CharacterDatabase.h:257

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

Referenced by MapMgr::CreateBaseMap().

◆ LogEncounterFinished()

void Map::LogEncounterFinished ( EncounterCreditType  type,
uint32  creditEntry 
)
2900{
2901 if (!IsRaid() || !GetEntry() || GetEntry()->Expansion() < 2) // only for wotlk raids, because logs take up tons of mysql memory
2902 return;
2903 InstanceMap* map = ToInstanceMap();
2904 if (!map)
2905 return;
2906 std::string playersInfo;
2907 char buffer[16384], buffer2[255];
2908 Map::PlayerList const& pl = map->GetPlayers();
2909 for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
2910 if (Player* p = itr->GetSource())
2911 {
2912 std::string auraStr;
2913 const Unit::AuraApplicationMap& a = p->GetAppliedAuras();
2914 for (auto iterator = a.begin(); iterator != a.end(); ++iterator)
2915 {
2916 snprintf(buffer2, 255, "%u(%u) ", iterator->first, iterator->second->GetEffectMask());
2917 auraStr += buffer2;
2918 }
2919
2920 snprintf(buffer, 16384, "%s (%s, acc: %u, ip: %s, guild: %u), xyz: (%.1f, %.1f, %.1f), auras: %s\n",
2921 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());
2922 playersInfo += buffer;
2923 }
2924 CleanStringForMysqlQuery(playersInfo);
2925 CharacterDatabase.Execute("INSERT INTO log_encounter VALUES(NOW(), {}, {}, {}, {}, '{}')", GetId(), (uint32)GetDifficulty(), type, creditEntry, playersInfo);
2926}
void CleanStringForMysqlQuery(std::string &str)
Definition Common.cpp:61
LinkedListHead::Iterator< GridReference< MapGridType > > iterator
Definition GridRefMgr.h:30
Definition Map.h:708
Definition MapRefMgr.h:26
iterator begin()
Definition MapRefMgr.h:36
InstanceMap * ToInstanceMap()
Definition Map.h:381
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition Unit.h:673

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

Referenced by UpdateEncounterState().

◆ markCell()

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

References marked_cells.

Referenced by MarkNearbyCellsOf().

◆ MarkNearbyCellsOf()

void Map::MarkNearbyCellsOf ( WorldObject obj)
395{
396 // Check for valid position
397 if (!obj->IsPositionValid())
398 return;
399
400 // Update mobs/objects in ALL visible cells around object!
402 for (uint32 x = area.low_bound.x_coord; x <= area.high_bound.x_coord; ++x)
403 {
404 for (uint32 y = area.low_bound.y_coord; y <= area.high_bound.y_coord; ++y)
405 {
406 // marked cells are those that have been visited
407 uint32 cell_id = (y * TOTAL_NUMBER_OF_CELLS_PER_MAP) + x;
408 markCell(cell_id);
409 }
410 }
411}
void markCell(uint32 pCellId)
Definition Map.h:320
float GetGridActivationRange() const
Definition Object.cpp:1679
bool IsPositionValid() const
Definition Position.cpp:183

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 ( )
919{
920 for (std::vector<Creature*>::iterator itr = _creaturesToMove.begin(); itr != _creaturesToMove.end(); ++itr)
921 {
922 Creature* c = *itr;
923 if (c->FindMap() != this)
924 continue;
925
927 {
929 continue;
930 }
931
933 if (!c->IsInWorld())
934 continue;
935
936 Cell const& old_cell = c->GetCurrentCell();
937 Cell new_cell(c->GetPositionX(), c->GetPositionY());
938 if (c->IsFarVisible())
939 {
940 // Removes via GetCurrentCell, added back in AddToGrid
942 }
943
944 c->RemoveFromGrid();
945 if (old_cell.DiffGrid(new_cell))
946 EnsureGridLoaded(new_cell);
947 AddToGrid(c, new_cell);
948 }
949 _creaturesToMove.clear();
950}
void RemoveFromGrid()
Definition Object.h:373
void RemoveWorldObjectFromFarVisibleMap(WorldObject *obj)
Definition Map.cpp:650
Map * FindMap() const
Definition Object.h:626

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

Referenced by Update().

◆ MoveAllDynamicObjectsInMoveList()

void Map::MoveAllDynamicObjectsInMoveList ( )
988{
989 for (std::vector<DynamicObject*>::iterator itr = _dynamicObjectsToMove.begin(); itr != _dynamicObjectsToMove.end(); ++itr)
990 {
991 DynamicObject* dynObj = *itr;
992 if (dynObj->FindMap() != this)
993 continue;
994
996 {
998 continue;
999 }
1000
1002 if (!dynObj->IsInWorld())
1003 continue;
1004
1005 Cell const& old_cell = dynObj->GetCurrentCell();
1006 Cell new_cell(dynObj->GetPositionX(), dynObj->GetPositionY());
1007
1008 dynObj->RemoveFromGrid();
1009 if (old_cell.DiffGrid(new_cell))
1010 EnsureGridLoaded(new_cell);
1011 AddToGrid(dynObj, new_cell);
1012 }
1013 _dynamicObjectsToMove.clear();
1014}

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 ( )
953{
954 for (std::vector<GameObject*>::iterator itr = _gameObjectsToMove.begin(); itr != _gameObjectsToMove.end(); ++itr)
955 {
956 GameObject* go = *itr;
957 if (go->FindMap() != this)
958 continue;
959
961 {
963 continue;
964 }
965
967 if (!go->IsInWorld())
968 continue;
969
970 Cell const& old_cell = go->GetCurrentCell();
971 Cell new_cell(go->GetPositionX(), go->GetPositionY());
972
973 if (go->IsFarVisible())
974 {
975 // Removes via GetCurrentCell, added back in AddToGrid
977 }
978
979 go->RemoveFromGrid();
980 if (old_cell.DiffGrid(new_cell))
981 EnsureGridLoaded(new_cell);
982 AddToGrid(go, new_cell);
983 }
984 _gameObjectsToMove.clear();
985}

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

Referenced by Update().

◆ OnCreateMap()

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

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

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

◆ PlayDirectSoundToMap()

void Map::PlayDirectSoundToMap ( uint32  soundId,
uint32  zoneId = 0 
)
3169{
3170 Map::PlayerList const& players = GetPlayers();
3171 if (!players.IsEmpty())
3172 {
3174 data << uint32(soundId);
3175
3176 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
3177 if (Player* player = itr->GetSource())
3178 if (!zoneId || player->GetZoneId() == zoneId)
3179 player->SendDirectMessage(&data);
3180 }
3181}
@ 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 
)
795{
796 Cell old_cell(player->GetPositionX(), player->GetPositionY());
797 Cell new_cell(x, y);
798
799 if (old_cell.DiffGrid(new_cell) || old_cell.DiffCell(new_cell))
800 {
801 player->RemoveFromGrid();
802
803 if (old_cell.DiffGrid(new_cell))
804 EnsureGridLoaded(new_cell);
805
806 AddToGrid(player, new_cell);
807 }
808
809 player->Relocate(x, y, z, o);
810 if (player->IsVehicle())
812 player->UpdatePositionData();
813 player->UpdateObjectVisibility(false);
814}

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

◆ ProcessCreatureRespawn()

void Map::ProcessCreatureRespawn ( ObjectGuid::LowType  spawnId)
2719{
2720 // Pool members are handled entirely by PoolMgr
2721 if (uint32 poolId = sPoolMgr->IsPartOfAPool<Creature>(spawnId))
2722 {
2723 sPoolMgr->UpdatePool<Creature>(poolId, spawnId);
2725 return;
2726 }
2727
2728 CreatureData const* data = sObjectMgr->GetCreatureData(spawnId);
2729 if (!data)
2730 {
2732 return;
2733 }
2734
2735 // Compat-mode creatures handle their own respawn in-place — don't interfere.
2736 // Clean up the stale respawn time entry since the legacy system manages these.
2737 SpawnGroupTemplateData const* groupData = sObjectMgr->GetSpawnGroupData(data->spawnGroupId);
2738 if (!groupData || (groupData->flags & SPAWNGROUP_FLAG_COMPATIBILITY_MODE))
2739 {
2741 return;
2742 }
2743
2744 // Don't respawn if the spawn group is not active
2745 if (!IsSpawnGroupActive(data->spawnGroupId))
2746 {
2747 // Re-queue — will be checked again next ProcessRespawns() tick
2748 _respawnQueue.insert({GameTime::GetGameTime().count() + 5, SPAWN_TYPE_CREATURE, spawnId});
2749 return;
2750 }
2751
2752 // Skip if grid isn't loaded (will be handled in grid loader)
2753 if (!IsGridLoaded(data->posX, data->posY))
2754 {
2755 _respawnQueue.insert({GameTime::GetGameTime().count() + 5, SPAWN_TYPE_CREATURE, spawnId});
2756 return;
2757 }
2758
2759 // Skip if already alive
2760 auto bounds = _creatureBySpawnIdStore.equal_range(spawnId);
2761 for (auto itr = bounds.first; itr != bounds.second; ++itr)
2762 {
2763 if (itr->second->IsAlive())
2764 {
2766 return;
2767 }
2768 }
2769
2770 // Remove respawn time BEFORE LoadFromDB, otherwise the creature
2771 // reads it back and loads as DEAD instead of ALIVE
2773
2774 Creature* creature = new Creature();
2775 if (!creature->LoadCreatureFromDB(spawnId, this, true, true))
2776 delete creature;
2777}
#define sPoolMgr
Definition PoolMgr.h:177
@ SPAWNGROUP_FLAG_COMPATIBILITY_MODE
Definition SpawnData.h:45
bool LoadCreatureFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true, bool allowDuplicate=false)
Definition Creature.cpp:1679
void RemoveCreatureRespawnTime(ObjectGuid::LowType dbGuid)
Definition Map.cpp:2413
bool IsSpawnGroupActive(uint32 groupId) const
Definition Map.cpp:2531
Seconds GetGameTime()
Definition GameTime.cpp:38
Definition CreatureData.h:370
float posX
Definition SpawnData.h:71
float posY
Definition SpawnData.h:72
uint32 spawnGroupId
Definition SpawnData.h:78

References _creatureBySpawnIdStore, _respawnQueue, SpawnGroupTemplateData::flags, GameTime::GetGameTime(), IsGridLoaded(), IsSpawnGroupActive(), Creature::LoadCreatureFromDB(), SpawnData::posX, SpawnData::posY, RemoveCreatureRespawnTime(), sObjectMgr, SPAWN_TYPE_CREATURE, SPAWNGROUP_FLAG_COMPATIBILITY_MODE, SpawnData::spawnGroupId, and sPoolMgr.

Referenced by ProcessRespawns().

◆ ProcessGameObjectRespawn()

void Map::ProcessGameObjectRespawn ( ObjectGuid::LowType  spawnId)
2780{
2781 // Pool members are handled entirely by PoolMgr
2782 if (uint32 poolId = sPoolMgr->IsPartOfAPool<GameObject>(spawnId))
2783 {
2784 sPoolMgr->UpdatePool<GameObject>(poolId, spawnId);
2785 RemoveGORespawnTime(spawnId);
2786 return;
2787 }
2788
2789 GameObjectData const* data = sObjectMgr->GetGameObjectData(spawnId);
2790 if (!data)
2791 {
2792 RemoveGORespawnTime(spawnId);
2793 return;
2794 }
2795
2796 // Compat-mode gameobjects handle their own respawn — don't interfere.
2797 // Clean up the stale respawn time entry since the legacy system manages these.
2798 SpawnGroupTemplateData const* groupData = sObjectMgr->GetSpawnGroupData(data->spawnGroupId);
2799 if (!groupData || (groupData->flags & SPAWNGROUP_FLAG_COMPATIBILITY_MODE))
2800 {
2801 RemoveGORespawnTime(spawnId);
2802 return;
2803 }
2804
2805 // Don't respawn if the spawn group is not active
2806 if (!IsSpawnGroupActive(data->spawnGroupId))
2807 {
2808 _respawnQueue.insert({GameTime::GetGameTime().count() + 5, SPAWN_TYPE_GAMEOBJECT, spawnId});
2809 return;
2810 }
2811
2812 // Skip if grid isn't loaded (will be handled in grid loader)
2813 if (!IsGridLoaded(data->posX, data->posY))
2814 {
2815 _respawnQueue.insert({GameTime::GetGameTime().count() + 5, SPAWN_TYPE_GAMEOBJECT, spawnId});
2816 return;
2817 }
2818
2819 if (_gameobjectBySpawnIdStore.count(spawnId))
2820 {
2821 RemoveGORespawnTime(spawnId);
2822 return;
2823 }
2824
2825 // Remove respawn time BEFORE LoadFromDB, otherwise the GO
2826 // reads it back and loads as despawned
2827 RemoveGORespawnTime(spawnId);
2828
2829 GameObject* gameobject = new GameObject();
2830 if (!gameobject->LoadGameObjectFromDB(spawnId, this, true))
2831 delete gameobject;
2832}
virtual bool LoadGameObjectFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true)
Definition GameObject.cpp:1099
void RemoveGORespawnTime(ObjectGuid::LowType dbGuid)
Definition Map.cpp:2458
Definition GameObjectData.h:715

References _gameobjectBySpawnIdStore, _respawnQueue, SpawnGroupTemplateData::flags, GameTime::GetGameTime(), IsGridLoaded(), IsSpawnGroupActive(), GameObject::LoadGameObjectFromDB(), SpawnData::posX, SpawnData::posY, RemoveGORespawnTime(), sObjectMgr, SPAWN_TYPE_GAMEOBJECT, SPAWNGROUP_FLAG_COMPATIBILITY_MODE, SpawnData::spawnGroupId, and sPoolMgr.

Referenced by ProcessRespawns().

◆ ProcessRespawns()

void Map::ProcessRespawns ( )
2693{
2694 time_t now = GameTime::GetGameTime().count();
2695
2696 // Process due respawns from the time-ordered queue.
2697 // Entries are sorted by respawnTime — once we hit a future time, we're done.
2698 while (!_respawnQueue.empty())
2699 {
2700 auto it = _respawnQueue.begin();
2701 if (it->respawnTime > now)
2702 break; // nothing else is due this tick
2703
2704 SpawnObjectType type = it->type;
2705 ObjectGuid::LowType spawnId = it->spawnId;
2706
2707 // Remove from queue first — handlers below call Remove*RespawnTime()
2708 // which also erases from queue, so we must pop before processing.
2709 _respawnQueue.erase(it);
2710
2711 if (type == SPAWN_TYPE_CREATURE)
2712 ProcessCreatureRespawn(spawnId);
2713 else if (type == SPAWN_TYPE_GAMEOBJECT)
2714 ProcessGameObjectRespawn(spawnId);
2715 }
2716}
SpawnObjectType
Definition SpawnData.h:26
void ProcessCreatureRespawn(ObjectGuid::LowType spawnId)
Definition Map.cpp:2718
void ProcessGameObjectRespawn(ObjectGuid::LowType spawnId)
Definition Map.cpp:2779

References _respawnQueue, GameTime::GetGameTime(), ProcessCreatureRespawn(), ProcessGameObjectRespawn(), SPAWN_TYPE_CREATURE, and SPAWN_TYPE_GAMEOBJECT.

Referenced by Update().

◆ RemoveAllObjectsInRemoveList()

void Map::RemoveAllObjectsInRemoveList ( )
1785{
1786 while (!i_objectsToRemove.empty())
1787 {
1788 std::unordered_set<WorldObject*>::iterator itr = i_objectsToRemove.begin();
1789 WorldObject* obj = *itr;
1790 i_objectsToRemove.erase(itr);
1791
1792 switch (obj->GetTypeId())
1793 {
1794 case TYPEID_CORPSE:
1795 {
1796 Corpse* corpse = ObjectAccessor::GetCorpse(*obj, obj->GetGUID());
1797 if (!corpse)
1798 LOG_ERROR("maps", "Tried to delete corpse/bones {} that is not in map.", obj->GetGUID().ToString());
1799 else
1800 RemoveFromMap(corpse, true);
1801 break;
1802 }
1804 RemoveFromMap((DynamicObject*)obj, true);
1805 break;
1806 case TYPEID_GAMEOBJECT:
1807 if (Transport* transport = obj->ToGameObject()->ToTransport())
1808 RemoveFromMap(transport, true);
1809 else
1810 RemoveFromMap(obj->ToGameObject(), true);
1811 break;
1812 case TYPEID_UNIT:
1813 // in case triggered sequence some spell can continue casting after prev CleanupsBeforeDelete call
1814 // make sure that like sources auras/etc removed before destructor start
1816 RemoveFromMap(obj->ToCreature(), true);
1817 break;
1818 default:
1819 LOG_ERROR("maps", "Non-grid object (TypeId: {}) is in grid object remove list, ignored.", obj->GetTypeId());
1820 break;
1821 }
1822 }
1823}
@ TYPEID_DYNAMICOBJECT
Definition ObjectGuid.h:38
@ TYPEID_GAMEOBJECT
Definition ObjectGuid.h:37
@ TYPEID_UNIT
Definition ObjectGuid.h:35
@ TYPEID_CORPSE
Definition ObjectGuid.h:39
void RemoveFromMap(T *, bool)
Definition Map.cpp:737
void CleanupsBeforeDelete(bool finalCleanup=true) override
Definition Unit.cpp:12620
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(), ObjectGuid::ToString(), GameObject::ToTransport(), TYPEID_CORPSE, TYPEID_DYNAMICOBJECT, TYPEID_GAMEOBJECT, and TYPEID_UNIT.

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

◆ RemoveAllPlayers()

void Map::RemoveAllPlayers ( )
virtual

Reimplemented in BattlegroundMap.

1026{
1027 if (HavePlayers())
1028 {
1029 for (MapRefMgr::iterator itr = m_mapRefMgr.begin(); itr != m_mapRefMgr.end(); ++itr)
1030 {
1031 Player* player = itr->GetSource();
1032 if (!player->IsBeingTeleportedFar())
1033 {
1034 // this is happening for bg
1035 LOG_ERROR("maps", "Map::UnloadAll: player {} is still in map {} during unload, this should not happen!", player->GetName(), GetId());
1036 player->TeleportTo(player->m_homebindMapId, player->m_homebindX, player->m_homebindY, player->m_homebindZ, player->GetOrientation());
1037 }
1038 }
1039 }
1040}
float m_homebindZ
Definition Player.h:2411
bool IsBeingTeleportedFar() const
Definition Player.h:2112
uint32 m_homebindMapId
Definition Player.h:2407
float m_homebindY
Definition Player.h:2410
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1353
float m_homebindX
Definition Player.h:2409
std::string const & GetName() const
Definition Object.h:528

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)
2973{
2974 ASSERT(corpse);
2975 GridCoord const gridCoord = Acore::ComputeGridCoord(corpse->GetPositionX(), corpse->GetPositionY());
2976
2977 corpse->DestroyForVisiblePlayers();
2978 if (corpse->IsInGrid())
2979 RemoveFromMap(corpse, false);
2980 else
2981 {
2982 corpse->RemoveFromWorld();
2983 corpse->ResetMap();
2984 }
2985
2986 _corpsesByGrid[gridCoord.GetId()].erase(corpse);
2987 if (corpse->GetType() != CORPSE_BONES)
2988 _corpsesByPlayer.erase(corpse->GetOwnerGUID());
2989 else
2990 _corpseBones.erase(corpse);
2991}
void RemoveFromWorld() override
Definition Corpse.cpp:52
bool IsInGrid() const
Definition Object.h:364
virtual void ResetMap()
Definition Object.cpp:2160
void DestroyForVisiblePlayers()
Definition Object.cpp:2995

References _corpseBones, _corpsesByGrid, _corpsesByPlayer, ASSERT, Acore::ComputeGridCoord(), CORPSE_BONES, WorldObject::DestroyForVisiblePlayers(), 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)
2414{
2415 auto itr = _creatureRespawnTimes.find(spawnId);
2416 if (itr != _creatureRespawnTimes.end())
2417 {
2418 _respawnQueue.erase({itr->second, SPAWN_TYPE_CREATURE, spawnId});
2419 _creatureRespawnTimes.erase(itr);
2420 }
2421
2423 stmt->SetData(0, spawnId);
2424 stmt->SetData(1, GetId());
2425 stmt->SetData(2, GetInstanceId());
2426 CharacterDatabase.Execute(stmt);
2427}
@ CHAR_DEL_CREATURE_RESPAWN
Definition CharacterDatabase.h:254

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

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

◆ RemoveDynamicObjectFromMoveList()

void Map::RemoveDynamicObjectFromMoveList ( DynamicObject go)
private

◆ RemoveFromMap() [1/2]

template<class T >
void Map::RemoveFromMap ( T *  obj,
bool  remove 
)
738{
739 obj->RemoveFromWorld();
740
741 obj->RemoveFromGrid();
742
743 obj->ResetMap();
744
745 if (remove)
746 {
748 DeleteFromWorld(obj);
749 }
750}
void RemoveObjectFromMapUpdateList(WorldObject *obj)
Definition Map.cpp:615
void DeleteFromWorld(T *)
Definition Map.cpp:165

References DeleteFromWorld(), and RemoveObjectFromMapUpdateList().

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

◆ RemoveFromMap() [2/2]

template<>
void Map::RemoveFromMap ( Transport obj,
bool  remove 
)
754{
755 obj->RemoveFromWorld();
756
757 Map::PlayerList const& players = GetPlayers();
758 if (!players.IsEmpty())
759 {
760 UpdateData data;
761 obj->BuildOutOfRangeUpdateBlock(&data);
762 WorldPacket packet;
763 data.BuildPacket(packet);
764 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
765 if (itr->GetSource()->GetTransport() != obj)
766 itr->GetSource()->SendDirectMessage(&packet);
767 }
768
770 {
771 TransportsContainer::iterator itr = _transports.find(obj);
772 if (itr == _transports.end())
773 return;
774 if (itr == _transportsUpdateIter)
776 _transports.erase(itr);
777 }
778 else
779 _transports.erase(obj);
780
781 obj->ResetMap();
782
784
785 if (remove)
786 {
787 // if option set then object already saved at this moment
788 if (!sWorld->getBoolConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY))
789 obj->SaveRespawnTime();
790 DeleteFromWorld(obj);
791 }
792}
@ CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY
Definition WorldConfig.h:48
void RemoveFromWorld() override
Definition GameObject.cpp:184
void SaveRespawnTime() override
Definition GameObject.h:244
void BuildOutOfRangeUpdateBlock(UpdateData *data) const
Definition Object.cpp:258

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

◆ RemoveGameObjectFromMoveList()

void Map::RemoveGameObjectFromMoveList ( GameObject go)
private

◆ RemoveGameObjectModel()

void Map::RemoveGameObjectModel ( const GameObjectModel model)
inline

◆ RemoveGORespawnTime()

void Map::RemoveGORespawnTime ( ObjectGuid::LowType  dbGuid)
2459{
2460 auto itr = _goRespawnTimes.find(spawnId);
2461 if (itr != _goRespawnTimes.end())
2462 {
2463 _respawnQueue.erase({itr->second, SPAWN_TYPE_GAMEOBJECT, spawnId});
2464 _goRespawnTimes.erase(itr);
2465 }
2466
2468 stmt->SetData(0, spawnId);
2469 stmt->SetData(1, GetId());
2470 stmt->SetData(2, GetInstanceId());
2471 CharacterDatabase.Execute(stmt);
2472}
@ CHAR_DEL_GO_RESPAWN
Definition CharacterDatabase.h:259

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

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

◆ RemoveObjectFromMapUpdateList()

void Map::RemoveObjectFromMapUpdateList ( WorldObject obj)

◆ RemoveOldCorpses()

void Map::RemoveOldCorpses ( )
3047{
3048 time_t now = GameTime::GetGameTime().count();
3049
3050 std::vector<ObjectGuid> corpses;
3051 corpses.reserve(_corpsesByPlayer.size());
3052
3053 for (auto const& p : _corpsesByPlayer)
3054 if (p.second->IsExpired(now))
3055 corpses.push_back(p.first);
3056
3057 for (ObjectGuid const& ownerGuid : corpses)
3058 ConvertCorpseToBones(ownerGuid);
3059
3060 std::vector<Corpse*> expiredBones;
3061 for (Corpse* bones : _corpseBones)
3062 if (bones->IsExpired(now))
3063 expiredBones.push_back(bones);
3064
3065 for (Corpse* bones : expiredBones)
3066 {
3067 RemoveCorpse(bones);
3068 delete bones;
3069 }
3070}

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

Referenced by server_commandscript::HandleServerCorpsesCommand(), and UpdateExpiredCorpses().

◆ RemovePlayerFromMap()

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

Reimplemented in InstanceMap, and BattlegroundMap.

712{
714
715 player->GetThreatMgr().RemoveMeFromThreatLists(); // pussywizard: multithreading crashfix
716
717 player->RemoveFromWorld();
718 SendRemoveTransports(player);
719
720 if (player->IsInGrid())
721 player->RemoveFromGrid();
722 else
723 ASSERT(remove); //maybe deleted in logoutplayer when player is not in a map
724
725 sScriptMgr->OnPlayerLeaveMap(this, player);
726 if (remove)
727 {
728 DeleteFromWorld(player);
729 }
730}
#define MAP_INVALID_ZONE
Definition Map.cpp:48
void UpdatePlayerZoneStats(uint32 oldZone, uint32 newZone)
Definition Map.cpp:413
void SendRemoveTransports(Player *player)
Definition Map.cpp:1681
void RemoveFromWorld() override
Definition Player.cpp:1710
void RemoveMeFromThreatLists()
Definition ThreatManager.cpp:789
ThreatManager & GetThreatMgr()
Definition Unit.h:951
uint32 GetZoneId() const
Definition Object.cpp:3111

References ASSERT, DeleteFromWorld(), Unit::GetThreatMgr(), WorldObject::GetZoneId(), GridObject< T >::IsInGrid(), MAP_INVALID_ZONE, GridObject< T >::RemoveFromGrid(), Player::RemoveFromWorld(), ThreatManager::RemoveMeFromThreatLists(), SendRemoveTransports(), sScriptMgr, and UpdatePlayerZoneStats().

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

◆ RemoveRespawnTime()

void Map::RemoveRespawnTime ( SpawnObjectType  type,
ObjectGuid::LowType  spawnId 
)
inline
458 {
459 switch (type)
460 {
463 break;
465 RemoveGORespawnTime(spawnId);
466 break;
467 default:
468 break;
469 }
470 }

References RemoveCreatureRespawnTime(), RemoveGORespawnTime(), SPAWN_TYPE_CREATURE, and SPAWN_TYPE_GAMEOBJECT.

Referenced by SpawnGroupDespawn(), and SpawnGroupSpawn().

◆ RemoveUpdateObject()

void Map::RemoveUpdateObject ( Object obj)
inline
531 {
532 _updateObjects.erase(obj);
533 }

References _updateObjects.

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

◆ RemoveWorldObjectFromFarVisibleMap()

void Map::RemoveWorldObjectFromFarVisibleMap ( WorldObject obj)
651{
652 if (Creature* creature = obj->ToCreature())
653 {
654 Cell curr_cell = creature->GetCurrentCell();
655 MapGridType* grid = GetMapGrid(curr_cell.GridX(), curr_cell.GridY());
656 grid->RemoveFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), creature);
657 }
658 else if (GameObject* go = obj->ToGameObject())
659 {
660 Cell curr_cell = go->GetCurrentCell();
661 MapGridType* grid = GetMapGrid(curr_cell.GridX(), curr_cell.GridY());
662 grid->RemoveFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), go);
663 }
664}
void RemoveFarVisibleObject(uint16 const x, uint16 const y, SPECIFIC_OBJECT *obj)
Definition MapGrid.h:64

References Cell::CellX(), Cell::CellY(), GetMapGrid(), Cell::GridX(), Cell::GridY(), MapGrid< GRID_OBJECT_TYPES, FAR_VISIBLE_OBJECT_TYPES >::RemoveFarVisibleObject(), Object::ToCreature(), and Object::ToGameObject().

Referenced by MoveAllCreaturesInMoveList(), MoveAllGameObjectsInMoveList(), and WorldObject::RemoveFromMapVisibilityOverrideContainers().

◆ RemoveWorldObjectFromZoneWideVisibleMap()

void Map::RemoveWorldObjectFromZoneWideVisibleMap ( uint32  zoneId,
WorldObject obj 
)
673{
674 ZoneWideVisibleWorldObjectsMap::iterator itr = _zoneWideVisibleWorldObjectsMap.find(zoneId);
675 if (itr == _zoneWideVisibleWorldObjectsMap.end())
676 return;
677
678 itr->second.erase(obj);
679}

References _zoneWideVisibleWorldObjectsMap.

Referenced by WorldObject::ProcessPositionDataChanged(), and WorldObject::RemoveFromMapVisibilityOverrideContainers().

◆ resetMarkedCells()

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

References marked_cells.

Referenced by Update().

◆ SaveCreatureRespawnTime()

void Map::SaveCreatureRespawnTime ( ObjectGuid::LowType  dbGuid,
time_t &  respawnTime 
)
2385{
2386 if (!respawnTime)
2387 {
2388 // Delete only
2390 return;
2391 }
2392
2393 time_t now = GameTime::GetGameTime().count();
2394 if (GetInstanceResetPeriod() > 0 && respawnTime - now + 5 >= GetInstanceResetPeriod())
2395 respawnTime = now + YEAR;
2396
2397 // Remove old queue entry if updating an existing respawn time
2398 auto itr = _creatureRespawnTimes.find(spawnId);
2399 if (itr != _creatureRespawnTimes.end())
2400 _respawnQueue.erase({itr->second, SPAWN_TYPE_CREATURE, spawnId});
2401
2402 _creatureRespawnTimes[spawnId] = respawnTime;
2403 _respawnQueue.insert({respawnTime, SPAWN_TYPE_CREATURE, spawnId});
2404
2406 stmt->SetData(0, spawnId);
2407 stmt->SetData(1, uint32(respawnTime));
2408 stmt->SetData(2, GetId());
2409 stmt->SetData(3, GetInstanceId());
2410 CharacterDatabase.Execute(stmt);
2411}
@ CHAR_REP_CREATURE_RESPAWN
Definition CharacterDatabase.h:253
constexpr auto YEAR
Definition Common.h:52
time_t GetInstanceResetPeriod() const
Definition Map.h:433

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

Referenced by misc_commandscript::HandleRespawnAllCommand(), Creature::Respawn(), and Creature::SaveRespawnTime().

◆ SaveGORespawnTime()

void Map::SaveGORespawnTime ( ObjectGuid::LowType  dbGuid,
time_t &  respawnTime 
)
2430{
2431 if (!respawnTime)
2432 {
2433 // Delete only
2434 RemoveGORespawnTime(spawnId);
2435 return;
2436 }
2437
2438 time_t now = GameTime::GetGameTime().count();
2439 if (GetInstanceResetPeriod() > 0 && respawnTime - now + 5 >= GetInstanceResetPeriod())
2440 respawnTime = now + YEAR;
2441
2442 // Remove old queue entry if updating an existing respawn time
2443 auto itr = _goRespawnTimes.find(spawnId);
2444 if (itr != _goRespawnTimes.end())
2445 _respawnQueue.erase({itr->second, SPAWN_TYPE_GAMEOBJECT, spawnId});
2446
2447 _goRespawnTimes[spawnId] = respawnTime;
2448 _respawnQueue.insert({respawnTime, SPAWN_TYPE_GAMEOBJECT, spawnId});
2449
2451 stmt->SetData(0, spawnId);
2452 stmt->SetData(1, uint32(respawnTime));
2453 stmt->SetData(2, GetId());
2454 stmt->SetData(3, GetInstanceId());
2455 CharacterDatabase.Execute(stmt);
2456}
@ CHAR_REP_GO_RESPAWN
Definition CharacterDatabase.h:258

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

Referenced by misc_commandscript::HandleRespawnAllCommand(), and GameObject::SaveRespawnTime().

◆ ScheduleCreatureRespawn()

void Map::ScheduleCreatureRespawn ( ObjectGuid  creatureGuid,
Milliseconds  respawnTimer,
Position  pos = Position() 
)
3073{
3074 Events.AddEventAtOffset([this, creatureGuid, pos]()
3075 {
3076 if (Creature* creature = GetCreature(creatureGuid))
3077 creature->Respawn();
3078 else
3079 SummonCreature(creatureGuid.GetEntry(), pos);
3080 }, respawnTimer);
3081}
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:2187
Creature * GetCreature(ObjectGuid const &guid)
Definition Map.cpp:2349
uint32 GetEntry() const
Definition ObjectGuid.h:144

References GetCreature(), ObjectGuid::GetEntry(), 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:85
ObjectGuid targetGUID
Definition Map.h:87
ObjectGuid ownerGUID
Definition Map.h:88
ObjectGuid sourceGUID
Definition Map.h:86
ScriptInfo const * script
Definition Map.h:89

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);
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(Milliseconds(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()->MoveIdle();
884
885 switch (step.script->Movement.MovementType)
886 {
888 cSource->GetMotionMaster()->MoveRandom((float)step.script->Movement.MovementDistance);
889 break;
891 cSource->GetMotionMaster()->MoveWaypoint(step.script->Movement.Path, false);
892 break;
893 }
894 }
895 break;
896
897 default:
898 LOG_ERROR("maps.script", "Unknown script command {}.", step.script->GetDebugInfo());
899 break;
900 }
901
902 m_scriptSchedule.erase(iter);
903 iter = m_scriptSchedule.begin();
904 sScriptMgr->DecreaseScheduledScriptCount();
905 }
906}
@ CHAT_TYPE_SAY
Definition CreatureData.h:412
@ CHAT_TYPE_TEXT_EMOTE
Definition CreatureData.h:414
@ CHAT_TYPE_BOSS_EMOTE
Definition CreatureData.h:415
@ CHAT_TYPE_WHISPER
Definition CreatureData.h:416
@ CHAT_TYPE_YELL
Definition CreatureData.h:413
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:27
@ 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
@ FORCED_MOVEMENT_NONE
Definition MotionMaster.h:86
ScriptMapMap * GetScriptsMapByType(ScriptsType type)
Definition ObjectMgr.cpp:84
@ SF_CASTSPELL_SOURCE_TO_SOURCE
Definition ObjectMgr.h:175
@ SF_CASTSPELL_SOURCE_TO_TARGET
Definition ObjectMgr.h:174
@ SF_CASTSPELL_TRIGGERED
Definition ObjectMgr.h:179
@ SF_CASTSPELL_TARGET_TO_SOURCE
Definition ObjectMgr.h:177
@ SF_REMOVEAURA_REVERSE
Definition ObjectMgr.h:171
@ SF_PLAYSOUND_DISTANCE_SOUND
Definition ObjectMgr.h:183
@ SF_TALK_USE_PLAYER
Definition ObjectMgr.h:159
@ SF_TELEPORT_USE_CREATURE
Definition ObjectMgr.h:165
@ SF_KILLCREDIT_REWARD_GROUP
Definition ObjectMgr.h:168
@ SF_PLAYSOUND_TARGET_PLAYER
Definition ObjectMgr.h:182
@ SF_CASTSPELL_TARGET_TO_TARGET
Definition ObjectMgr.h:176
@ SF_EMOTE_USE_STATE
Definition ObjectMgr.h:162
@ SF_CASTSPELL_SEARCH_CREATURE
Definition ObjectMgr.h:178
@ SF_PLAYSOUND_DISTANCE_RADIUS
Definition ObjectMgr.h:184
@ SF_ORIENTATION_FACE_TARGET
Definition ObjectMgr.h:187
@ SCRIPT_COMMAND_EMOTE
Definition ObjectMgr.h:94
@ SCRIPT_COMMAND_CREATE_ITEM
Definition ObjectMgr.h:110
@ SCRIPT_COMMAND_DESPAWN_SELF
Definition ObjectMgr.h:111
@ SCRIPT_COMMAND_CAST_SPELL
Definition ObjectMgr.h:108
@ SCRIPT_COMMAND_RESPAWN_GAMEOBJECT
Definition ObjectMgr.h:102
@ SCRIPT_COMMAND_QUEST_EXPLORED
Definition ObjectMgr.h:100
@ SCRIPT_COMMAND_ACTIVATE_OBJECT
Definition ObjectMgr.h:106
@ SCRIPT_COMMAND_TALK
Definition ObjectMgr.h:93
@ SCRIPT_COMMAND_EQUIP
Definition ObjectMgr.h:119
@ SCRIPT_COMMAND_FIELD_SET
Definition ObjectMgr.h:95
@ SCRIPT_COMMAND_PLAYMOVIE
Definition ObjectMgr.h:122
@ SCRIPT_COMMAND_CALLSCRIPT_TO_UNIT
Definition ObjectMgr.h:114
@ SCRIPT_COMMAND_TELEPORT_TO
Definition ObjectMgr.h:99
@ SCRIPT_COMMAND_MOVE_TO
Definition ObjectMgr.h:96
@ SCRIPT_COMMAND_FLAG_SET
Definition ObjectMgr.h:97
@ SCRIPT_COMMAND_TEMP_SUMMON_CREATURE
Definition ObjectMgr.h:103
@ SCRIPT_COMMAND_MOVEMENT
Definition ObjectMgr.h:123
@ SCRIPT_COMMAND_KILL_CREDIT
Definition ObjectMgr.h:101
@ SCRIPT_COMMAND_KILL
Definition ObjectMgr.h:115
@ SCRIPT_COMMAND_LOAD_PATH
Definition ObjectMgr.h:113
@ SCRIPT_COMMAND_ORIENTATION
Definition ObjectMgr.h:118
@ SCRIPT_COMMAND_PLAY_SOUND
Definition ObjectMgr.h:109
@ SCRIPT_COMMAND_MODEL
Definition ObjectMgr.h:120
@ SCRIPT_COMMAND_CLOSE_GOSSIP
Definition ObjectMgr.h:121
@ SCRIPT_COMMAND_REMOVE_AURA
Definition ObjectMgr.h:107
@ SCRIPT_COMMAND_FLAG_REMOVE
Definition ObjectMgr.h:98
std::map< uint32, ScriptMap > ScriptMapMap
Definition ObjectMgr.h:387
ScriptsType
Definition ObjectMgr.h:146
@ TEMPSUMMON_TIMED_OR_DEAD_DESPAWN
Definition Object.h:49
std::vector< ItemPosCount > ItemPosCountVec
Definition Player.h:757
Creature * GetClosestCreatureWithEntry(WorldObject *source, uint32 entry, float maxSearchRange, bool alive)
Definition ScriptedCreature.cpp:933
@ GAMEOBJECT_TYPE_TRAP
Definition SharedDefines.h:1570
@ GAMEOBJECT_TYPE_FISHINGNODE
Definition SharedDefines.h:1581
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition SharedDefines.h:3427
@ UNIT_NPC_EMOTESTATE
Definition UpdateFields.h:140
@ OBJECT_FIELD_ENTRY
Definition UpdateFields.h:27
#define sWaypointMgr
Definition WaypointMgr.h:54
bool isSpawned() const
Definition GameObject.h:190
void SetLootState(LootState s, Unit *unit=nullptr)
Definition GameObject.cpp:2462
void SetRespawnTime(int32 respawn)
Definition GameObject.cpp:1284
void Use(Unit *user)
Definition GameObject.cpp:1460
static T * Find(ObjectGuid guid)
Definition ObjectAccessor.cpp:53
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
Pet * GetPet(ObjectGuid const &guid)
Definition Map.cpp:2359
Creature * _GetScriptCreature(Object *obj, bool isSource, const ScriptInfo *scriptInfo) const
Definition MapScripts.cpp:186
Corpse * GetCorpse(ObjectGuid const &guid)
Definition Map.cpp:2344
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
void _ScriptProcessDoor(Object *source, Object *target, const ScriptInfo *scriptInfo) const
Definition MapScripts.cpp:217
Transport * GetTransport(ObjectGuid const &guid)
Definition Map.cpp:2364
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
void MoveWaypoint(uint32 path_id, bool repeatable, PathSource pathSource=PathSource::WAYPOINT_MGR)
Move the unit following a specific path. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:913
void MovePoint(uint32 id, const Position &pos, ForcedMovement forcedMovement=FORCED_MOVEMENT_NONE, float speed=0.f, bool generatePath=true, bool forceDestination=true, std::optional< AnimTier > animTier=std::nullopt)
Definition MotionMaster.h:240
Definition Object.h:105
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:1962
void GroupEventHappens(uint32 questId, WorldObject const *pEventObject)
Definition PlayerQuest.cpp:1853
void SendMovieStart(uint32 MovieId)
Definition Player.cpp:5704
void FailQuest(uint32 quest_id)
Definition PlayerQuest.cpp:887
PlayerMenu * PlayerTalkClass
Definition Player.h:2275
void RewardPlayerAndGroupAtEvent(uint32 creature_id, WorldObject *pRewardSource)
Definition Player.cpp:12766
void SetFacingToObject(WorldObject *object, Milliseconds timed=0ms)
Definition Unit.cpp:16456
void SetFacingTo(float ori)
Definition Unit.cpp:16446
virtual void Say(std::string_view text, Language language, WorldObject const *target=nullptr)
Definition Unit.cpp:17175
virtual void Yell(std::string_view text, Language language, WorldObject const *target=nullptr)
Definition Unit.cpp:17180
MotionMaster * GetMotionMaster()
Definition Unit.h:1759
virtual void TextEmote(std::string_view text, WorldObject const *target=nullptr, bool isBossEmote=false)
Definition Unit.cpp:17185
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:1375
void NearTeleportTo(Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
Definition Unit.cpp:15950
virtual void Whisper(std::string_view text, Language language, Player *target, bool isBossWhisper=false)
Definition Unit.cpp:17190
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:1377
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1295
Creature * SummonTrigger(float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
Definition Object.cpp:2442
Player * GetPlayer(Map const *, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:220
Definition ChatCommandTags.h:258
float Orientation
Definition ObjectMgr.h:251
uint32 Flags
Definition ObjectMgr.h:208
struct ScriptInfo::@270::@296 Movement
struct ScriptInfo::@270::@273 Talk
uint32 FieldID
Definition ObjectMgr.h:220
uint32 QuestID
Definition ObjectMgr.h:256
float SearchRadius
Definition ObjectMgr.h:305
struct ScriptInfo::@270::@280 KillCredit
struct ScriptInfo::@270::@287 CreateItem
struct ScriptInfo::@270::@289 LoadPath
int32 TextID
Definition ObjectMgr.h:209
struct ScriptInfo::@270::@293 Equip
struct ScriptInfo::@270::@290 CallScript
uint32 MovementType
Definition ObjectMgr.h:377
uint32 MovementDistance
Definition ObjectMgr.h:378
struct ScriptInfo::@270::@278 TeleportTo
float DestX
Definition ObjectMgr.h:230
uint32 ItemEntry
Definition ObjectMgr.h:317
struct ScriptInfo::@270::@285 CastSpell
uint32 ChatType
Definition ObjectMgr.h:207
struct ScriptInfo::@270::@295 PlayMovie
uint32 SoundID
Definition ObjectMgr.h:310
uint32 CheckIfExists
Definition ObjectMgr.h:276
uint32 ScriptID
Definition ObjectMgr.h:335
uint32 ModelID
Definition ObjectMgr.h:365
struct ScriptInfo::@270::@275 FieldSet
uint32 FieldValue
Definition ObjectMgr.h:221
struct ScriptInfo::@270::@291 Kill
float PosY
Definition ObjectMgr.h:279
float DestY
Definition ObjectMgr.h:231
uint32 PathID
Definition ObjectMgr.h:328
uint32 MapID
Definition ObjectMgr.h:244
uint32 IsRepeatable
Definition ObjectMgr.h:329
int32 Path
Definition ObjectMgr.h:379
int32 RemoveCorpse
Definition ObjectMgr.h:343
float PosZ
Definition ObjectMgr.h:280
struct ScriptInfo::@270::@284 RemoveAura
uint32 ScriptType
Definition ObjectMgr.h:336
struct ScriptInfo::@270::@277 FlagToggle
struct ScriptInfo::@270::@282 TempSummonCreature
uint32 DespawnDelay
Definition ObjectMgr.h:269
float PosX
Definition ObjectMgr.h:278
int32 Radius
Definition ObjectMgr.h:312
struct ScriptInfo::@270::@288 DespawnSelf
uint32 TravelTime
Definition ObjectMgr.h:227
uint32 Distance
Definition ObjectMgr.h:257
uint32 SpellID
Definition ObjectMgr.h:295
float DestZ
Definition ObjectMgr.h:232
uint32 MovieID
Definition ObjectMgr.h:372
struct ScriptInfo::@270::@279 QuestExplored
struct ScriptInfo::@270::@276 MoveTo
struct ScriptInfo::@270::@281 RespawnGameobject
struct ScriptInfo::@270::@286 Playsound
uint32 EquipmentID
Definition ObjectMgr.h:360
uint32 CreatureEntry
Definition ObjectMgr.h:262
uint32 Amount
Definition ObjectMgr.h:318
struct ScriptInfo::@270::@274 Emote
struct ScriptInfo::@270::@294 Model
uint32 EmoteID
Definition ObjectMgr.h:214

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, FORCED_MOVEMENT_NONE, 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(), Unit::GetMotionMaster(), 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, ScriptInfo::Movement, ScriptInfo::MovementDistance, ScriptInfo::MovementType, MotionMaster::MovePoint(), 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:386

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(), WaypointMovementGenerator< Creature >::DoUpdate(), Spell::EffectDummy(), Spell::EffectScriptEffect(), Spell::EffectSendEvent(), WaypointMovementGenerator< Creature >::ProcessWaypointArrival(), ScriptsProcess(), and GameObject::Use().

◆ SendInitSelf()

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

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)
1663{
1664 if (_transports.empty())
1665 return;
1666
1667 // Hack to send out transports
1668 UpdateData transData;
1669 for (TransportsContainer::const_iterator itr = _transports.begin(); itr != _transports.end(); ++itr)
1670 if (*itr != player->GetTransport())
1671 (*itr)->BuildCreateUpdateBlockForPlayer(&transData, player);
1672
1673 if (!transData.HasData())
1674 return;
1675
1676 WorldPacket packet;
1677 transData.BuildPacket(packet);
1678 player->SendDirectMessage(&packet);
1679}
bool HasData() const
Definition UpdateData.h:60

References _transports, UpdateData::BuildPacket(), WorldObject::GetTransport(), UpdateData::HasData(), and Player::SendDirectMessage().

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

◆ SendObjectUpdates()

void Map::SendObjectUpdates ( )
private
1701{
1702 UpdateDataMapType update_players;
1703
1704 while (!_updateObjects.empty())
1705 {
1706 Object* obj = *_updateObjects.begin();
1707 ASSERT(obj->IsInWorld());
1708
1709 _updateObjects.erase(_updateObjects.begin());
1710 obj->BuildUpdate(update_players);
1711 }
1712
1713 WorldPacket packet; // here we allocate a std::vector with a size of 0x10000
1714 for (UpdateDataMapType::iterator iter = update_players.begin(); iter != update_players.end(); ++iter)
1715 {
1716 iter->second.BuildPacket(packet);
1717 iter->first->SendDirectMessage(&packet);
1718 packet.clear(); // clean the string
1719 }
1720}
std::unordered_map< Player *, UpdateData > UpdateDataMapType
Definition Object.h:100
virtual void BuildUpdate(UpdateDataMapType &)
Definition Object.h:192

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

Referenced by Update().

◆ SendRemoveTransports()

void Map::SendRemoveTransports ( Player player)
1682{
1683 if (_transports.empty())
1684 return;
1685
1686 // Hack to send out transports
1687 UpdateData transData;
1688 for (TransportsContainer::const_iterator itr = _transports.begin(); itr != _transports.end(); ++itr)
1689 if (*itr != player->GetTransport())
1690 (*itr)->BuildOutOfRangeUpdateBlock(&transData);
1691
1692 if (!transData.HasData())
1693 return;
1694
1695 WorldPacket packet;
1696 transData.BuildPacket(packet);
1697 player->SendDirectMessage(&packet);
1698}

References _transports, UpdateData::BuildPacket(), WorldObject::GetTransport(), UpdateData::HasData(), and Player::SendDirectMessage().

Referenced by RemovePlayerFromMap().

◆ SendToPlayers()

void Map::SendToPlayers ( WorldPacket const *  data) const
1836{
1837 for (MapRefMgr::const_iterator itr = m_mapRefMgr.begin(); itr != m_mapRefMgr.end(); ++itr)
1838 itr->GetSource()->SendDirectMessage(data);
1839}

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

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

◆ SendZoneDynamicInfo()

void Map::SendZoneDynamicInfo ( uint32  zoneId,
Player player 
) const
3113{
3114 ZoneDynamicInfoMap::const_iterator itr = _zoneDynamicInfo.find(zoneId);
3115 if (itr == _zoneDynamicInfo.end())
3116 return;
3117
3118 if (uint32 music = itr->second.MusicId)
3119 player->SendDirectMessage(WorldPackets::Misc::PlayMusic(music).Write());
3120
3121 SendZoneWeather(itr->second, player);
3122
3123 if (uint32 overrideLight = itr->second.OverrideLightId)
3124 {
3125 WorldPacket data(SMSG_OVERRIDE_LIGHT, 4 + 4 + 4);
3126 data << uint32(_defaultLight);
3127 data << uint32(overrideLight);
3128 data << uint32(itr->second.LightFadeInTime);
3129 player->SendDirectMessage(&data);
3130 }
3131}
void SendZoneWeather(uint32 zoneId, Player *player) const
Definition Map.cpp:3133
Definition MiscPackets.h:58
@ SMSG_OVERRIDE_LIGHT
Definition Opcodes.h:1072

References _defaultLight, _zoneDynamicInfo, Player::SendDirectMessage(), SendZoneWeather(), and SMSG_OVERRIDE_LIGHT.

Referenced by Player::UpdateZone().

◆ SendZoneMessage()

bool Map::SendZoneMessage ( uint32  zone,
WorldPacket const *  packet,
WorldSession const *  self = nullptr,
TeamId  teamId = TEAM_NEUTRAL 
) const

Send a packet to all players (or players selected team) in the zone (except self if mentioned)

3085{
3086 bool foundPlayerToSend = false;
3087
3088 for (MapReference const& ref : GetPlayers())
3089 {
3090 Player* player = ref.GetSource();
3091 if (player->IsInWorld() &&
3092 player->GetZoneId() == zone &&
3093 player->GetSession() != self &&
3094 (teamId == TEAM_NEUTRAL || player->GetTeamId() == teamId))
3095 {
3096 player->SendDirectMessage(packet);
3097 foundPlayerToSend = true;
3098 }
3099 }
3100
3101 return foundPlayerToSend;
3102}
@ TEAM_NEUTRAL
Definition SharedDefines.h:750
Definition MapReference.h:25
TeamId GetTeamId(bool original=false) const
Definition Player.h:2128
WorldSession * GetSession() const
Definition Player.h:2020

References GetPlayers(), Player::GetSession(), Player::GetTeamId(), WorldObject::GetZoneId(), Object::IsInWorld(), Player::SendDirectMessage(), and TEAM_NEUTRAL.

Referenced by SendZoneText(), SetZoneMusic(), SetZoneOverrideLight(), SetZoneWeather(), and Weather::UpdateWeather().

◆ SendZoneText()

void Map::SendZoneText ( uint32  zoneId,
char const *  text,
WorldSession const *  self = nullptr,
TeamId  teamId = TEAM_NEUTRAL 
) const

Send a System Message to all players in the zone (except self if mentioned)

3106{
3107 WorldPacket data;
3108 ChatHandler::BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, text);
3109 SendZoneMessage(zoneId, &data, self, teamId);
3110}
@ CHAT_MSG_SYSTEM
Definition SharedDefines.h:3385
@ LANG_UNIVERSAL
Definition SharedDefines.h:723
static std::size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition Chat.cpp:273
bool SendZoneMessage(uint32 zone, WorldPacket const *packet, WorldSession const *self=nullptr, TeamId teamId=TEAM_NEUTRAL) const
Send a packet to all players (or players selected team) in the zone (except self if mentioned)
Definition Map.cpp:3084

References ChatHandler::BuildChatPacket(), CHAT_MSG_SYSTEM, LANG_UNIVERSAL, and SendZoneMessage().

Referenced by OPvPCapturePointEP_EWT::ChangeState(), OPvPCapturePointEP_NPT::ChangeState(), OPvPCapturePointEP_CGT::ChangeState(), OPvPCapturePointEP_PWT::ChangeState(), OPvPCapturePointHP::ChangeState(), OPvPCapturePointTF::ChangeState(), OPvPCapturePointZM_Beacon::ChangeState(), OPvPCapturePointNA::FactionTakeOver(), OutdoorPvPSI::HandleAreaTrigger(), OPvPCapturePointZM_Graveyard::HandleOpenGo(), and OPvPCapturePointNA::Update().

◆ SendZoneWeather() [1/2]

void Map::SendZoneWeather ( uint32  zoneId,
Player player 
) const
3134{
3135 ZoneDynamicInfoMap::const_iterator itr = _zoneDynamicInfo.find(zoneId);
3136 if (itr == _zoneDynamicInfo.end())
3137 return;
3138
3139 SendZoneWeather(itr->second, player);
3140}

References _zoneDynamicInfo, and SendZoneWeather().

Referenced by SendZoneDynamicInfo(), and SendZoneWeather().

◆ SendZoneWeather() [2/2]

void Map::SendZoneWeather ( ZoneDynamicInfo const &  zoneDynamicInfo,
Player player 
) const
3143{
3144 if (WeatherState weatherId = zoneDynamicInfo.WeatherId)
3145 {
3146 WorldPackets::Misc::Weather weather(weatherId, zoneDynamicInfo.WeatherGrade);
3147 player->SendDirectMessage(weather.Write());
3148 }
3149 else if (zoneDynamicInfo.DefaultWeather)
3150 zoneDynamicInfo.DefaultWeather->SendWeatherUpdateToPlayer(player);
3151 else
3153}
Definition MiscPackets.h:32
WeatherState
Definition Weather.h:46
static void SendFineWeatherUpdateToPlayer(Player *player)
Definition Weather.cpp:193

References ZoneDynamicInfo::DefaultWeather, Player::SendDirectMessage(), Weather::SendFineWeatherUpdateToPlayer(), ZoneDynamicInfo::WeatherGrade, ZoneDynamicInfo::WeatherId, and WorldPackets::Misc::Weather::Write().

◆ SetVisibilityRange()

◆ SetZoneMusic()

◆ SetZoneOverrideLight()

void Map::SetZoneOverrideLight ( uint32  zoneId,
uint32  lightId,
Milliseconds  fadeInTime 
)
3219{
3220 ZoneDynamicInfo& info = _zoneDynamicInfo[zoneId];
3221 info.OverrideLightId = lightId;
3222 info.LightFadeInTime = static_cast<uint32>(fadeInTime.count());
3223
3224 WorldPacket data(SMSG_OVERRIDE_LIGHT, 4 + 4 + 4);
3225 data << uint32(_defaultLight);
3226 data << uint32(lightId);
3227 data << uint32(static_cast<uint32>(fadeInTime.count()));
3228 SendZoneMessage(zoneId, &data);
3229}
uint32 LightFadeInTime
Definition Map.h:144
uint32 OverrideLightId
Definition Map.h:143

References _defaultLight, _zoneDynamicInfo, ZoneDynamicInfo::LightFadeInTime, ZoneDynamicInfo::OverrideLightId, SendZoneMessage(), and SMSG_OVERRIDE_LIGHT.

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

◆ SetZoneWeather()

void Map::SetZoneWeather ( uint32  zoneId,
WeatherState  weatherId,
float  weatherGrade 
)

◆ SpawnGroupDespawn()

bool Map::SpawnGroupDespawn ( uint32  groupId,
bool  deleteRespawnTimes = false 
)
2634{
2635 SpawnGroupTemplateData const* groupData = sObjectMgr->GetSpawnGroupData(groupId);
2636 if (!groupData || (groupData->flags & SPAWNGROUP_FLAG_SYSTEM))
2637 {
2638 LOG_ERROR("maps", "Tried to despawn non-existing (or system) spawn group {}. Blocked.", groupId);
2639 return false;
2640 }
2641
2642 if (groupData->mapId != SPAWNGROUP_MAP_UNSET && groupData->mapId != GetId())
2643 {
2644 LOG_ERROR("maps", "Tried to despawn group {} on map {}, but group has map {}. Blocked.",
2645 groupId, GetId(), groupData->mapId);
2646 return false;
2647 }
2648
2649 // Mark group as inactive on this map (toggle to inactive state)
2650 if (groupData->flags & SPAWNGROUP_FLAG_MANUAL_SPAWN)
2651 _toggledSpawnGroupIds.erase(groupId);
2652 else
2653 _toggledSpawnGroupIds.insert(groupId);
2654
2655 std::vector<WorldObject*> toUnload;
2656 auto range = sObjectMgr->GetSpawnDataForGroup(groupId);
2657 for (auto it = range.first; it != range.second; ++it)
2658 {
2659 SpawnData const* data = it->second;
2660 ObjectGuid::LowType spawnId = data->spawnId;
2661
2662 if (deleteRespawnTimes)
2663 RemoveRespawnTime(data->type, spawnId);
2664
2665 switch (data->type)
2666 {
2668 {
2669 auto bounds = _creatureBySpawnIdStore.equal_range(spawnId);
2670 for (auto itr = bounds.first; itr != bounds.second; ++itr)
2671 toUnload.emplace_back(itr->second);
2672 break;
2673 }
2675 {
2676 auto bounds = _gameobjectBySpawnIdStore.equal_range(spawnId);
2677 for (auto itr = bounds.first; itr != bounds.second; ++itr)
2678 toUnload.emplace_back(itr->second);
2679 break;
2680 }
2681 default:
2682 break;
2683 }
2684 }
2685
2686 for (WorldObject* obj : toUnload)
2687 obj->AddObjectToRemoveList();
2688
2689 return true;
2690}
constexpr uint32 SPAWNGROUP_MAP_UNSET
Definition SpawnData.h:55
void AddObjectToRemoveList(WorldObject *obj)
Definition Map.cpp:1774
void RemoveRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId)
Definition Map.h:457
Definition SpawnData.h:66
ObjectGuid::LowType spawnId
Definition SpawnData.h:68
SpawnObjectType const type
Definition SpawnData.h:67
uint32 mapId
Definition SpawnData.h:61

References _creatureBySpawnIdStore, _gameobjectBySpawnIdStore, _toggledSpawnGroupIds, SpawnGroupTemplateData::flags, GetId(), LOG_ERROR, SpawnGroupTemplateData::mapId, RemoveRespawnTime(), sObjectMgr, SPAWN_TYPE_CREATURE, SPAWN_TYPE_GAMEOBJECT, SPAWNGROUP_FLAG_MANUAL_SPAWN, SPAWNGROUP_FLAG_SYSTEM, SPAWNGROUP_MAP_UNSET, SpawnData::spawnId, and SpawnData::type.

Referenced by gobject_commandscript::HandleGameObjectDespawnGroupCommand(), npc_commandscript::HandleNpcDespawnGroupCommand(), and SmartScript::ProcessAction().

◆ SpawnGroupSpawn()

bool Map::SpawnGroupSpawn ( uint32  groupId,
bool  ignoreRespawn = false,
bool  force = false 
)
2550{
2551 SpawnGroupTemplateData const* groupData = sObjectMgr->GetSpawnGroupData(groupId);
2552 if (!groupData || (groupData->flags & SPAWNGROUP_FLAG_SYSTEM))
2553 {
2554 LOG_ERROR("maps", "Tried to spawn non-existing (or system) spawn group {}. Blocked.", groupId);
2555 return false;
2556 }
2557
2558 if (groupData->mapId != SPAWNGROUP_MAP_UNSET && groupData->mapId != GetId())
2559 {
2560 LOG_ERROR("maps", "Tried to spawn group {} on map {}, but group has map {}. Blocked.",
2561 groupId, GetId(), groupData->mapId);
2562 return false;
2563 }
2564
2565 // Mark group as active on this map (toggle to active state)
2566 if (groupData->flags & SPAWNGROUP_FLAG_MANUAL_SPAWN)
2567 _toggledSpawnGroupIds.insert(groupId);
2568 else
2569 _toggledSpawnGroupIds.erase(groupId);
2570
2571 auto range = sObjectMgr->GetSpawnDataForGroup(groupId);
2572 for (auto it = range.first; it != range.second; ++it)
2573 {
2574 SpawnData const* data = it->second;
2575 ObjectGuid::LowType spawnId = data->spawnId;
2576
2577 // Check if there's already an alive instance
2578 if (!force)
2579 {
2580 if (data->type == SPAWN_TYPE_CREATURE)
2581 {
2582 auto bounds = _creatureBySpawnIdStore.equal_range(spawnId);
2583 bool alive = false;
2584 for (auto itr = bounds.first; itr != bounds.second; ++itr)
2585 if (itr->second->IsAlive())
2586 alive = true;
2587 if (alive)
2588 continue;
2589 }
2590 else if (data->type == SPAWN_TYPE_GAMEOBJECT)
2591 {
2592 if (_gameobjectBySpawnIdStore.count(spawnId))
2593 continue;
2594 }
2595 }
2596
2597 time_t respawnTime = GetRespawnTime(data->type, spawnId);
2598 if (respawnTime && respawnTime > GameTime::GetGameTime().count())
2599 {
2600 if (!force && !ignoreRespawn)
2601 continue;
2602 RemoveRespawnTime(data->type, spawnId);
2603 }
2604
2605 // Don't spawn if grid isn't loaded (will be handled in grid loader)
2606 if (!IsGridLoaded(data->posX, data->posY))
2607 continue;
2608
2609 switch (data->type)
2610 {
2612 {
2613 Creature* creature = new Creature();
2614 if (!creature->LoadCreatureFromDB(spawnId, this, true, true))
2615 delete creature;
2616 break;
2617 }
2619 {
2620 GameObject* gameobject = new GameObject();
2621 if (!gameobject->LoadGameObjectFromDB(spawnId, this, true))
2622 delete gameobject;
2623 break;
2624 }
2625 default:
2626 break;
2627 }
2628 }
2629
2630 return true;
2631}
time_t GetRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId) const
Definition Map.h:445

References _creatureBySpawnIdStore, _gameobjectBySpawnIdStore, _toggledSpawnGroupIds, SpawnGroupTemplateData::flags, GameTime::GetGameTime(), GetId(), GetRespawnTime(), IsGridLoaded(), Creature::LoadCreatureFromDB(), GameObject::LoadGameObjectFromDB(), LOG_ERROR, SpawnGroupTemplateData::mapId, SpawnData::posX, SpawnData::posY, RemoveRespawnTime(), sObjectMgr, SPAWN_TYPE_CREATURE, SPAWN_TYPE_GAMEOBJECT, SPAWNGROUP_FLAG_MANUAL_SPAWN, SPAWNGROUP_FLAG_SYSTEM, SPAWNGROUP_MAP_UNSET, SpawnData::spawnId, and SpawnData::type.

Referenced by gobject_commandscript::HandleGameObjectSpawnGroupCommand(), npc_commandscript::HandleNpcSpawnGroupCommand(), and SmartScript::ProcessAction().

◆ 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 
)
2188{
2189 uint32 mask = UNIT_MASK_SUMMON;
2190 if (properties)
2191 {
2192 switch (properties->Category)
2193 {
2195 mask = UNIT_MASK_GUARDIAN;
2196 break;
2198 mask = UNIT_MASK_PUPPET;
2199 break;
2201 mask = UNIT_MASK_MINION;
2202 break;
2206 {
2207 switch (properties->Type)
2208 {
2209 case SUMMON_TYPE_MINION:
2212 mask = UNIT_MASK_GUARDIAN;
2213 break;
2214 case SUMMON_TYPE_TOTEM:
2216 mask = UNIT_MASK_TOTEM;
2217 break;
2220 mask = UNIT_MASK_SUMMON;
2221 break;
2223 case SUMMON_TYPE_JEEVES:
2224 mask = UNIT_MASK_MINION;
2225 break;
2226 default:
2227 if (properties->Flags & 512) // Mirror Image, Summon Gargoyle
2228 mask = UNIT_MASK_GUARDIAN;
2229 break;
2230 }
2231 break;
2232 }
2233 default:
2234 return nullptr;
2235 }
2236 }
2237
2238 uint32 phase = PHASEMASK_NORMAL;
2239 if (summoner)
2240 phase = summoner->GetPhaseMask();
2241
2242 TempSummon* summon = nullptr;
2243 switch (mask)
2244 {
2245 case UNIT_MASK_SUMMON:
2246 summon = new TempSummon(properties, summoner ? summoner->GetGUID() : ObjectGuid::Empty);
2247 break;
2248 case UNIT_MASK_GUARDIAN:
2249 summon = new Guardian(properties, summoner ? summoner->GetGUID() : ObjectGuid::Empty);
2250 break;
2251 case UNIT_MASK_PUPPET:
2252 summon = new Puppet(properties, summoner ? summoner->GetGUID() : ObjectGuid::Empty);
2253 break;
2254 case UNIT_MASK_TOTEM:
2255 summon = new Totem(properties, summoner ? summoner->GetGUID() : ObjectGuid::Empty);
2256 break;
2257 case UNIT_MASK_MINION:
2258 summon = new Minion(properties, summoner ? summoner->GetGUID() : ObjectGuid::Empty);
2259 break;
2260 default:
2261 return nullptr;
2262 }
2263
2264 EnsureGridLoaded(Cell(pos.GetPositionX(), pos.GetPositionY()));
2265 if (!summon->Create(GenerateLowGuid<HighGuid::Unit>(), this, phase, entry, vehId, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()))
2266 {
2267 delete summon;
2268 return nullptr;
2269 }
2270
2271 summon->SetUInt32Value(UNIT_CREATED_BY_SPELL, spellId);
2272
2273 summon->SetHomePosition(pos);
2274
2275 summon->InitStats(duration);
2276
2277 summon->SetVisibleBySummonerOnly(visibleBySummonerOnly);
2278
2279 bool summonerHasTransport = summoner && summoner->GetTransport();
2280 bool summonerIsVehicle = summoner && summoner->IsUnit() && summoner->ToUnit()->IsVehicle();
2281 bool checkTransport = summon->GetOwnerGUID().IsPlayer() || (summonerHasTransport && !summonerIsVehicle);
2282 if (!AddToMap(summon->ToCreature(), checkTransport))
2283 {
2284 delete summon;
2285 return nullptr;
2286 }
2287
2288 summon->InitSummon();
2289
2290 // call MoveInLineOfSight for nearby creatures
2291 Acore::AIRelocationNotifier notifier(*summon);
2292 Cell::VisitObjects(summon, notifier, GetVisibilityRange());
2293
2294 return summon;
2295}
@ PHASEMASK_NORMAL
Definition Object.h:63
@ SUMMON_TYPE_VEHICLE2
Definition SharedDefines.h:3537
@ SUMMON_TYPE_LIGHTWELL
Definition SharedDefines.h:3538
@ SUMMON_TYPE_MINION
Definition SharedDefines.h:3530
@ SUMMON_TYPE_GUARDIAN
Definition SharedDefines.h:3529
@ SUMMON_TYPE_JEEVES
Definition SharedDefines.h:3539
@ SUMMON_TYPE_TOTEM
Definition SharedDefines.h:3531
@ SUMMON_TYPE_VEHICLE
Definition SharedDefines.h:3536
@ SUMMON_TYPE_MINIPET
Definition SharedDefines.h:3532
@ SUMMON_TYPE_GUARDIAN2
Definition SharedDefines.h:3533
@ SUMMON_CATEGORY_PET
Definition SharedDefines.h:3518
@ SUMMON_CATEGORY_VEHICLE
Definition SharedDefines.h:3520
@ SUMMON_CATEGORY_ALLY
Definition SharedDefines.h:3517
@ SUMMON_CATEGORY_PUPPET
Definition SharedDefines.h:3519
@ SUMMON_CATEGORY_WILD
Definition SharedDefines.h:3516
@ SUMMON_CATEGORY_UNK
Definition SharedDefines.h:3521
@ UNIT_MASK_PUPPET
Definition UnitDefines.h:165
@ UNIT_MASK_TOTEM
Definition UnitDefines.h:162
@ UNIT_MASK_SUMMON
Definition UnitDefines.h:159
@ UNIT_MASK_GUARDIAN
Definition UnitDefines.h:161
@ UNIT_MASK_MINION
Definition UnitDefines.h:160
@ UNIT_CREATED_BY_SPELL
Definition UpdateFields.h:138
void SetHomePosition(float x, float y, float z, float o)
Definition Creature.h:347
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:1151
Definition TemporarySummon.h:106
float GetVisibilityRange() const
Definition Map.h:198
Definition TemporarySummon.h:87
bool IsPlayer() const
Definition ObjectGuid.h:168
Definition TemporarySummon.h:125
Definition TemporarySummon.h:50
virtual void InitSummon()
Definition TemporarySummon.cpp:257
virtual void InitStats(uint32 lifetime)
Definition TemporarySummon.cpp:200
void SetVisibleBySummonerOnly(bool visibleBySummonerOnly)
Definition TemporarySummon.h:71
Definition Totem.h:51
ObjectGuid GetOwnerGUID() const
Definition Unit.h:713
void SetUInt32Value(uint16 index, uint32 value)
Definition Unit.cpp:17358
Definition GridNotifiers.h:91
static void VisitObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:165

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

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::ReplaceMoiraIfSaved(), boss_ossirian::Reset(), ScheduleCreatureRespawn(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::ScheduleNextPortal(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::SetBossState(), instance_ulduar::instance_ulduar_InstanceMapScript::SetBossState(), instance_blackrock_depths::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::SpawnLeviathanEncounterVehicles(), instance_zulfarrak::instance_zulfarrak_InstanceMapScript::SpawnPyramidWave(), SummonCreatureGroup(), instance_violet_hold::instance_violet_hold_InstanceMapScript::SummonDefenseSystem(), Spell::SummonGuardian(), instance_zulaman::instance_zulaman_InstanceMapScript::SummonHostage(), instance_molten_core::SummonMajordomoExecutus(), WorldState::SummonMouth(), WorldState::SummonPallid(), instance_blackrock_spire::SummonSolakarWave(), instance_blackwing_lair::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::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.
2305{
2306 std::vector<TempSummonData> const* data = sObjectMgr->GetSummonGroup(GetId(), SUMMONER_TYPE_MAP, group);
2307 if (!data)
2308 return;
2309
2310 for (std::vector<TempSummonData>::const_iterator itr = data->begin(); itr != data->end(); ++itr)
2311 if (TempSummon* summon = SummonCreature(itr->entry, itr->pos, nullptr, itr->time))
2312 if (list)
2313 list->push_back(summon);
2314}
@ SUMMONER_TYPE_MAP
Definition TemporarySummon.h:28

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 
)
2341{
2342 GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(entry);
2343 if (!goinfo)
2344 {
2345 LOG_ERROR("sql.sql", "Gameobject template {} not found in database!", entry);
2346 return nullptr;
2347 }
2348
2349 GameObject* go = sObjectMgr->IsGameObjectStaticTransport(entry) ? new StaticTransport() : new GameObject();
2350 if (!go->Create(GenerateLowGuid<HighGuid::GameObject>(), entry, this, PHASEMASK_NORMAL, x, y, z, ang, G3D::Quat(rotation0, rotation1, rotation2, rotation3), 100, GO_STATE_READY))
2351 {
2352 delete go;
2353 return nullptr;
2354 }
2355
2356 // Xinef: if gameobject is temporary, set custom spellid
2357 if (respawnTime)
2358 go->SetSpellId(1);
2359
2360 go->SetRespawnTime(respawnTime);
2361 go->SetSpawnedByDefault(false);
2362 AddToMap(go, checkTransport);
2363 return go;
2364}
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:270
void SetSpawnedByDefault(bool b)
Definition GameObject.h:197
void SetSpellId(uint32 id)
Definition GameObject.h:177
Definition Transport.h:115
Definition GameObjectData.h:32

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

Referenced by boss_four_horsemen::boss_four_horsemenAI::JustDied(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnGameObjectCreate(), SummonGameObject(), SummonGameObjectGroup(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::Update(), and npc_belnistrasz::npc_belnistraszAI::UpdateAI().

◆ 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 
)
2367{
2368 return SummonGameObject(entry, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), rotation0, rotation1, rotation2, rotation3, respawnTime, checkTransport);
2369}
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:2340

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

◆ SummonGameObjectGroup()

void Map::SummonGameObjectGroup ( uint8  group,
std::list< GameObject * > *  list = nullptr 
)
2317{
2318 std::vector<GameObjectSummonData> const* data = sObjectMgr->GetGameObjectSummonGroup(GetId(), SUMMONER_TYPE_MAP, group);
2319 if (!data)
2320 return;
2321
2322 for (std::vector<GameObjectSummonData>::const_iterator itr = data->begin(); itr != data->end(); ++itr)
2323 if (GameObject* go = SummonGameObject(itr->entry, itr->pos.GetPositionX(), itr->pos.GetPositionY(), itr->pos.GetPositionZ(), itr->pos.GetOrientation(), itr->rot.x, itr->rot.y, itr->rot.z, itr->rot.w, itr->respawnTime))
2324 if (list)
2325 list->push_back(go);
2326}

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

◆ ToBattlegroundMap() [1/2]

◆ ToBattlegroundMap() [2/2]

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

References IsBattlegroundOrArena().

◆ ToInstanceMap() [1/2]

◆ ToInstanceMap() [2/2]

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

References IsDungeon().

◆ ToMapInstanced() [1/2]

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

References Instanceable().

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

◆ ToMapInstanced() [2/2]

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

References Instanceable().

◆ UnloadAll()

void Map::UnloadAll ( )
virtual

Reimplemented in InstanceMap, and MapInstanced.

1043{
1044 // clear all delayed moves, useless anyway do this moves before map unload.
1045 _creaturesToMove.clear();
1046 _gameObjectsToMove.clear();
1047
1049 {
1050 MapGridType* grid = i->GetSource();
1051 ++i;
1052 if (grid)
1053 UnloadGrid(*grid);
1054 }
1055
1056 // pussywizard: crashfix, some npc can be left on transport (not a default passenger)
1057 if (!AllTransportsEmpty())
1059
1060 for (TransportsContainer::iterator itr = _transports.begin(); itr != _transports.end();)
1061 {
1062 Transport* transport = *itr;
1063 ++itr;
1064
1065 RemoveFromMap<Transport>(transport, true);
1066 }
1067
1068 _transports.clear();
1069
1070 for (auto& cellCorpsePair : _corpsesByGrid)
1071 {
1072 for (Corpse* corpse : cellCorpsePair.second)
1073 {
1074 corpse->RemoveFromWorld();
1075 corpse->ResetMap();
1076 delete corpse;
1077 }
1078 }
1079
1080 _corpsesByGrid.clear();
1081 _corpsesByPlayer.clear();
1082 _corpseBones.clear();
1083}
Definition GridRefMgr.h:28
iterator end()
Definition GridRefMgr.h:36
void AllTransportsRemovePassengers()
Definition Map.cpp:2937
bool UnloadGrid(MapGridType &grid)
Definition Map.cpp:1016
bool AllTransportsEmpty() const
Definition Map.cpp:2928

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

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

◆ UnloadGrid()

bool Map::UnloadGrid ( MapGridType grid)
1017{
1018 _mapGridManager.UnloadGrid(grid.GetX(), grid.GetY());
1019
1020 ASSERT(i_objectsToRemove.empty());
1021 LOG_DEBUG("maps", "Unloading grid[{}, {}] for map {} finished", grid.GetX(), grid.GetY(), GetId());
1022 return true;
1023}
void UnloadGrid(uint16 const x, uint16 const y)
Definition MapGridManager.cpp:49
uint16 GetY() const
Definition MapGrid.h:44
uint16 GetX() const
Definition MapGrid.h:43

References _mapGridManager, ASSERT, GetId(), MapGrid< GRID_OBJECT_TYPES, FAR_VISIBLE_OBJECT_TYPES >::GetX(), MapGrid< GRID_OBJECT_TYPES, FAR_VISIBLE_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 any due respawns (non-compatibility mode spawns)

  • Process necessary scripts

Reimplemented in InstanceMap, and MapInstanced.

431{
432 if (t_diff)
434
435 // Update world sessions and players
437 {
438 Player* player = m_mapRefIter->GetSource();
439 if (player && player->IsInWorld())
440 {
441 // Update session
442 WorldSession* session = player->GetSession();
443 MapSessionFilter updater(session);
444 session->Update(s_diff, updater);
445
446 // update players at tick
447 if (!t_diff)
448 player->Update(s_diff);
449 }
450 }
451
452 Events.Update(t_diff);
453
454 if (!t_diff)
455 {
457 return;
458 }
459
462 {
463 if (_respawnCheckTimer <= t_diff)
464 {
466 _respawnCheckTimer = 5000; // Check every 5 seconds
467 }
468 else
469 _respawnCheckTimer -= t_diff;
470 }
471
474
475 // Update players
477 {
478 Player* player = m_mapRefIter->GetSource();
479
480 if (!player || !player->IsInWorld())
481 continue;
482
483 player->Update(s_diff);
484
486 {
487 MarkNearbyCellsOf(player);
488
489 // If player is using far sight, update viewpoint
490 if (WorldObject* viewPoint = player->GetViewpoint())
491 {
492 if (Creature* viewCreature = viewPoint->ToCreature())
493 MarkNearbyCellsOf(viewCreature);
494 else if (DynamicObject* viewObject = viewPoint->ToDynObject())
495 MarkNearbyCellsOf(viewObject);
496 }
497 }
498 }
499
501
503
505 if (!m_scriptSchedule.empty())
506 {
507 i_scriptLock = true;
509 i_scriptLock = false;
510 }
511
515
517
518 UpdateWeather(t_diff);
519 UpdateExpiredCorpses(t_diff);
520
521 sScriptMgr->OnMapUpdate(this, t_diff);
522
523 METRIC_VALUE("map_creatures", uint64(GetObjectsStore().Size<Creature>()),
524 METRIC_TAG("map_id", std::to_string(GetId())),
525 METRIC_TAG("map_instanceid", std::to_string(GetInstanceId())));
526
527 METRIC_VALUE("map_gameobjects", uint64(GetObjectsStore().Size<GameObject>()),
528 METRIC_TAG("map_id", std::to_string(GetId())),
529 METRIC_TAG("map_instanceid", std::to_string(GetInstanceId())));
530}
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
@ CONFIG_RESPAWN_FORCE_COMPATIBILITY_MODE
Definition WorldConfig.h:390
void update(uint32 diff)
Definition DynamicTree.cpp:142
Definition WorldSession.h:298
void HandleDelayedVisibility()
Definition Map.cpp:690
MapStoredObjectTypesContainer & GetObjectsStore()
Definition Map.h:352
void MoveAllGameObjectsInMoveList()
Definition Map.cpp:952
void ProcessRespawns()
Definition Map.cpp:2692
void UpdateNonPlayerObjects(uint32 const diff)
Definition Map.cpp:532
void MarkNearbyCellsOf(WorldObject *obj)
Definition Map.cpp:394
uint32 _respawnCheckTimer
Definition Map.h:662
void resetMarkedCells()
Definition Map.h:318
void UpdateWeather(uint32 const diff)
Definition Map.cpp:3155
void MoveAllDynamicObjectsInMoveList()
Definition Map.cpp:987
void MoveAllCreaturesInMoveList()
Definition Map.cpp:918
MapRefMgr::iterator m_mapRefIter
Definition Map.h:605
void SendObjectUpdates()
Definition Map.cpp:1700
void UpdateExpiredCorpses(uint32 const diff)
Definition Map.cpp:1651
DynamicObject * ToDynObject()
Definition Object.h:222
void Update(uint32 time) override
Definition PlayerUpdates.cpp:53
WorldObject * GetViewpoint() const
Definition Player.cpp:13258
FROM * GetSource() const
Definition Reference.h:97
Player session in the World.
Definition WorldSession.h:384
bool Update(uint32 diff, PacketFilter &updater)
Update the WorldSession (triggered by World update)
Definition WorldSession.cpp:362
bool Passed()
Definition Timer.h:161
void Update(time_t diff)
Definition Timer.h:152

References _mapCollisionData, _respawnCheckTimer, _updatableObjectListRecheckTimer, MapRefMgr::begin(), CONFIG_RESPAWN_FORCE_COMPATIBILITY_MODE, MapRefMgr::end(), MapCollisionData::GetDynamicTree(), GetId(), GetInstanceId(), GetObjectsStore(), Player::GetSession(), Reference< TO, FROM >::GetSource(), Player::GetViewpoint(), HandleDelayedVisibility(), i_scriptLock, Object::IsInWorld(), m_mapRefIter, m_mapRefMgr, m_scriptSchedule, MarkNearbyCellsOf(), METRIC_TAG, METRIC_VALUE, MoveAllCreaturesInMoveList(), MoveAllDynamicObjectsInMoveList(), MoveAllGameObjectsInMoveList(), IntervalTimer::Passed(), ProcessRespawns(), resetMarkedCells(), ScriptsProcess(), SendObjectUpdates(), sScriptMgr, sWorld, Object::ToCreature(), Object::ToDynObject(), IntervalTimer::Update(), DynamicMapTree::update(), WorldSession::Update(), Player::Update(), UpdateExpiredCorpses(), UpdateNonPlayerObjects(), and UpdateWeather().

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

◆ UpdateEncounterState()

void Map::UpdateEncounterState ( EncounterCreditType  type,
uint32  creditEntry,
Unit source 
)
2835{
2836 Difficulty difficulty_fixed = (IsSharedDifficultyMap(GetId()) ? Difficulty(GetDifficulty() % 2) : GetDifficulty());
2837 DungeonEncounterList const* encounters;
2838 // 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.
2839 if ((GetId() == 631 || GetId() == 724) && IsHeroic())
2840 {
2841 encounters = sObjectMgr->GetDungeonEncounterList(GetId(), !Is25ManRaid() ? RAID_DIFFICULTY_10MAN_NORMAL : RAID_DIFFICULTY_25MAN_NORMAL);
2842 }
2843 else
2844 {
2845 encounters = sObjectMgr->GetDungeonEncounterList(GetId(), difficulty_fixed);
2846 }
2847
2848 if (!encounters)
2849 {
2850 return;
2851 }
2852
2853 uint32 dungeonId = 0;
2854 bool updated = false;
2855
2856 for (DungeonEncounterList::const_iterator itr = encounters->begin(); itr != encounters->end(); ++itr)
2857 {
2858 DungeonEncounter const* encounter = *itr;
2859 if (encounter->creditType == type && encounter->creditEntry == creditEntry)
2860 {
2861 if (source)
2862 if (InstanceScript* instanceScript = source->GetInstanceScript())
2863 {
2864 uint32 prevMask = instanceScript->GetCompletedEncounterMask();
2865 instanceScript->SetCompletedEncountersMask((1 << encounter->dbcEntry->encounterIndex) | instanceScript->GetCompletedEncounterMask(), true);
2866 if (prevMask != instanceScript->GetCompletedEncounterMask())
2867 updated = true;
2868 }
2869
2870 if (encounter->lastEncounterDungeon)
2871 {
2872 dungeonId = encounter->lastEncounterDungeon;
2873 break;
2874 }
2875 }
2876 }
2877
2878 // pussywizard:
2879 LogEncounterFinished(type, creditEntry);
2880
2881 sScriptMgr->OnAfterUpdateEncounterState(this, type, creditEntry, source, difficulty_fixed, encounters, dungeonId, updated);
2882
2883 if (dungeonId)
2884 {
2885 Map::PlayerList const& players = GetPlayers();
2886 for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
2887 {
2888 if (Player* player = i->GetSource())
2889 if (Group* grp = player->GetGroup())
2890 if (grp->isLFGGroup())
2891 {
2892 sLFGMgr->FinishDungeon(grp->GetGUID(), dungeonId, this);
2893 return;
2894 }
2895 }
2896 }
2897}
@ 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:658
std::list< DungeonEncounter const * > DungeonEncounterList
Definition ObjectMgr.h:714
Definition Group.h:169
Definition InstanceScript.h:143
bool Is25ManRaid() const
Definition Map.h:302
void LogEncounterFinished(EncounterCreditType type, uint32 creditEntry)
Definition Map.cpp:2899
bool IsHeroic() const
Definition Map.h:301
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1238
uint32 encounterIndex
Definition DBCStructure.h:871
Definition ObjectMgr.h:704
DungeonEncounterEntry const * dbcEntry
Definition ObjectMgr.h:708
EncounterCreditType creditType
Definition ObjectMgr.h:709
uint32 lastEncounterDungeon
Definition ObjectMgr.h:711
uint32 creditEntry
Definition ObjectMgr.h:710

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::SummonedCreatureDies(), and npc_grimstone::WaypointReached().

◆ UpdateExpiredCorpses()

void Map::UpdateExpiredCorpses ( uint32 const  diff)
1652{
1655 return;
1656
1658
1660}
void RemoveOldCorpses()
Definition Map.cpp:3046
void Reset()
Definition Timer.h:166

References _corpseUpdateTimer, IntervalTimer::Passed(), RemoveOldCorpses(), IntervalTimer::Reset(), and IntervalTimer::Update().

Referenced by Update().

◆ UpdateIteratorBack()

void Map::UpdateIteratorBack ( Player player)
2379{
2380 if (m_mapRefIter == player->GetMapRef())
2382}
MapReference const * nocheck_prev() const
Definition MapReference.h:49
MapReference & GetMapRef()
Definition Player.h:2528

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

Referenced by Player::ResetMap().

◆ UpdateNonPlayerObjects()

void Map::UpdateNonPlayerObjects ( uint32 const  diff)
private
533{
537
539 {
540 for (uint32 i = 0; i < _updatableObjectList.size();)
541 {
543 if (!obj->IsInWorld())
544 {
545 ++i;
546 continue;
547 }
548
549 obj->Update(diff);
550
551 if (!obj->IsUpdateNeeded())
552 {
554 // Intentional no iteration here, obj is swapped with last element in
555 // _updatableObjectList so next loop will update that object at the same index
556 }
557 else
558 ++i;
559 }
561 }
562 else
563 {
564 for (uint32 i = 0; i < _updatableObjectList.size(); ++i)
565 {
567 if (!obj->IsInWorld())
568 continue;
569
570 obj->Update(diff);
571 }
572 }
573}
void _AddObjectToUpdateList(WorldObject *obj)
Definition Map.cpp:589
virtual bool IsUpdateNeeded()
Definition Object.cpp:3187
virtual void Update(uint32 diff)
Definition Object.cpp:1068

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 
)
414{
415 // Nothing to do if no change
416 if (oldZone == newZone)
417 return;
418
419 if (oldZone != MAP_INVALID_ZONE)
420 {
421 uint32& oldZoneCount = _zonePlayerCountMap[oldZone];
422 if (oldZoneCount)
423 --oldZoneCount;
424 }
425
426 if (newZone != MAP_INVALID_ZONE)
427 ++_zonePlayerCountMap[newZone];
428}

References _zonePlayerCountMap, and MAP_INVALID_ZONE.

Referenced by RemovePlayerFromMap(), and Player::UpdateZone().

◆ UpdateWeather()

void Map::UpdateWeather ( uint32 const  diff)
3156{
3159 return;
3160
3161 for (auto&& zoneInfo : _zoneDynamicInfo)
3162 if (zoneInfo.second.DefaultWeather && !zoneInfo.second.DefaultWeather->Update(_weatherUpdateTimer.GetInterval()))
3163 zoneInfo.second.DefaultWeather.reset();
3164
3166}
virtual void Update(const uint32, const uint32, bool thread=true)
Definition Map.cpp:430

References _weatherUpdateTimer, _zoneDynamicInfo, IntervalTimer::GetInterval(), IntervalTimer::Passed(), IntervalTimer::Reset(), and IntervalTimer::Update().

Referenced by Update().

◆ Visit()

template<class T , class CONTAINER >
void Map::Visit ( const Cell cell,
TypeContainerVisitor< T, CONTAINER > &  visitor 
)
inline
763{
764 uint32 const grid_x = cell.GridX();
765 uint32 const grid_y = cell.GridY();
766
767 // If grid is not loaded, nothing to visit.
768 if (!IsGridLoaded(GridCoord(grid_x, grid_y)))
769 return;
770
771 GetMapGrid(grid_x, grid_y)->VisitCell(cell.CellX(), cell.CellY(), visitor);
772}
void VisitCell(uint16 const x, uint16 const y, TypeContainerVisitor< T, TT > &visitor)
Definition MapGrid.h:87

References Cell::CellX(), Cell::CellY(), GetMapGrid(), Cell::GridX(), Cell::GridY(), IsGridLoaded(), and MapGrid< GRID_OBJECT_TYPES, FAR_VISIBLE_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

◆ _corpseUpdateTimer

IntervalTimer Map::_corpseUpdateTimer
private

Referenced by Map(), and UpdateExpiredCorpses().

◆ _creatureBySpawnIdStore

◆ _creatureRespawnTimes

◆ _creaturesToMove

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

◆ _defaultLight

uint32 Map::_defaultLight
private

◆ _dynamicObjectsToMove

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

◆ _gameobjectBySpawnIdStore

◆ _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

◆ _mapCollisionData

◆ _mapGridManager

◆ _objectsStore

◆ _pendingAddUpdatableObjectList

◆ _respawnCheckTimer

uint32 Map::_respawnCheckTimer {0}
private
662{0};

Referenced by Update().

◆ _respawnQueue

◆ _toggledSpawnGroupIds

std::unordered_set<uint32> Map::_toggledSpawnGroupIds
private

◆ _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

◆ _weatherUpdateTimer

IntervalTimer Map::_weatherUpdateTimer
private

Referenced by Map(), and UpdateWeather().

◆ _zoneDynamicInfo

◆ _zonePlayerCountMap

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

◆ _zoneWideVisibleWorldObjectsMap

◆ CreatureGroupHolder

◆ CustomData

DataMap Map::CustomData

◆ Events

EventProcessor Map::Events

◆ i_InstanceId

uint32 Map::i_InstanceId
protected

Referenced by GetInstanceId().

◆ 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

◆ Lock

std::mutex Map::Lock
protected

◆ 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

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