diff options
| author | Shauren <shauren.trinity@gmail.com> | 2019-09-07 16:58:58 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2019-09-07 16:58:58 +0200 |
| commit | 8e98ceb2936842ea0032cbfdc04a510d6b1e5de0 (patch) | |
| tree | abb48f72a728cc97af6e934de1310047b5725341 /src/server/game/Server/Packets | |
| parent | e0a0dbe41c5ed0db078d0897d54f3cd8f75abc99 (diff) | |
Core/Movement: Implemented movement forces
Diffstat (limited to 'src/server/game/Server/Packets')
| -rw-r--r-- | src/server/game/Server/Packets/MovementPackets.cpp | 59 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/MovementPackets.h | 77 |
2 files changed, 108 insertions, 28 deletions
diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index c14d96e0964..943d312dffb 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -579,7 +579,7 @@ WorldPacket const* WorldPackets::Movement::MoveTeleport::Write() return &_worldPacket; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementForce const& movementForce) +ByteBuffer& operator<<(ByteBuffer& data, MovementForce const& movementForce) { data << movementForce.ID; data << movementForce.Origin; @@ -592,11 +592,23 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementForce c return data; } +ByteBuffer& operator>>(ByteBuffer& data, MovementForce& movementForce) +{ + data >> movementForce.ID; + data >> movementForce.Origin; + data >> movementForce.Direction; + data >> movementForce.TransportID; + data >> movementForce.Magnitude; + movementForce.Type = data.ReadBits(2); + + return data; +} + WorldPacket const* WorldPackets::Movement::MoveUpdateTeleport::Write() { _worldPacket << *Status; - _worldPacket << uint32(MovementForces.size()); + _worldPacket << uint32(MovementForces ? MovementForces->size() : 0); _worldPacket.WriteBit(WalkSpeed.is_initialized()); _worldPacket.WriteBit(RunSpeed.is_initialized()); _worldPacket.WriteBit(RunBackSpeed.is_initialized()); @@ -608,8 +620,9 @@ WorldPacket const* WorldPackets::Movement::MoveUpdateTeleport::Write() _worldPacket.WriteBit(PitchRate.is_initialized()); _worldPacket.FlushBits(); - for (WorldPackets::Movement::MovementForce const& force : MovementForces) - _worldPacket << force; + if (MovementForces) + for (MovementForce const& force : *MovementForces) + _worldPacket << force; if (WalkSpeed) _worldPacket << *WalkSpeed; @@ -745,18 +758,48 @@ WorldPacket const* WorldPackets::Movement::MoveUpdateCollisionHeight::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Movement::MoveUpdateRemoveMovementForce::Write() +WorldPacket const* WorldPackets::Movement::MoveApplyMovementForce::Write() { - _worldPacket << *Status; - _worldPacket << TriggerGUID; + _worldPacket << MoverGUID; + _worldPacket << SequenceIndex; + _worldPacket << *Force; return &_worldPacket; } +void WorldPackets::Movement::MoveApplyMovementForceAck::Read() +{ + _worldPacket >> Ack; + _worldPacket >> Force; +} + +WorldPacket const* WorldPackets::Movement::MoveRemoveMovementForce::Write() +{ + _worldPacket << MoverGUID; + _worldPacket << SequenceIndex; + _worldPacket << ID; + + return &_worldPacket; +} + +void WorldPackets::Movement::MoveRemoveMovementForceAck::Read() +{ + _worldPacket >> Ack; + _worldPacket >> ID; +} + WorldPacket const* WorldPackets::Movement::MoveUpdateApplyMovementForce::Write() { _worldPacket << *Status; - _worldPacket << Force; + _worldPacket << *Force; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Movement::MoveUpdateRemoveMovementForce::Write() +{ + _worldPacket << *Status; + _worldPacket << TriggerGUID; return &_worldPacket; } diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index f806551c24c..47197949c55 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -33,6 +33,12 @@ namespace WorldPackets { namespace Movement { + struct MovementAck + { + MovementInfo Status; + int32 AckIndex = 0; + }; + class ClientPlayerMovement final : public ClientPacket { public: @@ -269,16 +275,6 @@ namespace WorldPackets uint8 PreloadWorld = 0; }; - struct MovementForce - { - ObjectGuid ID; - TaggedPosition<Position::XYZ> Origin; - TaggedPosition<Position::XYZ> Direction; - uint32 TransportID = 0; - float Magnitude = 0; - uint8 Type = 0; - }; - class MoveUpdateTeleport final : public ServerPacket { public: @@ -287,7 +283,7 @@ namespace WorldPackets WorldPacket const* Write() override; MovementInfo* Status = nullptr; - std::vector<MovementForce> MovementForces; + ::MovementForces::Container const* MovementForces = nullptr; Optional<float> SwimBackSpeed; Optional<float> FlightSpeed; Optional<float> SwimSpeed; @@ -299,21 +295,67 @@ namespace WorldPackets Optional<float> PitchRate; }; + class MoveApplyMovementForce final : public ServerPacket + { + public: + MoveApplyMovementForce() : ServerPacket(SMSG_MOVE_APPLY_MOVEMENT_FORCE, 16 + 4 + 16 + 12 + 12 + 4 + 4 + 1) { } + + WorldPacket const* Write() override; + + ObjectGuid MoverGUID; + int32 SequenceIndex = 0; + MovementForce const* Force = nullptr; + }; + + class MoveApplyMovementForceAck final : public ClientPacket + { + public: + MoveApplyMovementForceAck(WorldPacket&& packet) : ClientPacket(CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK, std::move(packet)) { } + + void Read() override; + + MovementAck Ack; + MovementForce Force; + }; + + class MoveRemoveMovementForce final : public ServerPacket + { + public: + MoveRemoveMovementForce() : ServerPacket(SMSG_MOVE_REMOVE_MOVEMENT_FORCE, 16 + 4 + 16) { } + + WorldPacket const* Write() override; + + ObjectGuid MoverGUID; + int32 SequenceIndex = 0; + ObjectGuid ID; + }; + + class MoveRemoveMovementForceAck final : public ClientPacket + { + public: + MoveRemoveMovementForceAck(WorldPacket&& packet) : ClientPacket(CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK, std::move(packet)) { } + + void Read() override; + + MovementAck Ack; + ObjectGuid ID; + }; + class MoveUpdateApplyMovementForce final : public ServerPacket { public: - MoveUpdateApplyMovementForce() : ServerPacket(SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE) { } + MoveUpdateApplyMovementForce() : ServerPacket(SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE, sizeof(MovementInfo) + 16 + 12 + 12 + 4 + 4 + 1) { } WorldPacket const* Write() override; MovementInfo* Status = nullptr; - MovementForce Force; + MovementForce const* Force = nullptr; }; class MoveUpdateRemoveMovementForce final : public ServerPacket { public: - MoveUpdateRemoveMovementForce() : ServerPacket(SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE) { } + MoveUpdateRemoveMovementForce() : ServerPacket(SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE, sizeof(MovementInfo) + 16) { } WorldPacket const* Write() override; @@ -333,12 +375,6 @@ namespace WorldPackets int32 MoveTime = 0; }; - struct MovementAck - { - MovementInfo Status; - int32 AckIndex = 0; - }; - class MovementAckMessage final : public ClientPacket { public: @@ -616,5 +652,6 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo const& movementInfo); ByteBuffer& operator>>(ByteBuffer& data, MovementInfo::TransportInfo& transportInfo); ByteBuffer& operator<<(ByteBuffer& data, MovementInfo::TransportInfo const& transportInfo); ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Movement::MovementAck& movementAck); +ByteBuffer& operator<<(ByteBuffer& data, MovementForce const& movementForce); #endif // MovementPackets_h__ |
