From f6a9b1f97d7c0ae1f23880986ff09a2d5af7a2b8 Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Tue, 30 Jul 2024 16:41:34 +0800 Subject: [PATCH] Add MoveKnockbackFromForPlayer --- src/server/game/Movement/MotionMaster.cpp | 24 +++++++++++++++++++++++ src/server/game/Movement/MotionMaster.h | 4 +++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index ff3c9d246..4b8ab7979 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -833,6 +833,30 @@ void MotionMaster::MoveRotate(uint32 time, RotateDirection direction) Mutate(new RotateMovementGenerator(time, direction), MOTION_SLOT_ACTIVE); } +#ifdef MOD_PLAYERBOTS +void MotionMaster::MoveKnockbackFromForPlayer(float srcX, float srcY, float speedXY, float speedZ) +{ + if (speedXY <= 0.1f) + return; + + Position dest = _owner->GetPosition(); + float moveTimeHalf = speedZ / Movement::gravity; + float dist = 2 * moveTimeHalf * speedXY; + float max_height = -Movement::computeFallElevation(moveTimeHalf, false, -speedZ); + + // Use a mmap raycast to get a valid destination. + _owner->MovePositionToFirstCollision(dest, dist, _owner->GetRelativeAngle(srcX, srcY) + float(M_PI)); + + Movement::MoveSplineInit init(_owner); + init.MoveTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ()); + init.SetParabolic(max_height, 0); + init.SetOrientationFixed(true); + init.SetVelocity(speedXY); + init.Launch(); + Mutate(new EffectMovementGenerator(0), MOTION_SLOT_CONTROLLED); +} +#endif + void MotionMaster::propagateSpeedChange() { /*Impl::container_type::iterator it = Impl::c.begin(); diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index 21b76a0f5..efb235ade 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -235,7 +235,9 @@ public: void MoveDistract(uint32 time); void MovePath(uint32 path_id, bool repeatable); void MoveRotate(uint32 time, RotateDirection direction); - +#ifdef MOD_PLAYERBOTS + void MoveKnockbackFromForPlayer(float srcX, float srcY, float speedXY, float speedZ); +#endif [[nodiscard]] MovementGeneratorType GetCurrentMovementGeneratorType() const; [[nodiscard]] MovementGeneratorType GetMotionSlotType(int slot) const; [[nodiscard]] uint32 GetCurrentSplineId() const; // Xinef: Escort system