aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps/Map.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Maps/Map.cpp')
-rw-r--r--src/server/game/Maps/Map.cpp96
1 files changed, 45 insertions, 51 deletions
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