aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Movement/MotionMaster.cpp
diff options
context:
space:
mode:
authorOvah <dreadkiller@gmx.de>2020-04-17 21:13:18 +0200
committerShauren <shauren.trinity@gmail.com>2022-01-01 19:17:05 +0100
commita3d28efcfa329a1330b8687e9bdde8759bbe0bdc (patch)
tree201158f7188b2eacccb2f74b1eb1e91d487aecfb /src/server/game/Movement/MotionMaster.cpp
parent92ab79bd9a83cc0961b643cc3298226c5bea41df (diff)
Core/Movement: various improvements for creature knockbacks
* creature knockbacks will no longer generate a full path but instead only use a destination point to reflect sniff data * calculate the destination by using a mmap raycast instead of using a mmap path which had the chance of creating weird movements when GetNearPosition failed to get a proper collision point (knocking arround a tree for example or just somewhere it should not go at all) (cherry picked from commit cfd63c350f5b01fd699903b17162b2f5167b1386)
Diffstat (limited to 'src/server/game/Movement/MotionMaster.cpp')
-rw-r--r--src/server/game/Movement/MotionMaster.cpp7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp
index 3fd6523b017..8cab79a34de 100644
--- a/src/server/game/Movement/MotionMaster.cpp
+++ b/src/server/game/Movement/MotionMaster.cpp
@@ -744,15 +744,16 @@ void MotionMaster::MoveKnockbackFrom(Position const& origin, float speedXY, floa
if (speedXY < 0.01f)
return;
- float x, y, z;
+ Position dest = _owner->GetPosition();
float moveTimeHalf = speedZ / Movement::gravity;
float dist = 2 * moveTimeHalf * speedXY;
float max_height = -Movement::computeFallElevation(moveTimeHalf, false, -speedZ);
- _owner->GetNearPoint(_owner, x, y, z, dist, _owner->GetAbsoluteAngle(origin) + float(M_PI));
+ // Use a mmap raycast to get a valid destination.
+ _owner->MovePositionToFirstCollision(dest, dist, _owner->GetRelativeAngle(origin) + float(M_PI));
Movement::MoveSplineInit init(_owner);
- init.MoveTo(x, y, z);
+ init.MoveTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), false);
init.SetParabolic(max_height, 0);
init.SetOrientationFixed(true);
init.SetVelocity(speedXY);