From af77448d8b34c262005b89c73a9d17c8e4f81813 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 7 Apr 2023 14:02:04 +0800 Subject: [PATCH] 1 --- server/gameserver/room.cc | 57 +++++++++++++++++++++++++++++++++++++-- server/gameserver/room.h | 1 + 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index ff50fddf..3f74e9e8 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1023,8 +1023,7 @@ void Room::OnPlayerOffline(Player* hum) { if (a8::TIMER_EXEC_EVENT == event) { if (GetOnlinePlayerNum() <= 0 && !added_to_over_room) { - GameLog::Instance()->ForceOver(this); - RoomMgr::Instance()->AddOverRoom(room_uuid_); + ForceOver(); } } }, @@ -3660,3 +3659,57 @@ int Room::GetPvpMatchMode() { return GetRoomMode() == kPvpRankMode ? 1 : 0; } + +void Room::ForceOver() +{ + if (added_to_over_room) { + return; + } + std::vector alive_teams; + TraverseTeams + ( + [&alive_teams] (Team* team) + { + if (team->HasAliveMember()) { + alive_teams.push_back(team); + } + return true; + }); + std::sort(alive_teams.begin(), alive_teams.end(), + [] (Team* a, Team *b) -> bool + { + if (a->HasPlayer()) { + return true; + } + return false; + }); + for (Team* team : alive_teams) { + team->TraverseMembers + ( + [] (Human* member) + { + if (!member->dead) { + member->BeKill(VP_Gas, + TEXT("battle_server_killer_gas", "毒圈"), + VW_Gas, + VP_Gas, + TEXT("battle_server_killer_gas", "毒圈")); + } + return true; + }); + } + GameLog::Instance()->ForceOver(this); + xtimer.SetTimeoutEx + (SERVER_FRAME_RATE * 5, + [this] (int event, const a8::Args* args) + { + if (a8::TIMER_EXEC_EVENT == event) { + if (!game_over_) { + game_over_ = true; + game_over_frameno_ = GetFrameNo(); + OnGameOver(); + } + } + }, + &xtimer_attacher_); +} diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 465d7bdc..e184ca03 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -235,6 +235,7 @@ public: Team* GetVictoryTeam() { return victory_team_;}; int GetReportRoomMode(); int GetPvpMatchMode(); + void ForceOver(); private: void ShuaAndroid();