diff options
author | Rat <gmstreetrat@gmail.com> | 2014-11-15 11:37:08 +0100 |
---|---|---|
committer | Rat <gmstreetrat@gmail.com> | 2014-11-15 11:37:08 +0100 |
commit | 5545a2605b8bf7218f853218253b8b44a36e4fc0 (patch) | |
tree | a5329f9e2a9dfcf3fb019475b00abfd8487fd7fb | |
parent | 0a9f34059ef03fa54b7c0533a4b4933db5eb7a9d (diff) |
Core/Movement: Some fixes to player movement (SMSG_PLAYER_MOVE)
-rw-r--r-- | src/server/game/Handlers/MovementHandler.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.cpp | 88 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.h | 10 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 |
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); |