diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-04-07 00:05:46 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-04-07 00:05:46 +0200 |
commit | be3ae90dc488894afea8e4cca74d9105558fff53 (patch) | |
tree | 4edff4d861660895128cc4a199e5fe726a3d0c64 | |
parent | b265c49977235dea5e7e69d7b6fb93f4943bf87a (diff) |
Core/Movement: Ensure land and takeoff animations even if gravity enabled/disabled state is not what spline generator expects
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 40 | ||||
-rw-r--r-- | src/server/game/Movement/MotionMaster.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Movement/MovementGenerator.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSplineInit.h | 3 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.cpp | 2 |
5 files changed, 28 insertions, 23 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index c463c26d8b3..b47d8909d12 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12777,16 +12777,6 @@ bool Unit::SetDisableGravity(bool disable, bool updateAnimTier /*= true*/) SendMessageToSet(packet.Write(), true); } - if (IsCreature() && updateAnimTier && IsAlive() && !HasUnitState(UNIT_STATE_ROOT)) - { - if (IsGravityDisabled()) - SetAnimTier(AnimTier::Fly); - else if (IsHovering()) - SetAnimTier(AnimTier::Hover); - else - SetAnimTier(AnimTier::Ground); - } - if (IsAlive()) { if (IsGravityDisabled() || IsHovering()) @@ -12797,6 +12787,16 @@ bool Unit::SetDisableGravity(bool disable, bool updateAnimTier /*= true*/) else if (IsPlayer()) // To update player who dies while flying/hovering SetPlayHoverAnim(false, false); + if (IsCreature() && updateAnimTier && IsAlive() && !HasUnitState(UNIT_STATE_ROOT)) + { + if (IsGravityDisabled()) + SetAnimTier(AnimTier::Fly); + else if (IsHovering()) + SetAnimTier(AnimTier::Hover); + else + SetAnimTier(AnimTier::Ground); + } + return true; } @@ -13003,16 +13003,6 @@ bool Unit::SetHover(bool enable, bool updateAnimTier /*= true*/) SendMessageToSet(packet.Write(), true); } - if (IsCreature() && updateAnimTier && IsAlive() && !HasUnitState(UNIT_STATE_ROOT)) - { - if (IsGravityDisabled()) - SetAnimTier(AnimTier::Fly); - else if (IsHovering()) - SetAnimTier(AnimTier::Hover); - else - SetAnimTier(AnimTier::Ground); - } - if (IsAlive()) { if (IsGravityDisabled() || IsHovering()) @@ -13023,6 +13013,16 @@ bool Unit::SetHover(bool enable, bool updateAnimTier /*= true*/) else if (IsPlayer()) // To update player who dies while flying/hovering SetPlayHoverAnim(false, false); + if (IsCreature() && updateAnimTier && IsAlive() && !HasUnitState(UNIT_STATE_ROOT)) + { + if (IsGravityDisabled()) + SetAnimTier(AnimTier::Fly); + else if (IsHovering()) + SetAnimTier(AnimTier::Hover); + else + SetAnimTier(AnimTier::Ground); + } + return true; } diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 7b43eea41ae..aec3bc208a8 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -713,6 +713,8 @@ void MotionMaster::MoveLand(uint32 id, Position const& pos, Optional<int32> tier { 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) { case MovementWalkRunSpeedSelectionMode::ForceRun: @@ -740,7 +742,8 @@ void MotionMaster::MoveTakeoff(uint32 id, Position const& pos, Optional<int32> t std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init) { init.MoveTo(PositionToVector3(pos), false); - init.SetAnimation(AnimTier::Hover, tierTransitionId.value_or(15)); + 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: diff --git a/src/server/game/Movement/MovementGenerator.cpp b/src/server/game/Movement/MovementGenerator.cpp index 38844c0d821..d1fc73d6dd1 100644 --- a/src/server/game/Movement/MovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerator.cpp @@ -27,6 +27,7 @@ MovementGenerator::~MovementGenerator() { + // Ensure script doesn't get stuck waiting for this movement SetScriptResult(MovementStopReason::Interrupted); } diff --git a/src/server/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h index 55e9db456b8..8be00f741bb 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.h +++ b/src/server/game/Movement/Spline/MoveSplineInit.h @@ -207,7 +207,8 @@ namespace Movement args.animTier.emplace(); args.animTier->TierTransitionId = tierTransitionId; args.animTier->AnimTier = anim; - args.flags.EnableAnimation(); + if (!tierTransitionId) + args.flags.EnableAnimation(); } inline void MoveSplineInit::DisableTransportPathTransformations() { args.TransformForTransport = false; } diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index 49e7c7f9f92..f5e47aa88d4 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -529,7 +529,7 @@ void WorldPackets::Movement::MonsterMove::InitializeSplineData(::Movement::MoveS movementSpline.FaceGUID = moveSpline.facing.target; movementSpline.FaceSpot = Position(moveSpline.facing.f.x, moveSpline.facing.f.y, moveSpline.facing.f.z); - if (splineFlags.animation) + if (moveSpline.anim_tier) { movementSpline.AnimTierTransition.emplace(); movementSpline.AnimTierTransition->TierTransitionID = moveSpline.anim_tier->TierTransitionId; |