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 | |
parent | 4eb6fe462c106b21f5c625074d75377db614767b (diff) |
Core/Auras: Implemented SPELL_AURA_MOVE_SET_CANT_SWIM and related new opcodes
-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 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraDefines.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.h | 1 |
9 files changed, 63 insertions, 5 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"); } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 29bc0765015..c1167df4310 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1711,6 +1711,7 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CANT_SWIM, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_ADV_FLY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1763,6 +1764,7 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_UNSET_HOVER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_TELEPORT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNROOT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CANT_SWIM, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_ADV_FLY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 0a90b36114e..f7afd982199 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -1613,6 +1613,7 @@ enum OpcodeServer : uint16 SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP = 0x2E40, SMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION = 0x2E42, SMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD = 0x2E41, + SMSG_MOVE_SET_CANT_SWIM = 0x2E07, SMSG_MOVE_SET_CAN_ADV_FLY = 0x2E36, SMSG_MOVE_SET_CAN_FLY = 0x2E05, SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x2E09, @@ -1665,6 +1666,7 @@ enum OpcodeServer : uint16 SMSG_MOVE_SPLINE_UNSET_HOVER = 0x2E24, SMSG_MOVE_TELEPORT = 0x2E04, SMSG_MOVE_UNROOT = 0x2DFA, + SMSG_MOVE_UNSET_CANT_SWIM = 0x2E08, SMSG_MOVE_UNSET_CAN_ADV_FLY = 0x2E37, SMSG_MOVE_UNSET_CAN_FLY = 0x2E06, SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING = 0x2E0A, diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index c3fb03e4690..af7bcc784f5 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -636,7 +636,7 @@ enum AuraType : uint32 SPELL_AURA_TRIGGER_SPELL_ON_STACK_AMOUNT = 542, // NYI SPELL_AURA_543 = 543, SPELL_AURA_544 = 544, - SPELL_AURA_545 = 545, // prevent swim + SPELL_AURA_MOVE_SET_CANT_SWIM = 545, SPELL_AURA_546 = 546, SPELL_AURA_547 = 547, SPELL_AURA_548 = 548, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 7e917275510..e3dbdc50eb6 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -614,7 +614,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //542 SPELL_AURA_TRIGGER_SPELL_ON_STACK_AMOUNT &AuraEffect::HandleNULL, //543 &AuraEffect::HandleNULL, //544 - &AuraEffect::HandleNULL, //545 + &AuraEffect::HandleSetCantSwim, //545 SPELL_AURA_MOVE_SET_CANT_SWIM &AuraEffect::HandleNULL, //546 &AuraEffect::HandleNULL, //547 &AuraEffect::HandleNULL, //548 @@ -2975,6 +2975,23 @@ void AuraEffect::HandleDisableInertia(AuraApplication const* aurApp, uint8 mode, target->SetDisableInertia(apply); } +void AuraEffect::HandleSetCantSwim(AuraApplication const* aurApp, uint8 mode, bool apply) const +{ + if (!(mode & AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK)) + 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 ***/ /****************************/ diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index c6ac44bc24c..446f21b6be4 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -188,6 +188,7 @@ class TC_GAME_API AuraEffect void HandleAuraCanTurnWhileFalling(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleIgnoreMovementForces(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleDisableInertia(AuraApplication const* aurApp, uint8 mode, bool apply) const; + void HandleSetCantSwim(AuraApplication const* aurApp, uint8 mode, bool apply) const; // threat void HandleModThreat(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraModTotalThreat(AuraApplication const* aurApp, uint8 mode, bool apply) const; |