aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-11-11 23:45:06 +0100
committerShauren <shauren.trinity@gmail.com>2025-11-11 23:45:06 +0100
commit07e9f3e75ec6b382fa58e0b23619d96748bd9af7 (patch)
tree664b8a2dcab3428e7ffa7d576eb1f4c6f34b5316
parentc24dcf62acd80519360943f606cfc0986a0507f1 (diff)
Core/Movement: Add new function allowing any tier transition animation to be used, not only land/takeoff
-rw-r--r--src/server/game/Movement/MotionMaster.cpp62
-rw-r--r--src/server/game/Movement/MotionMaster.h4
-rw-r--r--src/server/game/Movement/MovementDefines.h2
3 files changed, 41 insertions, 27 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp
index 2b43e54b4ee..bccfa78dd0d 100644
--- a/src/server/game/Movement/MotionMaster.cpp
+++ b/src/server/game/Movement/MotionMaster.cpp
@@ -701,43 +701,52 @@ void MotionMaster::MoveLand(uint32 id, Position const& pos, Optional<int32> tier
MovementWalkRunSpeedSelectionMode speedSelectionMode /*= MovementWalkRunSpeedSelectionMode::Default*/,
Optional<Scripting::v2::ActionResultSetter<MovementStopReason>>&& scriptResult /*= {}*/)
{
- TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveLand: '{}', landing point Id: {} (X: {}, Y: {}, Z: {})", _owner->GetGUID(), id, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
+ MoveTierTransition(id, pos, AnimTier::Ground, tierTransitionId, velocity, speedSelectionMode, std::move(scriptResult));
+}
- std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
+void MotionMaster::MoveTakeoff(uint32 id, Position const& pos, Optional<int32> tierTransitionId /*= {}*/, Optional<float> velocity /*= {}*/,
+ MovementWalkRunSpeedSelectionMode speedSelectionMode /*= MovementWalkRunSpeedSelectionMode::Default*/,
+ Optional<Scripting::v2::ActionResultSetter<MovementStopReason>>&& scriptResult /*= {}*/)
+{
+ MoveTierTransition(id, pos, AnimTier::Fly, tierTransitionId, velocity, speedSelectionMode, std::move(scriptResult));
+}
+
+void MotionMaster::MoveTierTransition(uint32 id, Position const& pos, AnimTier newAnimTier, Optional<int32> tierTransitionId /*= {}*/, Optional<float> velocity /*= {}*/,
+ MovementWalkRunSpeedSelectionMode speedSelectionMode /*= MovementWalkRunSpeedSelectionMode::Default*/,
+ Optional<Scripting::v2::ActionResultSetter<MovementStopReason>>&& scriptResult /*= {}*/)
+{
+ TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveTierTransition: '{}', anim tier transition to {} Id: {} (X: {}, Y: {}, Z: {})",
+ _owner->GetGUID(), newAnimTier, id, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
+
+ bool flyingTransition = newAnimTier == AnimTier::Fly || _owner->GetAnimTier() == AnimTier::Fly;
+ if (!tierTransitionId)
{
- init.MoveTo(PositionToVector3(pos), false);
- init.SetAnimation(AnimTier::Ground, tierTransitionId.value_or(1));
- init.SetFly(); // ensure smooth animation even if gravity is enabled before calling this function
- init.SetSmooth();
- switch (speedSelectionMode)
+ switch (newAnimTier)
{
- case MovementWalkRunSpeedSelectionMode::ForceRun:
- init.SetWalk(false);
+ case AnimTier::Ground:
+ tierTransitionId = 208;
break;
- case MovementWalkRunSpeedSelectionMode::ForceWalk:
- init.SetWalk(true);
+ case AnimTier::Swim:
+ tierTransitionId = 149;
+ break;
+ case AnimTier::Hover:
+ tierTransitionId = 25;
+ break;
+ case AnimTier::Fly:
+ tierTransitionId = 17;
break;
- case MovementWalkRunSpeedSelectionMode::Default:
default:
break;
}
- if (velocity)
- init.SetVelocity(*velocity);
- };
- Add(new GenericMovementGenerator(std::move(initializer), EFFECT_MOTION_TYPE, id, { .ScriptResult = std::move(scriptResult) }));
-}
-
-void MotionMaster::MoveTakeoff(uint32 id, Position const& pos, Optional<int32> tierTransitionId /*= {}*/, Optional<float> velocity /*= {}*/,
- MovementWalkRunSpeedSelectionMode speedSelectionMode /*= MovementWalkRunSpeedSelectionMode::Default*/,
- Optional<Scripting::v2::ActionResultSetter<MovementStopReason>>&& scriptResult /*= {}*/)
-{
- TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveTakeoff: '{}', landing point Id: {} (X: {}, Y: {}, Z: {})", _owner->GetGUID(), id, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
+ }
- std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
+ std::function<void(Movement::MoveSplineInit&)> initializer = [=, tierTransitionId = tierTransitionId.value_or(0)](Movement::MoveSplineInit& init)
{
init.MoveTo(PositionToVector3(pos), false);
- init.SetAnimation(AnimTier::Fly, tierTransitionId.value_or(2));
- init.SetFly(); // ensure smooth animation even if gravity is disabled after calling this function
+ init.SetAnimation(newAnimTier, tierTransitionId);
+ if (flyingTransition)
+ init.SetFly(); // ensure smooth animation even if gravity is disabled after/enabled before calling this function
+ init.SetSmooth();
switch (speedSelectionMode)
{
case MovementWalkRunSpeedSelectionMode::ForceRun:
@@ -753,6 +762,7 @@ void MotionMaster::MoveTakeoff(uint32 id, Position const& pos, Optional<int32> t
if (velocity)
init.SetVelocity(*velocity);
};
+
Add(new GenericMovementGenerator(std::move(initializer), EFFECT_MOTION_TYPE, id, { .ScriptResult = std::move(scriptResult) }));
}
diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h
index f5b99c7328f..22f6bfaf475 100644
--- a/src/server/game/Movement/MotionMaster.h
+++ b/src/server/game/Movement/MotionMaster.h
@@ -38,6 +38,7 @@ struct SplineChainLink;
struct SplineChainResumeInfo;
struct WaypointPath;
enum UnitMoveType : uint8;
+enum class AnimTier : uint8;
namespace Movement
{
@@ -184,6 +185,9 @@ class TC_GAME_API MotionMaster
void MoveTakeoff(uint32 id, Position const& pos, Optional<int32> tierTransitionId = {}, Optional<float> velocity = {},
MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode::Default,
Optional<Scripting::v2::ActionResultSetter<MovementStopReason>>&& scriptResult = {});
+ void MoveTierTransition(uint32 id, Position const& pos, AnimTier newAnimTier, Optional<int32> tierTransitionId = {}, Optional<float> velocity = {},
+ MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode::Default,
+ Optional<Scripting::v2::ActionResultSetter<MovementStopReason>>&& scriptResult = {});
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/MovementDefines.h b/src/server/game/Movement/MovementDefines.h
index af51de795c9..bf6507e006b 100644
--- a/src/server/game/Movement/MovementDefines.h
+++ b/src/server/game/Movement/MovementDefines.h
@@ -88,7 +88,7 @@ enum MovementSlot : uint8
MAX_MOTION_SLOT
};
-enum class MovementWalkRunSpeedSelectionMode
+enum class MovementWalkRunSpeedSelectionMode : uint8
{
Default,
ForceRun,