diff options
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/Packets/MailPackets.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/MovementPackets.cpp | 86 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/MovementPackets.h | 39 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 |
4 files changed, 110 insertions, 21 deletions
diff --git a/src/server/game/Server/Packets/MailPackets.cpp b/src/server/game/Server/Packets/MailPackets.cpp index f8922d5bbaf..472c33503cb 100644 --- a/src/server/game/Server/Packets/MailPackets.cpp +++ b/src/server/game/Server/Packets/MailPackets.cpp @@ -128,7 +128,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Mail::MailListEntry const data.WriteBits(entry.Body.size(), 13); data.FlushBits(); - for (auto const& att : entry.Attachments) + for (WorldPackets::Mail::MailAttachedItem const& att : entry.Attachments) data << att; if (entry.SenderCharacter) @@ -157,7 +157,7 @@ WorldPacket const* WorldPackets::Mail::MailListResult::Write() _worldPacket << uint32(Mails.size()); _worldPacket << int32(TotalNumRecords); - for (auto const& mail : Mails) + for (MailListEntry const& mail : Mails) _worldPacket << mail; return &_worldPacket; diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index 0a77af16b83..1a04aa52a50 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -532,22 +532,27 @@ WorldPacket const* WorldPackets::Movement::MoveTeleport::Write() return &_worldPacket; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementForce const& movementForce) +{ + data << movementForce.ID; + data << movementForce.Origin; + data << movementForce.Direction; + data << movementForce.TransportPosition; + data << movementForce.TransportID; + data << movementForce.Magnitude; + data.WriteBits(movementForce.Type, 2); + data.FlushBits(); + + return data; +} + WorldPacket const* WorldPackets::Movement::MoveUpdateTeleport::Write() { _worldPacket << *movementInfo; _worldPacket << int32(MovementForces.size()); for (WorldPackets::Movement::MovementForce const& force : MovementForces) - { - _worldPacket << force.ID; - _worldPacket << force.Origin; - _worldPacket << force.Direction; - _worldPacket << force.TransportPosition; - _worldPacket << force.TransportID; - _worldPacket << force.Magnitude; - _worldPacket.WriteBits(force.Type, 2); - _worldPacket.FlushBits(); - } + _worldPacket << force; _worldPacket.WriteBit(WalkSpeed.is_initialized()); _worldPacket.WriteBit(RunSpeed.is_initialized()); @@ -679,14 +684,7 @@ WorldPacket const* WorldPackets::Movement::MoveUpdateRemoveMovementForce::Write( WorldPacket const* WorldPackets::Movement::MoveUpdateApplyMovementForce::Write() { _worldPacket << *movementInfo; - _worldPacket << Force.ID; - _worldPacket << Force.Origin; - _worldPacket << Force.Direction; - _worldPacket << Force.TransportPosition; - _worldPacket << Force.TransportID; - _worldPacket << Force.Magnitude; - _worldPacket.WriteBits(Force.Type, 2); - _worldPacket.FlushBits(); + _worldPacket << Force; return &_worldPacket; } @@ -760,3 +758,55 @@ WorldPacket const* WorldPackets::Movement::ResumeToken::Write() return &_worldPacket; } + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MoveSetCompoundState::MoveStateChange const& stateChange) +{ + data << uint16(stateChange.MessageID); + data << uint32(stateChange.SequenceIndex); + data.WriteBit(stateChange.Speed.is_initialized()); + data.WriteBit(stateChange.KnockBack.is_initialized()); + data.WriteBit(stateChange.VehicleRecID.is_initialized()); + data.WriteBit(stateChange.CollisionHeight.is_initialized()); + data.WriteBit(stateChange.MovementForce_.is_initialized()); + data.WriteBit(stateChange.Unknown.is_initialized()); + data.FlushBits(); + + if (stateChange.CollisionHeight) + { + data << float(stateChange.CollisionHeight->Height); + data << float(stateChange.CollisionHeight->Scale); + data.WriteBits(stateChange.CollisionHeight->Reason, 2); + data.FlushBits(); + } + + if (stateChange.Speed) + data << float(*stateChange.Speed); + + if (stateChange.KnockBack) + { + data << float(stateChange.KnockBack->HorzSpeed); + data << stateChange.KnockBack->Direction; + data << float(stateChange.KnockBack->InitVertSpeed); + } + + if (stateChange.VehicleRecID) + data << int32(*stateChange.VehicleRecID); + + if (stateChange.MovementForce_) + data << *stateChange.MovementForce_; + + if (stateChange.Unknown) + data << *stateChange.Unknown; + + return data; +} + +WorldPacket const* WorldPackets::Movement::MoveSetCompoundState::Write() +{ + _worldPacket << MoverGUID; + _worldPacket << uint32(StateChanges.size()); + for (MoveStateChange const& stateChange : StateChanges) + _worldPacket << stateChange; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index 1c21c034c86..83c53812ea3 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -536,6 +536,45 @@ namespace WorldPackets uint32 SequenceIndex = 1; uint32 Reason = 1; }; + + class MoveSetCompoundState final : public ServerPacket + { + public: + struct CollisionHeightInfo + { + float Height = 0.0f; + float Scale = 0.0f; + UpdateCollisionHeightReason Reason; + }; + + struct KnockBackInfo + { + float HorzSpeed = 0.0f; + G3D::Vector2 Direction; + float InitVertSpeed = 0.0f; + }; + + struct MoveStateChange + { + MoveStateChange(OpcodeServer messageId, uint32 sequenceIndex) : MessageID(messageId), SequenceIndex(sequenceIndex) { } + + uint16 MessageID = 0; + uint32 SequenceIndex = 0; + Optional<float> Speed; + Optional<KnockBackInfo> KnockBack; + Optional<int32> VehicleRecID; + Optional<CollisionHeightInfo> CollisionHeight; + Optional<MovementForce> MovementForce_; + Optional<ObjectGuid> Unknown; + }; + + MoveSetCompoundState() : ServerPacket(SMSG_MOVE_SET_COMPOUND_STATE, 4 + 1) { } + + WorldPacket const* Write() override; + + ObjectGuid MoverGUID; + std::vector<MoveStateChange> StateChanges; + }; } ByteBuffer& operator<<(ByteBuffer& data, Movement::MonsterSplineFilterKey const& monsterSplineFilterKey); diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index c242d9ee929..4fbc0b700fd 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1365,7 +1365,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_COLLISION_HEIGHT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_COMPOUND_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_COMPOUND_STATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_FEATHER_FALL, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_FLIGHT_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_FLIGHT_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); |
