diff options
| author | Shauren <shauren.trinity@gmail.com> | 2017-11-23 18:12:44 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-08-24 12:44:38 +0200 |
| commit | 2e2b29861878fda2d27156c71a1d8ed7dbe0b4fe (patch) | |
| tree | 19cd6b07b575781b68e42284dfe5cd7a1a59f825 /src/server/game/Entities/Object | |
| parent | 028f9b47807e2e2527c2c183105a033a6129b4d3 (diff) | |
Core/Movement: Fixed creature hover
Closes #15177
(cherry picked from commit 2baa81065ba27f0a6d278a8dd8a79b7c831e0a2b)
Diffstat (limited to 'src/server/game/Entities/Object')
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 80 |
1 files changed, 30 insertions, 50 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index e4e13390c78..985d079826c 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1303,7 +1303,9 @@ Position WorldObject::GetRandomPoint(Position const& srcPos, float distance) con void WorldObject::UpdateGroundPositionZ(float x, float y, float &z) const { - z = GetMapHeight(x, y, z); + float new_z = GetMapHeight(x, y, z); + if (new_z > INVALID_HEIGHT) + z = new_z + (isType(TYPEMASK_UNIT) ? static_cast<Unit const*>(this)->GetHoverOffset() : 0.0f); } void WorldObject::UpdateAllowedPositionZ(float x, float y, float &z) const @@ -1312,66 +1314,44 @@ void WorldObject::UpdateAllowedPositionZ(float x, float y, float &z) const if (GetTransport()) return; - switch (GetTypeId()) + if (Unit const* unit = ToUnit()) { - case TYPEID_UNIT: - { - // non fly unit don't must be in air - // non swim unit must be at ground (mostly speedup, because it don't must be in water and water level check less fast - if (!ToCreature()->CanFly()) - { - bool canSwim = ToCreature()->CanSwim(); - float ground_z = z; - float max_z = canSwim - ? GetMapWaterOrGroundLevel(x, y, z, &ground_z) - : (ground_z = GetMapHeight(x, y, z)); - if (max_z > INVALID_HEIGHT) - { - if (z > max_z) - z = max_z; - else if (z < ground_z) - z = ground_z; - } - } - else - { - float ground_z = GetMapHeight(x, y, z); - if (std::fabs(z - ground_z) < GetCollisionHeight()) - z = ground_z; - } - break; - } - case TYPEID_PLAYER: + if (!unit->CanFly()) { - // for server controlled moves playr work same as creature (but it can always swim) - if (!ToPlayer()->CanFly()) - { - float ground_z = z; - float max_z = GetMapWaterOrGroundLevel(x, y, z, &ground_z); - if (max_z > INVALID_HEIGHT) - { - if (z > max_z) - z = max_z; - else if (z < ground_z) - z = ground_z; - } - } + bool canSwim = unit->CanSwim(); + float ground_z = z; + float max_z; + if (canSwim) + max_z = GetMapWaterOrGroundLevel(x, y, z, &ground_z); else + max_z = ground_z = GetMapHeight(x, y, z); + + if (max_z > INVALID_HEIGHT) { - float ground_z = GetMapHeight(x, y, z); - if (std::fabs(z - ground_z) < GetCollisionHeight()) + // hovering units cannot go below their hover height + float hoverOffset = unit->GetHoverOffset(); + max_z += hoverOffset; + ground_z += hoverOffset; + + if (z > max_z) + z = max_z; + else if (z < ground_z) z = ground_z; } - break; } - default: + else { - float ground_z = GetMapHeight(x, y, z); - if (ground_z > INVALID_HEIGHT) + float ground_z = GetMapHeight(x, y, z) + unit->GetHoverOffset(); + if (z < ground_z) z = ground_z; - break; } } + else + { + float ground_z = GetMapHeight(x, y, z); + if (ground_z > INVALID_HEIGHT) + z = ground_z; + } } float WorldObject::GetGridActivationRange() const |
