aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Movement/MotionMaster.cpp34
-rw-r--r--src/server/game/Movement/MotionMaster.h6
-rw-r--r--src/server/game/Movement/Spline/MoveSpline.cpp14
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.h12
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInitArgs.h4
5 files changed, 53 insertions, 17 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp
index 6eeeb48ef78..4afc3a0f610 100644
--- a/src/server/game/Movement/MotionMaster.cpp
+++ b/src/server/game/Movement/MotionMaster.cpp
@@ -692,28 +692,54 @@ void MotionMaster::MoveCloserAndStop(uint32 id, Unit* target, float distance)
}
}
-void MotionMaster::MoveLand(uint32 id, Position const& pos, Optional<float> velocity /*= {}*/)
+void MotionMaster::MoveLand(uint32 id, Position const& pos, Optional<int32> tierTransitionId /*= {}*/, Optional<float> velocity /*= {}*/,
+ MovementWalkRunSpeedSelectionMode speedSelectionMode /*= MovementWalkRunSpeedSelectionMode::Default*/)
{
TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveLand: '{}', landing point Id: {} (X: {}, Y: {}, Z: {})", _owner->GetGUID().ToString(), id, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
{
init.MoveTo(PositionToVector3(pos), false);
- init.SetAnimation(AnimTier::Ground);
+ init.SetAnimation(AnimTier::Ground, tierTransitionId.value_or(0));
+ switch (speedSelectionMode)
+ {
+ case MovementWalkRunSpeedSelectionMode::ForceRun:
+ init.SetWalk(false);
+ break;
+ case MovementWalkRunSpeedSelectionMode::ForceWalk:
+ init.SetWalk(true);
+ break;
+ case MovementWalkRunSpeedSelectionMode::Default:
+ default:
+ break;
+ }
if (velocity)
init.SetVelocity(*velocity);
};
Add(new GenericMovementGenerator(std::move(initializer), EFFECT_MOTION_TYPE, id));
}
-void MotionMaster::MoveTakeoff(uint32 id, Position const& pos, Optional<float> velocity /*= {}*/)
+void MotionMaster::MoveTakeoff(uint32 id, Position const& pos, Optional<int32> tierTransitionId /*= {}*/, Optional<float> velocity /*= {}*/,
+ MovementWalkRunSpeedSelectionMode speedSelectionMode /*= MovementWalkRunSpeedSelectionMode::Default*/)
{
TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveTakeoff: '{}', landing point Id: {} (X: {}, Y: {}, Z: {})", _owner->GetGUID().ToString(), id, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
{
init.MoveTo(PositionToVector3(pos), false);
- init.SetAnimation(AnimTier::Hover);
+ init.SetAnimation(AnimTier::Hover, tierTransitionId.value_or(0));
+ switch (speedSelectionMode)
+ {
+ case MovementWalkRunSpeedSelectionMode::ForceRun:
+ init.SetWalk(false);
+ break;
+ case MovementWalkRunSpeedSelectionMode::ForceWalk:
+ init.SetWalk(true);
+ break;
+ case MovementWalkRunSpeedSelectionMode::Default:
+ default:
+ break;
+ }
if (velocity)
init.SetVelocity(*velocity);
};
diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h
index 928111dcc85..f991071c63c 100644
--- a/src/server/game/Movement/MotionMaster.h
+++ b/src/server/game/Movement/MotionMaster.h
@@ -174,8 +174,10 @@ class TC_GAME_API MotionMaster
*/
void MoveCloserAndStop(uint32 id, Unit* target, float distance);
// These two movement types should only be used with creatures having landing/takeoff animations
- void MoveLand(uint32 id, Position const& pos, Optional<float> velocity = {});
- void MoveTakeoff(uint32 id, Position const& pos, Optional<float> velocity = {});
+ void MoveLand(uint32 id, Position const& pos, Optional<int32> tierTransitionId = {}, Optional<float> velocity = {},
+ MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode::Default);
+ void MoveTakeoff(uint32 id, Position const& pos, Optional<int32> tierTransitionId = {}, Optional<float> velocity = {},
+ MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode::Default);
void MoveCharge(float x, float y, float z, float speed = SPEED_CHARGE, uint32 id = EVENT_CHARGE, bool generatePath = false, Unit const* target = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr);
void MoveCharge(PathGenerator const& path, float speed = SPEED_CHARGE, Unit const* target = nullptr, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr);
void MoveKnockbackFrom(Position const& origin, float speedXY, float speedZ, Movement::SpellEffectExtraData const* spellEffectExtraData = nullptr);
diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp
index 313481161b0..f365d93b924 100644
--- a/src/server/game/Movement/Spline/MoveSpline.cpp
+++ b/src/server/game/Movement/Spline/MoveSpline.cpp
@@ -209,12 +209,16 @@ void MoveSpline::Initialize(MoveSplineInitArgs const& args)
// spline initialized, duration known and i able to compute parabolic acceleration
if (args.flags & (MoveSplineFlag::Parabolic | MoveSplineFlag::Animation | MoveSplineFlag::FadeObject))
{
- effect_start_time = Duration() * args.time_perc;
- if (args.flags.parabolic && effect_start_time < Duration())
+ int32 spline_duration = Duration();
+ effect_start_time = spline_duration * args.effect_start_time_percent + args.effect_start_time.count();
+ if (effect_start_time > spline_duration)
+ effect_start_time = spline_duration;
+
+ if (args.flags.parabolic && effect_start_time < spline_duration)
{
if (args.parabolic_amplitude != 0.0f)
{
- float f_duration = MSToSec(Duration() - effect_start_time);
+ float f_duration = MSToSec(spline_duration - effect_start_time);
vertical_acceleration = args.parabolic_amplitude * 8.f / (f_duration * f_duration);
}
else if (args.vertical_acceleration != 0.0f)
@@ -247,7 +251,7 @@ bool MoveSplineInitArgs::Validate(Unit* unit) const
}
CHECK(path.size() > 1, true);
CHECK(velocity >= 0.01f, true);
- CHECK(time_perc >= 0.f && time_perc <= 1.f, true);
+ CHECK(effect_start_time_percent >= 0.f && effect_start_time_percent <= 1.f, true);
CHECK(_checkPathLengths(), false);
if (spellEffectExtra)
{
@@ -269,7 +273,7 @@ bool MoveSplineInitArgs::_checkPathLengths() const
}
MoveSplineInitArgs::MoveSplineInitArgs(size_t path_capacity /*= 16*/) : path_Idx_offset(0), velocity(0.f),
-parabolic_amplitude(0.f), vertical_acceleration(0.0f), time_perc(0.f), splineId(0), initialOrientation(0.f),
+parabolic_amplitude(0.f), vertical_acceleration(0.0f), effect_start_time_percent(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 eda06366387..55e9db456b8 100644
--- a/src/server/game/Movement/Spline/MoveSplineInit.h
+++ b/src/server/game/Movement/Spline/MoveSplineInit.h
@@ -79,7 +79,7 @@ namespace Movement
/* Plays animation after movement done
* can't be combined with parabolic movement
*/
- void SetAnimation(AnimTier anim);
+ void SetAnimation(AnimTier anim, uint32 tierTransitionId = 0, Milliseconds transitionStartTime = 0ms);
/* Adds final facing animation
* sets unit's facing to specified point/angle after all path done
@@ -186,7 +186,7 @@ namespace Movement
inline void MoveSplineInit::SetParabolic(float amplitude, float time_shift)
{
- args.time_perc = time_shift;
+ args.effect_start_time_percent = time_shift;
args.parabolic_amplitude = amplitude;
args.vertical_acceleration = 0.0f;
args.flags.EnableParabolic();
@@ -194,16 +194,18 @@ namespace Movement
inline void MoveSplineInit::SetParabolicVerticalAcceleration(float vertical_acceleration, float time_shift)
{
- args.time_perc = time_shift;
+ args.effect_start_time_percent = time_shift;
args.parabolic_amplitude = 0.0f;
args.vertical_acceleration = vertical_acceleration;
args.flags.EnableParabolic();
}
- inline void MoveSplineInit::SetAnimation(AnimTier anim)
+ inline void MoveSplineInit::SetAnimation(AnimTier anim, uint32 tierTransitionId /*= 0*/, Milliseconds transitionStartTime /*= 0ms*/)
{
- args.time_perc = 0.f;
+ args.effect_start_time_percent = 0.f;
+ args.effect_start_time = transitionStartTime;
args.animTier.emplace();
+ args.animTier->TierTransitionId = tierTransitionId;
args.animTier->AnimTier = anim;
args.flags.EnableAnimation();
}
diff --git a/src/server/game/Movement/Spline/MoveSplineInitArgs.h b/src/server/game/Movement/Spline/MoveSplineInitArgs.h
index d8c68c11d66..edd7085409e 100644
--- a/src/server/game/Movement/Spline/MoveSplineInitArgs.h
+++ b/src/server/game/Movement/Spline/MoveSplineInitArgs.h
@@ -18,6 +18,7 @@
#ifndef TRINITYSERVER_MOVESPLINEINIT_ARGS_H
#define TRINITYSERVER_MOVESPLINEINIT_ARGS_H
+#include "Duration.h"
#include "MoveSplineFlag.h"
#include "MovementTypedefs.h"
#include "ObjectGuid.h"
@@ -72,7 +73,8 @@ namespace Movement
float velocity;
float parabolic_amplitude;
float vertical_acceleration;
- float time_perc;
+ float effect_start_time_percent; // fraction of total spline duration
+ Milliseconds effect_start_time; // absolute value
uint32 splineId;
float initialOrientation;
Optional<SpellEffectExtraData> spellEffectExtra;