diff options
| author | Shauren <shauren.trinity@gmail.com> | 2021-05-29 21:21:37 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-05-29 21:21:37 +0200 |
| commit | 6ecfe58cae6d9cfa7a3aef21a4a96aa00c513ba2 (patch) | |
| tree | ff96897b193f6f78ad00fdf4100631705c2f010d /src/server | |
| parent | 2de6e56d29df8cebb358e10e5e452422588a3929 (diff) | |
Core/Maps & Extractors: Move copypasted map file headers into a single shared file and replace #defines with enums
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 8 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Maps/Map.cpp | 96 | ||||
| -rw-r--r-- | src/server/game/Maps/Map.h | 92 | ||||
| -rw-r--r-- | src/server/game/Movement/PathGenerator.cpp | 14 | ||||
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 2 | ||||
| -rw-r--r-- | src/server/scripts/Commands/cs_misc.cpp | 4 |
8 files changed, 71 insertions, 149 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 44e63f22155..d81cc5fd86d 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -930,7 +930,7 @@ void WorldObject::CleanupsBeforeDelete(bool /*finalCleanup*/) void WorldObject::UpdatePositionData() { PositionFullTerrainStatus data; - GetMap()->GetFullTerrainStatusForPosition(_phaseShift, GetPositionX(), GetPositionY(), GetPositionZ(), data, MAP_ALL_LIQUIDS); + GetMap()->GetFullTerrainStatusForPosition(_phaseShift, GetPositionX(), GetPositionY(), GetPositionZ(), data, map_liquidHeaderTypeFlags::AllLiquids); ProcessPositionDataChanged(data); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index d6f7cfb7bad..417e41482e5 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -25794,7 +25794,7 @@ void Player::ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidDat if (status && liquidData) { // Breath bar state (under water in any liquid type) - if (liquidData->type_flags & MAP_ALL_LIQUIDS) + if (liquidData->type_flags.HasFlag(map_liquidHeaderTypeFlags::AllLiquids)) { if (status & LIQUID_MAP_UNDER_WATER) m_MirrorTimerFlags |= UNDERWATER_INWATER; @@ -25803,13 +25803,13 @@ void Player::ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidDat } // Fatigue bar state (if not on flight path or transport) - if ((liquidData->type_flags & MAP_LIQUID_TYPE_DARK_WATER) && !IsInFlight() && !GetTransport()) + if (liquidData->type_flags.HasFlag(map_liquidHeaderTypeFlags::DarkWater) && !IsInFlight() && !GetTransport()) m_MirrorTimerFlags |= UNDERWATER_INDARKWATER; else m_MirrorTimerFlags &= ~UNDERWATER_INDARKWATER; // Lava state (any contact) - if (liquidData->type_flags & MAP_LIQUID_TYPE_MAGMA) + if (liquidData->type_flags.HasFlag(map_liquidHeaderTypeFlags::Magma)) { if (status & MAP_LIQUID_STATUS_IN_CONTACT) m_MirrorTimerFlags |= UNDERWATER_INLAVA; @@ -25818,7 +25818,7 @@ void Player::ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidDat } // Slime state (any contact) - if (liquidData->type_flags & MAP_LIQUID_TYPE_SLIME) + if (liquidData->type_flags.HasFlag(map_liquidHeaderTypeFlags::Slime)) { if (status & MAP_LIQUID_STATUS_IN_CONTACT) m_MirrorTimerFlags |= UNDERWATER_INSLIME; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index e933ea7b38c..c37c7ea82fe 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -8009,7 +8009,7 @@ MountCapabilityEntry const* Unit::GetMountCapability(uint32 mountType) const mountFlags = areaTable->MountFlags; LiquidData liquid; - ZLiquidStatus liquidStatus = GetMap()->GetLiquidStatus(GetPhaseShift(), GetPositionX(), GetPositionY(), GetPositionZ(), MAP_ALL_LIQUIDS, &liquid); + ZLiquidStatus liquidStatus = GetMap()->GetLiquidStatus(GetPhaseShift(), GetPositionX(), GetPositionY(), GetPositionZ(), map_liquidHeaderTypeFlags::AllLiquids, &liquid); isSubmerged = (liquidStatus & LIQUID_MAP_UNDER_WATER) != 0 || HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING); isInWater = (liquidStatus & (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER)) != 0; diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 697015cfe3f..671292fe479 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -56,12 +56,6 @@ #include "Hacks/boost_1_74_fibonacci_heap.h" BOOST_1_74_FIBONACCI_HEAP_MSVC_COMPILE_FIX(RespawnListContainer::value_type) -u_map_magic MapMagic = { {'M','A','P','S'} }; -u_map_magic MapVersionMagic = { {'v','1','.','9'} }; -u_map_magic MapAreaMagic = { {'A','R','E','A'} }; -u_map_magic MapHeightMagic = { {'M','H','G','T'} }; -u_map_magic MapLiquidMagic = { {'M','L','I','Q'} }; - #define DEFAULT_GRID_EXPIRY 300 #define MAX_GRID_LOAD_TIME 50 #define MAX_CREATURE_ATTACK_RADIUS (45.0f * sWorld->getRate(RATE_CREATURE_AGGRO)) @@ -106,14 +100,14 @@ void Map::DiscoverGridMapFiles() // tile list is optional if (FILE* tileList = fopen(tileListName.c_str(), "rb")) { - u_map_magic mapMagic; - u_map_magic versionMagic; + u_map_magic mapMagic = { }; + u_map_magic versionMagic = { }; uint32 build; - char tilesData[MAX_NUMBER_OF_GRIDS * MAX_NUMBER_OF_GRIDS]; - if (fread(&mapMagic.asUInt, sizeof(u_map_magic), 1, tileList) == 1 - && mapMagic.asUInt == MapMagic.asUInt - && fread(&versionMagic.asUInt, sizeof(u_map_magic), 1, tileList) == 1 - && versionMagic.asUInt == MapVersionMagic.asUInt + char tilesData[MAX_NUMBER_OF_GRIDS * MAX_NUMBER_OF_GRIDS] = { }; + if (fread(mapMagic.data(), mapMagic.size(), 1, tileList) == 1 + && mapMagic == MapMagic + && fread(versionMagic.data(), versionMagic.size(), 1, tileList) == 1 + && versionMagic == MapVersionMagic && fread(&build, sizeof(build), 1, tileList) == 1 && fread(&tilesData[0], MAX_NUMBER_OF_GRIDS * MAX_NUMBER_OF_GRIDS, 1, tileList) == 1) { @@ -158,11 +152,11 @@ bool Map::ExistMap(uint32 mapid, int gx, int gy, bool log /*= true*/) map_fileheader header; if (fread(&header, sizeof(header), 1, file) == 1) { - if (header.mapMagic.asUInt != MapMagic.asUInt || header.versionMagic.asUInt != MapVersionMagic.asUInt) + if (header.mapMagic != MapMagic || header.versionMagic != MapVersionMagic) { if (log) TC_LOG_ERROR("maps", "Map file '%s' is from an incompatible map version (%.*s %.*s), %.*s %.*s is expected. Please pull your source, recompile tools and recreate maps using the updated mapextractor, then replace your old map files with new files. If you still have problems search on forum for error TCE00018.", - fileName.c_str(), 4, header.mapMagic.asChar, 4, header.versionMagic.asChar, 4, MapMagic.asChar, 4, MapVersionMagic.asChar); + fileName.c_str(), 4, header.mapMagic.data(), 4, header.versionMagic.data(), 4, MapMagic.data(), 4, MapVersionMagic.data()); } else ret = true; @@ -1842,7 +1836,7 @@ GridMap::GridMap() _minHeightPlanes = nullptr; // Liquid data _liquidGlobalEntry = 0; - _liquidGlobalFlags = 0; + _liquidGlobalFlags = map_liquidHeaderTypeFlags::NoWater; _liquidOffX = 0; _liquidOffY = 0; _liquidWidth = 0; @@ -1875,7 +1869,7 @@ GridMap::LoadResult GridMap::loadData(char const* filename) return LoadResult::InvalidFile; } - if (header.mapMagic.asUInt == MapMagic.asUInt && header.versionMagic.asUInt == MapVersionMagic.asUInt) + if (header.mapMagic == MapMagic && header.versionMagic == MapVersionMagic) { // load up area data if (header.areaMapOffset && !loadAreaData(in, header.areaMapOffset, header.areaMapSize)) @@ -1903,7 +1897,7 @@ GridMap::LoadResult GridMap::loadData(char const* filename) } TC_LOG_ERROR("maps", "Map file '%s' is from an incompatible map version (%.*s %.*s), %.*s %.*s is expected. Please pull your source, recompile tools and recreate maps using the updated mapextractor, then replace your old map files with new files. If you still have problems search on forum for error TCE00018.", - filename, 4, header.mapMagic.asChar, 4, header.versionMagic.asChar, 4, MapMagic.asChar, 4, MapVersionMagic.asChar); + filename, 4, header.mapMagic.data(), 4, header.versionMagic.data(), 4, MapMagic.data(), 4, MapVersionMagic.data()); fclose(in); return LoadResult::InvalidFile; } @@ -1932,11 +1926,11 @@ bool GridMap::loadAreaData(FILE* in, uint32 offset, uint32 /*size*/) map_areaHeader header; fseek(in, offset, SEEK_SET); - if (fread(&header, sizeof(header), 1, in) != 1 || header.fourcc != MapAreaMagic.asUInt) + if (fread(&header, sizeof(header), 1, in) != 1 || header.areaMagic != MapAreaMagic) return false; _gridArea = header.gridArea; - if (!(header.flags & MAP_AREA_NO_AREA)) + if (!header.flags.HasFlag(map_areaHeaderFlags::NoArea)) { _areaMap = new uint16[16 * 16]; if (fread(_areaMap, sizeof(uint16), 16*16, in) != 16*16) @@ -1950,13 +1944,13 @@ bool GridMap::loadHeightData(FILE* in, uint32 offset, uint32 /*size*/) map_heightHeader header; fseek(in, offset, SEEK_SET); - if (fread(&header, sizeof(header), 1, in) != 1 || header.fourcc != MapHeightMagic.asUInt) + if (fread(&header, sizeof(header), 1, in) != 1 || header.heightMagic != MapHeightMagic) return false; _gridHeight = header.gridHeight; - if (!(header.flags & MAP_HEIGHT_NO_HEIGHT)) + if (!header.flags.HasFlag(map_heightHeaderFlags::NoHeight)) { - if ((header.flags & MAP_HEIGHT_AS_INT16)) + if (header.flags.HasFlag(map_heightHeaderFlags::HeightAsInt16)) { m_uint16_V9 = new uint16 [129*129]; m_uint16_V8 = new uint16 [128*128]; @@ -1966,7 +1960,7 @@ bool GridMap::loadHeightData(FILE* in, uint32 offset, uint32 /*size*/) _gridIntHeightMultiplier = (header.gridMaxHeight - header.gridHeight) / 65535; _gridGetHeight = &GridMap::getHeightFromUint16; } - else if ((header.flags & MAP_HEIGHT_AS_INT8)) + else if (header.flags.HasFlag(map_heightHeaderFlags::HeightAsInt8)) { m_uint8_V9 = new uint8 [129*129]; m_uint8_V8 = new uint8 [128*128]; @@ -1989,7 +1983,7 @@ bool GridMap::loadHeightData(FILE* in, uint32 offset, uint32 /*size*/) else _gridGetHeight = &GridMap::getHeightFromFlat; - if (header.flags & MAP_HEIGHT_HAS_FLIGHT_BOUNDS) + if (header.flags.HasFlag(map_heightHeaderFlags::HasFlightBounds)) { std::array<int16, 9> maxHeights; std::array<int16, 9> minHeights; @@ -2039,7 +2033,7 @@ bool GridMap::loadLiquidData(FILE* in, uint32 offset, uint32 /*size*/) map_liquidHeader header; fseek(in, offset, SEEK_SET); - if (fread(&header, sizeof(header), 1, in) != 1 || header.fourcc != MapLiquidMagic.asUInt) + if (fread(&header, sizeof(header), 1, in) != 1 || header.liquidMagic != MapLiquidMagic) return false; _liquidGlobalEntry = header.liquidType; @@ -2050,17 +2044,17 @@ bool GridMap::loadLiquidData(FILE* in, uint32 offset, uint32 /*size*/) _liquidHeight = header.height; _liquidLevel = header.liquidLevel; - if (!(header.flags & MAP_LIQUID_NO_TYPE)) + if (!header.flags.HasFlag(map_liquidHeaderFlags::NoType)) { _liquidEntry = new uint16[16*16]; if (fread(_liquidEntry, sizeof(uint16), 16*16, in) != 16*16) return false; - _liquidFlags = new uint8[16*16]; - if (fread(_liquidFlags, sizeof(uint8), 16*16, in) != 16*16) + _liquidFlags = new map_liquidHeaderTypeFlags[16*16]; + if (fread(_liquidFlags, sizeof(map_liquidHeaderTypeFlags), 16*16, in) != 16*16) return false; } - if (!(header.flags & MAP_LIQUID_NO_HEIGHT)) + if (!header.flags.HasFlag(map_liquidHeaderFlags::NoHeight)) { _liquidMap = new float[uint32(_liquidWidth) * uint32(_liquidHeight)]; if (fread(_liquidMap, sizeof(float), _liquidWidth*_liquidHeight, in) != (uint32(_liquidWidth) * uint32(_liquidHeight))) @@ -2352,10 +2346,10 @@ float GridMap::getLiquidLevel(float x, float y) const } // Why does this return LIQUID data? -uint8 GridMap::getTerrainType(float x, float y) const +map_liquidHeaderTypeFlags GridMap::getTerrainType(float x, float y) const { if (!_liquidFlags) - return 0; + return map_liquidHeaderTypeFlags::NoWater; x = 16 * (CENTER_GRID_ID - x/SIZE_OF_GRIDS); y = 16 * (CENTER_GRID_ID - y/SIZE_OF_GRIDS); @@ -2365,10 +2359,10 @@ uint8 GridMap::getTerrainType(float x, float y) const } // Get water state on map -inline ZLiquidStatus GridMap::GetLiquidStatus(float x, float y, float z, uint8 ReqLiquidType, LiquidData* data, float collisionHeight) +inline ZLiquidStatus GridMap::GetLiquidStatus(float x, float y, float z, Optional<map_liquidHeaderTypeFlags> ReqLiquidType, LiquidData* data, float collisionHeight) { // Check water type (if no water return) - if (!_liquidGlobalFlags && !_liquidFlags) + if (_liquidGlobalFlags == map_liquidHeaderTypeFlags::NoWater && !_liquidFlags) return LIQUID_MAP_NO_WATER; // Get cell @@ -2380,11 +2374,11 @@ inline ZLiquidStatus GridMap::GetLiquidStatus(float x, float y, float z, uint8 R // Check water type in cell int idx=(x_int>>3)*16 + (y_int>>3); - uint8 type = _liquidFlags ? _liquidFlags[idx] : _liquidGlobalFlags; + map_liquidHeaderTypeFlags type = _liquidFlags ? _liquidFlags[idx] : _liquidGlobalFlags; uint32 entry = _liquidEntry ? _liquidEntry[idx] : _liquidGlobalEntry; if (LiquidTypeEntry const* liquidEntry = sLiquidTypeStore.LookupEntry(entry)) { - type &= MAP_LIQUID_TYPE_DARK_WATER; + type &= map_liquidHeaderTypeFlags::DarkWater; uint32 liqTypeIdx = liquidEntry->SoundBank; if (entry < 21) { @@ -2406,14 +2400,14 @@ inline ZLiquidStatus GridMap::GetLiquidStatus(float x, float y, float z, uint8 R } } - type |= 1 << liqTypeIdx; + type |= map_liquidHeaderTypeFlags(1 << liqTypeIdx); } - if (type == 0) + if (type == map_liquidHeaderTypeFlags::NoWater) return LIQUID_MAP_NO_WATER; // Check req liquid type mask - if (ReqLiquidType && !(ReqLiquidType&type)) + if (ReqLiquidType && (*ReqLiquidType & type) == map_liquidHeaderTypeFlags::NoWater) return LIQUID_MAP_NO_WATER; // Check water level: @@ -2438,7 +2432,7 @@ inline ZLiquidStatus GridMap::GetLiquidStatus(float x, float y, float z, uint8 R if (data) { data->entry = entry; - data->type_flags = type; + data->type_flags = type; data->level = liquid_level; data->depth_level = ground_level; } @@ -2490,7 +2484,7 @@ float Map::GetWaterOrGroundLevel(PhaseShift const& phaseShift, float x, float y, LiquidData liquid_status; - ZLiquidStatus res = GetLiquidStatus(phaseShift, x, y, ground_z, MAP_ALL_LIQUIDS, &liquid_status, collisionHeight); + ZLiquidStatus res = GetLiquidStatus(phaseShift, x, y, ground_z, map_liquidHeaderTypeFlags::AllLiquids, &liquid_status, collisionHeight); switch (res) { case LIQUID_MAP_ABOVE_WATER: @@ -2703,15 +2697,15 @@ void Map::GetZoneAndAreaId(PhaseShift const& phaseShift, uint32& zoneid, uint32& zoneid = area->ParentAreaID; } -uint8 Map::GetTerrainType(PhaseShift const& phaseShift, float x, float y) +map_liquidHeaderTypeFlags Map::GetTerrainType(PhaseShift const& phaseShift, float x, float y) { if (GridMap* gmap = GetGrid(PhasingHandler::GetTerrainMapId(phaseShift, this, x, y), x, y)) return gmap->getTerrainType(x, y); else - return 0; + return map_liquidHeaderTypeFlags::NoWater; } -ZLiquidStatus Map::GetLiquidStatus(PhaseShift const& phaseShift, float x, float y, float z, uint8 ReqLiquidType, LiquidData* data, float collisionHeight) +ZLiquidStatus Map::GetLiquidStatus(PhaseShift const& phaseShift, float x, float y, float z, map_liquidHeaderTypeFlags ReqLiquidType, LiquidData* data, float collisionHeight) { ZLiquidStatus result = LIQUID_MAP_NO_WATER; VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager(); @@ -2719,7 +2713,7 @@ ZLiquidStatus Map::GetLiquidStatus(PhaseShift const& phaseShift, float x, float float ground_level = INVALID_HEIGHT; uint32 liquid_type = 0; uint32 terrainMapId = PhasingHandler::GetTerrainMapId(phaseShift, this, x, y); - if (vmgr->GetLiquidLevel(terrainMapId, x, y, z, ReqLiquidType, liquid_level, ground_level, liquid_type)) + if (vmgr->GetLiquidLevel(terrainMapId, x, y, z, AsUnderlyingType(ReqLiquidType), liquid_level, ground_level, liquid_type)) { TC_LOG_DEBUG("maps", "GetLiquidStatus(): vmap liquid level: %f ground: %f type: %u", liquid_level, ground_level, liquid_type); // Check water level and ground level @@ -2760,7 +2754,7 @@ ZLiquidStatus Map::GetLiquidStatus(PhaseShift const& phaseShift, float x, float data->depth_level = ground_level; data->entry = liquid_type; - data->type_flags = 1 << liquidFlagType; + data->type_flags = map_liquidHeaderTypeFlags(1 << liquidFlagType); } float delta = liquid_level - z; @@ -2797,12 +2791,12 @@ ZLiquidStatus Map::GetLiquidStatus(PhaseShift const& phaseShift, float x, float return result; } -void Map::GetFullTerrainStatusForPosition(PhaseShift const& phaseShift, float x, float y, float z, PositionFullTerrainStatus& data, uint8 reqLiquidType, float collisionHeight) +void Map::GetFullTerrainStatusForPosition(PhaseShift const& phaseShift, float x, float y, float z, PositionFullTerrainStatus& data, map_liquidHeaderTypeFlags reqLiquidType, float collisionHeight) { VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager(); VMAP::AreaAndLiquidData vmapData; uint32 terrainMapId = PhasingHandler::GetTerrainMapId(phaseShift, this, x, y); - vmgr->getAreaAndLiquidData(terrainMapId, x, y, z, reqLiquidType, vmapData); + vmgr->getAreaAndLiquidData(terrainMapId, x, y, z, AsUnderlyingType(reqLiquidType), vmapData); if (vmapData.areaInfo) data.areaInfo = boost::in_place(vmapData.areaInfo->adtId, vmapData.areaInfo->rootId, vmapData.areaInfo->groupId, vmapData.areaInfo->mogpFlags); @@ -2870,7 +2864,7 @@ void Map::GetFullTerrainStatusForPosition(PhaseShift const& phaseShift, float x, data.liquidInfo->level = vmapData.liquidInfo->level; data.liquidInfo->depth_level = vmapData.floorZ; data.liquidInfo->entry = liquidType; - data.liquidInfo->type_flags = 1 << liquidFlagType; + data.liquidInfo->type_flags = map_liquidHeaderTypeFlags(1 << liquidFlagType); float delta = vmapData.liquidInfo->level - z; if (delta > collisionHeight) @@ -2934,12 +2928,12 @@ bool Map::IsInWater(PhaseShift const& phaseShift, float x, float y, float pZ, Li { LiquidData liquid_status; LiquidData* liquid_ptr = data ? data : &liquid_status; - return (GetLiquidStatus(phaseShift, x, y, pZ, MAP_ALL_LIQUIDS, liquid_ptr) & (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER)) != 0; + return (GetLiquidStatus(phaseShift, x, y, pZ, map_liquidHeaderTypeFlags::AllLiquids, liquid_ptr) & (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER)) != 0; } bool Map::IsUnderWater(PhaseShift const& phaseShift, float x, float y, float z) { - return (GetLiquidStatus(phaseShift, x, y, z, MAP_LIQUID_TYPE_WATER | MAP_LIQUID_TYPE_OCEAN) & LIQUID_MAP_UNDER_WATER) != 0; + return (GetLiquidStatus(phaseShift, x, y, z, map_liquidHeaderTypeFlags::Water | map_liquidHeaderTypeFlags::Ocean) & LIQUID_MAP_UNDER_WATER) != 0; } char const* Map::GetMapName() const diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 0c85a237771..c3f87671069 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -25,6 +25,7 @@ #include "DynamicTree.h" #include "GridDefines.h" #include "GridRefManager.h" +#include "MapDefines.h" #include "MapRefManager.h" #include "ObjectGuid.h" #include "Optional.h" @@ -80,69 +81,6 @@ struct ScriptAction ScriptInfo const* script; ///> pointer to static script data }; -/// Represents a map magic value of 4 bytes (used in versions) -union u_map_magic -{ - char asChar[4]; ///> Non-null terminated string - uint32 asUInt; ///> uint32 representation -}; - -// ****************************************** -// Map file format defines -// ****************************************** -struct map_fileheader -{ - u_map_magic mapMagic; - u_map_magic versionMagic; - uint32 buildMagic; - uint32 areaMapOffset; - uint32 areaMapSize; - uint32 heightMapOffset; - uint32 heightMapSize; - uint32 liquidMapOffset; - uint32 liquidMapSize; - uint32 holesOffset; - uint32 holesSize; -}; - -#define MAP_AREA_NO_AREA 0x0001 - -struct map_areaHeader -{ - uint32 fourcc; - uint16 flags; - uint16 gridArea; -}; - -#define MAP_HEIGHT_NO_HEIGHT 0x0001 -#define MAP_HEIGHT_AS_INT16 0x0002 -#define MAP_HEIGHT_AS_INT8 0x0004 -#define MAP_HEIGHT_HAS_FLIGHT_BOUNDS 0x0008 - -struct map_heightHeader -{ - uint32 fourcc; - uint32 flags; - float gridHeight; - float gridMaxHeight; -}; - -#define MAP_LIQUID_NO_TYPE 0x0001 -#define MAP_LIQUID_NO_HEIGHT 0x0002 - -struct map_liquidHeader -{ - uint32 fourcc; - uint8 flags; - uint8 liquidFlags; - uint16 liquidType; - uint8 offsetX; - uint8 offsetY; - uint8 width; - uint8 height; - float liquidLevel; -}; - enum ZLiquidStatus : uint32 { LIQUID_MAP_NO_WATER = 0x00000000, @@ -155,19 +93,9 @@ enum ZLiquidStatus : uint32 #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) -#define MAP_LIQUID_TYPE_NO_WATER 0x00 -#define MAP_LIQUID_TYPE_WATER 0x01 -#define MAP_LIQUID_TYPE_OCEAN 0x02 -#define MAP_LIQUID_TYPE_MAGMA 0x04 -#define MAP_LIQUID_TYPE_SLIME 0x08 - -#define MAP_ALL_LIQUIDS (MAP_LIQUID_TYPE_WATER | MAP_LIQUID_TYPE_OCEAN | MAP_LIQUID_TYPE_MAGMA | MAP_LIQUID_TYPE_SLIME) - -#define MAP_LIQUID_TYPE_DARK_WATER 0x10 - struct LiquidData { - uint32 type_flags; + EnumFlag<map_liquidHeaderTypeFlags> type_flags = map_liquidHeaderTypeFlags::NoWater; uint32 entry; float level; float depth_level; @@ -215,11 +143,11 @@ class TC_GAME_API GridMap // Liquid data float _liquidLevel; uint16* _liquidEntry; - uint8* _liquidFlags; + map_liquidHeaderTypeFlags* _liquidFlags; float* _liquidMap; uint16 _gridArea; uint16 _liquidGlobalEntry; - uint8 _liquidGlobalFlags; + map_liquidHeaderTypeFlags _liquidGlobalFlags; uint8 _liquidOffX; uint8 _liquidOffY; uint8 _liquidWidth; @@ -255,8 +183,8 @@ public: 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; - uint8 getTerrainType(float x, float y) const; - ZLiquidStatus GetLiquidStatus(float x, float y, float z, uint8 ReqLiquidType, LiquidData* data = nullptr, float collisionHeight = 2.03128f); // DEFAULT_COLLISION_HEIGHT in Object.h + map_liquidHeaderTypeFlags getTerrainType(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) @@ -401,9 +329,9 @@ class TC_GAME_API Map : public GridRefManager<NGridType> void AddChildTerrainMap(Map* map) { m_childTerrainMaps->push_back(map); map->m_parentTerrainMap = this; } void UnlinkAllChildTerrainMaps() { m_childTerrainMaps->clear(); } - void GetFullTerrainStatusForPosition(float x, float y, float z, PositionFullTerrainStatus& data, uint8 reqLiquidType = MAP_ALL_LIQUIDS, float collisionHeight = 2.03128f) const; // DEFAULT_COLLISION_HEIGHT in Object.h - void GetFullTerrainStatusForPosition(PhaseShift const& phaseShift, float x, float y, float z, PositionFullTerrainStatus& data, uint8 reqLiquidType = MAP_ALL_LIQUIDS, float collisionHeight = 2.03128f); // DEFAULT_COLLISION_HEIGHT in Object.h - ZLiquidStatus GetLiquidStatus(PhaseShift const& phaseShift, float x, float y, float z, uint8 ReqLiquidType, LiquidData* data = nullptr, float collisionHeight = 2.03128f); // DEFAULT_COLLISION_HEIGHT in Object.h + 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 bool GetAreaInfo(PhaseShift const& phaseShift, float x, float y, float z, uint32& mogpflags, int32& adtId, int32& rootId, int32& groupId); uint32 GetAreaId(PhaseShift const& phaseShift, float x, float y, float z, bool *isOutdoors = nullptr); @@ -415,7 +343,7 @@ class TC_GAME_API Map : public GridRefManager<NGridType> bool IsOutdoors(PhaseShift const& phaseShift, float x, float y, float z); - uint8 GetTerrainType(PhaseShift const& phaseShift, float x, float y); + map_liquidHeaderTypeFlags GetTerrainType(PhaseShift const& phaseShift, float x, float y); 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); diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp index 5124c5c4bea..bcd5a82ca91 100644 --- a/src/server/game/Movement/PathGenerator.cpp +++ b/src/server/game/Movement/PathGenerator.cpp @@ -184,7 +184,7 @@ void PathGenerator::BuildPolyPath(G3D::Vector3 const& startPos, G3D::Vector3 con // Check both start and end points, if they're both in water, then we can *safely* let the creature move for (uint32 i = 0; i < _pathPoints.size(); ++i) { - ZLiquidStatus status = _sourceUnit->GetMap()->GetLiquidStatus(_sourceUnit->GetPhaseShift(), _pathPoints[i].x, _pathPoints[i].y, _pathPoints[i].z, MAP_ALL_LIQUIDS, nullptr, _sourceUnit->GetCollisionHeight()); + ZLiquidStatus status = _sourceUnit->GetMap()->GetLiquidStatus(_sourceUnit->GetPhaseShift(), _pathPoints[i].x, _pathPoints[i].y, _pathPoints[i].z, map_liquidHeaderTypeFlags::AllLiquids, nullptr, _sourceUnit->GetCollisionHeight()); // One of the points is not in the water, cancel movement. if (status == LIQUID_MAP_NO_WATER) { @@ -647,18 +647,18 @@ void PathGenerator::UpdateFilter() NavTerrainFlag PathGenerator::GetNavTerrain(float x, float y, float z) { LiquidData data; - ZLiquidStatus liquidStatus = _sourceUnit->GetMap()->GetLiquidStatus(_sourceUnit->GetPhaseShift(), x, y, z, MAP_ALL_LIQUIDS, &data, _sourceUnit->GetCollisionHeight()); + ZLiquidStatus liquidStatus = _sourceUnit->GetMap()->GetLiquidStatus(_sourceUnit->GetPhaseShift(), x, y, z, map_liquidHeaderTypeFlags::AllLiquids, &data, _sourceUnit->GetCollisionHeight()); if (liquidStatus == LIQUID_MAP_NO_WATER) return NAV_GROUND; - data.type_flags &= ~MAP_LIQUID_TYPE_DARK_WATER; + data.type_flags &= map_liquidHeaderTypeFlags::DarkWater; switch (data.type_flags) { - case MAP_LIQUID_TYPE_WATER: - case MAP_LIQUID_TYPE_OCEAN: + case map_liquidHeaderTypeFlags::Water: + case map_liquidHeaderTypeFlags::Ocean: return NAV_WATER; - case MAP_LIQUID_TYPE_MAGMA: - case MAP_LIQUID_TYPE_SLIME: + case map_liquidHeaderTypeFlags::Magma: + case map_liquidHeaderTypeFlags::Slime: return NAV_MAGMA_SLIME; default: return NAV_GROUND; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index f545df5ddc9..65a92309a8d 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1355,7 +1355,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici float ground = m_caster->GetMapHeight(x, y, z); float liquidLevel = VMAP_INVALID_HEIGHT_VALUE; LiquidData liquidData; - if (m_caster->GetMap()->GetLiquidStatus(m_caster->GetPhaseShift(), x, y, z, MAP_ALL_LIQUIDS, &liquidData, m_caster->GetCollisionHeight())) + if (m_caster->GetMap()->GetLiquidStatus(m_caster->GetPhaseShift(), x, y, z, map_liquidHeaderTypeFlags::AllLiquids, &liquidData, m_caster->GetCollisionHeight())) liquidLevel = liquidData.level; if (liquidLevel <= ground) // When there is no liquid Map::GetWaterOrGroundLevel returns ground level diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index c70567b1746..4cc34449eb0 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -298,9 +298,9 @@ public: zoneX, zoneY, groundZ, floorZ, haveMap, haveVMap, haveMMap); LiquidData liquidStatus; - ZLiquidStatus status = map->GetLiquidStatus(object->GetPhaseShift(), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), MAP_ALL_LIQUIDS, &liquidStatus); + ZLiquidStatus status = map->GetLiquidStatus(object->GetPhaseShift(), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), map_liquidHeaderTypeFlags::AllLiquids, &liquidStatus); if (status) - handler->PSendSysMessage(LANG_LIQUID_STATUS, liquidStatus.level, liquidStatus.depth_level, liquidStatus.entry, liquidStatus.type_flags, status); + handler->PSendSysMessage(LANG_LIQUID_STATUS, liquidStatus.level, liquidStatus.depth_level, liquidStatus.entry, uint32(liquidStatus.type_flags.AsUnderlyingType()), status); PhasingHandler::PrintToChat(handler, object->GetPhaseShift()); |
