aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
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);