diff --git a/include/client/state/GameState.h b/include/client/state/GameState.h index 6d4f5d2..8e4acde 100644 --- a/include/client/state/GameState.h +++ b/include/client/state/GameState.h @@ -9,12 +9,12 @@ namespace client { class GameState : public ClientState { private: - std::shared_ptr m_World; + game::WorldPtr m_World; sim::ClientSimulation m_Simulation; float m_CurrentLerp; public: - GameState(Client& a_Client, const std::shared_ptr& a_World, std::uint64_t a_StepTime); + GameState(Client& a_Client, const game::WorldPtr& a_World, std::uint64_t a_StepTime); ~GameState() {} virtual void Update(float a_Delta) override; @@ -23,6 +23,10 @@ class GameState : public ClientState { return m_CurrentLerp; } + game::WorldPtr GetWorld() const { + return m_World; + } + virtual void Handle(const protocol::packets::LockStepsPacket& a_LockStep) override; virtual void Handle(const protocol::packets::LockStepResponsePacket& a_LockStep) override; }; diff --git a/include/client/state/LobbyState.h b/include/client/state/LobbyState.h new file mode 100644 index 0000000..5b4de28 --- /dev/null +++ b/include/client/state/LobbyState.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include +#include + +namespace td { +namespace client { + +class LobbyState : public ClientState { + private: + std::shared_ptr m_World; + public: + LobbyState(Client& a_Client); + ~LobbyState(); + + virtual void Update(float a_Delta) override; + + virtual void Handle(const protocol::packets::WorldHeaderPacket& a_Packet) override; + virtual void Handle(const protocol::packets::WorldDataPacket& a_Packet) override; +}; + +} // namespace client +} // namespace td diff --git a/include/client/state/LoggingState.h b/include/client/state/LoggingState.h index 1a7e5ec..8a5e4b2 100644 --- a/include/client/state/LoggingState.h +++ b/include/client/state/LoggingState.h @@ -12,7 +12,7 @@ class LoggingState : public ClientState { LoggingState(Client& a_Client, const std::string& a_PlayerName); ~LoggingState(); - virtual void Update(float a_Delta) override {} + virtual void Update(float a_Delta) override; virtual void Handle(const protocol::packets::PlayerJoinPacket& a_Packet) override; virtual void Handle(const protocol::packets::LoggingSuccessPacket& a_Packet) override; diff --git a/include/server/IServerSocket.h b/include/server/IServerSocket.h index 0dc28bf..fb90e7a 100644 --- a/include/server/IServerSocket.h +++ b/include/server/IServerSocket.h @@ -12,8 +12,8 @@ class IServerSocket { using PlayerPacketHandlerType = std::unique_ptr(PlayerID); using PlayerPacketHandler = std::function; - utils::Signal OnPlayerJoin; - utils::Signal OnPlayerLeave; + utils::Signal OnPlayerConnect; + utils::Signal OnPlayerDisconnect; utils::Signal OnReceive; void Send(PlayerID a_PlayerId, const protocol::PacketBase& a_Packet); diff --git a/include/server/PlayerManager.h b/include/server/PlayerManager.h index fb1b5fb..0801ce6 100644 --- a/include/server/PlayerManager.h +++ b/include/server/PlayerManager.h @@ -1,5 +1,6 @@ #pragma once +#include #include namespace td { @@ -13,6 +14,9 @@ class PlayerManager { std::shared_ptr m_Socket; public: + utils::Signal OnPlayerJoin; + utils::Signal OnPlayerLeave; + PlayerManager(const std::shared_ptr& a_Socket); ~PlayerManager(); @@ -20,20 +24,19 @@ class PlayerManager { PlayerInfo GetPlayer(PlayerID a_Player); private: + void Disconnect(PlayerID a_Player); + class ConnectionHandler : public protocol::PacketHandler { private: - std::map& m_Players; - IServerSocket& m_Socket; + PlayerManager& m_PlayerManager; PlayerID m_Player; public: - ConnectionHandler(std::map& a_Players, IServerSocket& a_Socket, PlayerID a_Player); + ConnectionHandler(PlayerManager& a_PlayerManager, PlayerID a_Player); ~ConnectionHandler() = default; virtual void Handle(const protocol::packets::PlayerLoginPacket& a_Packet) override; virtual void Handle(const protocol::packets::DisconnectPacket& a_Packet) override; - - static void Disconnect(std::map&, IServerSocket& m_Socket, PlayerID m_Player); }; }; diff --git a/include/server/Server.h b/include/server/Server.h index ea78fb1..ef5033e 100644 --- a/include/server/Server.h +++ b/include/server/Server.h @@ -20,6 +20,10 @@ class Server : public StateMachine { virtual void Update(float a_Delta); + const PlayerManager& GetPlayers() const { + return m_Players; + } + friend class ServerState; }; diff --git a/include/server/state/LobbyState.h b/include/server/state/LobbyState.h index e4ba6be..f8996eb 100644 --- a/include/server/state/LobbyState.h +++ b/include/server/state/LobbyState.h @@ -10,9 +10,11 @@ class LobbyState : public ServerState { private: std::shared_ptr m_World; public: - LobbyState(Server& a_Server, const std::shared_ptr& a_World); + LobbyState(Server& a_Server); ~LobbyState() {} + virtual void OnPlayerJoin(PlayerID a_Id, const td::PlayerInfo& a_Info) override; + virtual void HandlePacket(PlayerID a_Id, const protocol::PacketBase& a_Packet) override; virtual void Update(float a_Delta) override; }; diff --git a/include/td/common/StateMachine.h b/include/td/common/StateMachine.h index 1bf0fb4..9669b11 100644 --- a/include/td/common/StateMachine.h +++ b/include/td/common/StateMachine.h @@ -1,7 +1,7 @@ #pragma once #include -#include +#include namespace td { @@ -16,7 +16,7 @@ class StateMachine { virtual TReturn Update(TArgs... args) = 0; template - T* ChangeState(Args&&... args) { + T* ChangeState(Args... args) { return m_StateMachine.template ChangeState(std::forward(args)...); } @@ -24,18 +24,25 @@ class StateMachine { TDerived& m_StateMachine; }; + utils::Signal OnStateChange; + StateMachine() {} StateMachine(StateMachine&&) = default; virtual ~StateMachine() {} virtual TReturn Update(TArgs... args) { assert(m_State && "You must change state at least once before updating !"); - return m_State->Update(args...); + return m_State->Update(std::forward(args)...); } template - T* ChangeState(Args&&... args) { - m_State = std::make_unique(static_cast(*this), std::forward(args)...); + T* ChangeState(Args... args) { + auto* currentState = m_State.get(); + auto newState = std::make_unique(static_cast(*this), std::forward(args)...); + // This allows chaining + if (m_State.get() == currentState) + m_State = std::move(newState); + OnStateChange(*m_State); return static_cast(m_State.get()); } diff --git a/include/td/display/DisplayState.h b/include/td/display/DisplayState.h index 0ad0790..5190945 100644 --- a/include/td/display/DisplayState.h +++ b/include/td/display/DisplayState.h @@ -2,8 +2,10 @@ #include #include +#include namespace td { + class DisplayState : public Display::State, private utils::SlotGuard { public: DisplayState(Display& a_Display); @@ -13,4 +15,5 @@ class DisplayState : public Display::State, private utils::SlotGuard { virtual void OnAspectRatioChange(float a_Ratio) {} virtual void OnKeyDown(SDL_Keycode a_Key) {} }; + } // namespace td diff --git a/include/td/game/World.h b/include/td/game/World.h index 9177cd6..5a953f9 100644 --- a/include/td/game/World.h +++ b/include/td/game/World.h @@ -33,6 +33,9 @@ class World { bool LoadMap(const protocol::pdata::WorldHeader& worldHeader); bool LoadMap(const protocol::pdata::WorldData& worldData); + protocol::packets::WorldHeaderPacket GetPacketHeader() const; + protocol::packets::WorldDataPacket GetPacketData() const; + bool LoadMapFromFile(const std::string& fileName); bool SaveMap(const std::string& fileName) const; diff --git a/src/client/Client.cpp b/src/client/Client.cpp index a933e89..a843f60 100644 --- a/src/client/Client.cpp +++ b/src/client/Client.cpp @@ -6,7 +6,7 @@ namespace td { namespace client { Client::Client(const std::shared_ptr& a_Socket, const std::string& a_PlayerName) : m_Socket(a_Socket), m_Players(a_Socket) { - ChangeState(a_PlayerName); + // ChangeState(a_PlayerName); } void Client::SendPacket(const protocol::PacketBase& a_Packet) { diff --git a/src/client/PlayerManager.cpp b/src/client/PlayerManager.cpp index 8403874..a7da9c3 100644 --- a/src/client/PlayerManager.cpp +++ b/src/client/PlayerManager.cpp @@ -10,7 +10,7 @@ namespace client { PlayerManager::PlayerManager(const std::shared_ptr& a_Socket) : m_Socket(a_Socket) { a_Socket->OnReceive.Connect(std::bind(&PlayerManager::HandleBase, this, std::placeholders::_1)); OnPlayerJoin.Connect([this](const PlayerInfo& a_Player){ - std::cout << "[Client " << this << "] " << a_Player.m_PlayerName << "(" << +a_Player.m_PlayerId << ") joined !\n"; + std::cout << "[Client " << this << "] " << a_Player.m_PlayerName << " joined !\n"; }); OnPlayerLeave.Connect([this](const PlayerID a_Player){ std::cout << "[Client " << this << "] " << GetPlayer(a_Player).m_PlayerName << "(" << +a_Player << ") left !\n"; diff --git a/src/client/state/LobbyState.cpp b/src/client/state/LobbyState.cpp new file mode 100644 index 0000000..a67c3de --- /dev/null +++ b/src/client/state/LobbyState.cpp @@ -0,0 +1,24 @@ +#include + +#include + +namespace td { +namespace client { + +LobbyState::LobbyState(Client& a_Client) : ClientState(a_Client), m_World(std::make_shared()) {} + +LobbyState::~LobbyState() {} + +void LobbyState::Handle(const protocol::packets::WorldHeaderPacket& a_Packet) { + m_World->LoadMap(*a_Packet); +} + +void LobbyState::Handle(const protocol::packets::WorldDataPacket& a_Packet) { + m_World->LoadMap(*a_Packet); + ChangeState(m_World, STEP_TIME); +} + +void LobbyState::Update(float a_Delta) {} + +} // namespace client +} // namespace td diff --git a/src/client/state/LoggingState.cpp b/src/client/state/LoggingState.cpp index ee3d43d..9fccb79 100644 --- a/src/client/state/LoggingState.cpp +++ b/src/client/state/LoggingState.cpp @@ -1,6 +1,6 @@ #include -#include +#include namespace td { namespace client { @@ -9,6 +9,9 @@ LoggingState::LoggingState(Client& a_Client, const std::string& a_PlayerName) : SendPacket(td::protocol::packets::PlayerLoginPacket(a_PlayerName)); } +void LoggingState::Update(float a_Delta) { +} + LoggingState::~LoggingState() {} void LoggingState::Handle(const protocol::packets::PlayerJoinPacket& a_Packet) { @@ -16,7 +19,7 @@ void LoggingState::Handle(const protocol::packets::PlayerJoinPacket& a_Packet) { } void LoggingState::Handle(const protocol::packets::LoggingSuccessPacket& a_Packet) { - // TODO: switch state + ChangeState(); } } // namespace client diff --git a/src/server/IServerSocket.cpp b/src/server/IServerSocket.cpp index 5fe5c2b..a66429e 100644 --- a/src/server/IServerSocket.cpp +++ b/src/server/IServerSocket.cpp @@ -19,10 +19,11 @@ void IServerSocket::UnregisterHandler(const PlayerPacketHandler& a_Handler) { void IServerSocket::OnConnectPeer(PeerID a_PeerId) { // here, the client is not a player yet (we need to wait for auth) m_Ids.AddConnection(a_PeerId); + OnPlayerConnect(m_Ids.GetPlayerId(a_PeerId)); } void IServerSocket::OnDisconnectPeer(PeerID a_PeerId) { - OnPlayerLeave(m_Ids.GetPlayerId(a_PeerId)); + OnPlayerDisconnect(m_Ids.GetPlayerId(a_PeerId)); m_Ids.RemovePeer(a_PeerId); } diff --git a/src/server/PlayerManager.cpp b/src/server/PlayerManager.cpp index 1c56850..ae273c0 100644 --- a/src/server/PlayerManager.cpp +++ b/src/server/PlayerManager.cpp @@ -6,48 +6,52 @@ namespace td { namespace server { -PlayerManager::ConnectionHandler::ConnectionHandler( - std::map& a_Players, IServerSocket& a_Socket, PlayerID a_Player) : - m_Players(a_Players), m_Socket(a_Socket), m_Player(a_Player) {} +PlayerManager::ConnectionHandler::ConnectionHandler(PlayerManager& a_PlayerManager, PlayerID a_Player) : + m_PlayerManager(a_PlayerManager), m_Player(a_Player) {} void PlayerManager::ConnectionHandler::Handle(const protocol::packets::PlayerLoginPacket& a_Packet) { PlayerInfo pInfo{m_Player, a_Packet->m_PlayerName}; - std::vector players; - players.reserve(m_Players.size()); - for (auto& [id, player] : m_Players) { - players.push_back(player); + auto& socket = *m_PlayerManager.m_Socket; + auto& players = m_PlayerManager.m_Players; + + std::vector playerInfos; + playerInfos.reserve(players.size()); + for (auto& [id, player] : players) { + playerInfos.push_back(player); } - m_Socket.Send(m_Player, protocol::packets::LoggingSuccessPacket(m_Player)); - m_Socket.Send(m_Player, protocol::packets::PlayerListPacket(players)); - m_Socket.Broadcast(protocol::packets::PlayerJoinPacket(pInfo)); + socket.Send(m_Player, protocol::packets::LoggingSuccessPacket(m_Player)); + socket.Send(m_Player, protocol::packets::PlayerListPacket(playerInfos)); + socket.Broadcast(protocol::packets::PlayerJoinPacket(pInfo)); - m_Players.emplace(m_Player, pInfo); - m_Socket.OnPlayerJoin(m_Player, pInfo); + players.emplace(m_Player, pInfo); + m_PlayerManager.OnPlayerJoin(m_Player, pInfo); std::cout << "[Server] " << a_Packet->m_PlayerName << " joined !\n"; } void PlayerManager::ConnectionHandler::Handle(const protocol::packets::DisconnectPacket& a_Packet) { - std::cout << "[Server] " << +m_Player << " wants to disconnect !\n"; - Disconnect(m_Players, m_Socket, m_Player); + m_PlayerManager.Disconnect(m_Player); } PlayerManager::PlayerManager(const std::shared_ptr& a_Socket) : m_Socket(a_Socket) { - a_Socket->RegisterHandler( - [this](PlayerID a_PlayerId) { return std::make_unique(m_Players, *m_Socket, a_PlayerId); }); + a_Socket->RegisterHandler([this](PlayerID a_PlayerId) { return std::make_unique(*this, a_PlayerId); }); + a_Socket->OnPlayerDisconnect.Connect(std::bind(&PlayerManager::RemovePlayer, this, std::placeholders::_1)); } -void PlayerManager::ConnectionHandler::Disconnect(std::map& a_Players, IServerSocket& a_Socket, PlayerID a_Player) { - a_Socket.Disconnect(a_Player); - a_Socket.Broadcast(protocol::packets::PlayerLeavePacket(a_Player)); - a_Players.erase(a_Player); +void PlayerManager::Disconnect(PlayerID a_Player) { + if (!m_Players.contains(a_Player)) + return; + std::cout << "[Server] " << +a_Player << " wants to disconnect !\n"; + m_Socket->Disconnect(a_Player); + m_Socket->Broadcast(protocol::packets::PlayerLeavePacket(a_Player)); + m_Players.erase(a_Player); } PlayerManager::~PlayerManager() {} void PlayerManager::RemovePlayer(PlayerID a_Player) { - ConnectionHandler::Disconnect(m_Players, *m_Socket, a_Player); + Disconnect(a_Player); } PlayerInfo PlayerManager::GetPlayer(PlayerID a_Player) { diff --git a/src/server/Server.cpp b/src/server/Server.cpp index 9105691..6a8e284 100644 --- a/src/server/Server.cpp +++ b/src/server/Server.cpp @@ -2,10 +2,14 @@ #include +#include + namespace td { namespace server { -Server::Server(const std::shared_ptr& a_Socket) : m_Socket(a_Socket), m_Players(a_Socket), m_LastMspt(0) {} +Server::Server(const std::shared_ptr& a_Socket) : m_Socket(a_Socket), m_Players(a_Socket), m_LastMspt(0) { + ChangeState(); +} void Server::Update(float a_Delta) { auto before = std::chrono::system_clock::now(); diff --git a/src/server/ServerState.cpp b/src/server/ServerState.cpp index 12dd27c..552a4f7 100644 --- a/src/server/ServerState.cpp +++ b/src/server/ServerState.cpp @@ -8,8 +8,8 @@ namespace server { ServerState::ServerState(Server& a_Server) : Server::State(a_Server) { Connect(m_StateMachine.m_Socket->OnReceive, std::bind(&ServerState::HandlePacket, this, std::placeholders::_1, std::placeholders::_2)); - Connect(m_StateMachine.m_Socket->OnPlayerJoin, std::bind(&ServerState::OnPlayerJoin, this, std::placeholders::_1, std::placeholders::_2)); - Connect(m_StateMachine.m_Socket->OnPlayerLeave, std::bind(&ServerState::OnPlayerLeave, this, std::placeholders::_1)); + Connect(m_StateMachine.m_Players.OnPlayerJoin, std::bind(&ServerState::OnPlayerJoin, this, std::placeholders::_1, std::placeholders::_2)); + Connect(m_StateMachine.m_Players.OnPlayerLeave, std::bind(&ServerState::OnPlayerLeave, this, std::placeholders::_1)); } ServerState::~ServerState() {} diff --git a/src/server/state/GameState.cpp b/src/server/state/GameState.cpp index fdc6640..09cea6e 100644 --- a/src/server/state/GameState.cpp +++ b/src/server/state/GameState.cpp @@ -1,5 +1,6 @@ #include #include +#include #include @@ -7,7 +8,9 @@ namespace td { namespace server { GameState::GameState(Server& a_Server, const std::shared_ptr& a_World) : ServerState(a_Server), m_World(a_World), m_Simulation(*m_World, STEP_TIME), m_Time(0) { - std::cout << "Switched to Game state !\n"; + std::cout << "[Server] Switched to Game state !\n"; + BroadcastPacket(a_World->GetPacketHeader()); + BroadcastPacket(a_World->GetPacketData()); BroadcastPacket(m_Simulation.MakePacket()); } diff --git a/src/server/state/LobbyState.cpp b/src/server/state/LobbyState.cpp index feac84d..e22ff6a 100644 --- a/src/server/state/LobbyState.cpp +++ b/src/server/state/LobbyState.cpp @@ -1,18 +1,60 @@ -#include #include +#include #include +#include +#include + +#include +#include +#include +#include namespace td { namespace server { -void LobbyState::HandlePacket(PlayerID a_Id, const protocol::PacketBase& a_Packet) { +void Save(const protocol::PacketBase& header, const protocol::PacketBase& data) { + auto comp = std::make_shared(); + std::ofstream fStream("test/tdmap.tdmap3"); + auto out = std::make_shared(fStream); + + sp::MessageStream stream(std::move(out), std::move(comp)); + + stream.WriteMessage(header, false); + stream.WriteMessage(data, false); } -void LobbyState::Update(float a_Delta) { - m_StateMachine.ChangeState(m_World); +game::WorldPtr GetWorld() { + auto comp = std::make_shared(); + + std::ifstream fStream("test/tdmap.tdmap2"); + auto out = std::make_shared(fStream); + + sp::MessageStream stream(std::move(out), std::move(comp)); + + auto header = stream.ReadConcreteMessage(); + auto data = stream.ReadConcreteMessage(); + + auto w = std::make_shared(); + + w->LoadMap(**header); + w->LoadMap(**data); + + // Save(*header, *data); + + return w; } +LobbyState::LobbyState(Server& a_Server) : ServerState(a_Server) {} + +void LobbyState::HandlePacket(PlayerID a_Id, const protocol::PacketBase& a_Packet) {} + +void LobbyState::OnPlayerJoin(PlayerID a_Id, const td::PlayerInfo& a_Info) { + m_StateMachine.ChangeState(GetWorld()); +} + +void LobbyState::Update(float a_Delta) {} + } // namespace server } // namespace td diff --git a/src/td/display/state/DebugWorldState.cpp b/src/td/display/state/DebugWorldState.cpp index 607ea7e..d39e710 100644 --- a/src/td/display/state/DebugWorldState.cpp +++ b/src/td/display/state/DebugWorldState.cpp @@ -1,101 +1,69 @@ #include #include -#include #include #include -#include #include #include #include #include -#include -#include -#include -#include - #include #include -#include +#include #include #include #include +#include #include #include namespace td { -void Save(const protocol::PacketBase& header, const protocol::PacketBase& data) { - auto comp = std::make_shared(); - - std::ofstream fStream("test/tdmap.tdmap3"); - auto out = std::make_shared(fStream); - - sp::MessageStream stream(std::move(out), std::move(comp)); - - stream.WriteMessage(header, false); - stream.WriteMessage(data, false); -} - -game::WorldPtr GetWorld() { - auto comp = std::make_shared(); - - std::ifstream fStream("test/tdmap.tdmap2"); - auto out = std::make_shared(fStream); - - sp::MessageStream stream(std::move(out), std::move(comp)); - - auto header = stream.ReadConcreteMessage(); - auto data = stream.ReadConcreteMessage(); - - auto w = std::make_shared(); - - w->LoadMap(**header); - w->LoadMap(**data); - - // Save(*header, *data); - - return w; -} - DebugWorldState::DebugWorldState(Display& a_Display) : DisplayState(a_Display) { // server - game::WorldPtr serverWorld = GetWorld(); auto serverFakeSocket = std::make_shared(); m_Server = std::make_unique(serverFakeSocket); // client - game::WorldPtr clientWorld = GetWorld(); auto clientFakeSocket = client::FakeSocket::Connect(serverFakeSocket); m_Client = std::make_unique(clientFakeSocket, "Player0"); - // client2 - auto clientFakeSocket2 = client::FakeSocket::Connect(serverFakeSocket); - m_Client2 = std::make_unique(clientFakeSocket2, "Player1"); + // TODO: make it better + m_Client->OnStateChange.Connect([this](client::Client::State& a_State) { + if (auto gameState = dynamic_cast(&a_State)) { + // render + auto clientWorld = gameState->GetWorld(); + m_Renderer.AddRenderer(m_Camera, clientWorld); + m_Renderer.AddRenderer(m_Camera, clientWorld); + m_Renderer.AddRenderer(m_Camera, clientWorld); + + // update state + m_ClientState = gameState; + } + }); - // render - m_Renderer.AddRenderer(m_Camera, clientWorld); - m_Renderer.AddRenderer(m_Camera, clientWorld); - m_Renderer.AddRenderer(m_Camera, clientWorld); + m_Client->ChangeState("Player0"); + std::cout << "Switched to login!\n"; + + // // client2 + // auto clientFakeSocket2 = client::FakeSocket::Connect(serverFakeSocket); + // m_Client2 = std::make_unique(clientFakeSocket2, "Player1"); + // m_Client2->ChangeState("Player1"); // camera m_Camera.SetCamPos({77, 7, 13}); m_Camera.UpdatePerspective(m_StateMachine.GetAspectRatio()); - - // states - m_ClientState = m_Client->ChangeState(clientWorld, STEP_TIME); - m_Server->ChangeState(serverWorld); } void DebugWorldState::Update(float a_Delta) { m_Server->Update(a_Delta); m_Client->Update(a_Delta); - // TODO: m_ClientState might be invalid ! - m_Renderer.Render(m_ClientState->GetCurrentLerp()); + if (m_ClientState) + m_Renderer.Render(m_ClientState->GetCurrentLerp()); } void DebugWorldState::OnAspectRatioChange(float a_Ratio) { diff --git a/src/td/game/World.cpp b/src/td/game/World.cpp index ba9be9a..cb5a935 100644 --- a/src/td/game/World.cpp +++ b/src/td/game/World.cpp @@ -1,6 +1,7 @@ #include #include +#include namespace td { namespace game { @@ -14,7 +15,7 @@ class ColorTileVisitor : public TileHandler { ColorTileVisitor(const World& a_World) : m_World(a_World), m_Result(nullptr) {} virtual void Handle(const EmptyTile& a_Tile) override {} - + virtual void Handle(const TowerTile& a_Tile) override { m_Result = &m_World.GetTowerTileColorPalette()[a_Tile->m_ColorPaletteRef]; } @@ -62,6 +63,16 @@ bool World::LoadMap(const protocol::pdata::WorldHeader& a_WorldHeader) { return true; } +protocol::packets::WorldHeaderPacket World::GetPacketHeader() const { + return protocol::packets::WorldHeaderPacket(m_TowerPlacePalette, m_WalkablePalette, m_DecorationPalette, m_Background, + m_SpawnColorPalette, m_TilePalette, GetRedTeam().GetSpawn(), GetBlueTeam().GetSpawn(), GetRedTeam().GetCastle(), + GetBlueTeam().GetCastle()); +} + +protocol::packets::WorldDataPacket World::GetPacketData() const { + return protocol::packets::WorldDataPacket(m_Chunks); +} + bool World::LoadMap(const protocol::pdata::WorldData& a_WorldData) { m_Chunks = a_WorldData.m_Chunks; return true;