diff --git a/include/protocol/PacketHandler.h b/include/protocol/PacketHandler.h index e25f7ed..a5243db 100644 --- a/include/protocol/PacketHandler.h +++ b/include/protocol/PacketHandler.h @@ -20,6 +20,8 @@ public: virtual void HandlePacket(const DisconnectPacket* packet) {} virtual void HandlePacket(const KeepAlivePacket* packet) {} virtual void HandlePacket(const PlaceTowerPacket* packet) {} + virtual void HandlePacket(const PlayerBuyItemPacket* packet) {} + virtual void HandlePacket(const PlayerBuyMobUpgradePacket* packet) {} virtual void HandlePacket(const PlayerJoinPacket* packet) {} virtual void HandlePacket(const PlayerLeavePacket* packet) {} virtual void HandlePacket(const PlayerListPacket* packet) {} diff --git a/include/protocol/Protocol.h b/include/protocol/Protocol.h index 3715194..ced2a0b 100644 --- a/include/protocol/Protocol.h +++ b/include/protocol/Protocol.h @@ -41,6 +41,10 @@ enum class PacketType : std::uint8_t { Disconnect, UpgradeTower, RemoveTower, + PlayerBuyItem, + PlayerBuyMobUpgrade, + + PACKET_COUNT }; struct WorldHeader { @@ -573,5 +577,55 @@ public: virtual PacketType GetType() const { return PacketType::UpdateCastleLife; } }; +enum class ItemType : std::uint8_t { + // Upgrades + ClickerUpgrade, + GoldPerSecUpgrade, + + // Items +}; + +/** Packet used by the client to buy items or upgrades + Packet used by the server to confirm transaction */ +class PlayerBuyItemPacket : public Packet { +private: + ItemType m_ItemType; + std::uint8_t m_Count; +public: + PlayerBuyItemPacket() {} + PlayerBuyItemPacket(ItemType itemType, std::uint8_t count) : m_ItemType(itemType), m_Count(count) {} + virtual ~PlayerBuyItemPacket() {} + + virtual DataBuffer Serialize(bool packetID = true) const; + virtual void Deserialize(DataBuffer& data); + virtual void Dispatch(PacketHandler* handler) const; + + ItemType GetItemType() const { return m_ItemType; } + std::uint8_t GetCount() const { return m_Count; } + + virtual PacketType GetType() const { return PacketType::PlayerBuyItem; } +}; + +/** Packet used by the client to buy mob upgrades + Packet used by the server to confirm transaction */ +class PlayerBuyMobUpgradePacket : public Packet { +private: + game::MobType m_MobType; + std::uint8_t m_MobLevel; +public: + PlayerBuyMobUpgradePacket() {} + PlayerBuyMobUpgradePacket(game::MobType mobType, std::uint8_t level) : m_MobType(mobType), m_MobLevel(level) {} + virtual ~PlayerBuyMobUpgradePacket() {} + + virtual DataBuffer Serialize(bool packetID = true) const; + virtual void Deserialize(DataBuffer& data); + virtual void Dispatch(PacketHandler* handler) const; + + game::MobType GetMobType() const { return m_MobType; } + std::uint8_t GetLevel() const { return m_MobLevel; } + + virtual PacketType GetType() const { return PacketType::PlayerBuyMobUpgrade; } +}; + } // namespace protocol } // namespace td \ No newline at end of file diff --git a/src/protocol/PacketFactory.cpp b/src/protocol/PacketFactory.cpp index 99b1cc8..8dfb764 100644 --- a/src/protocol/PacketFactory.cpp +++ b/src/protocol/PacketFactory.cpp @@ -9,30 +9,32 @@ namespace PacketFactory { using PacketCreator = std::function; static std::map packets = { - {PacketType::PlayerLogin, []() -> PacketPtr {return std::make_unique();} }, - {PacketType::WorldBeginData, []() -> PacketPtr {return std::make_unique();} }, - {PacketType::WorldData, []() -> PacketPtr {return std::make_unique();} }, - {PacketType::KeepAlive, []() -> PacketPtr {return std::make_unique();} }, - {PacketType::UpdateMoney, []() -> PacketPtr {return std::make_unique();} }, - {PacketType::UpdateEXP, []() -> PacketPtr {return std::make_unique();} }, - {PacketType::UpdateLobbyTime, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::UpdateGameState, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::PlayerList, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::PlayerJoin, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::PlayerLeave, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::ConnectionInfo, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::SelectTeam, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::UpdatePlayerTeam, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::Disconnect, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::ServerTps, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::SpawnMob, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::PlaceTower, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::WorldAddTower, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::RemoveTower, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::SendMobs, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::UpgradeTower, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::UpdateCastleLife, []() -> PacketPtr {return std::make_unique(); } }, - {PacketType::UpdateMobStates, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::PlayerLogin, []() -> PacketPtr {return std::make_unique();} }, + {PacketType::WorldBeginData, []() -> PacketPtr {return std::make_unique();} }, + {PacketType::WorldData, []() -> PacketPtr {return std::make_unique();} }, + {PacketType::KeepAlive, []() -> PacketPtr {return std::make_unique();} }, + {PacketType::UpdateMoney, []() -> PacketPtr {return std::make_unique();} }, + {PacketType::UpdateEXP, []() -> PacketPtr {return std::make_unique();} }, + {PacketType::UpdateLobbyTime, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::UpdateGameState, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::PlayerList, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::PlayerJoin, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::PlayerLeave, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::ConnectionInfo, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::SelectTeam, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::UpdatePlayerTeam, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::Disconnect, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::ServerTps, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::SpawnMob, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::PlaceTower, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::WorldAddTower, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::RemoveTower, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::SendMobs, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::UpgradeTower, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::UpdateCastleLife, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::UpdateMobStates, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::PlayerBuyItem, []() -> PacketPtr {return std::make_unique(); } }, + {PacketType::PlayerBuyMobUpgrade, []() -> PacketPtr {return std::make_unique(); } }, }; PacketPtr CreatePacket(PacketType type, DataBuffer& buffer) { diff --git a/src/protocol/Protocol.cpp b/src/protocol/Protocol.cpp index 4c381f1..a71e409 100644 --- a/src/protocol/Protocol.cpp +++ b/src/protocol/Protocol.cpp @@ -548,6 +548,30 @@ void UpdateMobStatesPacket::Deserialize(DataBuffer& data) { } } +DataBuffer PlayerBuyItemPacket::Serialize(bool packetID) const { + DataBuffer data; + + WritePacketID(data, packetID); + data << m_ItemType << m_Count; + return data; +} + +void PlayerBuyItemPacket::Deserialize(DataBuffer& data) { + data >> m_ItemType >> m_Count; +} + +DataBuffer PlayerBuyMobUpgradePacket::Serialize(bool packetID) const { + DataBuffer data; + + WritePacketID(data, packetID); + data << m_MobType << m_MobLevel; + return data; +} + +void PlayerBuyMobUpgradePacket::Deserialize(DataBuffer& data) { + data >> m_MobType >> m_MobLevel; +} + REGISTER_DISPATCH_CLASS(PlayerLoginPacket) REGISTER_DISPATCH_CLASS(WorldBeginDataPacket) REGISTER_DISPATCH_CLASS(WorldDataPacket) @@ -572,6 +596,8 @@ REGISTER_DISPATCH_CLASS(SendMobsPacket) REGISTER_DISPATCH_CLASS(UpgradeTowerPacket) REGISTER_DISPATCH_CLASS(UpdateCastleLifePacket) REGISTER_DISPATCH_CLASS(UpdateMobStatesPacket) +REGISTER_DISPATCH_CLASS(PlayerBuyItemPacket) +REGISTER_DISPATCH_CLASS(PlayerBuyMobUpgradePacket) } // namespace protocol } // namespace td \ No newline at end of file