From 537ff17ca07bcb4aafc5857e4232bdf2d50b7b67 Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 21 Oct 2016 18:24:47 +0200 Subject: Core/PacketIO: Fixed unneccessary packet spam when units become visible for players Before this change, one player starting to see any unit (CreateObject) would trigger sending root, feather fall, water walk, hover, can turn while falling and double jump status changes to ALL nearby players --- src/server/game/Server/Packets/MailPackets.cpp | 4 +- src/server/game/Server/Packets/MovementPackets.cpp | 86 +++++++++++++++++----- src/server/game/Server/Packets/MovementPackets.h | 39 ++++++++++ src/server/game/Server/Protocol/Opcodes.cpp | 2 +- 4 files changed, 110 insertions(+), 21 deletions(-) (limited to 'src/server/game/Server') 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 Speed; + Optional KnockBack; + Optional VehicleRecID; + Optional CollisionHeight; + Optional MovementForce_; + Optional Unknown; + }; + + MoveSetCompoundState() : ServerPacket(SMSG_MOVE_SET_COMPOUND_STATE, 4 + 1) { } + + WorldPacket const* Write() override; + + ObjectGuid MoverGUID; + std::vector 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); -- cgit v1.2.3