aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps/TerrainMgr.cpp
diff options
context:
space:
mode:
authorOvahlord <dreadkiller@gmx.de>2024-01-02 19:46:44 +0100
committerGitHub <noreply@github.com>2024-01-02 19:46:44 +0100
commit97af0c31af13de23eabe4eb22ed3e71dd5602531 (patch)
tree0c816747f6b2e627b214a1adac4ebcbd5803b556 /src/server/game/Maps/TerrainMgr.cpp
parentbfb9fd8a2c777651c99568ba9c6a2d4a3a468955 (diff)
Core/Maps: implement LIQUID_MAP_OCEAN_FLOOR to identify units that are on the bottom of a liquid (#29545)
Diffstat (limited to 'src/server/game/Maps/TerrainMgr.cpp')
-rw-r--r--src/server/game/Maps/TerrainMgr.cpp38
1 files changed, 27 insertions, 11 deletions
diff --git a/src/server/game/Maps/TerrainMgr.cpp b/src/server/game/Maps/TerrainMgr.cpp
index 4e9a0c65e92..cfdf78021d7 100644
--- a/src/server/game/Maps/TerrainMgr.cpp
+++ b/src/server/game/Maps/TerrainMgr.cpp
@@ -442,14 +442,19 @@ void TerrainInfo::GetFullTerrainStatusForPosition(PhaseShift const& phaseShift,
data.liquidInfo->type_flags = map_liquidHeaderTypeFlags(1 << liquidFlagType);
float delta = wmoData->liquidInfo->level - z;
+ uint32 status = LIQUID_MAP_ABOVE_WATER;
if (delta > collisionHeight)
- data.liquidStatus = LIQUID_MAP_UNDER_WATER;
+ status = LIQUID_MAP_UNDER_WATER;
else if (delta > 0.0f)
- data.liquidStatus = LIQUID_MAP_IN_WATER;
+ status = LIQUID_MAP_IN_WATER;
else if (delta > -0.1f)
- data.liquidStatus = LIQUID_MAP_WATER_WALK;
- else
- data.liquidStatus = LIQUID_MAP_ABOVE_WATER;
+ status = LIQUID_MAP_WATER_WALK;
+
+ if (status != LIQUID_MAP_ABOVE_WATER)
+ if (std::fabs(wmoData->floorZ - z) <= GROUND_HEIGHT_TOLERANCE)
+ status |= LIQUID_MAP_OCEAN_FLOOR;
+
+ data.liquidStatus = static_cast<ZLiquidStatus>(status);
}
// look up liquid data from grid map
if (gmap && useGridLiquid)
@@ -524,12 +529,23 @@ ZLiquidStatus TerrainInfo::GetLiquidStatus(PhaseShift const& phaseShift, uint32
float delta = liquid_level - z;
// Get position delta
- if (delta > collisionHeight) // Under water
- return LIQUID_MAP_UNDER_WATER;
- if (delta > 0.0f) // In water
- return LIQUID_MAP_IN_WATER;
- if (delta > -0.1f) // Walk on water
- return LIQUID_MAP_WATER_WALK;
+ uint32 status = LIQUID_MAP_ABOVE_WATER;
+ if (delta > collisionHeight) // Under water
+ status = LIQUID_MAP_UNDER_WATER;
+ else if (delta > 0.0f) // In water
+ status = LIQUID_MAP_IN_WATER;
+ else if (delta > -0.1f) // Walk on water
+ status = LIQUID_MAP_WATER_WALK;
+
+ if (status != LIQUID_MAP_ABOVE_WATER)
+ {
+ if (status != LIQUID_MAP_ABOVE_WATER)
+ if (std::fabs(ground_level - z) <= GROUND_HEIGHT_TOLERANCE)
+ status |= LIQUID_MAP_OCEAN_FLOOR;
+
+ return static_cast<ZLiquidStatus>(status);
+ }
+
result = LIQUID_MAP_ABOVE_WATER;
}
}