From 6ec964885fa3c9746944593170dfbf22d8bf668d Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 28 May 2022 22:11:35 +0800 Subject: [PATCH] 1 --- server/gameserver/human.cc | 145 ++++++++++++++++++++++++++++++++++++- server/gameserver/types.cc | 24 ++++++ server/gameserver/types.h | 3 + 3 files changed, 171 insertions(+), 1 deletion(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 6db732fb..cfd15232 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -40,8 +40,151 @@ const int kReviveTimeAdd = 12; const int kSkinNum = 4; -void PlayerStats::Statement(Human* hum) +void PlayerStats::Statement(Human* sender) { + auto topxFunc = + [sender] (std::function cmpFunc) -> double + { + std::vector> rank_list; + sender->room->TraverseHumanList + (a8::XParams(), + [cmpFunc, &rank_list] (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 (!found) { + rank_list.push_back(std::vector({hum})); + } + return true; + }); + std::sort + (rank_list.begin(), rank_list.end(), + [cmpFunc] (std::vector& a, std::vector& b ) + { + return cmpFunc(a[0], b[0]) > 0; + }); + + int rank = rank_list.size(); + for (int i = 0; i < rank_list.size(); ++i){ + bool found = false; + for (Human* hum : rank_list[i]) { + if (hum == sender){ + rank = i + 1; + found = true; + break; + } + } + if (found) { + break; + } + } + + double topx = (double)rank / rank_list.size(); + return topx; + }; + + sender->stats.ranked_topx = (double)sender->stats.rank / sender->room->GetHumanNum(); + sender->stats.kills_topx = topxFunc + ( + [] (Human* a, Human* b) -> int + { + if (a->stats.kills == b->stats.kills) { + return 0; + } else if (a->stats.kills > b->stats.kills) { + return 1; + } else { + return -1; + } + } + ); + sender->stats.hero_topx = topxFunc + ( + [] (Human* a, Human* b) -> int + { + long long a_value = 0; + long long b_value = 0; + if (a->GetBattleContext()) { + int hero_lv = 0; + int quality = 0; + a->GetBattleContext()->GetHeroLvQualit(hero_lv, quality); + a_value = hero_lv + quality; + } + if (b->GetBattleContext()) { + int hero_lv = 0; + int quality = 0; + b->GetBattleContext()->GetHeroLvQualit(hero_lv, quality); + b_value = hero_lv + quality; + } + if (a_value == b_value) { + return 0; + } else if (a_value > b_value) { + return 1; + } else { + return -1; + } + } + ); + sender->stats.weapon_topx = topxFunc + ( + [] (Human* a, Human* b) -> int + { + long long a_value = 0; + long long b_value = 0; + if (a->GetBattleContext()) { + int weapon_lv = 0; + int quality = 0; + a->GetBattleContext()->GetWeaponLvQualit(weapon_lv, quality); + a_value = weapon_lv + quality; + } + if (b->GetBattleContext()) { + int weapon_lv = 0; + int quality = 0; + b->GetBattleContext()->GetWeaponLvQualit(weapon_lv, quality); + b_value = weapon_lv + quality; + } + if (a_value == b_value) { + return 0; + } else if (a_value > b_value) { + return 1; + } else { + return -1; + } + } + ); + sender->stats.survival_topx = topxFunc + ( + [] (Human* a, Human* b) -> int + { + if (a->dead && b->dead) { + if (a->dead_frameno == b->dead_frameno) { + return 0; + } else if (a->dead_frameno > b->dead_frameno) { + return 1; + } else { + return -1; + } + } else { + if (!(a->dead && b->dead)) { + if (a->GetUniId() > b->GetUniId()) { + return 1; + } else { + return -1; + } + } else { + if (!a->dead) { + return 1; + } else { + return -1; + } + } + } + } + ); statemented = 1; } diff --git a/server/gameserver/types.cc b/server/gameserver/types.cc index d687b74c..8677e626 100644 --- a/server/gameserver/types.cc +++ b/server/gameserver/types.cc @@ -138,3 +138,27 @@ void BattleDataContext::ApplyAttr(std::array& attr_abs, } } } + +void BattleDataContext::GetHeroLvQualit(int& hero_lv, int& quality) +{ + hero_lv = 0; + quality = 0; + if (hero_uniid_) { + hero_lv = hero_dto->Get("hero_lv", 0).GetInt(); + quality = hero_dto->Get("quality", 0).GetInt(); + } +} + +void BattleDataContext::GetWeaponLvQualit(int& weapon_lv, int& quality) +{ + weapon_lv = 0; + quality = 0; + if (weapon_uniid1_) { + weapon_lv += weapon_dto1->Get("gun_lv", 0).GetInt(); + quality += weapon_dto1->Get("quality", 0).GetInt(); + } + if (weapon_uniid2_) { + weapon_lv += weapon_dto2->Get("gun_lv", 0).GetInt(); + quality += weapon_dto2->Get("quality", 0).GetInt(); + } +} diff --git a/server/gameserver/types.h b/server/gameserver/types.h index 656a74e1..b6e11cdd 100644 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -36,6 +36,9 @@ struct BattleDataContext float GetHeroAttrAbs(long long hero_uniid, int attr_id); float GetHeroAttrRate(long long hero_uniid, int attr_id); + void GetHeroLvQualit(int& hero_lv, int& quality); + void GetWeaponLvQualit(int& weapon_lv, int& quality); + float GetWeaponAttrAbs(long long weapon_uniid, int attr_id); float GetWeaponAttrRate(long long weapon_uniid, int attr_id);