diff options
| author | Shauren <shauren.trinity@gmail.com> | 2017-11-23 18:12:44 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2018-03-08 23:13:51 +0100 |
| commit | 2baa81065ba27f0a6d278a8dd8a79b7c831e0a2b (patch) | |
| tree | e8d4960ec63da14aeee2afaed037a64bd5835859 /src/server/game/Movement | |
| parent | 2840e096fc42faa80b839f16edaedc977b12bfee (diff) | |
Core/Movement: Fixed creature hover
Closes #15177
Diffstat (limited to 'src/server/game/Movement')
3 files changed, 15 insertions, 5 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 131c96cce22..c10870703fa 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -356,7 +356,7 @@ void MotionMaster::MoveCloserAndStop(uint32 id, Unit* target, float distance) { // we are already close enough. We just need to turn toward the target without changing position. Movement::MoveSplineInit init(_owner); - init.MoveTo(_owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZMinusOffset()); + init.MoveTo(_owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZ()); init.SetFacing(target); init.Launch(); Mutate(new EffectMovementGenerator(id), MOTION_SLOT_ACTIVE); @@ -499,7 +499,7 @@ void MotionMaster::MoveCirclePath(float x, float y, float z, float radius, bool if (_owner->IsFlying()) point.z = z; else - point.z = _owner->GetMapHeight(point.x, point.y, z); + point.z = _owner->GetMapHeight(point.x, point.y, z) + _owner->GetHoverOffset(); init.Path().push_back(point); } @@ -600,7 +600,7 @@ void MotionMaster::MoveFall(uint32 id /*=0*/) } Movement::MoveSplineInit init(_owner); - init.MoveTo(_owner->GetPositionX(), _owner->GetPositionY(), tz, false); + init.MoveTo(_owner->GetPositionX(), _owner->GetPositionY(), tz + _owner->GetHoverOffset(), false); init.SetFall(); init.Launch(); Mutate(new EffectMovementGenerator(id), MOTION_SLOT_CONTROLLED); diff --git a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp index 809c8b8bccd..dd72838c247 100644 --- a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp @@ -52,6 +52,7 @@ void HomeMovementGenerator<Creature>::SetTargetLocation(Creature* owner) owner->GetHomePosition(x, y, z, o); init.SetFacing(o); } + owner->UpdateAllowedPositionZ(x, y, z); init.MoveTo(x, y, z); init.SetWalk(false); init.Launch(); diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index de0a16e1910..4de930e56b6 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -125,29 +125,38 @@ void TargetedMovementGenerator<T, D>::SetTargetLocation(T* owner, bool updateDes float x, y, z; if (updateDestination || !_path) { + float size = owner->GetCombatReach(); + float hoverDiff = owner->GetHoverOffset() - GetTarget()->GetHoverOffset(); if (!_offset) { if (GetTarget()->IsWithinDistInMap(owner, CONTACT_DISTANCE)) return; - GetTarget()->GetContactPoint(owner, x, y, z); + if (hoverDiff) + size = size > hoverDiff ? std::sqrt(size * size - hoverDiff * hoverDiff) : 0.0f; + + GetTarget()->GetNearPoint(owner, x, y, z, size, CONTACT_DISTANCE, GetTarget()->GetAngle(owner)); } else { float distance = _offset + 1.0f; - float size = owner->GetCombatReach(); if (owner->IsPet() && GetTarget()->GetTypeId() == TYPEID_PLAYER) { distance = 1.0f; size = 1.0f; } + else if (hoverDiff) + size = size > hoverDiff ? std::sqrt(size * size - hoverDiff * hoverDiff) : 0.0f; if (GetTarget()->IsWithinDistInMap(owner, distance)) return; GetTarget()->GetClosePoint(x, y, z, size, _offset, _angle); } + + if (owner->IsHovering()) + owner->UpdateAllowedPositionZ(x, y, z); } else { |
