send world to client

This commit is contained in:
2025-08-22 11:41:58 +02:00
parent 20acbc0499
commit 7d58b881b2
22 changed files with 217 additions and 107 deletions

View File

@@ -9,12 +9,12 @@ namespace client {
class GameState : public ClientState {
private:
std::shared_ptr<game::World> m_World;
game::WorldPtr m_World;
sim::ClientSimulation m_Simulation;
float m_CurrentLerp;
public:
GameState(Client& a_Client, const std::shared_ptr<game::World>& 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;
};

View File

@@ -0,0 +1,24 @@
#pragma once
#include <client/ClientState.h>
#include <td/game/World.h>
#include <td/simulation/ClientSimulation.h>
namespace td {
namespace client {
class LobbyState : public ClientState {
private:
std::shared_ptr<game::World> 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

View File

@@ -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;

View File

@@ -12,8 +12,8 @@ class IServerSocket {
using PlayerPacketHandlerType = std::unique_ptr<protocol::PacketHandler>(PlayerID);
using PlayerPacketHandler = std::function<PlayerPacketHandlerType>;
utils::Signal<PlayerID, const PlayerInfo&> OnPlayerJoin;
utils::Signal<PlayerID> OnPlayerLeave;
utils::Signal<PlayerID> OnPlayerConnect;
utils::Signal<PlayerID> OnPlayerDisconnect;
utils::Signal<PlayerID, const protocol::PacketBase&> OnReceive;
void Send(PlayerID a_PlayerId, const protocol::PacketBase& a_Packet);

View File

@@ -1,5 +1,6 @@
#pragma once
#include <td/misc/Signal.h>
#include <td/protocol/packet/Packets.h>
namespace td {
@@ -13,6 +14,9 @@ class PlayerManager {
std::shared_ptr<IServerSocket> m_Socket;
public:
utils::Signal<PlayerID, const PlayerInfo&> OnPlayerJoin;
utils::Signal<PlayerID> OnPlayerLeave;
PlayerManager(const std::shared_ptr<IServerSocket>& 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<PlayerID, PlayerInfo>& m_Players;
IServerSocket& m_Socket;
PlayerManager& m_PlayerManager;
PlayerID m_Player;
public:
ConnectionHandler(std::map<PlayerID, PlayerInfo>& 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<PlayerID, PlayerInfo>&, IServerSocket& m_Socket, PlayerID m_Player);
};
};

View File

@@ -20,6 +20,10 @@ class Server : public StateMachine<Server, void, float> {
virtual void Update(float a_Delta);
const PlayerManager& GetPlayers() const {
return m_Players;
}
friend class ServerState;
};

View File

@@ -10,9 +10,11 @@ class LobbyState : public ServerState {
private:
std::shared_ptr<game::World> m_World;
public:
LobbyState(Server& a_Server, const std::shared_ptr<game::World>& 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;
};

View File

@@ -1,7 +1,7 @@
#pragma once
#include <cassert>
#include <memory>
#include <td/misc/Signal.h>
namespace td {
@@ -16,7 +16,7 @@ class StateMachine {
virtual TReturn Update(TArgs... args) = 0;
template <typename T, typename... Args>
T* ChangeState(Args&&... args) {
T* ChangeState(Args... args) {
return m_StateMachine.template ChangeState<T>(std::forward<Args>(args)...);
}
@@ -24,18 +24,25 @@ class StateMachine {
TDerived& m_StateMachine;
};
utils::Signal<State&> 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<TArgs>(args)...);
}
template <typename T, typename... Args>
T* ChangeState(Args&&... args) {
m_State = std::make_unique<T>(static_cast<TDerived&>(*this), std::forward<Args>(args)...);
T* ChangeState(Args... args) {
auto* currentState = m_State.get();
auto newState = std::make_unique<T>(static_cast<TDerived&>(*this), std::forward<Args>(args)...);
// This allows chaining
if (m_State.get() == currentState)
m_State = std::move(newState);
OnStateChange(*m_State);
return static_cast<T*>(m_State.get());
}

View File

@@ -2,8 +2,10 @@
#include <td/display/Display.h>
#include <td/misc/SlotGuard.h>
#include <client/ClientState.h>
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

View File

@@ -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;