From 88a9020da7e7ffd9b8830ecd9922451fc092a895 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Sat, 12 Aug 2023 14:43:20 +0200 Subject: [PATCH] timed packets --- include/protocol/Protocol.h | 26 +++++++++- include/protocol/packets/KeepAlivePacket.h | 2 +- src/protocol/PacketFactory.cpp | 22 +++++++- src/protocol/Protocol.cpp | 59 ++++++++++++---------- 4 files changed, 79 insertions(+), 30 deletions(-) diff --git a/include/protocol/Protocol.h b/include/protocol/Protocol.h index 33f74d1..00fe55d 100644 --- a/include/protocol/Protocol.h +++ b/include/protocol/Protocol.h @@ -54,13 +54,37 @@ public: virtual void Deserialize(DataBuffer& data) = 0; virtual void Dispatch(PacketHandler* handler) const = 0; - void WritePacketID(DataBuffer& data, bool packetID) const; + virtual void WritePacketID(DataBuffer& data, bool packetID) const; virtual PacketType GetType() const = 0; std::uint8_t GetID() const { return static_cast(GetType()); } + + virtual bool IsTimed() const { return false; } +}; + +class TimedPacket : public Packet { +protected: + std::uint64_t m_PacketTime = 69; + +public: + TimedPacket() {} + virtual ~TimedPacket() {} + + virtual DataBuffer Serialize(bool packetID = true) const = 0; + virtual void Deserialize(DataBuffer& data) = 0; + virtual void Dispatch(PacketHandler* handler) const = 0; + + virtual void WritePacketID(DataBuffer& data, bool packetID) const override; + + virtual PacketType GetType() const = 0; + + virtual bool IsTimed() const override { return true; } + + void SetPacketTime(std::uint64_t packetTime) { m_PacketTime = packetTime; } }; typedef std::unique_ptr PacketPtr; +typedef std::unique_ptr TimedPacketPtr; } // namespace protocol } // namespace td \ No newline at end of file diff --git a/include/protocol/packets/KeepAlivePacket.h b/include/protocol/packets/KeepAlivePacket.h index 9a611a6..bc5c922 100644 --- a/include/protocol/packets/KeepAlivePacket.h +++ b/include/protocol/packets/KeepAlivePacket.h @@ -5,7 +5,7 @@ namespace td { namespace protocol { -class KeepAlivePacket : public Packet { +class KeepAlivePacket : public TimedPacket { private: std::uint64_t m_AliveID; public: diff --git a/src/protocol/PacketFactory.cpp b/src/protocol/PacketFactory.cpp index 7eab92a..cecbf2a 100644 --- a/src/protocol/PacketFactory.cpp +++ b/src/protocol/PacketFactory.cpp @@ -39,7 +39,27 @@ static std::map packets = { }; PacketPtr CreatePacket(PacketType type, DataBuffer& buffer) { - PacketPtr packet = packets[type](); + + std::uint8_t packetTypeInt = static_cast(type); + + PacketPtr packet; + + // we have a timed packet + if (packetTypeInt >> 7) { + std::uint64_t packetTime = 0; + buffer >> packetTime; + packetTypeInt &= 0x7F; + type = protocol::PacketType(packetTypeInt); + + packet = packets[type](); + + TimedPacket* timedPacket = reinterpret_cast(packet.get()); + timedPacket->SetPacketTime(packetTime); + + } else { + packet = packets[type](); + } + packet->Deserialize(buffer); return packet; } diff --git a/src/protocol/Protocol.cpp b/src/protocol/Protocol.cpp index 0d208ab..4f197dc 100644 --- a/src/protocol/Protocol.cpp +++ b/src/protocol/Protocol.cpp @@ -1,7 +1,7 @@ #include "protocol/PacketHandler.h" #include "protocol/Packets.h" -#define REGISTER_DISPATCH_CLASS(className) void className::Dispatch(PacketHandler* handler) const { \ +#define REGISTER_DISPATCH(className) void className::Dispatch(PacketHandler* handler) const { \ handler->HandlePacket(this);\ } @@ -13,32 +13,37 @@ void Packet::WritePacketID(DataBuffer& data, bool packetID) const { data << GetID(); } -REGISTER_DISPATCH_CLASS(PlayerLoginPacket) -REGISTER_DISPATCH_CLASS(WorldBeginDataPacket) -REGISTER_DISPATCH_CLASS(WorldDataPacket) -REGISTER_DISPATCH_CLASS(KeepAlivePacket) -REGISTER_DISPATCH_CLASS(UpdateExpPacket) -REGISTER_DISPATCH_CLASS(UpdateMoneyPacket) -REGISTER_DISPATCH_CLASS(UpdateLobbyTimePacket) -REGISTER_DISPATCH_CLASS(UpdateGameStatePacket) -REGISTER_DISPATCH_CLASS(PlayerListPacket) -REGISTER_DISPATCH_CLASS(PlayerJoinPacket) -REGISTER_DISPATCH_CLASS(PlayerLeavePacket) -REGISTER_DISPATCH_CLASS(ConnexionInfoPacket) -REGISTER_DISPATCH_CLASS(SelectTeamPacket) -REGISTER_DISPATCH_CLASS(UpdatePlayerTeamPacket) -REGISTER_DISPATCH_CLASS(DisconnectPacket) -REGISTER_DISPATCH_CLASS(ServerTpsPacket) -REGISTER_DISPATCH_CLASS(SpawnMobPacket) -REGISTER_DISPATCH_CLASS(PlaceTowerPacket) -REGISTER_DISPATCH_CLASS(WorldAddTowerPacket) -REGISTER_DISPATCH_CLASS(RemoveTowerPacket) -REGISTER_DISPATCH_CLASS(SendMobsPacket) -REGISTER_DISPATCH_CLASS(UpgradeTowerPacket) -REGISTER_DISPATCH_CLASS(UpdateCastleLifePacket) -REGISTER_DISPATCH_CLASS(UpdateMobStatesPacket) -REGISTER_DISPATCH_CLASS(PlayerBuyItemPacket) -REGISTER_DISPATCH_CLASS(PlayerBuyMobUpgradePacket) +void TimedPacket::WritePacketID(DataBuffer& data, bool packetID) const { + if (packetID) + data << static_cast(GetID() | static_cast(0x80)) << m_PacketTime; +} + +REGISTER_DISPATCH(PlayerLoginPacket) +REGISTER_DISPATCH(WorldBeginDataPacket) +REGISTER_DISPATCH(WorldDataPacket) +REGISTER_DISPATCH(KeepAlivePacket) +REGISTER_DISPATCH(UpdateExpPacket) +REGISTER_DISPATCH(UpdateMoneyPacket) +REGISTER_DISPATCH(UpdateLobbyTimePacket) +REGISTER_DISPATCH(UpdateGameStatePacket) +REGISTER_DISPATCH(PlayerListPacket) +REGISTER_DISPATCH(PlayerJoinPacket) +REGISTER_DISPATCH(PlayerLeavePacket) +REGISTER_DISPATCH(ConnexionInfoPacket) +REGISTER_DISPATCH(SelectTeamPacket) +REGISTER_DISPATCH(UpdatePlayerTeamPacket) +REGISTER_DISPATCH(DisconnectPacket) +REGISTER_DISPATCH(ServerTpsPacket) +REGISTER_DISPATCH(SpawnMobPacket) +REGISTER_DISPATCH(PlaceTowerPacket) +REGISTER_DISPATCH(WorldAddTowerPacket) +REGISTER_DISPATCH(RemoveTowerPacket) +REGISTER_DISPATCH(SendMobsPacket) +REGISTER_DISPATCH(UpgradeTowerPacket) +REGISTER_DISPATCH(UpdateCastleLifePacket) +REGISTER_DISPATCH(UpdateMobStatesPacket) +REGISTER_DISPATCH(PlayerBuyItemPacket) +REGISTER_DISPATCH(PlayerBuyMobUpgradePacket) } // namespace protocol } // namespace td \ No newline at end of file