client PlayerManager

This commit is contained in:
2025-08-21 20:51:13 +02:00
parent fd08833f3f
commit 4fe2e25029
11 changed files with 100 additions and 7 deletions

View File

@@ -1,6 +1,7 @@
#pragma once
#include <client/IClientSocket.h>
#include <client/PlayerManager.h>
#include <td/common/StateMachine.h>
namespace td {
@@ -11,6 +12,7 @@ class ClientState;
class Client : public StateMachine<Client, void, float> {
private:
std::shared_ptr<IClientSocket> m_Socket;
PlayerManager m_Players;
public:
Client(const std::shared_ptr<IClientSocket>& a_Socket, const std::string& a_PlayerName);

View File

@@ -0,0 +1,31 @@
#pragma once
#include <td/protocol/packet/Packets.h>
#include <td/misc/Signal.h>
namespace td {
namespace client {
class IClientSocket;
class PlayerManager : public protocol::PacketHandler {
private:
std::map<PlayerID, PlayerInfo> m_Players;
std::shared_ptr<IClientSocket> m_Socket;
public:
utils::Signal<const PlayerInfo&> OnPlayerJoin;
utils::Signal<PlayerID> OnPlayerLeave;
PlayerManager(const std::shared_ptr<IClientSocket>& 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

View File

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

View File

@@ -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<PlayerID, PlayerInfo>&, IServerSocket& m_Socket, PlayerID m_Player);
};
};

View File

@@ -14,6 +14,7 @@ class DebugWorldState : public DisplayState {
render::RenderPipeline m_Renderer;
render::Camera m_Camera;
std::unique_ptr<client::Client> m_Client;
std::unique_ptr<client::Client> m_Client2;
std::unique_ptr<server::Server> m_Server;
client::GameState* m_ClientState;

View File

@@ -5,7 +5,7 @@
namespace td {
namespace client {
Client::Client(const std::shared_ptr<IClientSocket>& a_Socket, const std::string& a_PlayerName) : m_Socket(a_Socket) {
Client::Client(const std::shared_ptr<IClientSocket>& a_Socket, const std::string& a_PlayerName) : m_Socket(a_Socket), m_Players(a_Socket) {
ChangeState<LoggingState>(a_PlayerName);
}

View File

@@ -0,0 +1,44 @@
#include <client/PlayerManager.h>
#include <client/IClientSocket.h>
#include <iostream>
namespace td {
namespace client {
PlayerManager::PlayerManager(const std::shared_ptr<IClientSocket>& 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

View File

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

View File

@@ -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<IServerSocket>& a_Socket) : m_Socket(a_Socket) {
@@ -39,11 +38,16 @@ PlayerManager::PlayerManager(const std::shared_ptr<IServerSocket>& a_Socket) : m
[this](PlayerID a_PlayerId) { return std::make_unique<ConnectionHandler>(m_Players, *m_Socket, a_PlayerId); });
}
void PlayerManager::ConnectionHandler::Disconnect(std::map<PlayerID, PlayerInfo>& 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) {

View File

@@ -73,6 +73,10 @@ DebugWorldState::DebugWorldState(Display& a_Display) : DisplayState(a_Display) {
auto clientFakeSocket = client::FakeSocket::Connect(serverFakeSocket);
m_Client = std::make_unique<client::Client>(clientFakeSocket, "Player0");
// client2
auto clientFakeSocket2 = client::FakeSocket::Connect(serverFakeSocket);
m_Client2 = std::make_unique<client::Client>(clientFakeSocket2, "Player1");
// render
m_Renderer.AddRenderer<render::WorldRenderer>(m_Camera, clientWorld);
m_Renderer.AddRenderer<render::EntityRenderer>(m_Camera, clientWorld);

View File

@@ -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")