diff options
author | Ovahlord <dreadkiller@gmx.de> | 2024-01-02 19:46:44 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-02 19:46:44 +0100 |
commit | 97af0c31af13de23eabe4eb22ed3e71dd5602531 (patch) | |
tree | 0c816747f6b2e627b214a1adac4ebcbd5803b556 /src/server/game/Maps/TerrainMgr.cpp | |
parent | bfb9fd8a2c777651c99568ba9c6a2d4a3a468955 (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.cpp | 38 |
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; } } |