#pragma once #include "misc/DataBuffer.h" #include namespace td { namespace protocol { class PacketHandler; enum class PacketType : std::uint8_t { // client --> server PlayerLogin = 0, SelectTeam, SpawnMob, SendMobs, PlaceTower, // client <-- server PlayerJoin, PlayerLeave, WorldBeginData, WorldData, UpdateMoney, UpdateEXP, UpdateLobbyTime, UpdateGameState, PlayerList, ConnectionInfo, UpdatePlayerTeam, ServerTps, WorldAddTower, UpdateMobStates, UpdateCastleLife, // client <--> server KeepAlive, Disconnect, UpgradeTower, RemoveTower, PlayerBuyItem, PlayerBuyMobUpgrade, PACKET_COUNT }; class Packet { public: Packet() {} virtual ~Packet() {} 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; virtual PacketType GetType() const = 0; std::uint8_t GetID() const { return static_cast(GetType()); } virtual bool IsTimed() const { return false; } }; class DelayedPacket : public Packet { protected: std::uint64_t m_PacketTime = 69; public: DelayedPacket() {} virtual ~DelayedPacket() {} 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 DelayedPacketPtr; } // namespace protocol } // namespace td