From 5631efcf9e59c490a2fc83a37e9b46d192190135 Mon Sep 17 00:00:00 2001 From: Simon Pribylski <66266021+Persson-dev@users.noreply.github.com> Date: Sat, 26 Aug 2023 10:46:20 +0200 Subject: [PATCH] remove mobs on player leave --- include/client/game/WorldClient.h | 1 + include/td/game/World.h | 1 + src/client/game/WorldClient.cpp | 10 ++++++++++ src/server/game/ServerGame.cpp | 18 ++++++++++++++++-- src/td/game/World.cpp | 11 +++++++++++ 5 files changed, 39 insertions(+), 2 deletions(-) diff --git a/include/client/game/WorldClient.h b/include/client/game/WorldClient.h index 41375fe..a025df9 100644 --- a/include/client/game/WorldClient.h +++ b/include/client/game/WorldClient.h @@ -20,6 +20,7 @@ public: virtual void HandlePacket(const protocol::SpawnMobPacket* packet) override; virtual void HandlePacket(const protocol::UpgradeTowerPacket* packet) override; virtual void HandlePacket(const protocol::WorldAddTowerPacket* packet) override; + virtual void HandlePacket(const protocol::RemoveMobPacket* packet) override; virtual void HandlePacket(const protocol::RemoveTowerPacket* packet) override; virtual void HandlePacket(const protocol::UpdateMobStatesPacket* packet) override; virtual void HandlePacket(const protocol::UpdateCastleLifePacket* packet) override; diff --git a/include/td/game/World.h b/include/td/game/World.h index 0d5988c..929b24b 100644 --- a/include/td/game/World.h +++ b/include/td/game/World.h @@ -174,6 +174,7 @@ public: void Reset(); // clear mobs and towers void SpawnMobAt(MobID id, MobType type, std::uint8_t level, PlayerID sender, float x, float y, Direction dir); + MobPtr RemoveMob(MobID id); TowerPtr PlaceTowerAt(TowerID id, TowerType type, std::int32_t x, std::int32_t y, PlayerID builder); TowerPtr RemoveTower(TowerID id); diff --git a/src/client/game/WorldClient.cpp b/src/client/game/WorldClient.cpp index b3b681e..e4cec12 100644 --- a/src/client/game/WorldClient.cpp +++ b/src/client/game/WorldClient.cpp @@ -8,6 +8,7 @@ #include "td/protocol/packets/WorldDataPacket.h" #include "td/protocol/packets/SpawnMobPacket.h" #include "td/protocol/packets/UpgradeTowerPacket.h" +#include "td/protocol/packets/RemoveMobPacket.h" #include "td/protocol/packets/RemoveTowerPacket.h" #include "td/protocol/packets/UpdateCastleLifePacket.h" #include "td/protocol/packets/UpdateMobStatesPacket.h" @@ -21,6 +22,7 @@ WorldClient::WorldClient(ClientGame* game) : game::World(game), protocol::Packet GetDispatcher()->RegisterHandler(protocol::PacketType::WorldData, this); GetDispatcher()->RegisterHandler(protocol::PacketType::SpawnMob, this); GetDispatcher()->RegisterHandler(protocol::PacketType::UpgradeTower, this); + GetDispatcher()->RegisterHandler(protocol::PacketType::RemoveMob, this); GetDispatcher()->RegisterHandler(protocol::PacketType::RemoveTower, this); GetDispatcher()->RegisterHandler(protocol::PacketType::UpdateCastleLife, this); GetDispatcher()->RegisterHandler(protocol::PacketType::UpdateMobStates, this); @@ -70,6 +72,14 @@ void WorldClient::HandlePacket(const protocol::RemoveTowerPacket* packet) { GetWorldNotifier().NotifyListeners(&WorldListener::OnTowerRemove, tower); } +void WorldClient::HandlePacket(const protocol::RemoveMobPacket* packet) { + game::MobPtr mob = RemoveMob(packet->GetMobID()); + + SAFE_CHECK(mob); + + //GetWorldNotifier().NotifyListeners(&MobListener::OnMobDie, mob.get()); +} + void WorldClient::HandlePacket(const protocol::UpdateMobStatesPacket* packet) { for (auto mobState : packet->GetMobStates()) { game::MobID mobId = mobState.GetMobId(); diff --git a/src/server/game/ServerGame.cpp b/src/server/game/ServerGame.cpp index 48f4ea0..9f30904 100644 --- a/src/server/game/ServerGame.cpp +++ b/src/server/game/ServerGame.cpp @@ -2,6 +2,7 @@ #include "server/Server.h" #include "td/protocol/packets/DisconnectPacket.h" +#include "td/protocol/packets/RemoveMobPacket.h" #include "td/protocol/packets/RemoveTowerPacket.h" #include "td/protocol/packets/UpdatePlayerTeamPacket.h" #include "td/protocol/packets/UpdateGameStatePacket.h" @@ -135,13 +136,26 @@ void ServerGame::OnGameClose() { m_Server->Restart(); } -void ServerGame::OnPlayerJoin(game::PlayerID id){ +void ServerGame::OnPlayerJoin(game::PlayerID id) { if (m_GameState == game::GameState::Game) BalanceTeams(); } -void ServerGame::OnPlayerLeave(game::PlayerID playerId){ +void ServerGame::OnPlayerLeave(game::PlayerID playerId) { // temporary fix + + auto& mobList = GetWorld()->GetMobList(); + for(std::size_t i = 0; i < mobList.size(); i++) { + auto mob = mobList.at(i); + + if(mob->GetSender() == playerId) { + protocol::RemoveMobPacket packet(mob->GetMobID()); + m_Server->BroadcastPacket(&packet); + + mobList.erase(mobList.begin() + i); + } + } + auto& towerList = GetWorld()->GetTowers(); for(std::size_t i = 0; i < towerList.size(); i++) { auto tower = towerList.at(i); diff --git a/src/td/game/World.cpp b/src/td/game/World.cpp index e0b60ee..b5e2e02 100644 --- a/src/td/game/World.cpp +++ b/src/td/game/World.cpp @@ -123,6 +123,17 @@ void World::SpawnMobAt(MobID id, MobType type, std::uint8_t level, PlayerID send GetMobNotifier().NotifyListeners(&MobListener::OnMobSpawn, mob.get()); } +MobPtr World::RemoveMob(MobID mobId) { + auto it = std::find_if(m_Mobs.begin(), m_Mobs.end(), [mobId](MobPtr mob) { return mob->GetMobID() == mobId;}); + if (it == m_Mobs.end()) return nullptr; + + MobPtr mob = *it; + + m_Mobs.erase(it); + + return mob; +} + TowerPtr World::PlaceTowerAt(TowerID id, TowerType type, std::int32_t x, std::int32_t y, PlayerID builder) { TowerPtr tower = TowerFactory::CreateTower(type, id, x, y, builder); m_Towers.push_back(tower);