diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 5715a2b..2ae0958 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -88,7 +88,11 @@ void Human::FillMFPlayerStats(cs::MFPlayerStats* stats_pb) stats_pb->set_player_id(entity_uniid); stats_pb->set_player_avatar_url(avatar_url); - stats_pb->set_time_alive(dead_frameno * 1000.0f / SERVER_FRAME_RATE); + if (!dead) { + stats_pb->set_time_alive(room->frame_no * 1000.0f / SERVER_FRAME_RATE); + } else { + stats_pb->set_time_alive(dead_frameno * 1000.0f / SERVER_FRAME_RATE); + } stats_pb->set_kills(stats.kills); stats_pb->set_damage_amount(stats.damage_amount); stats_pb->set_heal_amount(stats.heal_amount); @@ -355,8 +359,8 @@ void Human::FillSMGameOver(cs::SMGameOver& msg) msg.set_team_id(0); msg.set_team_rank(rank); msg.set_team_allcnt(1); - msg.set_game_over(true); - msg.set_victory(false); + msg.set_game_over(room->game_over); + msg.set_victory(!dead); cs::MFPlayerStats* p = msg.add_player_stats(); FillMFPlayerStats(p); @@ -364,7 +368,7 @@ void Human::FillSMGameOver(cs::SMGameOver& msg) void Human::BeKill(int killer_id, const std::string& killer_name) { - if (!dead) { + if (!dead && !room->game_over) { Entity* hum = room->GetEntityByUniId(killer_id); if (hum && hum->entity_type == ET_Player) { ((Human*)hum)->stats.kills++; diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 2e2b6ab..d584eff 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -47,7 +47,6 @@ class Human : public Entity bool poisoning = false; long long poisoning_time = 0; long long dead_frameno = 0; - bool game_over = false; Weapon default_weapon; std::vector weapons; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index dfac55e..615003a 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -280,13 +280,6 @@ void Room::FillSMJoinedNotify(Player* self_hum, cs::SMJoinedNotify& msg) void Room::ResetFrameData() { frame_data.deleted_objects.clear(); - #if 0 - { - frame_data.explosions_hash.clear(); - frame_data.smokes_hash.clear(); - frame_data.emotes_hash.Clear(); - } - #endif frame_data.bullets.Clear(); frame_data.shots.Clear(); } @@ -674,10 +667,16 @@ void Room::UpdateGas() break; } if (gas_data.gas_mode != GasInactive) { + if (alive_count_ <= 1) { + game_over = true; + } for (auto& pair : human_hash_) { if (pair.second->dead) { continue; } + if (game_over) { + pair.second->send_gameover = true; + } bool b1 = CircleContainCircle(gas_data.pos_old, gas_data.gas_progress, pair.second->pos, diff --git a/server/gameserver/room.h b/server/gameserver/room.h index d36f302..29baf6b 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -22,6 +22,7 @@ public: RoomFrameData frame_data; long long frame_no = 0; GasData gas_data; + bool game_over = false; void Initialize(); void Update(int delta_time);