aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps/TerrainMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Maps/TerrainMgr.cpp')
-rw-r--r--src/server/game/Maps/TerrainMgr.cpp74
1 files changed, 32 insertions, 42 deletions
diff --git a/src/server/game/Maps/TerrainMgr.cpp b/src/server/game/Maps/TerrainMgr.cpp
index cfdf78021d7..189108a74d1 100644
--- a/src/server/game/Maps/TerrainMgr.cpp
+++ b/src/server/game/Maps/TerrainMgr.cpp
@@ -322,7 +322,8 @@ static bool IsInWMOInterior(uint32 mogpFlags)
return (mogpFlags & 0x2000) != 0;
}
-void TerrainInfo::GetFullTerrainStatusForPosition(PhaseShift const& phaseShift, uint32 mapId, float x, float y, float z, PositionFullTerrainStatus& data, map_liquidHeaderTypeFlags reqLiquidType, float collisionHeight, DynamicMapTree const* dynamicMapTree)
+void TerrainInfo::GetFullTerrainStatusForPosition(PhaseShift const& phaseShift, uint32 mapId, float x, float y, float z, PositionFullTerrainStatus& data,
+ Optional<map_liquidHeaderTypeFlags> reqLiquidType, float collisionHeight, DynamicMapTree const* dynamicMapTree)
{
VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager();
VMAP::AreaAndLiquidData vmapData;
@@ -330,9 +331,9 @@ void TerrainInfo::GetFullTerrainStatusForPosition(PhaseShift const& phaseShift,
VMAP::AreaAndLiquidData* wmoData = nullptr;
uint32 terrainMapId = PhasingHandler::GetTerrainMapId(phaseShift, mapId, this, x, y);
GridMap* gmap = GetGrid(terrainMapId, x, y);
- vmgr->getAreaAndLiquidData(terrainMapId, x, y, z, AsUnderlyingType(reqLiquidType), vmapData);
+ vmgr->getAreaAndLiquidData(terrainMapId, x, y, z, reqLiquidType ? AsUnderlyingType(*reqLiquidType) : Optional<uint8>(), vmapData);
if (dynamicMapTree)
- dynamicMapTree->getAreaAndLiquidData(x, y, z, phaseShift, AsUnderlyingType(reqLiquidType), dynData);
+ dynamicMapTree->getAreaAndLiquidData(x, y, z, phaseShift, reqLiquidType ? AsUnderlyingType(*reqLiquidType) : Optional<uint8>(), dynData);
uint32 gridAreaId = 0;
float gridMapHeight = INVALID_HEIGHT;
@@ -371,7 +372,7 @@ void TerrainInfo::GetFullTerrainStatusForPosition(PhaseShift const& phaseShift,
{
if (wmoData->areaInfo)
{
- data.areaInfo.emplace(wmoData->areaInfo->adtId, wmoData->areaInfo->rootId, wmoData->areaInfo->groupId, wmoData->areaInfo->mogpFlags);
+ data.wmoLocation.emplace(wmoData->areaInfo->groupId, wmoData->areaInfo->adtId, wmoData->areaInfo->rootId, wmoData->areaInfo->uniqueId);
// wmo found
WMOAreaTableEntry const* wmoEntry = sDB2Manager.GetWMOAreaTable(wmoData->areaInfo->rootId, wmoData->areaInfo->adtId, wmoData->areaInfo->groupId);
if (!wmoEntry)
@@ -471,35 +472,32 @@ void TerrainInfo::GetFullTerrainStatusForPosition(PhaseShift const& phaseShift,
}
}
-ZLiquidStatus TerrainInfo::GetLiquidStatus(PhaseShift const& phaseShift, uint32 mapId, float x, float y, float z, map_liquidHeaderTypeFlags ReqLiquidType, LiquidData* data, float collisionHeight)
+ZLiquidStatus TerrainInfo::GetLiquidStatus(PhaseShift const& phaseShift, uint32 mapId, float x, float y, float z, Optional<map_liquidHeaderTypeFlags> ReqLiquidType, LiquidData* data, float collisionHeight)
{
ZLiquidStatus result = LIQUID_MAP_NO_WATER;
VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager();
- float liquid_level = INVALID_HEIGHT;
- float ground_level = INVALID_HEIGHT;
- uint32 liquid_type = 0;
- uint32 mogpFlags = 0;
+ VMAP::AreaAndLiquidData vmapData;
bool useGridLiquid = true;
uint32 terrainMapId = PhasingHandler::GetTerrainMapId(phaseShift, mapId, this, x, y);
- if (vmgr->GetLiquidLevel(terrainMapId, x, y, z, AsUnderlyingType(ReqLiquidType), liquid_level, ground_level, liquid_type, mogpFlags))
+ if (vmgr->getAreaAndLiquidData(terrainMapId, x, y, z, ReqLiquidType ? AsUnderlyingType(*ReqLiquidType) : Optional<uint8>(), vmapData) && vmapData.liquidInfo)
{
- useGridLiquid = !IsInWMOInterior(mogpFlags);
- TC_LOG_DEBUG("maps", "GetLiquidStatus(): vmap liquid level: {} ground: {} type: {}", liquid_level, ground_level, liquid_type);
+ useGridLiquid = !vmapData.areaInfo || !IsInWMOInterior(vmapData.areaInfo->mogpFlags);
+ TC_LOG_DEBUG("maps", "GetLiquidStatus(): vmap liquid level: {} ground: {} type: {}", vmapData.liquidInfo->level, vmapData.floorZ, vmapData.liquidInfo->type);
// Check water level and ground level
- if (liquid_level > ground_level && G3D::fuzzyGe(z, ground_level - GROUND_HEIGHT_TOLERANCE))
+ if (vmapData.liquidInfo->level > vmapData.floorZ && G3D::fuzzyGe(z, vmapData.floorZ - GROUND_HEIGHT_TOLERANCE))
{
// All ok in water -> store data
if (data)
{
// hardcoded in client like this
- if (GetId() == 530 && liquid_type == 2)
- liquid_type = 15;
+ if (GetId() == 530 && vmapData.liquidInfo->type == 2)
+ vmapData.liquidInfo->type = 15;
uint32 liquidFlagType = 0;
- if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(liquid_type))
+ if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(vmapData.liquidInfo->type))
liquidFlagType = liq->SoundBank;
- if (liquid_type && liquid_type < 21)
+ if (vmapData.liquidInfo->type && vmapData.liquidInfo->type < 21)
{
if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(GetAreaId(phaseShift, mapId, x, y, z)))
{
@@ -513,20 +511,20 @@ ZLiquidStatus TerrainInfo::GetLiquidStatus(PhaseShift const& phaseShift, uint32
if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(overrideLiquid))
{
- liquid_type = overrideLiquid;
+ vmapData.liquidInfo->type = overrideLiquid;
liquidFlagType = liq->SoundBank;
}
}
}
- data->level = liquid_level;
- data->depth_level = ground_level;
+ data->level = vmapData.liquidInfo->level;
+ data->depth_level = vmapData.floorZ;
- data->entry = liquid_type;
+ data->entry = vmapData.liquidInfo->type;
data->type_flags = map_liquidHeaderTypeFlags(1 << liquidFlagType);
}
- float delta = liquid_level - z;
+ float delta = vmapData.liquidInfo->level - z;
// Get position delta
uint32 status = LIQUID_MAP_ABOVE_WATER;
@@ -540,7 +538,7 @@ ZLiquidStatus TerrainInfo::GetLiquidStatus(PhaseShift const& phaseShift, uint32
if (status != LIQUID_MAP_ABOVE_WATER)
{
if (status != LIQUID_MAP_ABOVE_WATER)
- if (std::fabs(ground_level - z) <= GROUND_HEIGHT_TOLERANCE)
+ if (std::fabs(vmapData.floorZ - z) <= GROUND_HEIGHT_TOLERANCE)
status |= LIQUID_MAP_OCEAN_FLOOR;
return static_cast<ZLiquidStatus>(status);
@@ -557,7 +555,7 @@ ZLiquidStatus TerrainInfo::GetLiquidStatus(PhaseShift const& phaseShift, uint32
LiquidData map_data;
ZLiquidStatus map_result = gmap->GetLiquidStatus(x, y, z, ReqLiquidType, &map_data, collisionHeight);
// Not override LIQUID_MAP_ABOVE_WATER with LIQUID_MAP_NO_WATER:
- if (map_result != LIQUID_MAP_NO_WATER && (map_data.level > ground_level))
+ if (map_result != LIQUID_MAP_NO_WATER && (map_data.level > vmapData.floorZ))
{
if (data)
{
@@ -576,28 +574,20 @@ ZLiquidStatus TerrainInfo::GetLiquidStatus(PhaseShift const& phaseShift, uint32
bool TerrainInfo::GetAreaInfo(PhaseShift const& phaseShift, uint32 mapId, float x, float y, float z, uint32& mogpflags, int32& adtId, int32& rootId, int32& groupId, DynamicMapTree const* dynamicMapTree)
{
- float vmap_z = z;
- float dynamic_z = z;
float check_z = z;
uint32 terrainMapId = PhasingHandler::GetTerrainMapId(phaseShift, mapId, this, x, y);
VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager();
- uint32 vflags;
- int32 vadtId;
- int32 vrootId;
- int32 vgroupId;
- uint32 dflags;
- int32 dadtId;
- int32 drootId;
- int32 dgroupId;
-
- bool hasVmapAreaInfo = vmgr->getAreaInfo(terrainMapId, x, y, vmap_z, vflags, vadtId, vrootId, vgroupId);
- bool hasDynamicAreaInfo = dynamicMapTree ? dynamicMapTree->getAreaInfo(x, y, dynamic_z, phaseShift, dflags, dadtId, drootId, dgroupId) : false;
- auto useVmap = [&]() { check_z = vmap_z; mogpflags = vflags; adtId = vadtId; rootId = vrootId; groupId = vgroupId; };
- auto useDyn = [&]() { check_z = dynamic_z; mogpflags = dflags; adtId = dadtId; rootId = drootId; groupId = dgroupId; };
+ VMAP::AreaAndLiquidData vdata;
+ VMAP::AreaAndLiquidData ddata;
+
+ bool hasVmapAreaInfo = vmgr->getAreaAndLiquidData(terrainMapId, x, y, z, {}, vdata) && vdata.areaInfo.has_value();
+ bool hasDynamicAreaInfo = dynamicMapTree ? dynamicMapTree->getAreaAndLiquidData(x, y, z, phaseShift, {}, ddata) && ddata.areaInfo.has_value() : false;
+ auto useVmap = [&] { check_z = vdata.floorZ; groupId = vdata.areaInfo->groupId; adtId = vdata.areaInfo->adtId; rootId = vdata.areaInfo->rootId; mogpflags = vdata.areaInfo->mogpFlags; };
+ auto useDyn = [&] { check_z = ddata.floorZ; groupId = ddata.areaInfo->groupId; adtId = ddata.areaInfo->adtId; rootId = ddata.areaInfo->rootId; mogpflags = ddata.areaInfo->mogpFlags; };
if (hasVmapAreaInfo)
{
- if (hasDynamicAreaInfo && dynamic_z > vmap_z)
+ if (hasDynamicAreaInfo && ddata.floorZ > vdata.floorZ)
useDyn();
else
useVmap();
@@ -743,7 +733,7 @@ bool TerrainInfo::IsInWater(PhaseShift const& phaseShift, uint32 mapId, float x,
{
LiquidData liquid_status;
LiquidData* liquid_ptr = data ? data : &liquid_status;
- return (GetLiquidStatus(phaseShift, mapId, x, y, pZ, map_liquidHeaderTypeFlags::AllLiquids, liquid_ptr) & (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER)) != 0;
+ return (GetLiquidStatus(phaseShift, mapId, x, y, pZ, {}, liquid_ptr) & (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER)) != 0;
}
bool TerrainInfo::IsUnderWater(PhaseShift const& phaseShift, uint32 mapId, float x, float y, float z)
@@ -765,7 +755,7 @@ float TerrainInfo::GetWaterOrGroundLevel(PhaseShift const& phaseShift, uint32 ma
LiquidData liquid_status;
- ZLiquidStatus res = GetLiquidStatus(phaseShift, mapId, x, y, ground_z, map_liquidHeaderTypeFlags::AllLiquids, &liquid_status, collisionHeight);
+ ZLiquidStatus res = GetLiquidStatus(phaseShift, mapId, x, y, ground_z, {}, &liquid_status, collisionHeight);
switch (res)
{
case LIQUID_MAP_ABOVE_WATER: