diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Movement/MotionMaster.cpp | 31 | ||||
-rw-r--r-- | src/server/game/Movement/MotionMaster.h | 1 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSpline.cpp | 15 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSplineInit.h | 15 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSplineInitArgs.h | 1 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.cpp | 6 |
6 files changed, 62 insertions, 7 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 4f8fd1345ae..2114b94f6a4 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -813,6 +813,37 @@ void MotionMaster::MoveJump(float x, float y, float z, float o, float speedXY, f Add(movement); } +void MotionMaster::MoveJumpWithGravity(Position const& pos, float speedXY, float gravity, uint32 id/* = EVENT_JUMP*/, bool hasOrientation/* = false*/, + JumpArrivalCastArgs const* arrivalCast /*= nullptr*/, Movement::SpellEffectExtraData const* spellEffectExtraData /*= nullptr*/) +{ + TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveJumpWithGravity: '%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.SetUncompressed(); + init.SetVelocity(speedXY); + if (hasOrientation) + init.SetFacing(pos.GetOrientation()); + if (spellEffectExtraData) + init.SetSpellEffectExtraData(*spellEffectExtraData); + + uint32 arrivalSpellId = 0; + ObjectGuid arrivalSpellTargetGuid; + if (arrivalCast) + { + arrivalSpellId = arrivalCast->SpellId; + arrivalSpellTargetGuid = arrivalCast->Target; + } + + GenericMovementGenerator* movement = new GenericMovementGenerator(std::move(init), EFFECT_MOTION_TYPE, id, arrivalSpellId, arrivalSpellTargetGuid); + movement->Priority = MOTION_PRIORITY_HIGHEST; + movement->BaseUnitState = UNIT_STATE_JUMPING; + Add(movement); +} + void MotionMaster::MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount) { 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 2fc2135b603..8ed38897ea5 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -162,6 +162,7 @@ class TC_GAME_API MotionMaster void MoveJumpTo(float angle, float speedXY, float speedZ); void MoveJump(Position const& pos, float speedXY, float speedZ, uint32 id = EVENT_JUMP, bool hasOrientation = false, JumpArrivalCastArgs const* arrivalCast = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr); void MoveJump(float x, float y, float z, float o, float speedXY, float speedZ, uint32 id = EVENT_JUMP, bool hasOrientation = false, JumpArrivalCastArgs const* arrivalCast = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr); + void MoveJumpWithGravity(Position const& pos, float speedXY, float gravity, uint32 id = EVENT_JUMP, bool hasOrientation = false, JumpArrivalCastArgs const* arrivalCast = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr); void MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount); void MoveSmoothPath(uint32 pointId, Position const* pathPoints, size_t pathSize, bool walk = false, bool fly = false); // Walk along spline chain stored in DB (script_spline_chain_meta and script_spline_chain_waypoints) diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp index 8e4ce67ca2d..d2298b8536c 100644 --- a/src/server/game/Movement/Spline/MoveSpline.cpp +++ b/src/server/game/Movement/Spline/MoveSpline.cpp @@ -210,8 +210,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; + } } } } @@ -256,13 +263,13 @@ bool MoveSplineInitArgs::_checkPathLengths() const return true; } 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), +parabolic_amplitude(0.f), vertical_acceleration(0.0f), time_perc(0.f), splineId(0), initialOrientation(0.f), walk(false), HasVelocity(false), TransformForTransport(true) { path.reserve(path_capacity); } -MoveSplineInitArgs::MoveSplineInitArgs(MoveSplineInitArgs && args) = default; +MoveSplineInitArgs::MoveSplineInitArgs(MoveSplineInitArgs&& args) = default; MoveSplineInitArgs::~MoveSplineInitArgs() = default; diff --git a/src/server/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h index 73c81c0ffdf..49856a761e5 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.h +++ b/src/server/game/Movement/Spline/MoveSplineInit.h @@ -72,6 +72,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 time_shift); /* Plays animation after movement done * can't be combined with parabolic movement */ @@ -177,6 +183,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 42db1df6224..441aea04d71 100644 --- a/src/server/game/Movement/Spline/MoveSplineInitArgs.h +++ b/src/server/game/Movement/Spline/MoveSplineInitArgs.h @@ -68,6 +68,7 @@ namespace Movement int32 path_Idx_offset; float velocity; float parabolic_amplitude; + float vertical_acceleration; float time_perc; uint32 splineId; float initialOrientation; diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index e89e2953d29..7e2e142a630 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -348,7 +348,7 @@ void WorldPackets::Movement::CommonMovement::WriteCreateObjectSplineDataBlock(:: data.WriteBits(moveSpline.getPath().size(), 16); data.WriteBit(false); // HasSplineFilter data.WriteBit(moveSpline.spell_effect_extra.is_initialized()); // HasSpellEffectExtraData - data.WriteBit(moveSpline.splineflags.parabolic); // HasJumpExtraData + bool hasJumpExtraData = data.WriteBit(moveSpline.splineflags.parabolic && (!moveSpline.spell_effect_extra || moveSpline.effect_start_time)); data.WriteBit(moveSpline.anim_tier.is_initialized()); // HasAnimationTierTransition data.WriteBit(false); // HasUnknown901 data.FlushBits(); @@ -400,7 +400,7 @@ void WorldPackets::Movement::CommonMovement::WriteCreateObjectSplineDataBlock(:: data << float(moveSpline.vertical_acceleration); } - if (moveSpline.splineflags.parabolic) + if (hasJumpExtraData) { data << float(moveSpline.vertical_acceleration); data << uint32(moveSpline.effect_start_time); @@ -499,7 +499,7 @@ void WorldPackets::Movement::MonsterMove::InitializeSplineData(::Movement::MoveS movementSpline.MoveTime = moveSpline.Duration(); - if (splineFlags.parabolic) + if (splineFlags.parabolic && (!moveSpline.spell_effect_extra || moveSpline.effect_start_time)) { movementSpline.JumpExtraData.emplace(); movementSpline.JumpExtraData->JumpGravity = moveSpline.vertical_acceleration; |