diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 12baafa..f8049e7 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -560,39 +560,45 @@ void Human::ResetAction() void Human::FillSMGameOver(cs::SMGameOver& msg) { - std::vector human_list; - room->TouchHumanList(a8::XParams(), - [&human_list] (Human* hum, a8::XParams& param) -> bool - { - if (hum->leave_frameno_ == 0 || - hum->leave_frameno_ > hum->room->battle_start_frameno_) { - human_list.push_back(hum); - } - return true; - }); - std::sort(human_list.begin(), human_list.end(), - [] (Human* a, Human* b ) - { - if (a->dead_frameno == b->dead_frameno) { - return a->entity_uniid < b->entity_uniid; - } else { - return a->dead_frameno == 0 || - (b->dead_frameno != 0 && a->dead_frameno > b->dead_frameno); - } - }); - int rank = human_list.size(); - for (size_t i = 0; i < human_list.size(); ++i) { - if (human_list[i] == this) { - rank = i + 1; - break; + if (stats.rank <= 0) { + std::vector human_list; + room->TouchHumanList(a8::XParams(), + [&human_list] (Human* hum, a8::XParams& param) -> bool + { + if (hum->leave_frameno_ == 0 || + hum->leave_frameno_ > hum->room->battle_start_frameno_) { + human_list.push_back(hum); + } + return true; + }); + std::sort(human_list.begin(), human_list.end(), + [] (Human* a, Human* b ) + { + if (a->dead_frameno == b->dead_frameno) { + return a->entity_uniid < b->entity_uniid; + } else { + return a->dead_frameno == 0 || + (b->dead_frameno != 0 && a->dead_frameno > b->dead_frameno); + } + }); + int rank = human_list.size(); + for (size_t i = 0; i < human_list.size(); ++i) { + if (human_list[i] == this) { + rank = i + 1; + break; + } } - } - if (!dead && room->GetAliveTeamNum() == 1) { - rank = 1; + if (room->GetAliveTeamNum() == 1) { + std::set* alive_team = room->GetAliveTeam(); + if (alive_team == team_members) { + rank = 1; + } + } + stats.rank = rank; } msg.set_team_id(team_id); - msg.set_team_rank(rank); + msg.set_team_rank(stats.rank); msg.set_team_allcnt(1); msg.set_game_over(room->game_over); msg.set_victory(!dead); @@ -713,15 +719,15 @@ void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id) } } if (room->GetAliveTeamNum() == 1) { - std::set* members = room->GetAliveTeam(); - if (members) { - for (Human* member : *members) { + std::set* alive_team = room->GetAliveTeam(); + if (team_members != alive_team) { + SendGameOver(); + } + if (alive_team) { + for (Human* member : *alive_team) { member->SendGameOver(); } } - if (team_members != members) { - SendGameOver(); - } } DeadDrop(); } diff --git a/server/gameserver/types.h b/server/gameserver/types.h index ae13dbc..d95fe21 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -87,6 +87,7 @@ struct PlayerStats std::string killer_name; int weapon_id = 0; + int rank = 0; }; struct Plane