diff options
Diffstat (limited to 'src/server/game/Maps/Map.h')
-rw-r--r-- | src/server/game/Maps/Map.h | 166 |
1 files changed, 12 insertions, 154 deletions
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 89f64d947e0..471d1b64d5a 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -30,7 +30,6 @@ #include "MapRefManager.h" #include "MPSCQueue.h" #include "ObjectGuid.h" -#include "Optional.h" #include "PersonalPhaseTracker.h" #include "SharedDefines.h" #include "SpawnData.h" @@ -60,6 +59,7 @@ class PhaseShift; class Player; class SpawnedPoolData; class TempSummon; +class TerrainInfo; class Unit; class Weather; class WorldObject; @@ -77,7 +77,6 @@ enum WeatherState : uint32; enum class ItemContext : uint8; namespace Trinity { struct ObjectUpdater; } -namespace G3D { class Plane; } namespace VMAP { enum class ModelIgnoreFlags : uint32; } struct ScriptAction @@ -88,119 +87,6 @@ struct ScriptAction ScriptInfo const* script; ///> pointer to static script data }; -enum ZLiquidStatus : uint32 -{ - LIQUID_MAP_NO_WATER = 0x00000000, - LIQUID_MAP_ABOVE_WATER = 0x00000001, - LIQUID_MAP_WATER_WALK = 0x00000002, - LIQUID_MAP_IN_WATER = 0x00000004, - LIQUID_MAP_UNDER_WATER = 0x00000008 -}; - -#define MAP_LIQUID_STATUS_SWIMMING (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER) -#define MAP_LIQUID_STATUS_IN_CONTACT (MAP_LIQUID_STATUS_SWIMMING | LIQUID_MAP_WATER_WALK) - -struct LiquidData -{ - EnumFlag<map_liquidHeaderTypeFlags> type_flags = map_liquidHeaderTypeFlags::NoWater; - uint32 entry; - float level; - float depth_level; -}; - -struct PositionFullTerrainStatus -{ - struct AreaInfo - { - AreaInfo(int32 _adtId, int32 _rootId, int32 _groupId, uint32 _flags) : adtId(_adtId), rootId(_rootId), groupId(_groupId), mogpFlags(_flags) { } - int32 const adtId; - int32 const rootId; - int32 const groupId; - uint32 const mogpFlags; - }; - - PositionFullTerrainStatus() : areaId(0), floorZ(0.0f), outdoors(true), liquidStatus(LIQUID_MAP_NO_WATER) { } - uint32 areaId; - float floorZ; - bool outdoors; - ZLiquidStatus liquidStatus; - Optional<AreaInfo> areaInfo; - Optional<LiquidData> liquidInfo; -}; - -class TC_GAME_API GridMap -{ - uint32 _flags; - union{ - float* m_V9; - uint16* m_uint16_V9; - uint8* m_uint8_V9; - }; - union{ - float* m_V8; - uint16* m_uint16_V8; - uint8* m_uint8_V8; - }; - G3D::Plane* _minHeightPlanes; - // Height level data - float _gridHeight; - float _gridIntHeightMultiplier; - - // Area data - uint16* _areaMap; - - // Liquid data - float _liquidLevel; - uint16* _liquidEntry; - map_liquidHeaderTypeFlags* _liquidFlags; - float* _liquidMap; - uint16 _gridArea; - uint16 _liquidGlobalEntry; - map_liquidHeaderTypeFlags _liquidGlobalFlags; - uint8 _liquidOffX; - uint8 _liquidOffY; - uint8 _liquidWidth; - uint8 _liquidHeight; - - uint8* _holes; - - bool loadAreaData(FILE* in, uint32 offset, uint32 size); - bool loadHeightData(FILE* in, uint32 offset, uint32 size); - bool loadLiquidData(FILE* in, uint32 offset, uint32 size); - bool loadHolesData(FILE* in, uint32 offset, uint32 size); - bool isHole(int row, int col) const; - - // Get height functions and pointers - typedef float (GridMap::*GetHeightPtr) (float x, float y) const; - GetHeightPtr _gridGetHeight; - float getHeightFromFloat(float x, float y) const; - float getHeightFromUint16(float x, float y) const; - float getHeightFromUint8(float x, float y) const; - float getHeightFromFlat(float x, float y) const; - -public: - GridMap(); - ~GridMap(); - - enum class LoadResult - { - Ok, - FileDoesNotExist, - InvalidFile - }; - - LoadResult loadData(char const* filename); - void unloadData(); - - uint16 getArea(float x, float y) const; - inline float getHeight(float x, float y) const {return (this->*_gridGetHeight)(x, y);} - float getMinHeight(float x, float y) const; - float getLiquidLevel(float x, float y) const; - ZLiquidStatus GetLiquidStatus(float x, float y, float z, Optional<map_liquidHeaderTypeFlags> ReqLiquidType, LiquidData* data = nullptr, float collisionHeight = 2.03128f); // DEFAULT_COLLISION_HEIGHT in Object.h -}; - -#pragma pack(push, 1) - struct ZoneDynamicInfo { ZoneDynamicInfo(); @@ -220,12 +106,6 @@ struct ZoneDynamicInfo std::vector<LightOverride> LightOverrides; }; -#pragma pack(pop) - -#define MAX_HEIGHT 100000.0f // can be use for find ground height at surface -#define INVALID_HEIGHT -100000.0f // for check, must be equal to VMAP_INVALID_HEIGHT, real value for unknown height is VMAP_INVALID_HEIGHT_VALUE -#define MAX_FALL_DISTANCE 250000.0f // "unlimited fall" to find VMap ground if it is available, just larger than MAX_HEIGHT - INVALID_HEIGHT -#define DEFAULT_HEIGHT_SEARCH 50.0f // default search distance to find height at nearby locations #define MIN_UNLOAD_DELAY 1 // immediate unload #define MAP_INVALID_ZONE 0xFFFFFFFF @@ -333,20 +213,11 @@ class TC_GAME_API Map : public GridRefManager<NGridType> time_t GetGridExpiry() const { return i_gridExpiry; } - bool HasChildMapGridFile(uint32 mapId, int32 gx, int32 gy) const; - static bool ExistMap(uint32 mapid, int gx, int gy, bool log = true); - static bool ExistVMap(uint32 mapid, int gx, int gy); - static void InitStateMachine(); static void DeleteStateMachine(); - void DiscoverGridMapFiles(); - - Map* GetRootParentTerrainMap(); - void AddChildTerrainMap(Map* map) { m_childTerrainMaps->push_back(map); map->m_parentTerrainMap = this; } - void UnlinkAllChildTerrainMaps() { m_childTerrainMaps->clear(); } + TerrainInfo* GetTerrain() const { return m_terrain.get(); } - void GetFullTerrainStatusForPosition(float x, float y, float z, PositionFullTerrainStatus& data, map_liquidHeaderTypeFlags reqLiquidType = map_liquidHeaderTypeFlags::AllLiquids, float collisionHeight = 2.03128f) const; // DEFAULT_COLLISION_HEIGHT in Object.h void GetFullTerrainStatusForPosition(PhaseShift const& phaseShift, float x, float y, float z, PositionFullTerrainStatus& data, map_liquidHeaderTypeFlags reqLiquidType = map_liquidHeaderTypeFlags::AllLiquids, float collisionHeight = 2.03128f); // DEFAULT_COLLISION_HEIGHT in Object.h ZLiquidStatus GetLiquidStatus(PhaseShift const& phaseShift, float x, float y, float z, map_liquidHeaderTypeFlags ReqLiquidType, LiquidData* data = nullptr, float collisionHeight = 2.03128f); // DEFAULT_COLLISION_HEIGHT in Object.h @@ -358,10 +229,19 @@ class TC_GAME_API Map : public GridRefManager<NGridType> void GetZoneAndAreaId(PhaseShift const& phaseShift, uint32& zoneid, uint32& areaid, float x, float y, float z); void GetZoneAndAreaId(PhaseShift const& phaseShift, uint32& zoneid, uint32& areaid, Position const& pos) { GetZoneAndAreaId(phaseShift, zoneid, areaid, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); } + float GetMinHeight(PhaseShift const& phaseShift, float x, float y); + float GetGridHeight(PhaseShift const& phaseShift, float x, float y); + float GetStaticHeight(PhaseShift const& phaseShift, float x, float y, float z, bool checkVMap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH); + float GetStaticHeight(PhaseShift const& phaseShift, Position const& pos, bool checkVMap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) { return GetStaticHeight(phaseShift, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), checkVMap, maxSearchDist); } + float GetHeight(PhaseShift const& phaseShift, float x, float y, float z, bool vmap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) { return std::max<float>(GetStaticHeight(phaseShift, x, y, z, vmap, maxSearchDist), GetGameObjectFloor(phaseShift, x, y, z, maxSearchDist)); } + float GetHeight(PhaseShift const& phaseShift, Position const& pos, bool vmap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) { return GetHeight(phaseShift, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), vmap, maxSearchDist); } + float GetWaterLevel(PhaseShift const& phaseShift, float x, float y); bool IsInWater(PhaseShift const& phaseShift, float x, float y, float z, LiquidData* data = nullptr); bool IsUnderWater(PhaseShift const& phaseShift, float x, float y, float z); + float GetWaterOrGroundLevel(PhaseShift const& phaseShift, float x, float y, float z, float* ground = nullptr, bool swim = false, float collisionHeight = 2.03128f); // DEFAULT_COLLISION_HEIGHT in Object.h + void MoveAllCreaturesInMoveList(); void MoveAllGameObjectsInMoveList(); void MoveAllDynamicObjectsInMoveList(); @@ -531,13 +411,6 @@ class TC_GAME_API Map : public GridRefManager<NGridType> BattlegroundMap* ToBattlegroundMap() { if (IsBattlegroundOrArena()) return reinterpret_cast<BattlegroundMap*>(this); else return nullptr; } BattlegroundMap const* ToBattlegroundMap() const { if (IsBattlegroundOrArena()) return reinterpret_cast<BattlegroundMap const*>(this); return nullptr; } - float GetWaterOrGroundLevel(PhaseShift const& phaseShift, float x, float y, float z, float* ground = nullptr, bool swim = false, float collisionHeight = 2.03128f); // DEFAULT_COLLISION_HEIGHT in Object.h - float GetMinHeight(PhaseShift const& phaseShift, float x, float y); - float GetGridHeight(PhaseShift const& phaseShift, float x, float y); - float GetStaticHeight(PhaseShift const& phaseShift, float x, float y, float z, bool checkVMap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH); - float GetStaticHeight(PhaseShift const& phaseShift, Position const& pos, bool checkVMap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) { return GetStaticHeight(phaseShift, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), checkVMap, maxSearchDist); } - float GetHeight(PhaseShift const& phaseShift, float x, float y, float z, bool vmap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) { return std::max<float>(GetStaticHeight(phaseShift, x, y, z, vmap, maxSearchDist), GetGameObjectFloor(phaseShift, x, y, z, maxSearchDist)); } - float GetHeight(PhaseShift const& phaseShift, Position const& pos, bool vmap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) { return GetHeight(phaseShift, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), vmap, maxSearchDist); } bool isInLineOfSight(PhaseShift const& phaseShift, float x1, float y1, float z1, float x2, float y2, float z2, LineOfSightChecks checks, VMAP::ModelIgnoreFlags ignoreFlags) const; void Balance() { _dynamicTree.balance(); } void RemoveGameObjectModel(GameObjectModel const& model) { _dynamicTree.remove(model); } @@ -628,14 +501,6 @@ class TC_GAME_API Map : public GridRefManager<NGridType> virtual std::string GetDebugInfo() const; private: - void LoadMapAndVMap(int gx, int gy); - void LoadVMap(int gx, int gy); - void LoadMap(int gx, int gy); - static void LoadMapImpl(Map* map, int gx, int gy); - void UnloadMap(int gx, int gy); - static void UnloadMapImpl(Map* map, int gx, int gy); - void LoadMMap(int gx, int gy); - GridMap* GetGrid(uint32 mapId, float x, float y); void SetTimer(uint32 t) { i_gridExpiry = t < MIN_GRID_DELAY ? MIN_GRID_DELAY : t; } @@ -733,16 +598,9 @@ class TC_GAME_API Map : public GridRefManager<NGridType> time_t i_gridExpiry; - //used for fast base_map (e.g. MapInstanced class object) search for - //InstanceMaps and BattlegroundMaps... - Map* m_parentMap; // points to MapInstanced* or self (always same map id) - Map* m_parentTerrainMap; // points to m_parentMap of MapEntry::ParentMapID - std::vector<Map*>* m_childTerrainMaps; // contains m_parentMap of maps that have MapEntry::ParentMapID == GetId() + std::shared_ptr<TerrainInfo> m_terrain; NGridType* i_grids[MAX_NUMBER_OF_GRIDS][MAX_NUMBER_OF_GRIDS]; - std::shared_ptr<GridMap> GridMaps[MAX_NUMBER_OF_GRIDS][MAX_NUMBER_OF_GRIDS]; - uint16 GridMapReference[MAX_NUMBER_OF_GRIDS][MAX_NUMBER_OF_GRIDS]; - std::bitset<MAX_NUMBER_OF_GRIDS * MAX_NUMBER_OF_GRIDS> i_gridFileExists; // cache what grids are available for this map (not including parent/child maps) std::bitset<TOTAL_NUMBER_OF_CELLS_PER_MAP*TOTAL_NUMBER_OF_CELLS_PER_MAP> marked_cells; //these functions used to process player/mob aggro reactions and |