diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 63af3afc..946b1a0c 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -4576,12 +4576,14 @@ void Human::FillMFSettlement(cs::SMGameOver* msg, cs::MFSettlement* s) s->set_temmate_all_dead(1); s->set_map_id(room->GetMapMeta()->i->map_id()); - s->set_map_name(""); + s->set_map_name(room->GetMapMeta()->i->map_name()); s->set_rank_chg(0); for (auto item : msg->spoils_items()) { - auto p = s->add_spoils_items(); - p->set_item_id(a8::XValue(item.values(0))); - p->set_item_num(a8::XValue(item.values(1))); + if (a8::XValue(item.values(1)).GetInt() > 0) { + auto p = s->add_spoils_items(); + p->set_item_id(a8::XValue(item.values(0))); + p->set_item_num(a8::XValue(item.values(1))); + } } if (room->IsPveRoom()) { @@ -4600,36 +4602,56 @@ void Human::FillMFSettlement(cs::SMGameOver* msg, cs::MFSettlement* s) } *s->mutable_reward() = msg->reward(); + std::vector stats; + { + for (auto& item : msg->player_stats()) { + stats.push_back(&item); + } + if (room->IsPveRoom()) { + std::sort(stats.begin(), stats.end(), + [] (const cs::MFPlayerStats* a, const cs::MFPlayerStats *b) -> bool + { + if (a->score() > b->score()) { + return true; + } + if (a->score() < b->score()) { + return false; + } + return a->player_id() < b->player_id(); + }); + } + } - for (auto item : msg->player_stats()) { + int i = 0; + for (auto item : stats) { + ++i; auto p = s->add_members_stats(); - p->set_id(item.player_id()); - p->set_account_id(item.account_id()); - p->set_name(item.nickname()); + p->set_id(item->player_id()); + p->set_account_id(item->account_id()); + p->set_name(item->nickname()); p->set_head(a8::XValue(avatar_url)); - p->set_head_frame(item.head_frame()); - p->set_sex(item.sex()); - p->set_hero_id(item.charid()); - p->set_dead(item.dead() ? 1 : 0); - p->set_is_myself(item.account_id() == account_id ? 1 : 0); + p->set_head_frame(item->head_frame()); + p->set_sex(item->sex()); + p->set_hero_id(item->charid()); + p->set_dead(item->dead() ? 1 : 0); + p->set_is_myself(item->account_id() == account_id ? 1 : 0); // p->set_is_mvp(0); if (room->IsPveRoom()) { - p->set_pve_order(0); - p->set_pve_score(item.score()); - // - p->set_pve_star(0); - p->set_pve_damage(item.damage_amount()); - p->set_pve_round(item.pve_wave()); - p->set_pve_revive(item.revive()); + p->set_pve_order(i); + p->set_pve_score(item->score()); + p->set_pve_star(room->pve_mode_meta->CalcStar(item->score())); + p->set_pve_damage(item->damage_amount()); + p->set_pve_round(item->pve_wave()); + p->set_pve_revive(item->revive()); } else { - p->set_pvp_kill(item.kills()); - p->set_pvp_damage(item.damage_amount()); - p->set_pvp_assist(item.assist()); - p->set_pvp_survia_time(item.time_alive()); - p->set_pvp_recover(item.heal_amount()); - p->set_pvp_rescue(item.rescue()); + p->set_pvp_kill(item->kills()); + p->set_pvp_damage(item->damage_amount()); + p->set_pvp_assist(item->assist()); + p->set_pvp_survia_time(item->time_alive()); + p->set_pvp_recover(item->heal_amount()); + p->set_pvp_rescue(item->rescue()); } } } diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 3437bd64..ef86a2de 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -1747,6 +1747,19 @@ namespace MetaData } } + int PveGeminiMode::CalcStar(int score) + { + int star = 0; + for (int i = 0; i < score_reward.size(); ++i) { + if (score >= score_reward[i]) { + star = i + 1; + } else { + break; + } + } + return star; + } + void SkillNumber::Init() { int_ratio = a8::XValue(pb->ratio()); diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index aef64aa4..836438de 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -479,6 +479,7 @@ namespace MetaData std::vector next_door; void Init(); + int CalcStar(int score); }; struct RankRoom