client PlayerManager
This commit is contained in:
@@ -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);
|
||||
|
||||
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 Handle(const protocol::packets::PlayerJoinPacket& a_Packet) override;
|
||||
virtual void Handle(const protocol::packets::LoggingSuccessPacket& a_Packet) override;
|
||||
};
|
||||
|
||||
} // namespace client
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
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() {}
|
||||
|
||||
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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user