aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Movement/MotionMaster.cpp
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 /src/server/game/Movement/MotionMaster.cpp
parentc24dcf62acd80519360943f606cfc0986a0507f1 (diff)
Core/Movement: Add new function allowing any tier transition animation to be used, not only land/takeoff
Diffstat (limited to 'src/server/game/Movement/MotionMaster.cpp')
-rw-r--r--src/server/game/Movement/MotionMaster.cpp62
1 files changed, 36 insertions, 26 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) }));
}