feat: add end game disconnect

This commit is contained in:
2021-12-13 20:05:20 +01:00
parent 2148c0050c
commit 360258e4cf
6 changed files with 30 additions and 20 deletions

View File

@@ -232,7 +232,6 @@ public:
// MobListener // MobListener
virtual void OnMobDamage(Mob* target, float damage, Tower* source); virtual void OnMobDamage(Mob* target, float damage, Tower* source);
virtual void OnMobDie(Mob* mob);
virtual void OnMobCastleDamage(Mob* damager, TeamCastle* enemyCastle, float damage); virtual void OnMobCastleDamage(Mob* damager, TeamCastle* enemyCastle, float damage);
private: private:

View File

@@ -14,6 +14,7 @@ private:
Server* m_Server; Server* m_Server;
ServerWorld m_ServerWorld; ServerWorld m_ServerWorld;
utils::AutoTimer m_GoldMineTimer{ 1000, std::bind(&ServerGame::updateGoldMines, this) }; utils::AutoTimer m_GoldMineTimer{ 1000, std::bind(&ServerGame::updateGoldMines, this) };
utils::CooldownTimer m_EndGameCooldown{ 1000 * 10 };
public: public:
ServerGame(Server* server); ServerGame(Server* server);
~ServerGame() {} ~ServerGame() {}

View File

@@ -21,6 +21,8 @@ public:
void spawnMobs(game::MobType type, std::uint8_t level, game::PlayerID sender, std::uint8_t count); 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); 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 } // namespace server

View File

@@ -221,17 +221,6 @@ bool World::CanPlaceBigTower(const glm::vec2& worldPos, PlayerID playerID) const
return false; 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() { void World::cleanDeadMobs() {
// safely remove mobs when unused // safely remove mobs when unused
for (std::size_t i = 0; i < m_Mobs.size(); i++) { for (std::size_t i = 0; i < m_Mobs.size(); i++) {

View File

@@ -12,6 +12,10 @@ void ServerGame::tick(std::uint64_t delta) {
if (m_GameState == game::GameState::Game) { if (m_GameState == game::GameState::Game) {
Game::tick(delta); Game::tick(delta);
updatePlayerStats(); 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); 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() { void ServerGame::OnGameBegin() {
notifyListeners(&game::GameListener::OnGameStateUpdate, game::GameState::Game); notifyListeners(&game::GameListener::OnGameStateUpdate, game::GameState::Game);
startGame(); 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 game
} // namespace td } // namespace td

View File

@@ -55,5 +55,16 @@ game::TowerPtr ServerWorld::placeTowerAt(game::TowerType type, std::int32_t x, s
return tower; 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 server
} // namespace td } // namespace td