aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp35
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
-rw-r--r--src/server/game/Entities/Unit/UnitDefines.h1
-rw-r--r--src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp5
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraDefines.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp19
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.h1
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;