mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-13 03:32:28 -04:00
Core/Maps: implement LIQUID_MAP_OCEAN_FLOOR to identify units that are on the bottom of a liquid (#29545)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user