aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp40
-rw-r--r--src/server/game/Movement/MotionMaster.cpp5
-rw-r--r--src/server/game/Movement/MovementGenerator.cpp1
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.h3
-rw-r--r--src/server/game/Server/Packets/MovementPackets.cpp2
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;