Core/Movement: Ensure land and takeoff animations even if gravity enabled/disabled state is not what spline generator expects

This commit is contained in:
Shauren
2024-04-07 00:05:46 +02:00
parent b265c49977
commit be3ae90dc4
5 changed files with 28 additions and 23 deletions

View File

@@ -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;
}

View File

@@ -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:

View File

@@ -27,6 +27,7 @@
MovementGenerator::~MovementGenerator()
{
// Ensure script doesn't get stuck waiting for this movement
SetScriptResult(MovementStopReason::Interrupted);
}

View File

@@ -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; }

View File

@@ -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;