From 4fe2e250291bbe32e399015e66dc8fb275b95dbf Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Thu, 21 Aug 2025 20:51:13 +0200 Subject: [PATCH] client PlayerManager --- include/client/Client.h | 2 + include/client/PlayerManager.h | 31 +++++++++++++++ include/client/state/LoggingState.h | 1 + include/server/PlayerManager.h | 2 + include/td/display/state/DebugWorldState.h | 1 + src/client/Client.cpp | 2 +- src/client/PlayerManager.cpp | 44 ++++++++++++++++++++++ src/client/state/LoggingState.cpp | 6 ++- src/server/PlayerManager.cpp | 12 ++++-- src/td/display/state/DebugWorldState.cpp | 4 ++ xmake.lua | 2 +- 11 files changed, 100 insertions(+), 7 deletions(-) create mode 100644 include/client/PlayerManager.h create mode 100644 src/client/PlayerManager.cpp diff --git a/include/client/Client.h b/include/client/Client.h index aaee5ca..be6db99 100644 --- a/include/client/Client.h +++ b/include/client/Client.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include namespace td { @@ -11,6 +12,7 @@ class ClientState; class Client : public StateMachine { private: std::shared_ptr m_Socket; + PlayerManager m_Players; public: Client(const std::shared_ptr& a_Socket, const std::string& a_PlayerName); diff --git a/include/client/PlayerManager.h b/include/client/PlayerManager.h new file mode 100644 index 0000000..1f4745f --- /dev/null +++ b/include/client/PlayerManager.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +namespace td { +namespace client { + +class IClientSocket; + +class PlayerManager : public protocol::PacketHandler { + private: + std::map m_Players; + std::shared_ptr m_Socket; + + public: + utils::Signal OnPlayerJoin; + utils::Signal OnPlayerLeave; + + PlayerManager(const std::shared_ptr& a_Socket); + ~PlayerManager(); + + PlayerInfo GetPlayer(PlayerID a_Player); + + virtual void Handle(const protocol::packets::PlayerJoinPacket&) override; + virtual void Handle(const protocol::packets::PlayerListPacket&) override; + virtual void Handle(const protocol::packets::PlayerLeavePacket&) override; +}; + +} // namespace client +} // namespace td diff --git a/include/client/state/LoggingState.h b/include/client/state/LoggingState.h index b0d73c4..1a7e5ec 100644 --- a/include/client/state/LoggingState.h +++ b/include/client/state/LoggingState.h @@ -15,6 +15,7 @@ class LoggingState : public ClientState { 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; }; } // namespace client diff --git a/include/server/PlayerManager.h b/include/server/PlayerManager.h index 41df1f0..fb1b5fb 100644 --- a/include/server/PlayerManager.h +++ b/include/server/PlayerManager.h @@ -32,6 +32,8 @@ class PlayerManager { 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/td/display/state/DebugWorldState.h b/include/td/display/state/DebugWorldState.h index f5e22cc..e639851 100644 --- a/include/td/display/state/DebugWorldState.h +++ b/include/td/display/state/DebugWorldState.h @@ -14,6 +14,7 @@ class DebugWorldState : public DisplayState { render::RenderPipeline m_Renderer; render::Camera m_Camera; std::unique_ptr m_Client; + std::unique_ptr m_Client2; std::unique_ptr m_Server; client::GameState* m_ClientState; diff --git a/src/client/Client.cpp b/src/client/Client.cpp index 53710c7..a933e89 100644 --- a/src/client/Client.cpp +++ b/src/client/Client.cpp @@ -5,7 +5,7 @@ namespace td { namespace client { -Client::Client(const std::shared_ptr& a_Socket, const std::string& a_PlayerName) : m_Socket(a_Socket) { +Client::Client(const std::shared_ptr& a_Socket, const std::string& a_PlayerName) : m_Socket(a_Socket), m_Players(a_Socket) { ChangeState(a_PlayerName); } diff --git a/src/client/PlayerManager.cpp b/src/client/PlayerManager.cpp new file mode 100644 index 0000000..8403874 --- /dev/null +++ b/src/client/PlayerManager.cpp @@ -0,0 +1,44 @@ +#include + +#include + +#include + +namespace td { +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"; + }); + OnPlayerLeave.Connect([this](const PlayerID a_Player){ + std::cout << "[Client " << this << "] " << GetPlayer(a_Player).m_PlayerName << "(" << +a_Player << ") left !\n"; + }); +} + +PlayerManager::~PlayerManager() {} + +PlayerInfo PlayerManager::GetPlayer(PlayerID a_Player) { + return m_Players.at(a_Player); +} + +void PlayerManager::Handle(const protocol::packets::PlayerJoinPacket& a_Packet) { + m_Players.emplace(a_Packet->m_Player.m_PlayerId, a_Packet->m_Player); + OnPlayerJoin(a_Packet->m_Player); +} + +void PlayerManager::Handle(const protocol::packets::PlayerListPacket& a_Packet) { + for (auto pInfo : a_Packet->m_Players) { + m_Players.emplace(pInfo.m_PlayerId, pInfo); + OnPlayerJoin(pInfo); + } +} + +void PlayerManager::Handle(const protocol::packets::PlayerLeavePacket& a_Packet) { + OnPlayerLeave(a_Packet->m_PlayerId); + m_Players.erase(a_Packet->m_PlayerId); +} + +} // namespace client +} // namespace td diff --git a/src/client/state/LoggingState.cpp b/src/client/state/LoggingState.cpp index e1b3973..ee3d43d 100644 --- a/src/client/state/LoggingState.cpp +++ b/src/client/state/LoggingState.cpp @@ -12,7 +12,11 @@ LoggingState::LoggingState(Client& a_Client, const std::string& a_PlayerName) : LoggingState::~LoggingState() {} void LoggingState::Handle(const protocol::packets::PlayerJoinPacket& a_Packet) { - std::cout << "[Client] " << a_Packet->m_Player.m_PlayerName << "(" << +a_Packet->m_Player.m_PlayerId << ") joined !\n"; + // TODO: check if id matches client id +} + +void LoggingState::Handle(const protocol::packets::LoggingSuccessPacket& a_Packet) { + // TODO: switch state } } // namespace client diff --git a/src/server/PlayerManager.cpp b/src/server/PlayerManager.cpp index ad95fdd..1c56850 100644 --- a/src/server/PlayerManager.cpp +++ b/src/server/PlayerManager.cpp @@ -30,8 +30,7 @@ void PlayerManager::ConnectionHandler::Handle(const protocol::packets::PlayerLog void PlayerManager::ConnectionHandler::Handle(const protocol::packets::DisconnectPacket& a_Packet) { std::cout << "[Server] " << +m_Player << " wants to disconnect !\n"; - m_Socket.Disconnect(m_Player); - m_Players.erase(m_Player); + Disconnect(m_Players, m_Socket, m_Player); } PlayerManager::PlayerManager(const std::shared_ptr& a_Socket) : m_Socket(a_Socket) { @@ -39,11 +38,16 @@ PlayerManager::PlayerManager(const std::shared_ptr& a_Socket) : m [this](PlayerID a_PlayerId) { return std::make_unique(m_Players, *m_Socket, a_PlayerId); }); } +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); +} + PlayerManager::~PlayerManager() {} void PlayerManager::RemovePlayer(PlayerID a_Player) { - m_Socket->Disconnect(a_Player); - m_Players.erase(a_Player); + ConnectionHandler::Disconnect(m_Players, *m_Socket, a_Player); } PlayerInfo PlayerManager::GetPlayer(PlayerID a_Player) { diff --git a/src/td/display/state/DebugWorldState.cpp b/src/td/display/state/DebugWorldState.cpp index 0267760..607ea7e 100644 --- a/src/td/display/state/DebugWorldState.cpp +++ b/src/td/display/state/DebugWorldState.cpp @@ -73,6 +73,10 @@ DebugWorldState::DebugWorldState(Display& a_Display) : DisplayState(a_Display) { 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"); + // render m_Renderer.AddRenderer(m_Camera, clientWorld); m_Renderer.AddRenderer(m_Camera, clientWorld); diff --git a/xmake.lua b/xmake.lua index 6f04855..abaa8fa 100644 --- a/xmake.lua +++ b/xmake.lua @@ -3,7 +3,7 @@ add_rules("mode.debug", "mode.release") add_repositories("persson-repo https://git.ale-pri.com/Persson-dev/xmake-repo.git") add_requires("imgui 1.92.0", {configs = {sdl3 = true, opengl3 = true}}) -add_requires("libsdl3 3.2.16", "splib 2.3.1", "zlib", "glew", "fpm", "enet6") +add_requires("libsdl3 3.2.16", "splib 2.3.2", "zlib", "glew", "fpm", "enet6") set_languages("c++17")