diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-09-07 00:58:37 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-09-07 00:58:37 +0200 |
| commit | 010550da224c446461b26bc4f38ee5cc35d4aa3d (patch) | |
| tree | d00906ba8a65931fe3baad234384492f8b95bfff /src/server/game/Entities | |
| parent | 4eb6fe462c106b21f5c625074d75377db614767b (diff) | |
Core/Auras: Implemented SPELL_AURA_MOVE_SET_CANT_SWIM and related new opcodes
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 35 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 1 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/UnitDefines.h | 1 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp | 5 |
4 files changed, 39 insertions, 3 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index fcd177b1c8d..1561c86c473 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -13337,8 +13337,8 @@ bool Unit::SetDisableInertia(bool disable) static OpcodeServer const disableInertiaOpcodeTable[2] = { - SMSG_MOVE_DISABLE_INERTIA, - SMSG_MOVE_ENABLE_INERTIA + SMSG_MOVE_ENABLE_INERTIA, + SMSG_MOVE_DISABLE_INERTIA }; if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved())) @@ -13356,6 +13356,37 @@ bool Unit::SetDisableInertia(bool disable) return true; } +bool Unit::SetMoveCantSwim(bool cantSwim) +{ + if (cantSwim == HasExtraUnitMovementFlag2(MOVEMENTFLAG3_CANT_SWIM)) + return false; + + if (cantSwim) + AddExtraUnitMovementFlag2(MOVEMENTFLAG3_CANT_SWIM); + else + RemoveExtraUnitMovementFlag2(MOVEMENTFLAG3_CANT_SWIM); + + static OpcodeServer const cantSwimOpcodeTable[2] = + { + SMSG_MOVE_UNSET_CANT_SWIM, + SMSG_MOVE_SET_CANT_SWIM, + }; + + if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved())) + { + WorldPackets::Movement::MoveSetFlag packet(cantSwimOpcodeTable[cantSwim]); + packet.MoverGUID = GetGUID(); + packet.SequenceIndex = m_movementCounter++; + playerMover->SendDirectMessage(packet.Write()); + + WorldPackets::Movement::MoveUpdate moveUpdate; + moveUpdate.Status = &m_movementInfo; + SendMessageToSet(moveUpdate.Write(), playerMover); + } + + return true; +} + void Unit::SendSetVehicleRecId(uint32 vehicleId) { if (Player* player = ToPlayer()) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 1dc8ddec7e1..b60317dd891 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1154,6 +1154,7 @@ class TC_GAME_API Unit : public WorldObject bool SetCanTurnWhileFalling(bool enable); bool SetCanDoubleJump(bool enable); bool SetDisableInertia(bool disable); + bool SetMoveCantSwim(bool cantSwim); void SendSetVehicleRecId(uint32 vehicleId); MovementForces const* GetMovementForces() const { return _movementForces.get(); } diff --git a/src/server/game/Entities/Unit/UnitDefines.h b/src/server/game/Entities/Unit/UnitDefines.h index 7aa05211b90..2225e0f14a7 100644 --- a/src/server/game/Entities/Unit/UnitDefines.h +++ b/src/server/game/Entities/Unit/UnitDefines.h @@ -445,6 +445,7 @@ enum MovementFlags3 : uint32 MOVEMENTFLAG3_DISABLE_INERTIA = 0x00000001, MOVEMENTFLAG3_CAN_ADV_FLY = 0x00000002, MOVEMENTFLAG3_ADV_FLYING = 0x00000004, + MOVEMENTFLAG3_CANT_SWIM = 0x00002000, }; enum HitInfo diff --git a/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp b/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp index 8160e9fed22..56b6afebee7 100644 --- a/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp +++ b/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp @@ -851,12 +851,13 @@ TC_API_EXPORT EnumText EnumUtils<MovementFlags3>::ToString(MovementFlags3 value) case MOVEMENTFLAG3_DISABLE_INERTIA: return { "MOVEMENTFLAG3_DISABLE_INERTIA", "MOVEMENTFLAG3_DISABLE_INERTIA", "" }; case MOVEMENTFLAG3_CAN_ADV_FLY: return { "MOVEMENTFLAG3_CAN_ADV_FLY", "MOVEMENTFLAG3_CAN_ADV_FLY", "" }; case MOVEMENTFLAG3_ADV_FLYING: return { "MOVEMENTFLAG3_ADV_FLYING", "MOVEMENTFLAG3_ADV_FLYING", "" }; + case MOVEMENTFLAG3_CANT_SWIM: return { "MOVEMENTFLAG3_CANT_SWIM", "MOVEMENTFLAG3_CANT_SWIM", "" }; default: throw std::out_of_range("value"); } } template <> -TC_API_EXPORT size_t EnumUtils<MovementFlags3>::Count() { return 4; } +TC_API_EXPORT size_t EnumUtils<MovementFlags3>::Count() { return 5; } template <> TC_API_EXPORT MovementFlags3 EnumUtils<MovementFlags3>::FromIndex(size_t index) @@ -867,6 +868,7 @@ TC_API_EXPORT MovementFlags3 EnumUtils<MovementFlags3>::FromIndex(size_t index) case 1: return MOVEMENTFLAG3_DISABLE_INERTIA; case 2: return MOVEMENTFLAG3_CAN_ADV_FLY; case 3: return MOVEMENTFLAG3_ADV_FLYING; + case 4: return MOVEMENTFLAG3_CANT_SWIM; default: throw std::out_of_range("index"); } } @@ -880,6 +882,7 @@ TC_API_EXPORT size_t EnumUtils<MovementFlags3>::ToIndex(MovementFlags3 value) case MOVEMENTFLAG3_DISABLE_INERTIA: return 1; case MOVEMENTFLAG3_CAN_ADV_FLY: return 2; case MOVEMENTFLAG3_ADV_FLYING: return 3; + case MOVEMENTFLAG3_CANT_SWIM: return 4; default: throw std::out_of_range("value"); } } |
