mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-30 09:03:47 +00:00
fix(Core): creature movement bugs (#4544)
- fix UpdateEnvironmentIfNeeded was changing flying creature status all the time. closes: #4447 - fix hovering state was causing bugs at #4466 - add animation state priority: fly > hover > ground Co-authored-by: Wotex <fm@gmail.com> Co-authored-by: Francesco Borzì <borzifrancesco@gmail.com> Co-authored-by: Patrick Lewis <pat@lo5t.com>
This commit is contained in:
@@ -2758,6 +2758,8 @@ bool Creature::SetDisableGravity(bool disable, bool packetOnly/*=false*/)
|
||||
if (!packetOnly && !Unit::SetDisableGravity(disable))
|
||||
return false;
|
||||
|
||||
applyInhabitFlags();
|
||||
|
||||
if (!movespline->Initialized())
|
||||
return true;
|
||||
|
||||
@@ -2767,6 +2769,26 @@ bool Creature::SetDisableGravity(bool disable, bool packetOnly/*=false*/)
|
||||
return true;
|
||||
}
|
||||
|
||||
void Creature::applyInhabitFlags()
|
||||
{
|
||||
if (IsAlive() && !HasUnitState(UNIT_STATE_ROOT) && !HasUnitMovementFlag(MOVEMENTFLAG_ROOT))
|
||||
{
|
||||
if (IsLevitating())
|
||||
{
|
||||
SetByteValue(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_BYTE1_FLAG_FLY);
|
||||
return;
|
||||
}
|
||||
|
||||
if (IsHovering())
|
||||
{
|
||||
SetByteValue(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_BYTE1_FLAG_HOVER);
|
||||
return;
|
||||
}
|
||||
|
||||
SetByteValue(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_BYTE1_FLAG_GROUND);
|
||||
}
|
||||
}
|
||||
|
||||
bool Creature::SetSwim(bool enable)
|
||||
{
|
||||
if (!Unit::SetSwim(enable))
|
||||
@@ -2873,11 +2895,7 @@ bool Creature::SetHover(bool enable, bool packetOnly /*= false*/)
|
||||
if (!packetOnly && !Unit::SetHover(enable))
|
||||
return false;
|
||||
|
||||
//! Unconfirmed for players:
|
||||
if (enable)
|
||||
SetByteFlag(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_BYTE1_FLAG_HOVER);
|
||||
else
|
||||
RemoveByteFlag(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_BYTE1_FLAG_HOVER);
|
||||
applyInhabitFlags();
|
||||
|
||||
if (!movespline->Initialized())
|
||||
return true;
|
||||
|
||||
@@ -832,6 +832,8 @@ private:
|
||||
Spell const* _focusSpell; ///> Locks the target during spell cast for proper facing
|
||||
|
||||
bool _isMissingSwimmingFlagOutOfCombat;
|
||||
|
||||
void applyInhabitFlags();
|
||||
};
|
||||
|
||||
class AssistDelayEvent : public BasicEvent
|
||||
|
||||
@@ -3816,28 +3816,39 @@ void Unit::UpdateEnvironmentIfNeeded(const uint8 option)
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
else if (c->CanFly() && isInAir)
|
||||
else if (c->CanFly() && isInAir && !c->IsFalling())
|
||||
{
|
||||
if (!c->IsFalling() && (!HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY) || !HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY) || !HasUnitMovementFlag(MOVEMENTFLAG_HOVER)))
|
||||
|
||||
if (!HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY) || !HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY))
|
||||
{
|
||||
SetCanFly(true);
|
||||
SetDisableGravity(true);
|
||||
if (IsAlive() && (c->CanHover() || HasAuraType(SPELL_AURA_HOVER)))
|
||||
SetHover(true);
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (IsHovering() && !HasAuraType(SPELL_AURA_HOVER))
|
||||
{
|
||||
SetHover(false);
|
||||
changed = true;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if (HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY) || HasUnitMovementFlag(MOVEMENTFLAG_FLYING) || HasUnitMovementFlag(MOVEMENTFLAG_HOVER))
|
||||
if (HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY) || HasUnitMovementFlag(MOVEMENTFLAG_FLYING))
|
||||
{
|
||||
SetCanFly(false);
|
||||
RemoveUnitMovementFlag(MOVEMENTFLAG_FLYING);
|
||||
if (!HasAuraType(SPELL_AURA_HOVER))
|
||||
SetHover(false);
|
||||
changed = true;
|
||||
}
|
||||
if (HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY) && !HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) && !HasUnitMovementFlag(MOVEMENTFLAG_HOVER))
|
||||
|
||||
if (!IsHovering() && IsAlive() && (c->CanHover() || HasAuraType(SPELL_AURA_HOVER)))
|
||||
{
|
||||
SetHover(true);
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY) && !HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING))
|
||||
{
|
||||
SetDisableGravity(false);
|
||||
changed = true;
|
||||
|
||||
Reference in New Issue
Block a user