diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 5800a29f..ae1c882c 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -62,18 +62,25 @@ #include "pbutils.h" -static double TopXFunc (Human* sender, std::function cmpFunc) +static double TopXFunc (Human* sender, + std::function cmpFunc, + bool need_group, + std::function validFunc) { std::vector> rank_list; + double topx = 0.0f; + #if 0 sender->room->TraverseHumanList - ( - [cmpFunc, &rank_list] (Human* hum) -> bool + (a8::XParams(), + [cmpFunc, &rank_list, need_group] (Human* hum, a8::XParams& param) -> bool { bool found = false; - for (auto& list : rank_list) { - if (cmpFunc(list[0], hum) == 0) { - list.push_back(hum); - found = true; + if (need_group) { + for (auto& list : rank_list) { + if (cmpFunc(list[0], hum) == 0) { + list.push_back(hum); + found = true; + } } } if (!found) { @@ -85,6 +92,15 @@ static double TopXFunc (Human* sender, std::function cmpFu (rank_list.begin(), rank_list.end(), [cmpFunc] (const std::vector& a, const std::vector& b ) { + a8::XPrintf("id1:%d dead:%d id2:%d dead:%d cmpRet:%d\n", + { + a[0]->GetUniId(), + a[0]->dead ? 1 :0, + + b[0]->GetUniId(), + b[0]->dead ? 1 :0, + cmpFunc(a[0], b[0]) + }); return cmpFunc(a[0], b[0]) > 0; }); @@ -103,13 +119,21 @@ static double TopXFunc (Human* sender, std::function cmpFu } } +#if 1 + double topx = (double)rank / 40.0f; + if (!validFunc(sender)) { + topx = 40.0f / 40.0f; + } +#else double topx = (double)rank / rank_list.size(); +#endif +#endif return topx; }; void PlayerStats::Statement(Human* sender) { - sender->stats.ranked_topx = (double)sender->stats.rank / sender->room->GetHumanNum(); +sender->stats.ranked_topx = (double)sender->stats.rank / sender->room->GetHumanNum(); sender->stats.kills_topx = TopXFunc ( sender, @@ -122,6 +146,11 @@ void PlayerStats::Statement(Human* sender) } else { return -1; } + }, + true, + [] (Human* hum) + { + return hum->stats.kills > 0; } ); sender->stats.hero_topx = TopXFunc @@ -150,6 +179,17 @@ void PlayerStats::Statement(Human* sender) } else { return -1; } + }, + true, + [] (Human* hum) + { + if (hum->GetBattleContext()) { + int hero_lv = 0; + int quality = 0; + hum->GetBattleContext()->GetHeroLvQuality(hero_lv, quality); + return hero_lv + quality > 0; + } + return false; } ); sender->stats.weapon_topx = TopXFunc @@ -178,6 +218,17 @@ void PlayerStats::Statement(Human* sender) } else { return -1; } + }, + true, + [] (Human* hum) + { + if (hum->GetBattleContext()) { + int weapon_lv = 0; + int quality = 0; + hum->GetBattleContext()->GetWeaponLvQuality(weapon_lv, quality); + return weapon_lv + quality > 0; + } + return false; } ); sender->stats.survival_topx = TopXFunc @@ -194,12 +245,8 @@ void PlayerStats::Statement(Human* sender) return -1; } } else { - if (!(a->dead && b->dead)) { - if (a->GetUniId() > b->GetUniId()) { - return 1; - } else { - return -1; - } + if (!a->dead && !b->dead) { + return 0; } else { if (!a->dead) { return 1; @@ -208,6 +255,11 @@ void PlayerStats::Statement(Human* sender) } } } + }, + true, + [] (Human* hum) + { + return true; } ); if (sender->GetBattleContext()) {