This commit is contained in:
aozhiwei 2024-04-02 19:53:25 +08:00
parent 2682196a32
commit 26c38e41eb
2 changed files with 216 additions and 0 deletions

View File

@ -3916,4 +3916,15 @@ void Room::GenBattleRoomReportData(a8::MutableXObject* params)
params->SetVal("room_mode", GetReportRoomMode());
params->SetVal("map_mode", GetReportMapMode());
params->SetVal("map_id", GetMapMeta()->map_id());
auto teams_pb = a8::MutableXObject::CreateArray();
TraverseTeams
(
[&teams_pb] (Team* team) -> bool
{
auto team_pb = a8::MutableXObject::CreateObject();
teams_pb->Push(*team_pb);
return true;
}
);
params->SetVal("team_list", *teams_pb);
}

View File

@ -632,5 +632,210 @@ void Team::TrySendTeamBattleReport(Human* sender)
void Team::GenRoomReportData(a8::MutableXObject* params)
{
std::string battle_uuid;
params->SetVal("battle_uuid", battle_uuid);
params->SetVal("team_id", GetTeamId());
if (room->IsPveRoom()) {
params->SetVal("victory", room->pve_data.pve_kill_boss == 1 ? 1 : 0);
} else {
params->SetVal("victory", team_rank == 1 ? 1 : 0);
}
if (room->IsPveRoom()) {
params->SetVal("pve_settelement_type", 1);
params->SetVal("pve_instance_id", room->pve_instance->gemini_id());
params->SetVal("pve_wave", room->pve_data.GetPassedWave());
params->SetVal("pve_max_wave", room->pve_data.max_wave);
} else {
params->SetVal("pvp_settelement_type", 1);
params->SetVal("pvp_settelement_color", settlement_color);
params->SetVal("pvp_team_rank", team_rank);
params->SetVal("pvp_total_human_num", room->GetHumanNum());
params->SetVal("pvp_alive_human_num", room->AliveCount());
params->SetVal("pvp_total_team_num", room->GetTeamNum());
params->SetVal("pvp_match_mode", room->GetPvpMatchMode());
params->SetVal("pvp_team_kills", 0); //
}
{
auto teams_pb = a8::MutableXObject::CreateArray();
room->TraverseTeams
(
[teams_pb] (Team* team)
{
auto members_pb = a8::MutableXObject::CreateArray();
team->TraverseMembers
(
[members_pb] (Human* hum)
{
auto member_pb = a8::MutableXObject::CreateObject();
member_pb->SetVal("account_id", hum->account_id);
members_pb->Push(*member_pb);
return true;
});
auto team_pb = a8::MutableXObject::CreateObject();
team_pb->SetVal("team_id", team->GetTeamId());
team_pb->SetVal("members", *members_pb);
teams_pb->Push(*team_pb);
return true;
});
params->SetVal("team_list", *teams_pb);
}
{
int pvp_team_kills = 0;
auto members_pb = a8::MutableXObject::CreateArray();
std::vector<Human*> sorted_members;
TraverseMembers
(
[&sorted_members] (Human* hum) mutable
{
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);
if (hum->GetNetData()->GetSkinId() != 0) {
member_pb->SetVal("skin_id", hum->GetNetData()->GetSkinId());
} else {
member_pb->SetVal("skin_id", 0);
}
member_pb->SetVal("move_distance", hum->stats->move_distance);
member_pb->SetVal("full_level_idx", hum->stats->full_level_idx);
member_pb->SetVal("hero_level", hum->GetHeroLevel());
member_pb->SetVal("is_run_away", hum->stats->is_run_away);
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("game_duration", hum->stats->game_duration);
member_pb->SetVal("alive_time", hum->stats->alive_time);
member_pb->SetVal("ranked", 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);
member_pb->SetVal("abandon_battle", hum->stats->abandon_battle);
member_pb->SetVal("assist", hum->stats->assist);
{
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 if (room->IsMobaModeRoom()) {
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);
} 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("members", *members_pb);
if (room->IsMobaModeRoom()) {
params->SetVal("moba_my_team_kills", GetKillCount());
if (room->GetMobaTeamA() == this) {
params->SetVal("moba_enemy_team_kills", room->GetMobaTeamB()->GetKillCount());
} else {
params->SetVal("moba_enemy_team_kills", room->GetMobaTeamA()->GetKillCount());
}
}
params->SetVal("pvp_team_kills", pvp_team_kills);
}
}