From 360258e4cfc91fc6b993613a446937964c823566 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Mon, 13 Dec 2021 20:05:20 +0100 Subject: [PATCH] feat: add end game disconnect --- include/game/World.h | 1 - include/game/server/ServerGame.h | 1 + include/game/server/ServerWorld.h | 2 ++ src/game/World.cpp | 11 ----------- src/game/server/ServerGame.cpp | 24 ++++++++++++++++-------- src/game/server/ServerWorld.cpp | 11 +++++++++++ 6 files changed, 30 insertions(+), 20 deletions(-) diff --git a/include/game/World.h b/include/game/World.h index 9de0966..2b3d7b2 100644 --- a/include/game/World.h +++ b/include/game/World.h @@ -232,7 +232,6 @@ public: // MobListener virtual void OnMobDamage(Mob* target, float damage, Tower* source); - virtual void OnMobDie(Mob* mob); virtual void OnMobCastleDamage(Mob* damager, TeamCastle* enemyCastle, float damage); private: diff --git a/include/game/server/ServerGame.h b/include/game/server/ServerGame.h index b53389c..d89b4f2 100644 --- a/include/game/server/ServerGame.h +++ b/include/game/server/ServerGame.h @@ -14,6 +14,7 @@ private: Server* m_Server; ServerWorld m_ServerWorld; utils::AutoTimer m_GoldMineTimer{ 1000, std::bind(&ServerGame::updateGoldMines, this) }; + utils::CooldownTimer m_EndGameCooldown{ 1000 * 10 }; public: ServerGame(Server* server); ~ServerGame() {} diff --git a/include/game/server/ServerWorld.h b/include/game/server/ServerWorld.h index 301e53c..dffbcb5 100644 --- a/include/game/server/ServerWorld.h +++ b/include/game/server/ServerWorld.h @@ -21,6 +21,8 @@ public: void spawnMobs(game::MobType type, std::uint8_t level, game::PlayerID sender, std::uint8_t count); game::TowerPtr placeTowerAt(game::TowerType type, std::int32_t x, std::int32_t y, game::PlayerID builder); + virtual void OnMobDie(game::Mob* mob); + }; } // namespace server diff --git a/src/game/World.cpp b/src/game/World.cpp index 884e6f8..2fc2645 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -221,17 +221,6 @@ bool World::CanPlaceBigTower(const glm::vec2& worldPos, PlayerID playerID) const return false; } -void World::OnMobDie(Mob* mob) { - if (mob->OnDeath(this)) { // check if the mob is actually dead (slimes ...) - //reward players - Player* sender = m_Game->getPlayerById(mob->getSender()); - sender->addExp(mob->getStats()->getExpReward()); - - Player* killer = m_Game->getPlayerById(mob->getLastDamageTower()->getBuilder()); - killer->addGold(mob->getStats()->getMoneyCost()); - } -} - void World::cleanDeadMobs() { // safely remove mobs when unused for (std::size_t i = 0; i < m_Mobs.size(); i++) { diff --git a/src/game/server/ServerGame.cpp b/src/game/server/ServerGame.cpp index a393de4..3afaaf7 100644 --- a/src/game/server/ServerGame.cpp +++ b/src/game/server/ServerGame.cpp @@ -12,6 +12,10 @@ void ServerGame::tick(std::uint64_t delta) { if (m_GameState == game::GameState::Game) { Game::tick(delta); updatePlayerStats(); + } else if (m_GameState == game::GameState::EndGame) { + if (m_EndGameCooldown.update(delta)) { + notifyListeners(&game::GameListener::OnGameClose); + } } } @@ -76,18 +80,22 @@ void ServerGame::OnGameStateUpdate(game::GameState newState) { m_Server->broadcastPacket(&packet); } -void ServerGame::OnGameEnd() { - notifyListeners(&game::GameListener::OnGameStateUpdate, game::GameState::EndGame); -} - -void ServerGame::OnGameClose() { - notifyListeners(&game::GameListener::OnGameStateUpdate, game::GameState::Closed); -} - void ServerGame::OnGameBegin() { notifyListeners(&game::GameListener::OnGameStateUpdate, game::GameState::Game); startGame(); } +void ServerGame::OnGameEnd() { + notifyListeners(&game::GameListener::OnGameStateUpdate, game::GameState::EndGame); + m_EndGameCooldown.applyCooldown(); +} + +void ServerGame::OnGameClose() { + notifyListeners(&game::GameListener::OnGameStateUpdate, game::GameState::Closed); + // Disconnect clients + protocol::DisconnectPacket packet("Game finished"); + m_Server->broadcastPacket(&packet); +} + } // namespace game } // namespace td diff --git a/src/game/server/ServerWorld.cpp b/src/game/server/ServerWorld.cpp index 94fddd8..9b425ec 100644 --- a/src/game/server/ServerWorld.cpp +++ b/src/game/server/ServerWorld.cpp @@ -55,5 +55,16 @@ game::TowerPtr ServerWorld::placeTowerAt(game::TowerType type, std::int32_t x, s return tower; } +void ServerWorld::OnMobDie(game::Mob* mob) { + if (mob->OnDeath(this)) { // check if the mob is actually dead (slimes ...) + //reward players + game::Player* sender = m_Game->getPlayerById(mob->getSender()); + sender->addExp(mob->getStats()->getExpReward()); + + game::Player* killer = m_Game->getPlayerById(mob->getLastDamageTower()->getBuilder()); + killer->addGold(mob->getStats()->getMoneyCost()); + } +} + } // namespace server } // namespace td