aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common/Collision/Maps/MapDefines.h3
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp5
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
-rw-r--r--src/server/game/Maps/GridMap.cpp22
-rw-r--r--src/server/game/Maps/TerrainMgr.cpp38
5 files changed, 49 insertions, 20 deletions
diff --git a/src/common/Collision/Maps/MapDefines.h b/src/common/Collision/Maps/MapDefines.h
index ced17e3c25a..0aa187617df 100644
--- a/src/common/Collision/Maps/MapDefines.h
+++ b/src/common/Collision/Maps/MapDefines.h
@@ -127,7 +127,8 @@ enum ZLiquidStatus : uint32
LIQUID_MAP_ABOVE_WATER = 0x00000001,
LIQUID_MAP_WATER_WALK = 0x00000002,
LIQUID_MAP_IN_WATER = 0x00000004,
- LIQUID_MAP_UNDER_WATER = 0x00000008
+ LIQUID_MAP_UNDER_WATER = 0x00000008,
+ LIQUID_MAP_OCEAN_FLOOR = 0x00000010
};
#define MAP_LIQUID_STATUS_SWIMMING (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER)
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 31d30c9949b..368926acc5e 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -3110,6 +3110,11 @@ bool Unit::IsUnderWater() const
return GetLiquidStatus() & LIQUID_MAP_UNDER_WATER;
}
+bool Unit::IsOnOceanFloor() const
+{
+ return GetLiquidStatus() & LIQUID_MAP_OCEAN_FLOOR;
+}
+
void Unit::ProcessPositionDataChanged(PositionFullTerrainStatus const& data)
{
ZLiquidStatus oldLiquidStatus = GetLiquidStatus();
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index a07883dc296..08beac15956 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1191,6 +1191,7 @@ class TC_GAME_API Unit : public WorldObject
bool IsInWater() const;
bool IsUnderWater() const;
+ bool IsOnOceanFloor() const;
bool isInAccessiblePlaceFor(Creature const* c) const;
void SendHealSpellLog(HealInfo& healInfo, bool critical = false);
diff --git a/src/server/game/Maps/GridMap.cpp b/src/server/game/Maps/GridMap.cpp
index 2d06aa25687..0d5f2587675 100644
--- a/src/server/game/Maps/GridMap.cpp
+++ b/src/server/game/Maps/GridMap.cpp
@@ -677,12 +677,18 @@ ZLiquidStatus GridMap::GetLiquidStatus(float x, float y, float z, Optional<map_l
// For speed check as int values
float delta = liquid_level - z;
- 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;
- // Above water
- return LIQUID_MAP_ABOVE_WATER;
+ uint32 status = LIQUID_MAP_ABOVE_WATER; // 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 (std::fabs(ground_level - z) <= GROUND_HEIGHT_TOLERANCE)
+ status |= LIQUID_MAP_OCEAN_FLOOR;
+
+ return static_cast<ZLiquidStatus>(status);
}
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;
}
}