Core/Entities: handle more edge cases in IsInAir

can be done in one liner, with one math expression if I'm not mistaken, but this allows easier debugging
This commit is contained in:
ccrs
2025-10-25 23:26:43 +02:00
parent c5e2a9485f
commit 00ddc35568

View File

@@ -3166,7 +3166,17 @@ bool Unit::IsUnderWater() const
bool Unit::IsInAir(Position const destination, float destinationFloor, bool honorHover/* = true*/) const
{
return std::fabs(destination.GetPositionZ() - (honorHover ? GetHoverOffset() : 0.f) - destinationFloor) > 0.1f;
float z = destination.GetPositionZ();
if (z < destinationFloor - 0.5f) // if really bellow ground, in air (caves,...)
return true;
float hoverHeight = GetHoverOffset(); // height if currently hovering
if (GetTypeId() == TYPEID_UNIT) {
hoverHeight = ToCreature()->CanHover() ? GetFloatValue(UNIT_FIELD_HOVERHEIGHT) : 0.f; // height if could hover
}
z = destination.GetPositionZ() - (honorHover ? hoverHeight : 0.f);
if (z <= destinationFloor + 0.5f) // if is bellow ground or slightly above it, not in air - should hover too
return false;
return std::fabs(z - destinationFloor) > 0.5f; // if the difference is higher than tolerance level, in air (todo: this should most likely take into account unit's "size")
}
void Unit::ProcessPositionDataChanged(PositionFullTerrainStatus const& data)