aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2017-11-23 18:12:44 +0100
committerShauren <shauren.trinity@gmail.com>2021-08-24 12:44:38 +0200
commit2e2b29861878fda2d27156c71a1d8ed7dbe0b4fe (patch)
tree19cd6b07b575781b68e42284dfe5cd7a1a59f825 /src/server/game/Entities/Object
parent028f9b47807e2e2527c2c183105a033a6129b4d3 (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.cpp80
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