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,13 +701,51 @@ 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) + { + switch (newAnimTier) + { + case AnimTier::Ground: + tierTransitionId = 208; + break; + case AnimTier::Swim: + tierTransitionId = 149; + break; + case AnimTier::Hover: + tierTransitionId = 25; + break; + case AnimTier::Fly: + tierTransitionId = 17; + break; + default: + break; + } + } + + std::function initializer = [=, tierTransitionId = tierTransitionId.value_or(0)](Movement::MoveSplineInit& init) { 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.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) { @@ -724,35 +762,7 @@ void MotionMaster::MoveLand(uint32 id, Position const& pos, Optional tier 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) - { - 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 - 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, { .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,