diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-04-07 00:05:46 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2024-05-28 16:35:03 +0200 |
commit | 5c1021046a9a08101c0205e6ff60408e5dc3dbba (patch) | |
tree | 109f75d938126d24363edb27afeccca01ffd9070 | |
parent | 093546f22c2908017bbcf36e0b589ca5d7660eff (diff) |
Core/Movement: Ensure land and takeoff animations even if gravity enabled/disabled state is not what spline generator expects
(cherry picked from commit be3ae90dc488894afea8e4cca74d9105558fff53)
-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 ca0374e1822..3d282059c65 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12734,16 +12734,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()) @@ -12754,6 +12744,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; } @@ -12960,16 +12960,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()) @@ -12980,6 +12970,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 7c2bc3206eb..2396bfde98b 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -513,7 +513,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; |