diff options
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 19 |
4 files changed, 36 insertions, 20 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 33f29820b12..3900f532d5c 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2586,12 +2586,16 @@ Unit* Creature::SelectNearestHostileUnitInAggroRange(bool useLOS) const void Creature::UpdateMovementFlags() { + // Do not update movement flags if creature is controlled by a player (charm/vehicle) + if (m_movedPlayer) + return; + // Set the movement flags if the creature is in that mode. (Only fly if actually in air, only swim if in water, etc) float ground = GetMap()->GetHeight(GetPositionX(), GetPositionY(), GetPositionZMinusOffset()); - bool isInAir = !IsFalling() && (G3D::fuzzyGt(GetPositionZMinusOffset(), ground + 0.05f) || G3D::fuzzyLt(GetPositionZMinusOffset(), ground - 0.05f)); // Can be underground too, prevent the falling + bool isInAir = (G3D::fuzzyGt(GetPositionZMinusOffset(), ground + 0.05f) || G3D::fuzzyLt(GetPositionZMinusOffset(), ground - 0.05f)); // Can be underground too, prevent the falling - if (GetCreatureTemplate()->InhabitType & INHABIT_AIR && isInAir) + if (GetCreatureTemplate()->InhabitType & INHABIT_AIR && isInAir && !IsFalling()) { if (GetCreatureTemplate()->InhabitType & INHABIT_GROUND) SetCanFly(true); @@ -2604,6 +2608,9 @@ void Creature::UpdateMovementFlags() SetDisableGravity(false); } + if (!isInAir) + RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING); + SetSwim(GetCreatureTemplate()->InhabitType & INHABIT_WATER && IsInWater()); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 541c5d9f107..9f6b5f76cb4 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -17406,9 +17406,19 @@ bool Unit::SetDisableGravity(bool disable, bool /*packetOnly = false*/) return false; if (disable) + { AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); + RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING); + } else + { RemoveUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); + if (!HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY)) + { + m_movementInfo.SetFallTime(0); + AddUnitMovementFlag(MOVEMENTFLAG_FALLING); + } + } return true; } @@ -17432,9 +17442,19 @@ bool Unit::SetCanFly(bool enable) return false; if (enable) + { AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); + RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING); + } else - RemoveUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); + { + RemoveUnitMovementFlag(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_MASK_MOVING_FLY); + if (!IsLevitating()) + { + m_movementInfo.SetFallTime(0); + AddUnitMovementFlag(MOVEMENTFLAG_FALLING); + } + } return true; } diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 00aa43a4f47..5519f1d4d0e 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -869,6 +869,10 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi) !GetPlayer()->m_mover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED), MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY); + //! Cannot fly and fall at the same time + REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_DISABLE_GRAVITY) && mi->HasMovementFlag(MOVEMENTFLAG_FALLING), + MOVEMENTFLAG_FALLING); + #undef REMOVE_VIOLATING_FLAGS } diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index f8bc67c7aac..a361d54bbc8 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -2558,17 +2558,9 @@ void AuraEffect::HandleAuraAllowFlight(AuraApplication const* aurApp, uint8 mode return; } - //! Not entirely sure if this should be sent for creatures as well, but I don't think so. - if (!apply) - { - target->m_movementInfo.SetFallTime(0); - target->RemoveUnitMovementFlag(MOVEMENTFLAG_MASK_MOVING_FLY); - target->AddUnitMovementFlag(MOVEMENTFLAG_FALLING); - } - target->SetCanFly(apply); - if (target->GetTypeId() == TYPEID_UNIT) + if (!apply && target->GetTypeId() == TYPEID_UNIT && !target->IsLevitating()) target->GetMotionMaster()->MoveFall(); } @@ -2955,16 +2947,9 @@ void AuraEffect::HandleAuraModIncreaseFlightSpeed(AuraApplication const* aurApp, // do not remove unit flag if there are more than this auraEffect of that kind on unit on unit if (mode & AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK && (apply || (!target->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !target->HasAuraType(SPELL_AURA_FLY)))) { - if (!apply) - { - target->m_movementInfo.SetFallTime(0); - target->RemoveUnitMovementFlag(MOVEMENTFLAG_MASK_MOVING_FLY); - target->AddUnitMovementFlag(MOVEMENTFLAG_FALLING); - } - target->SetCanFly(apply); - if (target->GetTypeId() == TYPEID_UNIT) + if (!apply && target->GetTypeId() == TYPEID_UNIT && !target->IsLevitating()) target->GetMotionMaster()->MoveFall(); } |