aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp9
-rw-r--r--src/server/game/Server/Packets/MovementPackets.cpp88
-rw-r--r--src/server/game/Server/Packets/MovementPackets.h10
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
4 files changed, 103 insertions, 6 deletions
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index 016520eba9d..adc2e185591 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -383,10 +383,9 @@ void WorldSession::HandleMovementOpcodes(WorldPackets::Movement::ClientPlayerMov
mover->UpdatePosition(movementInfo.pos);
- // TODO:
- /*WorldPacket data(SMSG_PLAYER_MOVE, recvPacket.size());
- mover->WriteMovementInfo(data);
- mover->SendMessageToSet(&data, _player);
+ WorldPackets::Movement::ServerPlayerMovement playerMovement;
+ playerMovement.mover = mover;
+ mover->SendMessageToSet(const_cast<WorldPacket*>(playerMovement.Write()), _player);
if (plrMover) // nothing is charmed, or player charmed
{
@@ -415,7 +414,7 @@ void WorldSession::HandleMovementOpcodes(WorldPackets::Movement::ClientPlayerMov
}
}
}
- }*/
+ }
}
void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recvData)
diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp
index 5669d5b2c63..487e230a4a1 100644
--- a/src/server/game/Server/Packets/MovementPackets.cpp
+++ b/src/server/game/Server/Packets/MovementPackets.cpp
@@ -87,3 +87,91 @@ void WorldPackets::Movement::ClientPlayerMovement::Read()
}
}
}
+
+WorldPacket const* WorldPackets::Movement::ServerPlayerMovement::Write()
+{
+ MovementInfo const movementInfo = mover->m_movementInfo;
+
+ bool hasMovementFlags = mover->GetUnitMovementFlags() != 0;
+ bool hasMovementFlags2 = mover->GetExtraUnitMovementFlags() != 0;
+ bool hasTransportData = !mover->GetTransGUID().IsEmpty();
+ bool hasSpline = mover->IsSplineEnabled();
+
+ bool hasTransportPrevTime = hasTransportData && movementInfo.transport.prevTime != 0;
+ bool hasTransportVehicleId = hasTransportData && movementInfo.transport.vehicleId != 0;
+ bool hasPitch = mover->HasUnitMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || mover->HasExtraUnitMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING);
+ bool hasFallDirection = mover->HasUnitMovementFlag(MOVEMENTFLAG_FALLING);
+ bool hasFallData = hasFallDirection || movementInfo.jump.fallTime != 0;
+ bool hasSplineElevation = mover->HasUnitMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION);
+
+ _worldPacket << movementInfo.guid;
+ _worldPacket << movementInfo.time;
+ _worldPacket << movementInfo.pos.m_positionX;
+ _worldPacket << movementInfo.pos.m_positionY;
+ _worldPacket << movementInfo.pos.m_positionZ;
+ _worldPacket << movementInfo.pos.m_orientation;
+ _worldPacket << movementInfo.pitch;
+ _worldPacket << movementInfo.splineElevation;
+
+ uint32 removeMovementForcesCount = 0;
+ _worldPacket << removeMovementForcesCount;
+
+ uint32 int168 = 0;
+ _worldPacket << int168;
+
+ /*for (uint32 i = 0; i < removeMovementForcesCount; ++i)
+ {
+ _worldPacket << ObjectGuid;
+ }*/
+
+ _worldPacket.FlushBits();
+
+ _worldPacket.WriteBits(movementInfo.flags, 30);
+ _worldPacket.WriteBits(movementInfo.flags2, 15);
+
+ _worldPacket.WriteBit(hasTransportData);
+ _worldPacket.WriteBit(hasFallData);
+
+ _worldPacket.WriteBit(0); // HeightChangeFailed
+ _worldPacket.WriteBit(0); // RemoteTimeValid
+
+ if (hasTransportData)
+ {
+ _worldPacket << movementInfo.transport.guid;
+ _worldPacket << movementInfo.transport.pos.m_positionX;
+ _worldPacket << movementInfo.transport.pos.m_positionY;
+ _worldPacket << movementInfo.transport.pos.m_positionZ;
+ _worldPacket << movementInfo.transport.pos.m_orientation;
+ _worldPacket << movementInfo.transport.seat;
+ _worldPacket << movementInfo.transport.time;
+
+ _worldPacket.WriteBit(hasTransportPrevTime);
+ _worldPacket.WriteBit(hasTransportVehicleId);
+
+ if (hasTransportPrevTime)
+ _worldPacket << movementInfo.transport.prevTime;
+
+ if (hasTransportVehicleId)
+ _worldPacket << movementInfo.transport.vehicleId;
+ }
+
+ if (hasFallData)
+ {
+ _worldPacket << movementInfo.jump.fallTime;
+ _worldPacket << movementInfo.jump.zspeed;
+
+ _worldPacket.FlushBits();
+
+ _worldPacket.WriteBit(hasFallDirection);
+ if (hasFallDirection)
+ {
+ _worldPacket << movementInfo.jump.sinAngle;
+ _worldPacket << movementInfo.jump.cosAngle;
+ _worldPacket << movementInfo.jump.xyspeed;
+ }
+ }
+
+ _worldPacket.FlushBits();
+
+ return &_worldPacket;
+} \ No newline at end of file
diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h
index 2d2ca5aa7ba..f018757eada 100644
--- a/src/server/game/Server/Packets/MovementPackets.h
+++ b/src/server/game/Server/Packets/MovementPackets.h
@@ -33,6 +33,16 @@ namespace WorldPackets
MovementInfo movementInfo;
};
+
+ class ServerPlayerMovement final : public ServerPacket
+ {
+ public:
+ ServerPlayerMovement() : ServerPacket(SMSG_PLAYER_MOVE) {}
+
+ WorldPacket const* Write() override;
+
+ Unit* mover;
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 4e690769bca..aa21130e34c 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -1165,7 +1165,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYERBINDERROR, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYERBOUND, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_DIFFICULTY_CHANGE, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_MOVE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_MOVE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SKINNED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_VEHICLE_DATA, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_DANCE, STATUS_UNHANDLED);