aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Movement/MotionMaster.cpp31
-rw-r--r--src/server/game/Movement/MotionMaster.h1
-rw-r--r--src/server/game/Movement/Spline/MoveSpline.cpp15
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.h15
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInitArgs.h1
-rw-r--r--src/server/game/Server/Packets/MovementPackets.cpp6
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;