From 09bba1281410e50a72a20477448d69633be45877 Mon Sep 17 00:00:00 2001 From: Simon Pribylski Date: Sat, 2 Sep 2023 20:27:26 +0200 Subject: [PATCH] prevent player from joining mid game --- src/server/Server.cpp | 12 +++++++----- src/server/ServerConnexion.cpp | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/server/Server.cpp b/src/server/Server.cpp index 60d6e3b..0504618 100644 --- a/src/server/Server.cpp +++ b/src/server/Server.cpp @@ -163,12 +163,16 @@ void Server::BroadcastPacket(const protocol::Packet* packet) { } void Server::RemoveConnexion(std::uint8_t connexionID) { - std::string playerName = GetGame().GetPlayerById(connexionID)->GetName(); + m_Connections.erase(connexionID); + + td::game::Player* player = GetGame().GetPlayerById(connexionID); + SAFE_CHECK(player); + + std::string playerName = player->GetName(); GetGame().RemovePlayer(connexionID); - m_Connections.erase(connexionID); m_Lobby.OnPlayerLeave(connexionID); - + utils::LOG(utils::format("\t[%s] left !", playerName.c_str())); OnPlayerLeave(connexionID); @@ -176,8 +180,6 @@ void Server::RemoveConnexion(std::uint8_t connexionID) { void Server::OnPlayerJoin(std::uint8_t id) { m_Lobby.OnPlayerJoin(id); - - GetPlayers().insert({ id, game::Player{id} }); } void Server::OnPlayerLeave(std::uint8_t id) { diff --git a/src/server/ServerConnexion.cpp b/src/server/ServerConnexion.cpp index 8051404..e35c7d4 100644 --- a/src/server/ServerConnexion.cpp +++ b/src/server/ServerConnexion.cpp @@ -94,9 +94,22 @@ void ServerConnexion::SendKeepAlive() { void ServerConnexion::HandlePacket(const protocol::PlayerLoginPacket* packet) { - SAFE_CHECK(m_Player->GetName().empty() && !packet->GetPlayerName().empty()); + if (m_Server->GetGame().GetGameState() != game::GameState::Lobby) { + protocol::DisconnectPacket packet("Cannot join during game"); + SendPacket(&packet); + CloseConnection(); + return; + } + + SAFE_CHECK(!packet->GetPlayerName().empty()); + if (!m_Player) { // player does not exist yet + auto playerPos = m_Server->GetPlayers().insert({ m_ID, game::Player{m_ID} }); + m_Player = &playerPos.first->second; + } + + SAFE_CHECK(m_Player->GetName().empty()); m_Player->SetName(packet->GetPlayerName()); @@ -176,7 +189,6 @@ void ServerConnexion::HandlePacket(const protocol::DisconnectPacket* packet) { void ServerConnexion::SetServer(Server* server) { m_Server = server; - m_Player = &m_Server->GetPlayers().at(m_ID); InitConnection(); SendKeepAlive(); }