aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp65
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp31
-rw-r--r--src/server/game/Server/Packets/MovementPackets.cpp89
-rw-r--r--src/server/game/Server/Packets/MovementPackets.h71
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp6
-rw-r--r--src/server/game/Server/WorldSession.h15
6 files changed, 184 insertions, 93 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 802ebba5ef5..6a41a304639 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -10766,7 +10766,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced)
// Send notification to other players
WorldPackets::Movement::MoveUpdateSpeed packet(moveTypeToOpcode[mtype][2]);
- packet.movementInfo = m_movementInfo;
+ packet.movementInfo = &m_movementInfo;
packet.Speed = rate;
SendMessageToSet(packet.Write(), false);
}
@@ -15805,61 +15805,26 @@ void Unit::SendTeleportPacket(Position& pos)
ObjectGuid guid = GetGUID();
ObjectGuid transGuid = GetTransGUID();
- WorldPacket data(SMSG_MOVE_UPDATE_TELEPORT, 38);
- WriteMovementInfo(data);
+ WorldPackets::Movement::MoveUpdateTeleport packet;
+ packet.movementInfo = &m_movementInfo;
if (GetTypeId() == TYPEID_PLAYER)
{
- WorldPacket data2(SMSG_MOVE_TELEPORT, 38);
- data2.WriteBit(guid[6]);
- data2.WriteBit(guid[0]);
- data2.WriteBit(guid[3]);
- data2.WriteBit(guid[2]);
- data2.WriteBit(0); // unknown
- data2.WriteBit(!transGuid.IsEmpty());
- data2.WriteBit(guid[1]);
+ WorldPackets::Movement::MoveTeleport selfPacket;
+
+ selfPacket.MoverGUID = guid;
+
if (!transGuid.IsEmpty())
{
- data2.WriteBit(transGuid[1]);
- data2.WriteBit(transGuid[3]);
- data2.WriteBit(transGuid[2]);
- data2.WriteBit(transGuid[5]);
- data2.WriteBit(transGuid[0]);
- data2.WriteBit(transGuid[7]);
- data2.WriteBit(transGuid[6]);
- data2.WriteBit(transGuid[4]);
+ selfPacket.TransportGUID.Value = transGuid;
+ selfPacket.TransportGUID.HasValue = true;
}
- data2.WriteBit(guid[4]);
- data2.WriteBit(guid[7]);
- data2.WriteBit(guid[5]);
- data2.FlushBits();
- if (!transGuid.IsEmpty())
- {
- data2.WriteByteSeq(transGuid[6]);
- data2.WriteByteSeq(transGuid[5]);
- data2.WriteByteSeq(transGuid[1]);
- data2.WriteByteSeq(transGuid[7]);
- data2.WriteByteSeq(transGuid[0]);
- data2.WriteByteSeq(transGuid[2]);
- data2.WriteByteSeq(transGuid[4]);
- data2.WriteByteSeq(transGuid[3]);
- }
-
- data2 << uint32(0); // counter
- data2.WriteByteSeq(guid[1]);
- data2.WriteByteSeq(guid[2]);
- data2.WriteByteSeq(guid[3]);
- data2.WriteByteSeq(guid[5]);
- data2 << float(GetPositionX());
- data2.WriteByteSeq(guid[4]);
- data2 << float(GetOrientation());
- data2.WriteByteSeq(guid[7]);
- data2 << float(GetPositionZMinusOffset());
- data2.WriteByteSeq(guid[0]);
- data2.WriteByteSeq(guid[6]);
- data2 << float(GetPositionY());
- ToPlayer()->SendDirectMessage(&data2); // Send the MSG_MOVE_TELEPORT packet to self.
+ selfPacket.Pos.Relocate(GetPositionX(), GetPositionY(), GetPositionZMinusOffset());
+ selfPacket.Facing = GetOrientation();
+ selfPacket.SequenceIndex = m_movementCounter++;
+
+ ToPlayer()->SendDirectMessage(selfPacket.Write());
}
// Relocate the player/creature to its old position, so we can broadcast to nearby players correctly
@@ -15869,7 +15834,7 @@ void Unit::SendTeleportPacket(Position& pos)
Relocate(&oldPos);
// Broadcast the packet to everyone except self.
- SendMessageToSet(&data, false);
+ SendMessageToSet(packet.Write(), false);
}
bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool teleport)
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index 1ccd7294cc8..2100c949071 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -197,41 +197,16 @@ void WorldSession::HandleMoveWorldportAckOpcode()
GetPlayer()->ProcessDelayedOperations();
}
-void WorldSession::HandleMoveTeleportAck(WorldPacket& recvPacket)
+void WorldSession::HandleMoveTeleportAck(WorldPackets::Movement::MoveTeleportAck& packet)
{
- TC_LOG_DEBUG("network", "MSG_MOVE_TELEPORT_ACK");
-
- ObjectGuid guid;
- uint32 flags, time;
- recvPacket >> flags >> time;
-
- guid[5] = recvPacket.ReadBit();
- guid[0] = recvPacket.ReadBit();
- guid[1] = recvPacket.ReadBit();
- guid[6] = recvPacket.ReadBit();
- guid[3] = recvPacket.ReadBit();
- guid[7] = recvPacket.ReadBit();
- guid[2] = recvPacket.ReadBit();
- guid[4] = recvPacket.ReadBit();
-
- recvPacket.ReadByteSeq(guid[4]);
- recvPacket.ReadByteSeq(guid[2]);
- recvPacket.ReadByteSeq(guid[7]);
- recvPacket.ReadByteSeq(guid[6]);
- recvPacket.ReadByteSeq(guid[5]);
- recvPacket.ReadByteSeq(guid[1]);
- recvPacket.ReadByteSeq(guid[3]);
- recvPacket.ReadByteSeq(guid[0]);
-
- TC_LOG_DEBUG("network", "%s ", guid.ToString().c_str());
- TC_LOG_DEBUG("network", "Flags %u, time %u", flags, time/IN_MILLISECONDS);
+ TC_LOG_DEBUG("network", "CMSG_MOVE_TELEPORT_ACK: Guid: %s, Sequence: %u, Time: %u", packet.MoverGUID.ToString().c_str(), packet.AckIndex, packet.MoveTime);
Player* plMover = _player->m_mover->ToPlayer();
if (!plMover || !plMover->IsBeingTeleportedNear())
return;
- if (guid != plMover->GetGUID())
+ if (packet.MoverGUID != plMover->GetGUID())
return;
plMover->SetSemaphoreTeleportNear(false);
diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp
index f1d69746e80..74c5567c244 100644
--- a/src/server/game/Server/Packets/MovementPackets.cpp
+++ b/src/server/game/Server/Packets/MovementPackets.cpp
@@ -280,7 +280,7 @@ WorldPacket const* WorldPackets::Movement::MoveSetSpeed::Write()
WorldPacket const* WorldPackets::Movement::MoveUpdateSpeed::Write()
{
- _worldPacket << movementInfo;
+ _worldPacket << *movementInfo;
_worldPacket << Speed;
return &_worldPacket;
}
@@ -342,3 +342,90 @@ WorldPacket const* WorldPackets::Movement::NewWorld::Write()
_worldPacket << Reason;
return &_worldPacket;
}
+
+WorldPacket const* WorldPackets::Movement::MoveTeleport::Write()
+{
+ _worldPacket << MoverGUID;
+ _worldPacket << SequenceIndex;
+ _worldPacket << Pos.PositionXYZOStream();
+ _worldPacket << Facing;
+
+ _worldPacket.WriteBit(TransportGUID.HasValue);
+ _worldPacket.WriteBit(Vehicle.HasValue);
+ _worldPacket.FlushBits();
+
+ if (TransportGUID.HasValue)
+ _worldPacket << TransportGUID.Value;
+
+ if (Vehicle.HasValue)
+ {
+ _worldPacket << Vehicle.Value.VehicleSeatIndex;
+ _worldPacket.WriteBit(Vehicle.Value.VehicleExitVoluntary);
+ _worldPacket.WriteBit(Vehicle.Value.VehicleExitTeleport);
+ _worldPacket.FlushBits();
+ }
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Movement::MoveUpdateTeleport::Write()
+{
+ _worldPacket << *movementInfo;
+
+ _worldPacket << int32(MovementForces.size());
+ for (WorldPackets::Movement::MovementForce const& force : MovementForces)
+ {
+ _worldPacket << force.ID;
+ _worldPacket << force.Direction;
+ _worldPacket << force.TransportID;
+ _worldPacket << force.Magnitude;
+ _worldPacket.WriteBits(force.Type, 2);
+ _worldPacket.FlushBits();
+ }
+
+ _worldPacket.WriteBit(WalkSpeed.HasValue);
+ _worldPacket.WriteBit(RunSpeed.HasValue);
+ _worldPacket.WriteBit(RunBackSpeed.HasValue);
+ _worldPacket.WriteBit(SwimSpeed.HasValue);
+ _worldPacket.WriteBit(SwimBackSpeed.HasValue);
+ _worldPacket.WriteBit(FlightSpeed.HasValue);
+ _worldPacket.WriteBit(FlightBackSpeed.HasValue);
+ _worldPacket.WriteBit(TurnRate.HasValue);
+ _worldPacket.WriteBit(PitchRate.HasValue);
+
+ if (WalkSpeed.HasValue)
+ _worldPacket << WalkSpeed.Value;
+
+ if (RunSpeed.HasValue)
+ _worldPacket << RunSpeed.Value;
+
+ if (RunBackSpeed.HasValue)
+ _worldPacket << RunBackSpeed.Value;
+
+ if (SwimSpeed.HasValue)
+ _worldPacket << SwimSpeed.Value;
+
+ if (SwimBackSpeed.HasValue)
+ _worldPacket << SwimBackSpeed.Value;
+
+ if (FlightSpeed.HasValue)
+ _worldPacket << FlightSpeed.Value;
+
+ if (FlightBackSpeed.HasValue)
+ _worldPacket << FlightBackSpeed.Value;
+
+ if (TurnRate.HasValue)
+ _worldPacket << TurnRate.Value;
+
+ if (PitchRate.HasValue)
+ _worldPacket << PitchRate.Value;
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Movement::MoveTeleportAck::Read()
+{
+ _worldPacket >> MoverGUID;
+ _worldPacket >> AckIndex;
+ _worldPacket >> MoveTime;
+}
diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h
index cdaa0c79845..890b1991dd8 100644
--- a/src/server/game/Server/Packets/MovementPackets.h
+++ b/src/server/game/Server/Packets/MovementPackets.h
@@ -112,7 +112,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
ObjectGuid MoverGUID;
- float Speed;
+ float Speed = 1.0f;
};
class MoveSetSpeed : public ServerPacket
@@ -124,7 +124,7 @@ namespace WorldPackets
ObjectGuid MoverGUID;
uint32 SequenceIndex = 0; ///< Unit movement packet index, incremented each time
- float Speed;
+ float Speed = 1.0f;
};
class MoveUpdateSpeed : public ServerPacket
@@ -134,8 +134,8 @@ namespace WorldPackets
WorldPacket const* Write() override;
- MovementInfo movementInfo;
- float Speed;
+ MovementInfo* movementInfo;
+ float Speed = 1.0f;
};
class MoveSplineSetFlag final : public ServerPacket
@@ -208,6 +208,69 @@ namespace WorldPackets
void Read() override { }
};
+
+ struct VehicleTeleport
+ {
+ uint8 VehicleSeatIndex = 0;
+ bool VehicleExitVoluntary = false;
+ bool VehicleExitTeleport = false;
+ };
+
+ class MoveTeleport final : public ServerPacket
+ {
+ public:
+ MoveTeleport() : ServerPacket(SMSG_MOVE_TELEPORT, 12+4+16+16+4) { }
+
+ WorldPacket const* Write() override;
+
+ Position Pos;
+ Optional<VehicleTeleport> Vehicle;
+ uint32 SequenceIndex = 0;
+ ObjectGuid MoverGUID;
+ Optional<ObjectGuid> TransportGUID;
+ float Facing = 0.0f;
+ };
+
+ struct MovementForce
+ {
+ ObjectGuid ID;
+ G3D::Vector3 Direction;
+ uint32 TransportID = 0;
+ float Magnitude = 0;
+ uint8 Type = 0;
+ };
+
+ class MoveUpdateTeleport final : public ServerPacket
+ {
+ public:
+ MoveUpdateTeleport() : ServerPacket(SMSG_MOVE_UPDATE_TELEPORT) { }
+
+ WorldPacket const* Write() override;
+
+ MovementInfo* movementInfo;
+ std::vector<MovementForce> MovementForces;
+ Optional<float> SwimBackSpeed;
+ Optional<float> FlightSpeed;
+ Optional<float> SwimSpeed;
+ Optional<float> WalkSpeed;
+ Optional<float> TurnRate;
+ Optional<float> RunSpeed;
+ Optional<float> FlightBackSpeed;
+ Optional<float> RunBackSpeed;
+ Optional<float> PitchRate;
+ };
+
+ class MoveTeleportAck final : public ClientPacket
+ {
+ public:
+ MoveTeleportAck(WorldPacket&& packet) : ClientPacket(CMSG_MOVE_TELEPORT_ACK, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid MoverGUID;
+ int32 AckIndex = 0;
+ int32 MoveTime = 0;
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 933d1439c9d..fdec9a43948 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -474,7 +474,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_MOVE_STOP_STRAFE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_STOP_SWIM, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_STOP_TURN, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_TELEPORT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveTeleportAck );
+ DEFINE_HANDLER(CMSG_MOVE_TELEPORT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MoveTeleportAck, &WorldSession::HandleMoveTeleportAck);
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_TIME_SKIPPED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleMoveTimeSkippedOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_WATER_WALK_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveWaterWalkAck );
DEFINE_HANDLER(CMSG_MOVE_WORLDPORT_ACK, STATUS_TRANSFER, PROCESS_THREADUNSAFE, WorldPackets::Movement::WorldPortAck, &WorldSession::HandleMoveWorldportAckOpcode);
@@ -1120,7 +1120,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_SWIM_SPEED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_TURN_RATE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_WALK_SPEED, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_TELEPORT, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_TELEPORT, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNROOT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_FLY, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_UNHANDLED);
@@ -1134,7 +1134,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_SPEED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SWIM_BACK_SPEED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SWIM_SPEED, STATUS_NEVER);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TELEPORT, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TELEPORT, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TURN_RATE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_WALK_SPEED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_WATER_WALK, STATUS_NEVER);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index baeace23b40..f7e85c2abab 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -156,6 +156,13 @@ namespace WorldPackets
class TutorialSetFlag;
}
+ namespace Movement
+ {
+ class ClientPlayerMovement;
+ class WorldPortAck;
+ class MoveTeleportAck;
+ }
+
namespace NPC
{
class Hello;
@@ -175,12 +182,6 @@ namespace WorldPackets
class QuestGiverStatusQuery;
class QuestGiverStatusMultipleQuery;
}
-
- namespace Movement
- {
- class ClientPlayerMovement;
- class WorldPortAck;
- }
}
enum AccountDataType
@@ -625,7 +626,7 @@ class WorldSession
// Knockback
void HandleMoveKnockBackAck(WorldPacket& recvPacket);
- void HandleMoveTeleportAck(WorldPacket& recvPacket);
+ void HandleMoveTeleportAck(WorldPackets::Movement::MoveTeleportAck& packet);
void HandleForceSpeedChangeAck(WorldPacket& recvData);
void HandleSetCollisionHeightAck(WorldPacket& recvPacket);