diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 90cc7df9543..f131cbe94eb 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -460,6 +460,22 @@ void MotionMaster::MoveJump(float x, float y, float z, float o, float speedXY, f Mutate(new GenericMovementGenerator(std::move(init), EFFECT_MOTION_TYPE, id), MOTION_SLOT_CONTROLLED); } +void MotionMaster::MoveJumpWithGravity(Position const& pos, float speedXY, float gravity, uint32 id, bool hasOrientation /* = false*/) +{ + TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveJump: '%s', jumps to point Id: %u (%s)", _owner->GetGUID().ToString().c_str(), id, pos.ToString().c_str()); + if (speedXY < 0.01f) + return; + + Movement::MoveSplineInit init(_owner); + init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), false); + init.SetParabolicVerticalAcceleration(gravity, 0); + init.SetVelocity(speedXY); + if (hasOrientation) + init.SetFacing(pos.GetOrientation()); + + Mutate(new GenericMovementGenerator(std::move(init), EFFECT_MOTION_TYPE, id), MOTION_SLOT_CONTROLLED); +} + void MotionMaster::MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount, float velocity /*= 0.f*/) { float step = 2 * float(M_PI) / stepCount * (clockwise ? -1.0f : 1.0f); diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index 09d69bbfae0..0681fec244c 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -181,6 +181,7 @@ class TC_GAME_API MotionMaster MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), speedXY, speedZ, id, hasOrientation); } void MoveJump(float x, float y, float z, float o, float speedXY, float speedZ, uint32 id = EVENT_JUMP, bool hasOrientation = false); + void MoveJumpWithGravity(Position const& pos, float speedXY, float gravity, uint32 id = EVENT_JUMP, bool hasOrientation = false); void MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount, float velocity = 0.f); void MoveCyclicPath(Position const* pathPoints, size_t pathSize, bool walk = false, bool fly = false, float velocity = 0.f); void MoveCyclicPath(uint32 pathId); diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp index 432e1e41fb8..42afd95d7d7 100644 --- a/src/server/game/Movement/Spline/MoveSpline.cpp +++ b/src/server/game/Movement/Spline/MoveSpline.cpp @@ -204,8 +204,15 @@ void MoveSpline::Initialize(MoveSplineInitArgs const& args) effect_start_time = Duration() * args.time_perc; if (args.flags.parabolic && effect_start_time < Duration()) { - float f_duration = MSToSec(Duration() - effect_start_time); - vertical_acceleration = args.parabolic_amplitude * 8.f / (f_duration * f_duration); + if (args.parabolic_amplitude != 0.0f) + { + float f_duration = MSToSec(Duration() - effect_start_time); + vertical_acceleration = args.parabolic_amplitude * 8.f / (f_duration * f_duration); + } + else if (args.vertical_acceleration != 0.0f) + { + vertical_acceleration = args.vertical_acceleration; + } } } } @@ -218,7 +225,7 @@ MoveSpline::MoveSpline() : m_Id(0), time_passed(0), } MoveSplineInitArgs::MoveSplineInitArgs(size_t path_capacity /*= 16*/) : path_Idx_offset(0), velocity(0.f), - parabolic_amplitude(0.f), time_perc(0.f), splineId(0), initialOrientation(0.f), walk(false), + parabolic_amplitude(0.f), vertical_acceleration(0.f), time_perc(0.f), splineId(0), initialOrientation(0.f), walk(false), HasVelocity(false), TransformForTransport(true) { path.reserve(path_capacity); diff --git a/src/server/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h index 62af6aff069..9c07be58ca5 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.h +++ b/src/server/game/Movement/Spline/MoveSplineInit.h @@ -66,6 +66,12 @@ namespace Movement * can't be combined with final animation */ void SetParabolic(float amplitude, float start_time); + /* Adds movement by parabolic trajectory + * @param vertical_acceleration - vertical acceleration + * @param start_time - delay between movement starting time and beginning to move by parabolic trajectory + * can't be combined with final animation + */ + void SetParabolicVerticalAcceleration(float vertical_acceleration, float start_time); /* Plays animation after movement done * can't be combined with parabolic movement */ @@ -170,6 +176,15 @@ namespace Movement { args.time_perc = time_shift; args.parabolic_amplitude = amplitude; + args.vertical_acceleration = 0.0f; + args.flags.EnableParabolic(); + } + + inline void MoveSplineInit::SetParabolicVerticalAcceleration(float vertical_acceleration, float time_shift) + { + args.time_perc = time_shift; + args.parabolic_amplitude = 0.0f; + args.vertical_acceleration = vertical_acceleration; args.flags.EnableParabolic(); } diff --git a/src/server/game/Movement/Spline/MoveSplineInitArgs.h b/src/server/game/Movement/Spline/MoveSplineInitArgs.h index ce55be7be68..4e1439edf7d 100644 --- a/src/server/game/Movement/Spline/MoveSplineInitArgs.h +++ b/src/server/game/Movement/Spline/MoveSplineInitArgs.h @@ -52,6 +52,7 @@ namespace Movement int32 path_Idx_offset; float velocity; float parabolic_amplitude; + float vertical_acceleration; float time_perc; uint32 splineId; float initialOrientation;