From 07e9f3e75ec6b382fa58e0b23619d96748bd9af7 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 11 Nov 2025 23:45:06 +0100 Subject: Core/Movement: Add new function allowing any tier transition animation to be used, not only land/takeoff --- src/server/game/Movement/MotionMaster.cpp | 62 +++++++++++++++++------------- src/server/game/Movement/MotionMaster.h | 4 ++ src/server/game/Movement/MovementDefines.h | 2 +- 3 files changed, 41 insertions(+), 27 deletions(-) (limited to 'src') 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 tier MovementWalkRunSpeedSelectionMode speedSelectionMode /*= MovementWalkRunSpeedSelectionMode::Default*/, Optional>&& 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 initializer = [=](Movement::MoveSplineInit& init) +void MotionMaster::MoveTakeoff(uint32 id, Position const& pos, Optional tierTransitionId /*= {}*/, Optional velocity /*= {}*/, + MovementWalkRunSpeedSelectionMode speedSelectionMode /*= MovementWalkRunSpeedSelectionMode::Default*/, + Optional>&& scriptResult /*= {}*/) +{ + MoveTierTransition(id, pos, AnimTier::Fly, tierTransitionId, velocity, speedSelectionMode, std::move(scriptResult)); +} + +void MotionMaster::MoveTierTransition(uint32 id, Position const& pos, AnimTier newAnimTier, Optional tierTransitionId /*= {}*/, Optional velocity /*= {}*/, + MovementWalkRunSpeedSelectionMode speedSelectionMode /*= MovementWalkRunSpeedSelectionMode::Default*/, + Optional>&& 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 tierTransitionId /*= {}*/, Optional velocity /*= {}*/, - MovementWalkRunSpeedSelectionMode speedSelectionMode /*= MovementWalkRunSpeedSelectionMode::Default*/, - Optional>&& 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 initializer = [=](Movement::MoveSplineInit& init) + std::function 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 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 tierTransitionId = {}, Optional velocity = {}, MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode::Default, Optional>&& scriptResult = {}); + void MoveTierTransition(uint32 id, Position const& pos, AnimTier newAnimTier, Optional tierTransitionId = {}, Optional velocity = {}, + MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode::Default, + Optional>&& 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, -- cgit v1.2.3