diff options
-rw-r--r-- | src/server/game/Movement/MotionMaster.cpp | 34 | ||||
-rw-r--r-- | src/server/game/Movement/MotionMaster.h | 6 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSpline.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSplineInit.h | 12 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSplineInitArgs.h | 4 |
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; |