client PlayerManager
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <client/IClientSocket.h>
|
#include <client/IClientSocket.h>
|
||||||
|
#include <client/PlayerManager.h>
|
||||||
#include <td/common/StateMachine.h>
|
#include <td/common/StateMachine.h>
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
@@ -11,6 +12,7 @@ class ClientState;
|
|||||||
class Client : public StateMachine<Client, void, float> {
|
class Client : public StateMachine<Client, void, float> {
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<IClientSocket> m_Socket;
|
std::shared_ptr<IClientSocket> m_Socket;
|
||||||
|
PlayerManager m_Players;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Client(const std::shared_ptr<IClientSocket>& a_Socket, const std::string& a_PlayerName);
|
Client(const std::shared_ptr<IClientSocket>& a_Socket, const std::string& a_PlayerName);
|
||||||
|
|||||||
31
include/client/PlayerManager.h
Normal file
31
include/client/PlayerManager.h
Normal 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
|
||||||
@@ -15,6 +15,7 @@ class LoggingState : public ClientState {
|
|||||||
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::PlayerJoinPacket& a_Packet) override;
|
||||||
|
virtual void Handle(const protocol::packets::LoggingSuccessPacket& a_Packet) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace client
|
} // namespace client
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ class PlayerManager {
|
|||||||
|
|
||||||
virtual void Handle(const protocol::packets::PlayerLoginPacket& a_Packet) override;
|
virtual void Handle(const protocol::packets::PlayerLoginPacket& a_Packet) override;
|
||||||
virtual void Handle(const protocol::packets::DisconnectPacket& 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);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ class DebugWorldState : public DisplayState {
|
|||||||
render::RenderPipeline m_Renderer;
|
render::RenderPipeline m_Renderer;
|
||||||
render::Camera m_Camera;
|
render::Camera m_Camera;
|
||||||
std::unique_ptr<client::Client> m_Client;
|
std::unique_ptr<client::Client> m_Client;
|
||||||
|
std::unique_ptr<client::Client> m_Client2;
|
||||||
std::unique_ptr<server::Server> m_Server;
|
std::unique_ptr<server::Server> m_Server;
|
||||||
client::GameState* m_ClientState;
|
client::GameState* m_ClientState;
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
namespace td {
|
namespace td {
|
||||||
namespace client {
|
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);
|
ChangeState<LoggingState>(a_PlayerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
44
src/client/PlayerManager.cpp
Normal file
44
src/client/PlayerManager.cpp
Normal 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
|
||||||
@@ -12,7 +12,11 @@ LoggingState::LoggingState(Client& a_Client, const std::string& a_PlayerName) :
|
|||||||
LoggingState::~LoggingState() {}
|
LoggingState::~LoggingState() {}
|
||||||
|
|
||||||
void LoggingState::Handle(const protocol::packets::PlayerJoinPacket& a_Packet) {
|
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
|
} // namespace client
|
||||||
|
|||||||
@@ -30,8 +30,7 @@ void PlayerManager::ConnectionHandler::Handle(const protocol::packets::PlayerLog
|
|||||||
|
|
||||||
void PlayerManager::ConnectionHandler::Handle(const protocol::packets::DisconnectPacket& a_Packet) {
|
void PlayerManager::ConnectionHandler::Handle(const protocol::packets::DisconnectPacket& a_Packet) {
|
||||||
std::cout << "[Server] " << +m_Player << " wants to disconnect !\n";
|
std::cout << "[Server] " << +m_Player << " wants to disconnect !\n";
|
||||||
m_Socket.Disconnect(m_Player);
|
Disconnect(m_Players, m_Socket, m_Player);
|
||||||
m_Players.erase(m_Player);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerManager::PlayerManager(const std::shared_ptr<IServerSocket>& a_Socket) : m_Socket(a_Socket) {
|
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); });
|
[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() {}
|
PlayerManager::~PlayerManager() {}
|
||||||
|
|
||||||
void PlayerManager::RemovePlayer(PlayerID a_Player) {
|
void PlayerManager::RemovePlayer(PlayerID a_Player) {
|
||||||
m_Socket->Disconnect(a_Player);
|
ConnectionHandler::Disconnect(m_Players, *m_Socket, a_Player);
|
||||||
m_Players.erase(a_Player);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerInfo PlayerManager::GetPlayer(PlayerID a_Player) {
|
PlayerInfo PlayerManager::GetPlayer(PlayerID a_Player) {
|
||||||
|
|||||||
@@ -73,6 +73,10 @@ DebugWorldState::DebugWorldState(Display& a_Display) : DisplayState(a_Display) {
|
|||||||
auto clientFakeSocket = client::FakeSocket::Connect(serverFakeSocket);
|
auto clientFakeSocket = client::FakeSocket::Connect(serverFakeSocket);
|
||||||
m_Client = std::make_unique<client::Client>(clientFakeSocket, "Player0");
|
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
|
// render
|
||||||
m_Renderer.AddRenderer<render::WorldRenderer>(m_Camera, clientWorld);
|
m_Renderer.AddRenderer<render::WorldRenderer>(m_Camera, clientWorld);
|
||||||
m_Renderer.AddRenderer<render::EntityRenderer>(m_Camera, clientWorld);
|
m_Renderer.AddRenderer<render::EntityRenderer>(m_Camera, clientWorld);
|
||||||
|
|||||||
@@ -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_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("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")
|
set_languages("c++17")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user