diff --git a/include/server/ConnectionHandler.h b/include/server/ConnectionHandler.h deleted file mode 100644 index df00059..0000000 --- a/include/server/ConnectionHandler.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include - -namespace td { -namespace server { - -class IServerSocket; - -class ConnectionHandler : public protocol::PacketHandler { - private: - IServerSocket& m_Server; - PlayerID m_Player; - - public: - ConnectionHandler(IServerSocket& a_Server, 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; -}; - -} // namespace server -} // namespace td diff --git a/include/server/IServerSocket.h b/include/server/IServerSocket.h index baee286..0dc28bf 100644 --- a/include/server/IServerSocket.h +++ b/include/server/IServerSocket.h @@ -12,7 +12,7 @@ class IServerSocket { using PlayerPacketHandlerType = std::unique_ptr(PlayerID); using PlayerPacketHandler = std::function; - utils::Signal OnPlayerJoin; + utils::Signal OnPlayerJoin; utils::Signal OnPlayerLeave; utils::Signal OnReceive; diff --git a/include/server/PlayerManager.h b/include/server/PlayerManager.h new file mode 100644 index 0000000..41df1f0 --- /dev/null +++ b/include/server/PlayerManager.h @@ -0,0 +1,39 @@ +#pragma once + +#include + +namespace td { +namespace server { + +class IServerSocket; + +class PlayerManager { + private: + std::map m_Players; + std::shared_ptr m_Socket; + + public: + PlayerManager(const std::shared_ptr& a_Socket); + ~PlayerManager(); + + void RemovePlayer(PlayerID a_Player); + PlayerInfo GetPlayer(PlayerID a_Player); + + private: + class ConnectionHandler : public protocol::PacketHandler { + private: + std::map& m_Players; + IServerSocket& m_Socket; + PlayerID m_Player; + + public: + ConnectionHandler(std::map& a_Players, IServerSocket& a_Socket, 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; + }; +}; + +} // namespace server +} // namespace td diff --git a/include/server/Server.h b/include/server/Server.h index 94af6c6..ea78fb1 100644 --- a/include/server/Server.h +++ b/include/server/Server.h @@ -2,6 +2,7 @@ #include #include +#include namespace td { namespace server { @@ -11,6 +12,7 @@ class ServerState; class Server : public StateMachine { private: std::shared_ptr m_Socket; + PlayerManager m_Players; float m_LastMspt; public: diff --git a/include/server/ServerState.h b/include/server/ServerState.h index 1fc7db9..e2ef7f7 100644 --- a/include/server/ServerState.h +++ b/include/server/ServerState.h @@ -10,7 +10,7 @@ class ServerState : public Server::State, private utils::SlotGuard { public: virtual void HandlePacket(PlayerID a_Id, const protocol::PacketBase& a_Packet) = 0; virtual void Update(float a_Delta) = 0; - virtual void OnPlayerJoin(PlayerID a_Id, const td::protocol::PlayerInfo& a_Info) {} + virtual void OnPlayerJoin(PlayerID a_Id, const td::PlayerInfo& a_Info) {} virtual void OnPlayerLeave(PlayerID a_Id) {} ServerState(Server& a_Server); diff --git a/include/td/Types.h b/include/td/Types.h index b126919..0b8f350 100644 --- a/include/td/Types.h +++ b/include/td/Types.h @@ -78,6 +78,11 @@ enum class Direction : std::uint8_t { NegativeY = 1 << 3, }; +struct PlayerInfo { + PlayerID m_PlayerId; + std::string m_PlayerName; +}; + sp::DataBuffer& operator<<(sp::DataBuffer& a_Buffer, const EntityCoords& a_Coords); sp::DataBuffer& operator<<(sp::DataBuffer& a_Buffer, const FpFloat& a_Float); diff --git a/include/td/protocol/packet/PacketData.h b/include/td/protocol/packet/PacketData.h index 481ed73..49f2e07 100644 --- a/include/td/protocol/packet/PacketData.h +++ b/include/td/protocol/packet/PacketData.h @@ -16,11 +16,6 @@ namespace td { namespace protocol { -struct PlayerInfo { - PlayerID m_PlayerId; - std::string m_PlayerName; -}; - struct MapData { }; diff --git a/src/server/ConnectionHandler.cpp b/src/server/ConnectionHandler.cpp deleted file mode 100644 index 917974f..0000000 --- a/src/server/ConnectionHandler.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include - -#include - -namespace td { -namespace server { - -ConnectionHandler::ConnectionHandler(IServerSocket& a_Server, PlayerID a_Player) : m_Server(a_Server), m_Player(a_Player) {} - -void ConnectionHandler::Handle(const protocol::packets::PlayerLoginPacket& a_Packet) { - protocol::PlayerInfo pInfo{m_Player, a_Packet->m_PlayerName}; - - // TODO - std::vector players; - - m_Server.Send(m_Player, protocol::packets::LoggingSuccessPacket(m_Player)); - m_Server.Send(m_Player, protocol::packets::PlayerListPacket(players)); - m_Server.Broadcast(protocol::packets::PlayerJoinPacket(pInfo)); - - m_Server.OnPlayerJoin(m_Player, pInfo); - std::cout << "[Server] " << a_Packet->m_PlayerName << " tried to join !\n"; -} - -void ConnectionHandler::Handle(const protocol::packets::DisconnectPacket& a_Packet) { - std::cout << "[Server] " << +m_Player << " wants to disconnect !\n"; - m_Server.Disconnect(m_Player); -} - -} // namespace server -} // namespace td diff --git a/src/server/IServerSocket.cpp b/src/server/IServerSocket.cpp index 88e5027..5fe5c2b 100644 --- a/src/server/IServerSocket.cpp +++ b/src/server/IServerSocket.cpp @@ -1,12 +1,9 @@ #include -#include - namespace td { namespace server { IServerSocket::IServerSocket() { - RegisterHandler([this](PlayerID a_PlayerId) { return std::make_unique(*this, a_PlayerId); }); } void IServerSocket::RegisterHandler(const PlayerPacketHandler& a_Handler) { diff --git a/src/server/PlayerManager.cpp b/src/server/PlayerManager.cpp new file mode 100644 index 0000000..ad95fdd --- /dev/null +++ b/src/server/PlayerManager.cpp @@ -0,0 +1,54 @@ +#include + +#include +#include + +namespace td { +namespace server { + +PlayerManager::ConnectionHandler::ConnectionHandler( + std::map& a_Players, IServerSocket& a_Socket, PlayerID a_Player) : + m_Players(a_Players), m_Socket(a_Socket), m_Player(a_Player) {} + +void PlayerManager::ConnectionHandler::Handle(const protocol::packets::PlayerLoginPacket& a_Packet) { + PlayerInfo pInfo{m_Player, a_Packet->m_PlayerName}; + + std::vector players; + players.reserve(m_Players.size()); + for (auto& [id, player] : m_Players) { + players.push_back(player); + } + + m_Socket.Send(m_Player, protocol::packets::LoggingSuccessPacket(m_Player)); + m_Socket.Send(m_Player, protocol::packets::PlayerListPacket(players)); + m_Socket.Broadcast(protocol::packets::PlayerJoinPacket(pInfo)); + + m_Players.emplace(m_Player, pInfo); + m_Socket.OnPlayerJoin(m_Player, pInfo); + std::cout << "[Server] " << a_Packet->m_PlayerName << " joined !\n"; +} + +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); +} + +PlayerManager::PlayerManager(const std::shared_ptr& a_Socket) : m_Socket(a_Socket) { + a_Socket->RegisterHandler( + [this](PlayerID a_PlayerId) { return std::make_unique(m_Players, *m_Socket, a_PlayerId); }); +} + +PlayerManager::~PlayerManager() {} + +void PlayerManager::RemovePlayer(PlayerID a_Player) { + m_Socket->Disconnect(a_Player); + m_Players.erase(a_Player); +} + +PlayerInfo PlayerManager::GetPlayer(PlayerID a_Player) { + return m_Players.at(a_Player); +} + +} // namespace server +} // namespace td diff --git a/src/server/Server.cpp b/src/server/Server.cpp index e76ce62..9105691 100644 --- a/src/server/Server.cpp +++ b/src/server/Server.cpp @@ -5,7 +5,7 @@ namespace td { namespace server { -Server::Server(const std::shared_ptr& a_Socket) : m_Socket(a_Socket), m_LastMspt(0) {} +Server::Server(const std::shared_ptr& a_Socket) : m_Socket(a_Socket), m_Players(a_Socket), m_LastMspt(0) {} void Server::Update(float a_Delta) { auto before = std::chrono::system_clock::now();