From 55722adecd03a6edbfdb8027e1eaaa04b36c20ea Mon Sep 17 00:00:00 2001 From: azw Date: Wed, 22 Mar 2023 08:35:33 +0000 Subject: [PATCH] 1 --- server/gameserver/team.cc | 212 +++++++++++++++++++++----------------- 1 file changed, 116 insertions(+), 96 deletions(-) diff --git a/server/gameserver/team.cc b/server/gameserver/team.cc index 7fac0d42..9ec9596c 100644 --- a/server/gameserver/team.cc +++ b/server/gameserver/team.cc @@ -251,106 +251,126 @@ void Team::GenBattleReportData(a8::MutableXObject* params) int pvp_team_kills = 0; auto members_pb = a8::MutableXObject::CreateArray(); + std::vector sorted_members; TraverseMembers ( - [this, members_pb, &pvp_team_kills] (Human* hum) mutable + [&sorted_members] (Human* hum) mutable { - pvp_team_kills += hum->stats->kills; - - auto member_pb = a8::MutableXObject::CreateObject(); - member_pb->SetVal("account_id", hum->account_id); - member_pb->SetVal("name", hum->name); - member_pb->SetVal("head", a8::XValue(hum->avatar_url)); - member_pb->SetVal("head_frame", hum->head_frame); - member_pb->SetVal("sex", hum->sex); - member_pb->SetVal("dead", hum->dead); - member_pb->SetVal("is_mvp", 0); - - member_pb->SetVal("hero_id", hum->meta->id()); - member_pb->SetVal("hero_uniid", hum->hero_uniid); - //member_pb->SetVal("hero_quality", hum->hero_uniid); - member_pb->SetVal("game_time", hum->stats->game_time); - member_pb->SetVal("alive_time", hum->stats->alive_time); - member_pb->SetVal("rank", hum->stats->rank); - member_pb->SetVal("kills", hum->stats->kills); - member_pb->SetVal("damage_out", hum->stats->damage_amount_out); - member_pb->SetVal("weapon_uuid1", hum->spec_weapons.size() > 0 ? hum->spec_weapons[0].weapon_uniid : 0); - member_pb->SetVal("weapon_uuid2", hum->spec_weapons.size() > 1 ? hum->spec_weapons[1].weapon_uniid : 0); - member_pb->SetVal("rescue_teammate_times", hum->stats->rescue_member); - member_pb->SetVal("diving_times", hum->stats->diving_times); - member_pb->SetVal("damage_in", hum->stats->damage_amount_in); - member_pb->SetVal("recover_hp", hum->stats->heal_amount); - member_pb->SetVal("open_airdrop_times", hum->stats->open_airdrop_times); - member_pb->SetVal("use_medicine_times", hum->stats->use_medicine_times); - member_pb->SetVal("destory_car_times", hum->stats->destory_car_times); - member_pb->SetVal("use_camouflage_times", hum->stats->use_camouflage_times); - member_pb->SetVal("use_skill_times", hum->stats->use_skill_times); - member_pb->SetVal("ride_car_move_distance", hum->stats->ride_car_move_distance); - member_pb->SetVal("ride_car_kills", hum->stats->ride_car_kills); - member_pb->SetVal("max_hero_skill_lv", hum->stats->max_hero_skill_lv); - { - std::string weapons_type; - std::string weapons_slot; - for (auto& pair : hum->stats->weapon_stats) { - auto& weapon = pair.second; - if (weapon.kills || weapon.damage_out || weapon.obtain_count) { - weapons_type += a8::Format("%d:%d:%d:%d|", - { - weapon.weapon_id, - weapon.kills, - weapon.damage_out, - weapon.obtain_count - }); - } - if (weapon.use_times) { - weapons_slot += a8::Format("%d:%d|", - { - weapon.weapon_id, - weapon.use_times - }); - } - } - member_pb->SetVal("weapons_type", weapons_type); - member_pb->SetVal("weapons_slot", weapons_slot); - } - { - std::string heros; - for (auto& pair : hum->stats->hero_stats) { - auto& hero = pair.second; - if (hero.skill_lv || hero.weapon_lv) { - heros += a8::Format("%d:%d:%d|", - { - hero.hero_id, - hero.skill_lv, - hero.weapon_lv, - }); - } - } - member_pb->SetVal("heros", heros); - } - if (room->IsPveRoom()) { - member_pb->SetVal("pve_order", 0); - member_pb->SetVal("pve_score", hum->stats->pve_rank_score); - member_pb->SetVal("pve_star", room->pve_mode_meta->CalcStar(hum->stats->pve_rank_score)); - member_pb->SetVal("pve_damage", hum->stats->damage_amount_out); - member_pb->SetVal("pve_revive", hum->stats->revive); - member_pb->SetVal("pve_survia_time", hum->stats->alive_time); - member_pb->SetVal("pve_wave", hum->stats->pve_wave); - member_pb->SetVal("pve_max_wave", room->pve_data.max_wave); - member_pb->SetVal("pve_boss_killed", hum->stats->pve_kill_boss); - member_pb->SetVal("pve_rank_score", hum->stats->pve_rank_score); - } else { - member_pb->SetVal("pvp_kill", hum->stats->kills); - member_pb->SetVal("pvp_damage", hum->stats->damage_amount_out); - member_pb->SetVal("pvp_assist", hum->stats->assist); - member_pb->SetVal("pvp_survia_time", hum->stats->alive_time); - member_pb->SetVal("pvp_recover", hum->stats->heal_amount); - member_pb->SetVal("pvp_rescue", hum->stats->rescue_member); - member_pb->SetVal("pvp_personal_rank", hum->stats->rank); - } - members_pb->Push(*member_pb); + sorted_members.push_back(hum); return true; - }); + } + ); + if (room->IsPveRoom()) { + std::sort(sorted_members.begin(), sorted_members.end(), + [] (Human* a, Human* b) -> bool + { + if (a->stats->pve_rank_score > b->stats->pve_rank_score) { + return true; + } + if (a->stats->pve_rank_score < b->stats->pve_rank_score) { + return false; + } + return a->GetUniId() < b->GetUniId(); + }); + } + int i = 0; + for (Human* hum : sorted_members) { + ++i; + pvp_team_kills += hum->stats->kills; + + auto member_pb = a8::MutableXObject::CreateObject(); + member_pb->SetVal("account_id", hum->account_id); + member_pb->SetVal("name", hum->name); + member_pb->SetVal("head", a8::XValue(hum->avatar_url)); + member_pb->SetVal("head_frame", hum->head_frame); + member_pb->SetVal("sex", hum->sex); + member_pb->SetVal("dead", hum->dead); + member_pb->SetVal("is_mvp", 0); + + member_pb->SetVal("hero_id", hum->meta->id()); + member_pb->SetVal("hero_uniid", hum->hero_uniid); + //member_pb->SetVal("hero_quality", hum->hero_uniid); + member_pb->SetVal("game_time", hum->stats->game_time); + member_pb->SetVal("alive_time", hum->stats->alive_time); + member_pb->SetVal("rank", hum->stats->rank); + member_pb->SetVal("kills", hum->stats->kills); + member_pb->SetVal("damage_out", hum->stats->damage_amount_out); + member_pb->SetVal("weapon_uuid1", hum->spec_weapons.size() > 0 ? hum->spec_weapons[0].weapon_uniid : 0); + member_pb->SetVal("weapon_uuid2", hum->spec_weapons.size() > 1 ? hum->spec_weapons[1].weapon_uniid : 0); + member_pb->SetVal("rescue_teammate_times", hum->stats->rescue_member); + member_pb->SetVal("diving_times", hum->stats->diving_times); + member_pb->SetVal("damage_in", hum->stats->damage_amount_in); + member_pb->SetVal("recover_hp", hum->stats->heal_amount); + member_pb->SetVal("open_airdrop_times", hum->stats->open_airdrop_times); + member_pb->SetVal("use_medicine_times", hum->stats->use_medicine_times); + member_pb->SetVal("destory_car_times", hum->stats->destory_car_times); + member_pb->SetVal("use_camouflage_times", hum->stats->use_camouflage_times); + member_pb->SetVal("use_skill_times", hum->stats->use_skill_times); + member_pb->SetVal("ride_car_move_distance", hum->stats->ride_car_move_distance); + member_pb->SetVal("ride_car_kills", hum->stats->ride_car_kills); + member_pb->SetVal("max_hero_skill_lv", hum->stats->max_hero_skill_lv); + { + std::string weapons_type; + std::string weapons_slot; + for (auto& pair : hum->stats->weapon_stats) { + auto& weapon = pair.second; + if (weapon.kills || weapon.damage_out || weapon.obtain_count) { + weapons_type += a8::Format("%d:%d:%d:%d|", + { + weapon.weapon_id, + weapon.kills, + weapon.damage_out, + weapon.obtain_count + }); + } + if (weapon.use_times) { + weapons_slot += a8::Format("%d:%d|", + { + weapon.weapon_id, + weapon.use_times + }); + } + } + member_pb->SetVal("weapons_type", weapons_type); + member_pb->SetVal("weapons_slot", weapons_slot); + } + { + std::string heros; + for (auto& pair : hum->stats->hero_stats) { + auto& hero = pair.second; + if (hero.skill_lv || hero.weapon_lv) { + heros += a8::Format("%d:%d:%d|", + { + hero.hero_id, + hero.skill_lv, + hero.weapon_lv, + }); + } + } + member_pb->SetVal("heros", heros); + } + if (room->IsPveRoom()) { + member_pb->SetVal("pve_order", i); + member_pb->SetVal("pve_score", hum->stats->pve_rank_score); + member_pb->SetVal("pve_star", room->pve_mode_meta->CalcStar(hum->stats->pve_rank_score)); + member_pb->SetVal("pve_damage", hum->stats->damage_amount_out); + member_pb->SetVal("pve_revive", hum->stats->revive); + member_pb->SetVal("pve_survia_time", hum->stats->alive_time); + member_pb->SetVal("pve_wave", hum->stats->pve_wave); + member_pb->SetVal("pve_max_wave", room->pve_data.max_wave); + member_pb->SetVal("pve_boss_killed", hum->stats->pve_kill_boss); + member_pb->SetVal("pve_rank_score", hum->stats->pve_rank_score); + } else { + member_pb->SetVal("pvp_kill", hum->stats->kills); + member_pb->SetVal("pvp_damage", hum->stats->damage_amount_out); + member_pb->SetVal("pvp_assist", hum->stats->assist); + member_pb->SetVal("pvp_survia_time", hum->stats->alive_time); + member_pb->SetVal("pvp_recover", hum->stats->heal_amount); + member_pb->SetVal("pvp_rescue", hum->stats->rescue_member); + member_pb->SetVal("pvp_personal_rank", hum->stats->rank); + } + members_pb->Push(*member_pb); + }; params->SetVal("pvp_team_kills", pvp_team_kills); }