From 1e3b6728973df6778207e3b1eb9565cf9150fc42 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Tue, 15 Aug 2023 13:01:50 +0200 Subject: [PATCH] remove player from team when leaving --- include/td/game/BaseGame.h | 2 ++ include/td/game/Team.h | 1 + src/server/Server.cpp | 11 ++++++----- src/server/ServerConnexion.cpp | 26 ++++++++++++-------------- src/td/game/BaseGame.cpp | 19 +++++++++++++++++++ src/td/game/Team.cpp | 4 ++++ 6 files changed, 44 insertions(+), 19 deletions(-) diff --git a/include/td/game/BaseGame.h b/include/td/game/BaseGame.h index fc11d42..add9ea5 100644 --- a/include/td/game/BaseGame.h +++ b/include/td/game/BaseGame.h @@ -67,6 +67,8 @@ public: const TeamList& GetTeams() const { return m_Teams; } + void RemovePlayer(PlayerID pId); + }; } // namespace game diff --git a/include/td/game/Team.h b/include/td/game/Team.h index fa373bb..813ad1e 100644 --- a/include/td/game/Team.h +++ b/include/td/game/Team.h @@ -74,6 +74,7 @@ public: void AddPlayer(Player* newPlayer); void RemovePlayer(const Player* player); + void ClearPlayers(); TeamColor GetColor() const; diff --git a/src/server/Server.cpp b/src/server/Server.cpp index 06403ce..cfde5da 100644 --- a/src/server/Server.cpp +++ b/src/server/Server.cpp @@ -163,13 +163,14 @@ void Server::BroadcastPacket(const protocol::Packet* packet) { } void Server::RemoveConnexion(std::uint8_t connexionID) { - auto it = GetPlayers().find(connexionID); - if (it != GetPlayers().end()) { - GetPlayers().erase(it); - utils::LOG(utils::format("\t[%s] left !", it->second.GetName().c_str())); - } + std::string playerName = GetGame().GetPlayerById(connexionID)->GetName(); + + GetGame().RemovePlayer(connexionID); m_Connections.erase(connexionID); m_Lobby.OnPlayerLeave(connexionID); + + utils::LOG(utils::format("\t[%s] left !", playerName.c_str())); + OnPlayerLeave(connexionID); } diff --git a/src/server/ServerConnexion.cpp b/src/server/ServerConnexion.cpp index 5b4c370..3a159cd 100644 --- a/src/server/ServerConnexion.cpp +++ b/src/server/ServerConnexion.cpp @@ -28,7 +28,7 @@ #define KEEP_ALIVE_TIMEOUT 10 * 1000 // 10s -#define SAFE_CHECK(expr) if(expr) return +#define SAFE_CHECK(expr) if(!(expr)) return namespace td { namespace server { @@ -116,12 +116,20 @@ void ServerConnexion::HandlePacket(const protocol::PlayerLoginPacket* packet) { protocol::PlayerListPacket listPacket(playerNames); SendPacket(&listPacket); + protocol::UpdateGameStatePacket statePacket(m_Server->GetGame().GetGameState()); + SendPacket(&statePacket); + + protocol::WorldBeginDataPacket headerDataPacket(m_Server->GetGame().GetWorld()); + protocol::WorldBeginDataPacket dataPacket(m_Server->GetGame().GetWorld()); + SendPacket(&headerDataPacket); + SendPacket(&dataPacket); + m_Server->GetGame().NotifyListeners(&game::GameListener::OnPlayerJoin, m_ID); } } void ServerConnexion::HandlePacket(const protocol::SelectTeamPacket* packet) { - SAFE_CHECK(m_Server->GetGame().GetGameState() != game::GameState::Lobby); + SAFE_CHECK(m_Server->GetGame().GetGameState() == game::GameState::Lobby); if (static_cast(packet->GetSelectedTeam()) >= -1 || static_cast(packet->GetSelectedTeam()) <= 1) { if (m_Player->GetTeamColor() == game::TeamColor::None) { // join a team @@ -156,18 +164,8 @@ void ServerConnexion::SetServer(Server* server) { } void ServerConnexion::InitConnection() { - protocol::UpdateGameStatePacket statePacket(m_Server->GetGame().GetGameState()); - SendPacket(&statePacket); - protocol::ConnexionInfoPacket conPacket(m_ID); SendPacket(&conPacket); - - SAFE_CHECK(m_Server->GetGame().GetGameState() != game::GameState::Game); - - protocol::WorldBeginDataPacket headerDataPacket(m_Server->GetGame().GetWorld()); - protocol::WorldBeginDataPacket dataPacket(m_Server->GetGame().GetWorld()); - SendPacket(&headerDataPacket); - SendPacket(&dataPacket); } void ServerConnexion::HandlePacket(const protocol::PlaceTowerPacket* packet) { @@ -177,10 +175,10 @@ void ServerConnexion::HandlePacket(const protocol::PlaceTowerPacket* packet) { Vec2f towerPos = { static_cast(packet->GetTowerX()), static_cast(packet->GetTowerY()) }; - SAFE_CHECK(!world->CanPlaceLittleTower(towerPos, m_ID)); + SAFE_CHECK(world->CanPlaceLittleTower(towerPos, m_ID)); if (towerInfo.IsBigTower()) - SAFE_CHECK(!world->CanPlaceBigTower(towerPos, m_ID)); + SAFE_CHECK(world->CanPlaceBigTower(towerPos, m_ID)); game::TowerPtr tower = world->PlaceTowerAt(towerType, packet->GetTowerX(), packet->GetTowerY(), m_ID); diff --git a/src/td/game/BaseGame.cpp b/src/td/game/BaseGame.cpp index a940646..9d6aaab 100644 --- a/src/td/game/BaseGame.cpp +++ b/src/td/game/BaseGame.cpp @@ -20,6 +20,10 @@ void Game::Tick(std::uint64_t delta) { void Game::Reset() { m_World->Reset(); + for (auto team : m_Teams) { + team.ClearPlayers(); + } + for (auto& [id, player] : m_Players) { player.SetExp(0); player.SetGold(0); @@ -43,5 +47,20 @@ const Player* Game::GetPlayerById(PlayerID id) const { return &it->second; } +void Game::RemovePlayer(PlayerID pId) { + Player* player = GetPlayerById(pId); + + if (!player) return; + + TeamColor team = player->GetTeamColor(); + + GetTeam(team).RemovePlayer(player); + auto it = GetPlayers().find(pId); + + if (it == GetPlayers().end()) return; + + GetPlayers().erase(it); +} + } // namespace game } // namespace td diff --git a/src/td/game/Team.cpp b/src/td/game/Team.cpp index 1bd32eb..a575f66 100644 --- a/src/td/game/Team.cpp +++ b/src/td/game/Team.cpp @@ -23,6 +23,10 @@ std::uint8_t Team::GetPlayerCount() const { return m_Players.size(); } +void Team::ClearPlayers() { + m_Players.clear(); +} + } // namespace game } // namespace td