aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-10-21 18:24:47 +0200
committerShauren <shauren.trinity@gmail.com>2016-10-21 18:24:47 +0200
commit537ff17ca07bcb4aafc5857e4232bdf2d50b7b67 (patch)
treeb5885432a3eac3363d440fa2d9af3a47a59d4de9 /src/server/game/Server
parenta3b953952ae987b4fb8cc6d4b7a4395981e99bc2 (diff)
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
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/Packets/MailPackets.cpp4
-rw-r--r--src/server/game/Server/Packets/MovementPackets.cpp86
-rw-r--r--src/server/game/Server/Packets/MovementPackets.h39
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
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);