aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-09-07 00:58:37 +0200
committerShauren <shauren.trinity@gmail.com>2024-09-07 00:58:37 +0200
commit010550da224c446461b26bc4f38ee5cc35d4aa3d (patch)
treed00906ba8a65931fe3baad234384492f8b95bfff /src/server/game/Entities
parent4eb6fe462c106b21f5c625074d75377db614767b (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.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
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");
}
}