aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp8
-rw-r--r--src/server/game/Entities/Player/Player.h4
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp112
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
4 files changed, 84 insertions, 41 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index da964ef691f..b9ba699b7d0 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -25789,14 +25789,6 @@ void Player::DeleteGarrison()
}
}
-void Player::SendMovementSetCanTransitionBetweenSwimAndFly(bool apply)
-{
- WorldPackets::Movement::MoveSetFlag packet(apply ? SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY : SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY);
- packet.MoverGUID = GetGUID();
- packet.SequenceIndex = m_movementCounter++;
- SendMessageToSet(packet.Write(), true);
-}
-
void Player::SendMovementSetCollisionHeight(float height)
{
WorldPackets::Movement::MoveSetCollisionHeight setCollisionHeight;
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 5ff09881eb3..3c630c42fda 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2457,10 +2457,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void ValidateMovementInfo(MovementInfo* mi);
- /*! These methods send different packets to the client in apply and unapply case.
- These methods are only sent to the current unit.
- */
- void SendMovementSetCanTransitionBetweenSwimAndFly(bool apply);
void SendMovementSetCollisionHeight(float height);
bool CanFly() const override { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); }
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index c53389d89a2..76c91b05df7 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -13506,12 +13506,16 @@ void Unit::SetRooted(bool apply, bool packetOnly /*= false*/)
{ SMSG_MOVE_SPLINE_ROOT, SMSG_MOVE_ROOT }
};
- if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER)
+ if (Player* playerMover = GetPlayerMover()) // unit controlled by a player.
{
WorldPackets::Movement::MoveSetFlag packet(rootOpcodeTable[apply][1]);
packet.MoverGUID = GetGUID();
packet.SequenceIndex = m_movementCounter++;
- SendMessageToSet(packet.Write(), true);
+ playerMover->SendDirectMessage(packet.Write());
+
+ WorldPackets::Movement::MoveUpdate moveUpdate;
+ moveUpdate.movementInfo = &m_movementInfo;
+ playerMover->SendMessageToSet(moveUpdate.Write(), false);
}
else
{
@@ -14991,8 +14995,9 @@ void Unit::SendTeleportPacket(Position& pos)
WorldPackets::Movement::MoveUpdateTeleport moveUpdateTeleport;
moveUpdateTeleport.movementInfo = &m_movementInfo;
+ Unit* broadcastSource = this;
- if (GetTypeId() == TYPEID_PLAYER)
+ if (Player* playerMover = GetPlayerMover())
{
WorldPackets::Movement::MoveTeleport moveTeleport;
moveTeleport.MoverGUID = GetGUID();
@@ -15002,7 +15007,9 @@ void Unit::SendTeleportPacket(Position& pos)
moveTeleport.TransportGUID = GetTransGUID();
moveTeleport.Facing = pos.GetOrientation();
moveTeleport.SequenceIndex = m_movementCounter++;
- ToPlayer()->SendDirectMessage(moveTeleport.Write());
+ playerMover->SendDirectMessage(moveTeleport.Write());
+
+ broadcastSource = playerMover;
}
else
{
@@ -15014,7 +15021,7 @@ void Unit::SendTeleportPacket(Position& pos)
}
// Broadcast the packet to everyone except self.
- SendMessageToSet(moveUpdateTeleport.Write(), false);
+ broadcastSource->SendMessageToSet(moveUpdateTeleport.Write(), false);
}
bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool teleport)
@@ -15395,14 +15402,16 @@ bool Unit::SetDisableGravity(bool disable, bool packetOnly /*= false*/)
{ SMSG_MOVE_SPLINE_DISABLE_GRAVITY, SMSG_MOVE_DISABLE_GRAVITY }
};
- bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER;
-
- if (player)
+ if (Player* playerMover = GetPlayerMover())
{
WorldPackets::Movement::MoveSetFlag packet(gravityOpcodeTable[disable][1]);
packet.MoverGUID = GetGUID();
packet.SequenceIndex = m_movementCounter++;
- SendMessageToSet(packet.Write(), true);
+ playerMover->SendDirectMessage(packet.Write());
+
+ WorldPackets::Movement::MoveUpdate moveUpdate;
+ moveUpdate.movementInfo = &m_movementInfo;
+ playerMover->SendMessageToSet(moveUpdate.Write(), false);
}
else
{
@@ -15473,16 +15482,19 @@ bool Unit::SetCanFly(bool enable)
{ SMSG_MOVE_SPLINE_SET_FLYING, SMSG_MOVE_SET_CAN_FLY }
};
- bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER;
- if (!enable && player)
+ if (!enable && GetTypeId() == TYPEID_PLAYER)
ToPlayer()->SetFallInformation(0, GetPositionZ());
- if (player)
+ if (Player* playerMover = GetPlayerMover())
{
WorldPackets::Movement::MoveSetFlag packet(flyOpcodeTable[enable][1]);
packet.MoverGUID = GetGUID();
packet.SequenceIndex = m_movementCounter++;
- SendMessageToSet(packet.Write(), true);
+ playerMover->SendDirectMessage(packet.Write());
+
+ WorldPackets::Movement::MoveUpdate moveUpdate;
+ moveUpdate.movementInfo = &m_movementInfo;
+ playerMover->SendMessageToSet(moveUpdate.Write(), false);
}
else
{
@@ -15513,14 +15525,16 @@ bool Unit::SetWaterWalking(bool enable, bool packetOnly /*= false */)
{ SMSG_MOVE_SPLINE_SET_WATER_WALK, SMSG_MOVE_SET_WATER_WALK }
};
- bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER;
-
- if (player)
+ if (Player* playerMover = GetPlayerMover())
{
WorldPackets::Movement::MoveSetFlag packet(waterWalkingOpcodeTable[enable][1]);
packet.MoverGUID = GetGUID();
packet.SequenceIndex = m_movementCounter++;
- SendMessageToSet(packet.Write(), true);
+ playerMover->SendDirectMessage(packet.Write());
+
+ WorldPackets::Movement::MoveUpdate moveUpdate;
+ moveUpdate.movementInfo = &m_movementInfo;
+ playerMover->SendMessageToSet(moveUpdate.Write(), false);
}
else
{
@@ -15551,14 +15565,16 @@ bool Unit::SetFeatherFall(bool enable, bool packetOnly /*= false */)
{ SMSG_MOVE_SPLINE_SET_FEATHER_FALL, SMSG_MOVE_SET_FEATHER_FALL }
};
- bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER;
-
- if (player)
+ if (Player* playerMover = GetPlayerMover())
{
WorldPackets::Movement::MoveSetFlag packet(featherFallOpcodeTable[enable][1]);
packet.MoverGUID = GetGUID();
packet.SequenceIndex = m_movementCounter++;
- SendMessageToSet(packet.Write(), true);
+ playerMover->SendDirectMessage(packet.Write());
+
+ WorldPackets::Movement::MoveUpdate moveUpdate;
+ moveUpdate.movementInfo = &m_movementInfo;
+ playerMover->SendMessageToSet(moveUpdate.Write(), false);
}
else
{
@@ -15604,14 +15620,16 @@ bool Unit::SetHover(bool enable, bool packetOnly /*= false*/)
{ SMSG_MOVE_SPLINE_SET_HOVER, SMSG_MOVE_SET_HOVERING }
};
- bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER;
-
- if (player)
+ if (Player* playerMover = GetPlayerMover())
{
WorldPackets::Movement::MoveSetFlag packet(hoverOpcodeTable[enable][1]);
packet.MoverGUID = GetGUID();
packet.SequenceIndex = m_movementCounter++;
- SendMessageToSet(packet.Write(), true);
+ playerMover->SendDirectMessage(packet.Write());
+
+ WorldPackets::Movement::MoveUpdate moveUpdate;
+ moveUpdate.movementInfo = &m_movementInfo;
+ playerMover->SendMessageToSet(moveUpdate.Write(), false);
}
else
{
@@ -15639,14 +15657,16 @@ bool Unit::SetCollision(bool disable)
{ SMSG_MOVE_SPLINE_DISABLE_COLLISION, SMSG_MOVE_DISABLE_COLLISION }
};
- bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER;
-
- if (player)
+ if (Player* playerMover = GetPlayerMover())
{
WorldPackets::Movement::MoveSetFlag packet(collisionOpcodeTable[disable][1]);
packet.MoverGUID = GetGUID();
packet.SequenceIndex = m_movementCounter++;
- SendMessageToSet(packet.Write(), true);
+ playerMover->SendDirectMessage(packet.Write());
+
+ WorldPackets::Movement::MoveUpdate moveUpdate;
+ moveUpdate.movementInfo = &m_movementInfo;
+ playerMover->SendMessageToSet(moveUpdate.Write(), false);
}
else
{
@@ -15658,6 +15678,40 @@ bool Unit::SetCollision(bool disable)
return true;
}
+bool Unit::SetCanTransitionBetweenSwimAndFly(bool enable)
+{
+ if (GetTypeId() != TYPEID_PLAYER)
+ return false;
+
+ if (enable == HasExtraUnitMovementFlag(MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS))
+ return false;
+
+ if (enable)
+ AddExtraUnitMovementFlag(MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS);
+ else
+ RemoveExtraUnitMovementFlag(MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS);
+
+ static OpcodeServer const swimToFlyTransOpcodeTable[2] =
+ {
+ SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY,
+ SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY
+ };
+
+ if (Player* playerMover = GetPlayerMover())
+ {
+ WorldPackets::Movement::MoveSetFlag packet(swimToFlyTransOpcodeTable[enable]);
+ packet.MoverGUID = GetGUID();
+ packet.SequenceIndex = m_movementCounter++;
+ playerMover->SendDirectMessage(packet.Write());
+
+ WorldPackets::Movement::MoveUpdate moveUpdate;
+ moveUpdate.movementInfo = &m_movementInfo;
+ playerMover->SendMessageToSet(moveUpdate.Write(), false);
+ }
+
+ 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 3a7d25c9ef5..05149a4cd0a 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1678,6 +1678,7 @@ class TC_GAME_API Unit : public WorldObject
bool SetFeatherFall(bool enable, bool packetOnly = false);
bool SetHover(bool enable, bool packetOnly = false);
bool SetCollision(bool disable);
+ bool SetCanTransitionBetweenSwimAndFly(bool enable);
void SendSetVehicleRecId(uint32 vehicleId);
void SetInFront(WorldObject const* target);