diff --git a/Source/Framework/Constants/Movement/MovementFlags.cs b/Source/Framework/Constants/Movement/MovementFlags.cs index cb9baad19..747048651 100644 --- a/Source/Framework/Constants/Movement/MovementFlags.cs +++ b/Source/Framework/Constants/Movement/MovementFlags.cs @@ -87,5 +87,6 @@ namespace Framework.Constants DisableInertia = 0x01, CanAdvFly = 0x02, AdvFlying = 0x04, + CantSwim = 0x2000, } } diff --git a/Source/Framework/Constants/Network/Opcodes.cs b/Source/Framework/Constants/Network/Opcodes.cs index 3eef22eb3..bbeb92a65 100644 --- a/Source/Framework/Constants/Network/Opcodes.cs +++ b/Source/Framework/Constants/Network/Opcodes.cs @@ -1573,6 +1573,7 @@ namespace Framework.Constants MoveSetAdvFlyingPitchingRateUp = 0x2e40, MoveSetAdvFlyingSurfaceFriction = 0x2e42, MoveSetAdvFlyingTurnVelocityThreshold = 0x2e41, + MoveSetCantSwim = 0x2E07, MoveSetCanAdvFly = 0x2e36, MoveSetCanFly = 0x2e05, MoveSetCanTurnWhileFalling = 0x2e09, @@ -1625,6 +1626,7 @@ namespace Framework.Constants MoveSplineUnsetHover = 0x2e24, MoveTeleport = 0x2e04, MoveUnroot = 0x2dfa, + MoveUnsetCantSwim = 0x2E08, MoveUnsetCanAdvFly = 0x2e37, MoveUnsetCanFly = 0x2e06, MoveUnsetCanTurnWhileFalling = 0x2e0a, diff --git a/Source/Framework/Constants/Spells/SpellAuraConst.cs b/Source/Framework/Constants/Spells/SpellAuraConst.cs index dde080d4e..558b95119 100644 --- a/Source/Framework/Constants/Spells/SpellAuraConst.cs +++ b/Source/Framework/Constants/Spells/SpellAuraConst.cs @@ -552,7 +552,7 @@ namespace Framework.Constants TriggerSpellOnStackAmount = 542, // NYI Unk543 = 543, Unk544 = 544, - Unk545 = 545, // prevent swim + MoveSetCantSwim = 545, Unk546 = 546, Unk547 = 547, Unk548 = 548, diff --git a/Source/Game/Entities/Unit/Unit.Movement.cs b/Source/Game/Entities/Unit/Unit.Movement.cs index c3b47f4cc..edec0422c 100644 --- a/Source/Game/Entities/Unit/Unit.Movement.cs +++ b/Source/Game/Entities/Unit/Unit.Movement.cs @@ -1596,6 +1596,32 @@ namespace Game.Entities RemoveNpcFlag(NPCFlags.SpellClick | NPCFlags.PlayerVehicle); } + public bool SetMoveCantSwim(bool cantSwim) + { + if (cantSwim == HasExtraUnitMovementFlag2(MovementFlags3.CantSwim)) + return false; + + if (cantSwim) + AddExtraUnitMovementFlag2(MovementFlags3.CantSwim); + else + RemoveExtraUnitMovementFlag2(MovementFlags3.CantSwim); + + Player playerMover = GetUnitBeingMoved()?.ToPlayer(); + if (playerMover != null) + { + MoveSetFlag packet = new(cantSwim ? ServerOpcodes.MoveSetCantSwim : ServerOpcodes.MoveUnsetCantSwim); + packet.MoverGUID = GetGUID(); + packet.SequenceIndex = m_movementCounter++; + playerMover.SendPacket(packet); + + MoveUpdate moveUpdate = new(); + moveUpdate.Status = m_movementInfo; + SendMessageToSet(moveUpdate, playerMover); + } + + return true; + } + void SendSetVehicleRecId(uint vehicleId) { Player player = ToPlayer(); diff --git a/Source/Game/Spells/Auras/AuraEffect.cs b/Source/Game/Spells/Auras/AuraEffect.cs index a3e183ac8..69bf86797 100644 --- a/Source/Game/Spells/Auras/AuraEffect.cs +++ b/Source/Game/Spells/Auras/AuraEffect.cs @@ -2408,6 +2408,22 @@ namespace Game.Spells target.SetDisableInertia(apply); } + void HandleSetCantSwim(AuraApplication aurApp, AuraEffectHandleModes mode, bool apply) + { + if (!mode.HasAnyFlag(AuraEffectHandleModes.SendForClientMask)) + return; + + Unit target = aurApp.GetTarget(); + if (!apply) + { + // do not remove unit flag if there are more than this auraEffect of that kind on unit on unit + if (target.HasAuraType(GetAuraType())) + return; + } + + target.SetMoveCantSwim(apply); + } + /****************************/ /*** THREAT ***/ /****************************/