Packets Refactor
commit 497a601c424e8e728ef0a8e61f049982f2d4af16 Author: Persson-dev <sim16.prib@gmail.com> Date: Sat Aug 12 10:32:52 2023 +0200 fix warning commit 1bfd019a1ea00dcdb6323d1f285e2cdd3ebb4020 Author: Persson-dev <sim16.prib@gmail.com> Date: Tue Jul 25 19:05:13 2023 +0200 refactor: update cast commit 5bbc23a7d37e53eb74a885685f18e714f9448fd9 Author: Persson-dev <sim16.prib@gmail.com> Date: Tue Jul 25 19:04:15 2023 +0200 moved GetImguiTeamColor commit fd0e2d2470ea5cca3553acf280aa371de5c06f4c Author: Persson-dev <sim16.prib@gmail.com> Date: Tue Jul 25 19:03:37 2023 +0200 packets forward declaration commit 06eb9b99a96731f4b9a2167c00ed0bcd03702e3b Author: Persson-dev <sim16.prib@gmail.com> Date: Tue Jul 25 18:30:55 2023 +0200 remove Protocol.h includes commit 165f63d2e8b468f3e38992baddc221270010f801 Author: Persson-dev <sim16.prib@gmail.com> Date: Tue Jul 25 18:30:30 2023 +0200 split packets into separate source files commit f247f146c6c1e804a44b86f65cf3059859c07c6c Author: Persson-dev <sim16.prib@gmail.com> Date: Tue Jul 25 17:45:24 2023 +0200 split packets into separate headers
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
#include "game/World.h"
|
||||
#include "protocol/PacketDispatcher.h"
|
||||
#include "protocol/Protocol.h"
|
||||
#include "protocol/packets/WorldBeginDataPacket.h"
|
||||
#include "protocol/packets/WorldDataPacket.h"
|
||||
#include "game/BaseGame.h"
|
||||
#include "misc/Random.h"
|
||||
#include "misc/Compression.h"
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
#include "game/client/Client.h"
|
||||
#include "misc/Format.h"
|
||||
|
||||
#include "protocol/packets/DisconnectPacket.h"
|
||||
#include "protocol/packets/PlaceTowerPacket.h"
|
||||
#include "protocol/packets/RemoveTowerPacket.h"
|
||||
#include "protocol/packets/SelectTeamPacket.h"
|
||||
#include "protocol/packets/UpgradeTowerPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace client {
|
||||
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
#include "game/client/ClientConnexion.h"
|
||||
#include "render/WorldRenderer.h"
|
||||
|
||||
#include "protocol/packets/ConnectionInfoPacket.h"
|
||||
#include "protocol/packets/DisconnectPacket.h"
|
||||
#include "protocol/packets/KeepAlivePacket.h"
|
||||
#include "protocol/packets/PlayerLoginPacket.h"
|
||||
#include "protocol/packets/ServerTpsPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace client {
|
||||
|
||||
@@ -32,7 +38,7 @@ void ClientConnexion::HandlePacket(const protocol::ServerTpsPacket* packet) {
|
||||
}
|
||||
|
||||
void ClientConnexion::Login() {
|
||||
td::protocol::PlayerLoginPacket loginPacket("Persson" + std::to_string(m_ConnectionID));
|
||||
td::protocol::PlayerLoginPacket loginPacket("Persson" + std::to_string(static_cast<unsigned int>(m_ConnectionID)));
|
||||
SendPacket(&loginPacket);
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,18 @@
|
||||
#include "protocol/PacketDispatcher.h"
|
||||
#include "game/client/Client.h"
|
||||
|
||||
#include "protocol/packets/ConnectionInfoPacket.h"
|
||||
#include "protocol/packets/PlayerJoinPacket.h"
|
||||
#include "protocol/packets/PlayerListPacket.h"
|
||||
#include "protocol/packets/PlayerLeavePacket.h"
|
||||
#include "protocol/packets/UpdatePlayerTeamPacket.h"
|
||||
#include "protocol/packets/UpdateLobbyTimePacket.h"
|
||||
#include "protocol/packets/UpdateGameStatePacket.h"
|
||||
#include "protocol/packets/UpdateMoneyPacket.h"
|
||||
#include "protocol/packets/UpdateExpPacket.h"
|
||||
#include "protocol/packets/DisconnectPacket.h"
|
||||
#include "protocol/packets/WorldDataPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace client {
|
||||
|
||||
@@ -43,7 +55,7 @@ void ClientGame::HandlePacket(const protocol::PlayerJoinPacket* packet) {
|
||||
void ClientGame::HandlePacket(const protocol::PlayerLeavePacket* packet) {
|
||||
game::Player* player = &m_Players[packet->GetPlayerID()];
|
||||
if (player->GetTeamColor() != game::TeamColor::None) {
|
||||
m_Teams[(std::size_t)player->GetTeamColor()].RemovePlayer(player);
|
||||
m_Teams[static_cast<std::size_t>(player->GetTeamColor())].RemovePlayer(player);
|
||||
}
|
||||
m_Players.erase(player->GetID());
|
||||
}
|
||||
@@ -57,7 +69,7 @@ void ClientGame::HandlePacket(const protocol::PlayerListPacket* packet) {
|
||||
player.SetTeamColor(playerInfo.team);
|
||||
m_Players.insert({ playerID, player });
|
||||
if (player.GetTeamColor() != game::TeamColor::None) {
|
||||
m_Teams[(std::size_t)player.GetTeamColor()].AddPlayer(&m_Players[playerID]);
|
||||
m_Teams[static_cast<std::size_t>(player.GetTeamColor())].AddPlayer(&m_Players[playerID]);
|
||||
}
|
||||
}
|
||||
m_Player = &m_Players[m_ConnexionID];
|
||||
|
||||
@@ -3,6 +3,15 @@
|
||||
#include "game/client/ClientGame.h"
|
||||
#include "render/WorldRenderer.h"
|
||||
|
||||
#include "protocol/packets/WorldAddTowerPacket.h"
|
||||
#include "protocol/packets/WorldBeginDataPacket.h"
|
||||
#include "protocol/packets/WorldDataPacket.h"
|
||||
#include "protocol/packets/SpawnMobPacket.h"
|
||||
#include "protocol/packets/UpgradeTowerPacket.h"
|
||||
#include "protocol/packets/RemoveTowerPacket.h"
|
||||
#include "protocol/packets/UpdateCastleLifePacket.h"
|
||||
#include "protocol/packets/UpdateMobStatesPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace client {
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#include "game/server/Lobby.h"
|
||||
#include "game/server/Server.h"
|
||||
|
||||
#include "protocol/packets/UpdateLobbyTimePacket.h"
|
||||
|
||||
#include "misc/Time.h"
|
||||
|
||||
#ifdef NDEBUG
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
#include "game/server/Server.h"
|
||||
#include "protocol/PacketFactory.h"
|
||||
|
||||
#include "protocol/packets/DisconnectPacket.h"
|
||||
#include "protocol/packets/ServerTpsPacket.h"
|
||||
#include "protocol/packets/PlayerLeavePacket.h"
|
||||
|
||||
#include "misc/Format.h"
|
||||
|
||||
namespace td {
|
||||
|
||||
@@ -3,6 +3,23 @@
|
||||
#include "protocol/PacketFactory.h"
|
||||
#include "game/server/Server.h"
|
||||
|
||||
#include "protocol/packets/ConnectionInfoPacket.h"
|
||||
#include "protocol/packets/DisconnectPacket.h"
|
||||
#include "protocol/packets/KeepAlivePacket.h"
|
||||
#include "protocol/packets/PlaceTowerPacket.h"
|
||||
#include "protocol/packets/PlayerLoginPacket.h"
|
||||
#include "protocol/packets/PlayerJoinPacket.h"
|
||||
#include "protocol/packets/PlayerListPacket.h"
|
||||
#include "protocol/packets/RemoveTowerPacket.h"
|
||||
#include "protocol/packets/SelectTeamPacket.h"
|
||||
#include "protocol/packets/SendMobsPacket.h"
|
||||
#include "protocol/packets/UpdatePlayerTeamPacket.h"
|
||||
#include "protocol/packets/UpdateGameStatePacket.h"
|
||||
#include "protocol/packets/UpgradeTowerPacket.h"
|
||||
#include "protocol/packets/WorldBeginDataPacket.h"
|
||||
#include "protocol/packets/WorldDataPacket.h"
|
||||
#include "protocol/packets/WorldAddTowerPacket.h"
|
||||
|
||||
#include "misc/Time.h"
|
||||
#include "misc/Random.h"
|
||||
|
||||
|
||||
@@ -1,6 +1,15 @@
|
||||
#include "game/server/ServerGame.h"
|
||||
#include "game/server/Server.h"
|
||||
|
||||
#include "protocol/packets/DisconnectPacket.h"
|
||||
#include "protocol/packets/UpdatePlayerTeamPacket.h"
|
||||
#include "protocol/packets/UpdateGameStatePacket.h"
|
||||
#include "protocol/packets/UpdateMoneyPacket.h"
|
||||
#include "protocol/packets/UpdateExpPacket.h"
|
||||
#include "protocol/packets/UpdateMobStatesPacket.h"
|
||||
#include "protocol/packets/WorldDataPacket.h"
|
||||
#include "protocol/packets/WorldBeginDataPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace server {
|
||||
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
#include "game/server/Server.h"
|
||||
#include "misc/Random.h"
|
||||
|
||||
#include "protocol/packets/SpawnMobPacket.h"
|
||||
#include "protocol/packets/UpdateCastleLifePacket.h"
|
||||
|
||||
#define MOB_SPAWN_PRECISION 100.0f
|
||||
|
||||
namespace td {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#include "protocol/PacketFactory.h"
|
||||
#include "protocol/Packets.h"
|
||||
#include <map>
|
||||
#include <functional>
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#include "protocol/PacketHandler.h"
|
||||
|
||||
#include <cmath>
|
||||
#include "protocol/Packets.h"
|
||||
|
||||
#define REGISTER_DISPATCH_CLASS(className) void className::Dispatch(PacketHandler* handler) const { \
|
||||
handler->HandlePacket(this);\
|
||||
@@ -9,565 +8,11 @@
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
const int BITS_IN_BYTE = 8;
|
||||
const int BITS_IN_LONG = BITS_IN_BYTE * sizeof(std::uint64_t);
|
||||
|
||||
static unsigned int countBits(unsigned int number) {
|
||||
// log function in base 2
|
||||
// take only integer part
|
||||
return static_cast<unsigned int>(std::log2(number) + 1);
|
||||
}
|
||||
|
||||
void Packet::WritePacketID(DataBuffer& data, bool packetID) const {
|
||||
if (packetID)
|
||||
data << GetID();
|
||||
}
|
||||
|
||||
static DataBuffer& operator<<(DataBuffer& buffer, game::TilePtr tile) {
|
||||
buffer << tile->GetType();
|
||||
|
||||
switch (tile->GetType()) {
|
||||
|
||||
case game::TileType::Tower: {
|
||||
const game::TowerTile* towerTile = dynamic_cast<const game::TowerTile*>(tile.get());
|
||||
buffer << towerTile->color_palette_ref << towerTile->team_owner;
|
||||
break;
|
||||
}
|
||||
|
||||
case game::TileType::Walk: {
|
||||
const game::WalkableTile* walkTile = dynamic_cast<const game::WalkableTile*>(tile.get());
|
||||
buffer << walkTile->direction;
|
||||
break;
|
||||
}
|
||||
|
||||
case game::TileType::Decoration: {
|
||||
const game::DecorationTile* decoTile = dynamic_cast<const game::DecorationTile*>(tile.get());
|
||||
buffer << decoTile->color_palette_ref;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static DataBuffer& operator>>(DataBuffer& buffer, game::TilePtr& tile) {
|
||||
game::TileType tileType;
|
||||
buffer >> tileType;
|
||||
switch (tileType) {
|
||||
case game::TileType::Tower: {
|
||||
auto tilePtr = std::make_shared<game::TowerTile>();
|
||||
buffer >> tilePtr->color_palette_ref >> tilePtr->team_owner;
|
||||
tile = tilePtr;
|
||||
break;
|
||||
}
|
||||
case game::TileType::Walk: {
|
||||
auto tilePtr = std::make_shared<game::WalkableTile>();
|
||||
buffer >> tilePtr->direction;
|
||||
tile = tilePtr;
|
||||
break;
|
||||
}
|
||||
case game::TileType::Decoration: {
|
||||
auto tilePtr = std::make_shared<game::DecorationTile>();
|
||||
buffer >> tilePtr->color_palette_ref;
|
||||
tile = tilePtr;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
DataBuffer PlayerLoginPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_PlayerName;
|
||||
return data;
|
||||
}
|
||||
|
||||
void PlayerLoginPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_PlayerName;
|
||||
}
|
||||
|
||||
DataBuffer WorldBeginDataPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
const game::TowerTileColorPalette& towerTilePalette = m_Header.m_World->GetTowerTileColorPalette();
|
||||
const std::vector<Color>& decoTilePalette = m_Header.m_World->GetDecorationPalette();
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
|
||||
data << towerTilePalette << m_Header.m_World->GetWalkableTileColor()
|
||||
<< static_cast<std::uint16_t>(decoTilePalette.size());
|
||||
|
||||
// deco color palette
|
||||
std::size_t bufferSize = data.GetSize();
|
||||
data.Resize(bufferSize + decoTilePalette.size() * sizeof(Color));
|
||||
|
||||
memcpy(reinterpret_cast<std::uint8_t*>(data.data()) + bufferSize, decoTilePalette.data(), decoTilePalette.size() * sizeof(Color));
|
||||
|
||||
data << m_Header.m_World->GetBackgroundColor();
|
||||
|
||||
const game::Spawn& redSpawn = m_Header.m_World->GetRedTeam().GetSpawn(), blueSpawn = m_Header.m_World->GetBlueTeam().GetSpawn();
|
||||
const game::TeamCastle& redCastle = m_Header.m_World->GetRedTeam().GetCastle(), blueCastle = m_Header.m_World->GetBlueTeam().GetCastle();
|
||||
|
||||
data << redSpawn << static_cast<utils::shape::Rectangle>(redCastle);
|
||||
data << blueSpawn << static_cast<utils::shape::Rectangle>(blueCastle);
|
||||
|
||||
// tile palette
|
||||
data << static_cast<std::uint64_t>(m_Header.m_World->GetTilePalette().size());
|
||||
|
||||
for (game::TilePtr tile : m_Header.m_World->GetTilePalette()) {
|
||||
data << tile;
|
||||
}
|
||||
|
||||
data << m_Header.m_World->GetSpawnColors();
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
void WorldBeginDataPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_Header.m_TowerPlacePalette >> m_Header.m_WalkablePalette;
|
||||
|
||||
std::uint16_t decoPaletteSize;
|
||||
data >> decoPaletteSize;
|
||||
|
||||
std::size_t decoPalletteSizeByte = decoPaletteSize * sizeof(Color);
|
||||
|
||||
m_Header.m_DecorationPalette.resize(decoPaletteSize);
|
||||
|
||||
memcpy(reinterpret_cast<std::uint8_t*>(m_Header.m_DecorationPalette.data()), data.data() + data.GetReadOffset(), decoPalletteSizeByte);
|
||||
|
||||
data.SetReadOffset(data.GetReadOffset() + decoPalletteSizeByte);
|
||||
|
||||
data >> m_Header.m_Background;
|
||||
|
||||
utils::shape::Rectangle redCastle, blueCastle;
|
||||
|
||||
data >> m_Header.m_RedSpawn >> redCastle;
|
||||
data >> m_Header.m_BlueSpawn >> blueCastle;
|
||||
|
||||
m_Header.m_RedCastle.SetShape(redCastle);
|
||||
m_Header.m_BlueCastle.SetShape(blueCastle);
|
||||
|
||||
std::uint64_t tilePaletteSize;
|
||||
data >> tilePaletteSize;
|
||||
|
||||
m_Header.m_TilePalette.reserve(tilePaletteSize);
|
||||
|
||||
for (std::uint64_t tileNumber = 0; tileNumber < tilePaletteSize; tileNumber++) {
|
||||
game::TilePtr tile;
|
||||
data >> tile;
|
||||
m_Header.m_TilePalette.push_back(tile);
|
||||
}
|
||||
|
||||
data >> m_Header.m_SpawnColorPalette;
|
||||
}
|
||||
|
||||
typedef std::vector<uint64_t> ChunkPackedData;
|
||||
|
||||
DataBuffer WorldDataPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
|
||||
data << m_World->GetChunks().size();
|
||||
for (const auto& pair : m_World->GetChunks()) {
|
||||
game::ChunkCoord coords = pair.first;
|
||||
game::ChunkPtr chunk = pair.second;
|
||||
|
||||
data << coords.x << coords.y << static_cast<std::uint64_t>(chunk->palette.size());
|
||||
|
||||
std::size_t bufferSize = data.GetSize();
|
||||
data.Resize(data.GetSize() + chunk->palette.size() * sizeof(game::ChunkPalette::value_type));
|
||||
memcpy(reinterpret_cast<std::uint8_t*>(data.data()) + bufferSize, chunk->palette.data(), chunk->palette.size() * sizeof(game::ChunkPalette::value_type));
|
||||
|
||||
std::uint8_t bitsPerTile = countBits(chunk->palette.size());
|
||||
|
||||
game::Chunk::ChunkData::value_type individualValueMask = ((1 << bitsPerTile) - 1);
|
||||
|
||||
ChunkPackedData chunkData(game::Chunk::ChunkSize / (BITS_IN_BYTE * sizeof(ChunkPackedData::value_type) / bitsPerTile), 0);
|
||||
|
||||
for (unsigned int tileNumber = 0; tileNumber < game::Chunk::ChunkSize; tileNumber++) {
|
||||
std::size_t startLong = static_cast<std::size_t>((tileNumber * bitsPerTile) / BITS_IN_LONG);
|
||||
std::size_t startOffset = static_cast<std::size_t>((tileNumber * bitsPerTile) % BITS_IN_LONG);
|
||||
std::size_t endLong = static_cast<std::size_t>(((tileNumber + 1) * bitsPerTile - 1) / BITS_IN_LONG);
|
||||
|
||||
std::uint64_t value = static_cast<std::uint64_t>(chunk->tiles[tileNumber]);
|
||||
|
||||
value &= individualValueMask;
|
||||
|
||||
chunkData[startLong] |= (value << startOffset);
|
||||
|
||||
if (startLong != endLong) {
|
||||
chunkData[endLong] = (value >> (BITS_IN_LONG - startOffset));
|
||||
}
|
||||
}
|
||||
|
||||
bufferSize = data.GetSize();
|
||||
data.Resize(data.GetSize() + chunkData.size() * sizeof(ChunkPackedData::value_type));
|
||||
memcpy(reinterpret_cast<std::uint8_t*>(data.data()) + bufferSize, chunkData.data(), chunkData.size() * sizeof(ChunkPackedData::value_type));
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
void WorldDataPacket::Deserialize(DataBuffer& data) {
|
||||
std::uint64_t chunkCount;
|
||||
data >> chunkCount;
|
||||
|
||||
for (std::uint64_t chunkNumber = 0; chunkNumber < chunkCount; chunkNumber++) {
|
||||
game::ChunkPtr chunk = std::make_shared<game::Chunk>();
|
||||
|
||||
decltype(game::ChunkCoord::x) chunkX, chunkY;
|
||||
data >> chunkX >> chunkY;
|
||||
|
||||
std::uint64_t chunkPaletteSize;
|
||||
data >> chunkPaletteSize;
|
||||
|
||||
game::ChunkPalette chunkPalette(chunkPaletteSize);
|
||||
|
||||
memcpy(reinterpret_cast<void*>(chunkPalette.data()), data.data() + data.GetReadOffset(), chunkPaletteSize * sizeof(game::ChunkPalette::value_type));
|
||||
data.SetReadOffset(data.GetReadOffset() + chunkPaletteSize * sizeof(game::ChunkPalette::value_type));
|
||||
|
||||
chunk->palette = chunkPalette;
|
||||
|
||||
std::uint8_t bitsPerTile = countBits(chunkPaletteSize);
|
||||
|
||||
// A bitmask that contains bitsPerTile set bits
|
||||
game::Chunk::ChunkData::value_type individualValueMask = ((1 << bitsPerTile) - 1);
|
||||
|
||||
ChunkPackedData chunkData(game::Chunk::ChunkSize / (BITS_IN_BYTE * sizeof(ChunkPackedData::value_type) / bitsPerTile), 0);
|
||||
|
||||
memcpy(reinterpret_cast<void*>(chunkData.data()), data.data() + data.GetReadOffset(), chunkData.size() * sizeof(ChunkPackedData::value_type));
|
||||
data.SetReadOffset(data.GetReadOffset() + chunkData.size() * sizeof(ChunkPackedData::value_type));
|
||||
|
||||
for (unsigned int tileNumber = 0; tileNumber < game::Chunk::ChunkSize; tileNumber++) {
|
||||
std::size_t startLong = (tileNumber * bitsPerTile) / BITS_IN_LONG;
|
||||
std::size_t startOffset = (tileNumber * bitsPerTile) % BITS_IN_LONG;
|
||||
std::size_t endLong = ((tileNumber + 1) * bitsPerTile - 1) / BITS_IN_LONG;
|
||||
|
||||
game::Chunk::ChunkData::value_type value;
|
||||
if (startLong == endLong) {
|
||||
value = (chunkData[startLong] >> startOffset);
|
||||
} else {
|
||||
int endOffset = BITS_IN_LONG - startOffset;
|
||||
value = (chunkData[startLong] >> startOffset | chunkData[endLong] << endOffset);
|
||||
}
|
||||
value &= individualValueMask;
|
||||
|
||||
chunk->tiles[tileNumber] = value;
|
||||
}
|
||||
|
||||
|
||||
m_WorldData.m_Chunks.insert({ {chunkX, chunkY}, chunk });
|
||||
}
|
||||
}
|
||||
|
||||
DataBuffer KeepAlivePacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_AliveID;
|
||||
return data;
|
||||
}
|
||||
|
||||
void KeepAlivePacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_AliveID;
|
||||
}
|
||||
|
||||
DataBuffer UpdateMoneyPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_NewAmount;
|
||||
return data;
|
||||
}
|
||||
|
||||
void UpdateMoneyPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_NewAmount;
|
||||
}
|
||||
|
||||
DataBuffer UpdateExpPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_NewAmount;
|
||||
return data;
|
||||
}
|
||||
|
||||
void UpdateExpPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_NewAmount;
|
||||
}
|
||||
|
||||
DataBuffer UpdateLobbyTimePacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_RemainingTime;
|
||||
return data;
|
||||
}
|
||||
|
||||
void UpdateLobbyTimePacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_RemainingTime;
|
||||
}
|
||||
|
||||
DataBuffer UpdateGameStatePacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_GameState;
|
||||
return data;
|
||||
}
|
||||
|
||||
void UpdateGameStatePacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_GameState;
|
||||
}
|
||||
|
||||
DataBuffer PlayerListPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << static_cast<std::uint8_t>(m_Players.size());
|
||||
for (auto [playerID, playerInfo] : m_Players) {
|
||||
data << playerID << playerInfo.name << playerInfo.team;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
void PlayerListPacket::Deserialize(DataBuffer& data) {
|
||||
std::uint8_t playerCount;
|
||||
data >> playerCount;
|
||||
|
||||
for (int i = 0; i < playerCount; i++) {
|
||||
std::uint8_t playerID;
|
||||
PlayerInfo playerInfo;
|
||||
data >> playerID >> playerInfo.name >> playerInfo.team;
|
||||
m_Players.insert({ playerID, playerInfo });
|
||||
}
|
||||
}
|
||||
|
||||
DataBuffer PlayerJoinPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_PlayerID << m_PlayerName;
|
||||
return data;
|
||||
}
|
||||
|
||||
void PlayerJoinPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_PlayerID >> m_PlayerName;
|
||||
}
|
||||
|
||||
DataBuffer PlayerLeavePacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_PlayerID;
|
||||
return data;
|
||||
}
|
||||
|
||||
void PlayerLeavePacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_PlayerID;
|
||||
}
|
||||
|
||||
DataBuffer ConnexionInfoPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_ConnectionID;
|
||||
return data;
|
||||
}
|
||||
|
||||
void ConnexionInfoPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_ConnectionID;
|
||||
}
|
||||
|
||||
DataBuffer SelectTeamPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_SelectedTeam;
|
||||
return data;
|
||||
}
|
||||
|
||||
void SelectTeamPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_SelectedTeam;
|
||||
}
|
||||
|
||||
DataBuffer UpdatePlayerTeamPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_PlayerID << m_SelectedTeam;
|
||||
return data;
|
||||
}
|
||||
|
||||
void UpdatePlayerTeamPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_PlayerID >> m_SelectedTeam;
|
||||
}
|
||||
|
||||
DataBuffer DisconnectPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_Reason;
|
||||
return data;
|
||||
}
|
||||
|
||||
void DisconnectPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_Reason;
|
||||
}
|
||||
|
||||
DataBuffer ServerTpsPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_TPS << m_MSPT << m_PacketSendTime;
|
||||
return data;
|
||||
}
|
||||
|
||||
void ServerTpsPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_TPS >> m_MSPT >> m_PacketSendTime;
|
||||
}
|
||||
|
||||
DataBuffer SpawnMobPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_MobID << m_MobType << m_MobLevel << m_MobDirection
|
||||
<< m_Sender << m_MobX << m_MobY;
|
||||
return data;
|
||||
}
|
||||
|
||||
void SpawnMobPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_MobID >> m_MobType >> m_MobLevel >> m_MobDirection
|
||||
>> m_Sender >> m_MobX >> m_MobY;
|
||||
}
|
||||
|
||||
DataBuffer PlaceTowerPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_TowerX << m_TowerY << m_TowerType;
|
||||
return data;
|
||||
}
|
||||
|
||||
void PlaceTowerPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_TowerX >> m_TowerY >> m_TowerType;
|
||||
}
|
||||
|
||||
DataBuffer WorldAddTowerPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_TowerID << m_TowerX << m_TowerY << m_TowerType << m_Builder;
|
||||
return data;
|
||||
}
|
||||
|
||||
void WorldAddTowerPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_TowerID >> m_TowerX >> m_TowerY >> m_TowerType >> m_Builder;
|
||||
}
|
||||
|
||||
DataBuffer RemoveTowerPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_TowerID;
|
||||
return data;
|
||||
}
|
||||
|
||||
void RemoveTowerPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_TowerID;
|
||||
}
|
||||
|
||||
DataBuffer SendMobsPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << static_cast<std::uint8_t>(m_MobSends.size());
|
||||
|
||||
data.WriteSome(reinterpret_cast<const std::uint8_t*>(m_MobSends.data()), m_MobSends.size() * sizeof(m_MobSends));
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
void SendMobsPacket::Deserialize(DataBuffer& data) {
|
||||
std::uint8_t mobSendCount;
|
||||
data >> mobSendCount;
|
||||
|
||||
m_MobSends.resize(mobSendCount);
|
||||
data.ReadSome(reinterpret_cast<std::uint8_t*>(m_MobSends.data()), mobSendCount * sizeof(MobSend));
|
||||
}
|
||||
|
||||
DataBuffer UpgradeTowerPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_TowerID << m_TowerLevel;
|
||||
return data;
|
||||
}
|
||||
|
||||
void UpgradeTowerPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_TowerID >> m_TowerLevel;
|
||||
}
|
||||
|
||||
DataBuffer UpdateCastleLifePacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_CastleLife << m_Team;
|
||||
return data;
|
||||
}
|
||||
|
||||
void UpdateCastleLifePacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_CastleLife >> m_Team;
|
||||
}
|
||||
|
||||
DataBuffer UpdateMobStatesPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << static_cast<std::uint64_t>(m_MobStates.size());
|
||||
|
||||
data.WriteSome(reinterpret_cast<const std::uint8_t*>(m_MobStates.data()), m_MobStates.size() * sizeof(MobState));
|
||||
return data;
|
||||
}
|
||||
|
||||
void UpdateMobStatesPacket::Deserialize(DataBuffer& data) {
|
||||
std::uint64_t mobCount;
|
||||
data >> mobCount;
|
||||
m_MobStates.resize(mobCount);
|
||||
|
||||
data.ReadSome(reinterpret_cast<std::uint8_t*>(m_MobStates.data()), mobCount * sizeof(MobState));
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
19
src/protocol/packets/ConnectionInfoPacket.cpp
Normal file
19
src/protocol/packets/ConnectionInfoPacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/ConnectionInfoPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer ConnexionInfoPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_ConnectionID;
|
||||
return data;
|
||||
}
|
||||
|
||||
void ConnexionInfoPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_ConnectionID;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/DisconnectPacket.cpp
Normal file
19
src/protocol/packets/DisconnectPacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/DisconnectPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer DisconnectPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_Reason;
|
||||
return data;
|
||||
}
|
||||
|
||||
void DisconnectPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_Reason;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/KeepAlivePacket.cpp
Normal file
19
src/protocol/packets/KeepAlivePacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/KeepAlivePacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer KeepAlivePacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_AliveID;
|
||||
return data;
|
||||
}
|
||||
|
||||
void KeepAlivePacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_AliveID;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/PlaceTowerPacket.cpp
Normal file
19
src/protocol/packets/PlaceTowerPacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/PlaceTowerPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer PlaceTowerPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_TowerX << m_TowerY << m_TowerType;
|
||||
return data;
|
||||
}
|
||||
|
||||
void PlaceTowerPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_TowerX >> m_TowerY >> m_TowerType;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/PlayerBuyItemPacket.cpp
Normal file
19
src/protocol/packets/PlayerBuyItemPacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/PlayerBuyItemPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/PlayerBuyMobUpgradePacket.cpp
Normal file
19
src/protocol/packets/PlayerBuyMobUpgradePacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/PlayerBuyMobUpgradePacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/PlayerJoinPacket.cpp
Normal file
19
src/protocol/packets/PlayerJoinPacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/PlayerJoinPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer PlayerJoinPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_PlayerID << m_PlayerName;
|
||||
return data;
|
||||
}
|
||||
|
||||
void PlayerJoinPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_PlayerID >> m_PlayerName;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
20
src/protocol/packets/PlayerLeavePacket.cpp
Normal file
20
src/protocol/packets/PlayerLeavePacket.cpp
Normal file
@@ -0,0 +1,20 @@
|
||||
#include "protocol/packets/PlayerLeavePacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer PlayerLeavePacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_PlayerID;
|
||||
return data;
|
||||
}
|
||||
|
||||
void PlayerLeavePacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_PlayerID;
|
||||
}
|
||||
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
30
src/protocol/packets/PlayerListPacket.cpp
Normal file
30
src/protocol/packets/PlayerListPacket.cpp
Normal file
@@ -0,0 +1,30 @@
|
||||
#include "protocol/packets/PlayerListPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer PlayerListPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << static_cast<std::uint8_t>(m_Players.size());
|
||||
for (auto [playerID, playerInfo] : m_Players) {
|
||||
data << playerID << playerInfo.name << playerInfo.team;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
void PlayerListPacket::Deserialize(DataBuffer& data) {
|
||||
std::uint8_t playerCount;
|
||||
data >> playerCount;
|
||||
|
||||
for (int i = 0; i < playerCount; i++) {
|
||||
std::uint8_t playerID;
|
||||
PlayerInfo playerInfo;
|
||||
data >> playerID >> playerInfo.name >> playerInfo.team;
|
||||
m_Players.insert({ playerID, playerInfo });
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/PlayerLoginPacket.cpp
Normal file
19
src/protocol/packets/PlayerLoginPacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/PlayerLoginPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer PlayerLoginPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_PlayerName;
|
||||
return data;
|
||||
}
|
||||
|
||||
void PlayerLoginPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_PlayerName;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/RemoveTowerPacket.cpp
Normal file
19
src/protocol/packets/RemoveTowerPacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/RemoveTowerPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer RemoveTowerPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_TowerID;
|
||||
return data;
|
||||
}
|
||||
|
||||
void RemoveTowerPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_TowerID;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/SelectTeamPacket.cpp
Normal file
19
src/protocol/packets/SelectTeamPacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/SelectTeamPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer SelectTeamPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_SelectedTeam;
|
||||
return data;
|
||||
}
|
||||
|
||||
void SelectTeamPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_SelectedTeam;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
26
src/protocol/packets/SendMobsPacket.cpp
Normal file
26
src/protocol/packets/SendMobsPacket.cpp
Normal file
@@ -0,0 +1,26 @@
|
||||
#include "protocol/packets/SendMobsPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer SendMobsPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << static_cast<std::uint8_t>(m_MobSends.size());
|
||||
|
||||
data.WriteSome(reinterpret_cast<const std::uint8_t*>(m_MobSends.data()), m_MobSends.size() * sizeof(m_MobSends));
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
void SendMobsPacket::Deserialize(DataBuffer& data) {
|
||||
std::uint8_t mobSendCount;
|
||||
data >> mobSendCount;
|
||||
|
||||
m_MobSends.resize(mobSendCount);
|
||||
data.ReadSome(reinterpret_cast<std::uint8_t*>(m_MobSends.data()), mobSendCount * sizeof(MobSend));
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/ServerTpsPacket.cpp
Normal file
19
src/protocol/packets/ServerTpsPacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/ServerTpsPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer ServerTpsPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_TPS << m_MSPT << m_PacketSendTime;
|
||||
return data;
|
||||
}
|
||||
|
||||
void ServerTpsPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_TPS >> m_MSPT >> m_PacketSendTime;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
21
src/protocol/packets/SpawnMobPacket.cpp
Normal file
21
src/protocol/packets/SpawnMobPacket.cpp
Normal file
@@ -0,0 +1,21 @@
|
||||
#include "protocol/packets/SpawnMobPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer SpawnMobPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_MobID << m_MobType << m_MobLevel << m_MobDirection
|
||||
<< m_Sender << m_MobX << m_MobY;
|
||||
return data;
|
||||
}
|
||||
|
||||
void SpawnMobPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_MobID >> m_MobType >> m_MobLevel >> m_MobDirection
|
||||
>> m_Sender >> m_MobX >> m_MobY;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/UpdateCastleLifePacket.cpp
Normal file
19
src/protocol/packets/UpdateCastleLifePacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/UpdateCastleLifePacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer UpdateCastleLifePacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_CastleLife << m_Team;
|
||||
return data;
|
||||
}
|
||||
|
||||
void UpdateCastleLifePacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_CastleLife >> m_Team;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/UpdateExpPacket.cpp
Normal file
19
src/protocol/packets/UpdateExpPacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/UpdateExpPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer UpdateExpPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_NewAmount;
|
||||
return data;
|
||||
}
|
||||
|
||||
void UpdateExpPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_NewAmount;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/UpdateGameStatePacket.cpp
Normal file
19
src/protocol/packets/UpdateGameStatePacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/UpdateGameStatePacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer UpdateGameStatePacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_GameState;
|
||||
return data;
|
||||
}
|
||||
|
||||
void UpdateGameStatePacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_GameState;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/UpdateLobbyTimePacket.cpp
Normal file
19
src/protocol/packets/UpdateLobbyTimePacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/UpdateLobbyTimePacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer UpdateLobbyTimePacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_RemainingTime;
|
||||
return data;
|
||||
}
|
||||
|
||||
void UpdateLobbyTimePacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_RemainingTime;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
25
src/protocol/packets/UpdateMobStatesPacket.cpp
Normal file
25
src/protocol/packets/UpdateMobStatesPacket.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
#include "protocol/packets/UpdateMobStatesPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer UpdateMobStatesPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << static_cast<std::uint64_t>(m_MobStates.size());
|
||||
|
||||
data.WriteSome(reinterpret_cast<const std::uint8_t*>(m_MobStates.data()), m_MobStates.size() * sizeof(MobState));
|
||||
return data;
|
||||
}
|
||||
|
||||
void UpdateMobStatesPacket::Deserialize(DataBuffer& data) {
|
||||
std::uint64_t mobCount;
|
||||
data >> mobCount;
|
||||
m_MobStates.resize(mobCount);
|
||||
|
||||
data.ReadSome(reinterpret_cast<std::uint8_t*>(m_MobStates.data()), mobCount * sizeof(MobState));
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/UpdateMoneyPacket.cpp
Normal file
19
src/protocol/packets/UpdateMoneyPacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/UpdateMoneyPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer UpdateMoneyPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_NewAmount;
|
||||
return data;
|
||||
}
|
||||
|
||||
void UpdateMoneyPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_NewAmount;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
20
src/protocol/packets/UpdatePlayerTeamPacket.cpp
Normal file
20
src/protocol/packets/UpdatePlayerTeamPacket.cpp
Normal file
@@ -0,0 +1,20 @@
|
||||
#include "protocol/packets/UpdatePlayerTeamPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
|
||||
DataBuffer UpdatePlayerTeamPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_PlayerID << m_SelectedTeam;
|
||||
return data;
|
||||
}
|
||||
|
||||
void UpdatePlayerTeamPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_PlayerID >> m_SelectedTeam;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/UpgradeTowerPacket.cpp
Normal file
19
src/protocol/packets/UpgradeTowerPacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/UpgradeTowerPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer UpgradeTowerPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_TowerID << m_TowerLevel;
|
||||
return data;
|
||||
}
|
||||
|
||||
void UpgradeTowerPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_TowerID >> m_TowerLevel;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
19
src/protocol/packets/WorldAddTowerPacket.cpp
Normal file
19
src/protocol/packets/WorldAddTowerPacket.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "protocol/packets/WorldAddTowerPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer WorldAddTowerPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
data << m_TowerID << m_TowerX << m_TowerY << m_TowerType << m_Builder;
|
||||
return data;
|
||||
}
|
||||
|
||||
void WorldAddTowerPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_TowerID >> m_TowerX >> m_TowerY >> m_TowerType >> m_Builder;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
81
src/protocol/packets/WorldBeginDataPacket.cpp
Normal file
81
src/protocol/packets/WorldBeginDataPacket.cpp
Normal file
@@ -0,0 +1,81 @@
|
||||
#include "protocol/packets/WorldBeginDataPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
DataBuffer WorldBeginDataPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
const game::TowerTileColorPalette& towerTilePalette = m_Header.m_World->GetTowerTileColorPalette();
|
||||
const std::vector<Color>& decoTilePalette = m_Header.m_World->GetDecorationPalette();
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
|
||||
data << towerTilePalette << m_Header.m_World->GetWalkableTileColor()
|
||||
<< static_cast<std::uint16_t>(decoTilePalette.size());
|
||||
|
||||
// deco color palette
|
||||
std::size_t bufferSize = data.GetSize();
|
||||
data.Resize(bufferSize + decoTilePalette.size() * sizeof(Color));
|
||||
|
||||
memcpy(reinterpret_cast<std::uint8_t*>(data.data()) + bufferSize, decoTilePalette.data(), decoTilePalette.size() * sizeof(Color));
|
||||
|
||||
data << m_Header.m_World->GetBackgroundColor();
|
||||
|
||||
const game::Spawn& redSpawn = m_Header.m_World->GetRedTeam().GetSpawn(), blueSpawn = m_Header.m_World->GetBlueTeam().GetSpawn();
|
||||
const game::TeamCastle& redCastle = m_Header.m_World->GetRedTeam().GetCastle(), blueCastle = m_Header.m_World->GetBlueTeam().GetCastle();
|
||||
|
||||
data << redSpawn << static_cast<utils::shape::Rectangle>(redCastle);
|
||||
data << blueSpawn << static_cast<utils::shape::Rectangle>(blueCastle);
|
||||
|
||||
// tile palette
|
||||
data << static_cast<std::uint64_t>(m_Header.m_World->GetTilePalette().size());
|
||||
|
||||
for (game::TilePtr tile : m_Header.m_World->GetTilePalette()) {
|
||||
data << tile;
|
||||
}
|
||||
|
||||
data << m_Header.m_World->GetSpawnColors();
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
void WorldBeginDataPacket::Deserialize(DataBuffer& data) {
|
||||
data >> m_Header.m_TowerPlacePalette >> m_Header.m_WalkablePalette;
|
||||
|
||||
std::uint16_t decoPaletteSize;
|
||||
data >> decoPaletteSize;
|
||||
|
||||
std::size_t decoPalletteSizeByte = decoPaletteSize * sizeof(Color);
|
||||
|
||||
m_Header.m_DecorationPalette.resize(decoPaletteSize);
|
||||
|
||||
memcpy(reinterpret_cast<std::uint8_t*>(m_Header.m_DecorationPalette.data()), data.data() + data.GetReadOffset(), decoPalletteSizeByte);
|
||||
|
||||
data.SetReadOffset(data.GetReadOffset() + decoPalletteSizeByte);
|
||||
|
||||
data >> m_Header.m_Background;
|
||||
|
||||
utils::shape::Rectangle redCastle, blueCastle;
|
||||
|
||||
data >> m_Header.m_RedSpawn >> redCastle;
|
||||
data >> m_Header.m_BlueSpawn >> blueCastle;
|
||||
|
||||
m_Header.m_RedCastle.SetShape(redCastle);
|
||||
m_Header.m_BlueCastle.SetShape(blueCastle);
|
||||
|
||||
std::uint64_t tilePaletteSize;
|
||||
data >> tilePaletteSize;
|
||||
|
||||
m_Header.m_TilePalette.reserve(tilePaletteSize);
|
||||
|
||||
for (std::uint64_t tileNumber = 0; tileNumber < tilePaletteSize; tileNumber++) {
|
||||
game::TilePtr tile;
|
||||
data >> tile;
|
||||
m_Header.m_TilePalette.push_back(tile);
|
||||
}
|
||||
|
||||
data >> m_Header.m_SpawnColorPalette;
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
173
src/protocol/packets/WorldDataPacket.cpp
Normal file
173
src/protocol/packets/WorldDataPacket.cpp
Normal file
@@ -0,0 +1,173 @@
|
||||
#include "protocol/packets/WorldDataPacket.h"
|
||||
|
||||
namespace td {
|
||||
namespace protocol {
|
||||
|
||||
const int BITS_IN_BYTE = 8;
|
||||
const int BITS_IN_LONG = BITS_IN_BYTE * sizeof(std::uint64_t);
|
||||
|
||||
static unsigned int countBits(unsigned int number) {
|
||||
// log function in base 2
|
||||
// take only integer part
|
||||
return static_cast<unsigned int>(std::log2(number) + 1);
|
||||
}
|
||||
|
||||
static DataBuffer& operator<<(DataBuffer& buffer, game::TilePtr tile) {
|
||||
buffer << tile->GetType();
|
||||
|
||||
switch (tile->GetType()) {
|
||||
|
||||
case game::TileType::Tower: {
|
||||
const game::TowerTile* towerTile = dynamic_cast<const game::TowerTile*>(tile.get());
|
||||
buffer << towerTile->color_palette_ref << towerTile->team_owner;
|
||||
break;
|
||||
}
|
||||
|
||||
case game::TileType::Walk: {
|
||||
const game::WalkableTile* walkTile = dynamic_cast<const game::WalkableTile*>(tile.get());
|
||||
buffer << walkTile->direction;
|
||||
break;
|
||||
}
|
||||
|
||||
case game::TileType::Decoration: {
|
||||
const game::DecorationTile* decoTile = dynamic_cast<const game::DecorationTile*>(tile.get());
|
||||
buffer << decoTile->color_palette_ref;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static DataBuffer& operator>>(DataBuffer& buffer, game::TilePtr& tile) {
|
||||
game::TileType tileType;
|
||||
buffer >> tileType;
|
||||
switch (tileType) {
|
||||
case game::TileType::Tower: {
|
||||
auto tilePtr = std::make_shared<game::TowerTile>();
|
||||
buffer >> tilePtr->color_palette_ref >> tilePtr->team_owner;
|
||||
tile = tilePtr;
|
||||
break;
|
||||
}
|
||||
case game::TileType::Walk: {
|
||||
auto tilePtr = std::make_shared<game::WalkableTile>();
|
||||
buffer >> tilePtr->direction;
|
||||
tile = tilePtr;
|
||||
break;
|
||||
}
|
||||
case game::TileType::Decoration: {
|
||||
auto tilePtr = std::make_shared<game::DecorationTile>();
|
||||
buffer >> tilePtr->color_palette_ref;
|
||||
tile = tilePtr;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
typedef std::vector<uint64_t> ChunkPackedData;
|
||||
|
||||
DataBuffer WorldDataPacket::Serialize(bool packetID) const {
|
||||
DataBuffer data;
|
||||
|
||||
WritePacketID(data, packetID);
|
||||
|
||||
data << m_World->GetChunks().size();
|
||||
for (const auto& pair : m_World->GetChunks()) {
|
||||
game::ChunkCoord coords = pair.first;
|
||||
game::ChunkPtr chunk = pair.second;
|
||||
|
||||
data << coords.x << coords.y << static_cast<std::uint64_t>(chunk->palette.size());
|
||||
|
||||
std::size_t bufferSize = data.GetSize();
|
||||
data.Resize(data.GetSize() + chunk->palette.size() * sizeof(game::ChunkPalette::value_type));
|
||||
memcpy(reinterpret_cast<std::uint8_t*>(data.data()) + bufferSize, chunk->palette.data(), chunk->palette.size() * sizeof(game::ChunkPalette::value_type));
|
||||
|
||||
std::uint8_t bitsPerTile = countBits(chunk->palette.size());
|
||||
|
||||
game::Chunk::ChunkData::value_type individualValueMask = ((1 << bitsPerTile) - 1);
|
||||
|
||||
ChunkPackedData chunkData(game::Chunk::ChunkSize / (BITS_IN_BYTE * sizeof(ChunkPackedData::value_type) / bitsPerTile), 0);
|
||||
|
||||
for (unsigned int tileNumber = 0; tileNumber < game::Chunk::ChunkSize; tileNumber++) {
|
||||
std::size_t startLong = static_cast<std::size_t>((tileNumber * bitsPerTile) / BITS_IN_LONG);
|
||||
std::size_t startOffset = static_cast<std::size_t>((tileNumber * bitsPerTile) % BITS_IN_LONG);
|
||||
std::size_t endLong = static_cast<std::size_t>(((tileNumber + 1) * bitsPerTile - 1) / BITS_IN_LONG);
|
||||
|
||||
std::uint64_t value = static_cast<std::uint64_t>(chunk->tiles[tileNumber]);
|
||||
|
||||
value &= individualValueMask;
|
||||
|
||||
chunkData[startLong] |= (value << startOffset);
|
||||
|
||||
if (startLong != endLong) {
|
||||
chunkData[endLong] = (value >> (BITS_IN_LONG - startOffset));
|
||||
}
|
||||
}
|
||||
|
||||
bufferSize = data.GetSize();
|
||||
data.Resize(data.GetSize() + chunkData.size() * sizeof(ChunkPackedData::value_type));
|
||||
memcpy(reinterpret_cast<std::uint8_t*>(data.data()) + bufferSize, chunkData.data(), chunkData.size() * sizeof(ChunkPackedData::value_type));
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
void WorldDataPacket::Deserialize(DataBuffer& data) {
|
||||
std::uint64_t chunkCount;
|
||||
data >> chunkCount;
|
||||
|
||||
for (std::uint64_t chunkNumber = 0; chunkNumber < chunkCount; chunkNumber++) {
|
||||
game::ChunkPtr chunk = std::make_shared<game::Chunk>();
|
||||
|
||||
decltype(game::ChunkCoord::x) chunkX, chunkY;
|
||||
data >> chunkX >> chunkY;
|
||||
|
||||
std::uint64_t chunkPaletteSize;
|
||||
data >> chunkPaletteSize;
|
||||
|
||||
game::ChunkPalette chunkPalette(chunkPaletteSize);
|
||||
|
||||
memcpy(reinterpret_cast<void*>(chunkPalette.data()), data.data() + data.GetReadOffset(), chunkPaletteSize * sizeof(game::ChunkPalette::value_type));
|
||||
data.SetReadOffset(data.GetReadOffset() + chunkPaletteSize * sizeof(game::ChunkPalette::value_type));
|
||||
|
||||
chunk->palette = chunkPalette;
|
||||
|
||||
std::uint8_t bitsPerTile = countBits(chunkPaletteSize);
|
||||
|
||||
// A bitmask that contains bitsPerTile set bits
|
||||
game::Chunk::ChunkData::value_type individualValueMask = ((1 << bitsPerTile) - 1);
|
||||
|
||||
ChunkPackedData chunkData(game::Chunk::ChunkSize / (BITS_IN_BYTE * sizeof(ChunkPackedData::value_type) / bitsPerTile), 0);
|
||||
|
||||
memcpy(reinterpret_cast<void*>(chunkData.data()), data.data() + data.GetReadOffset(), chunkData.size() * sizeof(ChunkPackedData::value_type));
|
||||
data.SetReadOffset(data.GetReadOffset() + chunkData.size() * sizeof(ChunkPackedData::value_type));
|
||||
|
||||
for (unsigned int tileNumber = 0; tileNumber < game::Chunk::ChunkSize; tileNumber++) {
|
||||
std::size_t startLong = (tileNumber * bitsPerTile) / BITS_IN_LONG;
|
||||
std::size_t startOffset = (tileNumber * bitsPerTile) % BITS_IN_LONG;
|
||||
std::size_t endLong = ((tileNumber + 1) * bitsPerTile - 1) / BITS_IN_LONG;
|
||||
|
||||
game::Chunk::ChunkData::value_type value;
|
||||
if (startLong == endLong) {
|
||||
value = (chunkData[startLong] >> startOffset);
|
||||
} else {
|
||||
int endOffset = BITS_IN_LONG - startOffset;
|
||||
value = (chunkData[startLong] >> startOffset | chunkData[endLong] << endOffset);
|
||||
}
|
||||
value &= individualValueMask;
|
||||
|
||||
chunk->tiles[tileNumber] = value;
|
||||
}
|
||||
|
||||
|
||||
m_WorldData.m_Chunks.insert({ {chunkX, chunkY}, chunk });
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace protocol
|
||||
} // namespace td
|
||||
@@ -11,18 +11,6 @@
|
||||
namespace td {
|
||||
namespace render {
|
||||
|
||||
ImVec4 WorldRenderer::GetImGuiTeamColor(game::TeamColor color) {
|
||||
switch (color) {
|
||||
case td::game::TeamColor::None:
|
||||
break;
|
||||
case td::game::TeamColor::Red:
|
||||
return ImVec4(1, 0, 0, 1);
|
||||
case td::game::TeamColor::Blue:
|
||||
return ImVec4(0, 0, 1, 1);
|
||||
}
|
||||
return ImVec4(1, 1, 1, 1);
|
||||
}
|
||||
|
||||
void WorldRenderer::LoadModels() {
|
||||
utils::LOGD("World Created !");
|
||||
m_WorldVao = std::make_unique<GL::VertexArray>(std::move(WorldLoader::LoadWorldModel(m_World)));
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "render/gui/CastleTooltip.h"
|
||||
#include "render/gui/imgui/imgui.h"
|
||||
#include "render/gui/LifeProgress.h"
|
||||
#include "render/gui/ImGuiTeamColor.h"
|
||||
|
||||
#include "render/WorldRenderer.h"
|
||||
|
||||
@@ -18,7 +19,7 @@ void CastleTooltip::Render() {
|
||||
|
||||
if (ImGui::GetIO().KeyShift) {
|
||||
ImGui::BeginTooltip();
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, render::WorldRenderer::GetImGuiTeamColor(m_Castle->GetTeam()->GetColor()));
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, render::GetImGuiTeamColor(m_Castle->GetTeam()->GetColor()));
|
||||
ImGui::Text("Castle : ");
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::Text("\tCastle HP : %i/%i", static_cast<int>(m_Castle->GetLife()), game::TeamCastle::CastleMaxLife);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "render/gui/GameMenu.h"
|
||||
#include "render/gui/imgui/imgui.h"
|
||||
#include "render/gui/ImGuiTeamColor.h"
|
||||
|
||||
#include "render/WorldRenderer.h"
|
||||
|
||||
@@ -43,7 +44,7 @@ void GameMenu::ShowPlayers() {
|
||||
if (ImGui::TreeNode(std::string("Players (" + std::to_string(GetClient()->GetGame().GetPlayers().size()) + ")##player_list").c_str())) {
|
||||
for (auto pair : GetClient()->GetGame().GetPlayers()) {
|
||||
const td::game::Player& player = pair.second;
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, render::WorldRenderer::GetImGuiTeamColor(player.GetTeamColor()));
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, render::GetImGuiTeamColor(player.GetTeamColor()));
|
||||
ImGui::Text("%s", player.GetName().c_str());
|
||||
ImGui::PopStyleColor();
|
||||
}
|
||||
|
||||
19
src/render/gui/ImGuiTeamColor.cpp
Normal file
19
src/render/gui/ImGuiTeamColor.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "render/gui/ImGuiTeamColor.h"
|
||||
|
||||
namespace td {
|
||||
namespace render {
|
||||
|
||||
ImVec4 GetImGuiTeamColor(game::TeamColor color) {
|
||||
switch (color) {
|
||||
case td::game::TeamColor::None:
|
||||
break;
|
||||
case td::game::TeamColor::Red:
|
||||
return ImVec4(1, 0, 0, 1);
|
||||
case td::game::TeamColor::Blue:
|
||||
return ImVec4(0, 0, 1, 1);
|
||||
}
|
||||
return ImVec4(1, 1, 1, 1);
|
||||
}
|
||||
|
||||
} // namespace render
|
||||
} // namespace td
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "render/gui/MobTooltip.h"
|
||||
#include "render/gui/imgui/imgui.h"
|
||||
#include "render/gui/LifeProgress.h"
|
||||
#include "render/gui/ImGuiTeamColor.h"
|
||||
|
||||
#include "render/WorldRenderer.h"
|
||||
|
||||
@@ -25,7 +26,7 @@ void MobTooltip::Render() {
|
||||
ImGui::BeginTooltip();
|
||||
ImGui::Text("Sender :");
|
||||
ImGui::SameLine();
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, render::WorldRenderer::GetImGuiTeamColor(sender->GetTeamColor()));
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, render::GetImGuiTeamColor(sender->GetTeamColor()));
|
||||
ImGui::Text("%s", sender->GetName().c_str());
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::Text("Mob HP : %.1f/%i", m_Mob->GetHealth(), m_Mob->GetStats()->GetMaxLife());
|
||||
|
||||
Reference in New Issue
Block a user