diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 978ff42..c777f1b 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -229,6 +229,11 @@ void Human::FillMFPlayerStats(cs::MFPlayerStats* stats_pb) stats_pb->set_account_id(account_id); + for (auto& pair : stats.items) { + auto p = stats_pb->add_items(); + p->set_key(pair.first); + p->set_value(pair.second); + } for (auto& pair : stats.extra_drop) { auto p = stats_pb->add_extra_drop(); p->set_key(pair.first); @@ -2159,6 +2164,30 @@ void Human::GenBattleReportData(a8::MutableXObject* params) stats.gold = coin_num; params->SetVal("coin_num", coin_num); } + { + std::string items_str; + MetaData::RankReward* rank_reward_meta = MetaMgr::Instance()->GetRankReward(rank); + if (rank_reward_meta) { + int drop_id = rank_reward_meta->RandDrop(); + if (drop_id != 0) { + MetaData::Drop* drop_meta = MetaMgr::Instance()->GetDrop(drop_id); + if (drop_meta) { + std::vector> drop_items; + drop_meta->RandItems(drop_items); + for (auto& item : drop_items) { + int item_id = std::get<0>(item); + int item_num = std::get<1>(item); + stats.items.push_back(std::make_pair( + item_id, + item_num + )); + items_str += a8::Format("%d:%d|", {item_id, item_num}); + } + } + } + } + params->SetVal("items", items_str); + } { stats.pass_score = MetaMgr::Instance()->GetKillPointParam1(stats.kills); stats.pass_score += MetaMgr::Instance()->GetRankPointParam1(rank); diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index fb39525..b9e99b2 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -487,4 +487,28 @@ namespace MetaData return 0; } + void RankReward::Init() + { + std::vector strings; + a8::Split(i->drop(), strings, ':'); + if (strings.size() < 2) { + drop.push_back(std::make_tuple( + a8::XValue(strings[0]), + a8::XValue(strings[1]) + )); + } + } + + int RankReward::RandDrop() + { + for (auto& tuple : drop) { + int drop_id = std::get<0>(tuple); + int rnd = std::get<1>(tuple); + if (rand() % 100 < rnd) { + return drop_id; + } + } + return 0; + } + } diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 3195f5d..4600c67 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -196,6 +196,11 @@ namespace MetaData struct RankReward { const metatable::RankReward* i = nullptr; + + void Init(); + int RandDrop(); + private: + std::vector> drop; }; struct KillReward diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index db16d41..2ab5284 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -354,6 +354,7 @@ private: for (auto& meta : rankreward_meta_list) { MetaData::RankReward& item = a8::FastAppend(rankreward_list); item.i = &meta; + item.Init(); rankreward_hash[item.i->rank()] = &item; } @@ -538,6 +539,12 @@ MetaData::Dress* MetaMgr::GetDress(int dress_id) return itr != loader_->dress_hash.end() ? itr->second : nullptr; } +MetaData::RankReward* MetaMgr::GetRankReward(int rank) +{ + auto itr = loader_->rankreward_hash.find(rank); + return itr != loader_->rankreward_hash.end() ? itr->second : nullptr; +} + MetaData::Dress* MetaMgr::RandDress() { if (loader_->dress_vec.empty()) { diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 44856d4..1140fc0 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -37,6 +37,7 @@ class MetaMgr : public a8::Singleton MetaData::Attr* GetAttrByName(const std::string& attr_name); MetaData::Dress* GetDress(int dress_id); MetaData::Dress* RandDress(); + MetaData::RankReward* GetRankReward(int rank); float GetRankRewardParam(int rank); float GetKillRewardParam(int kill_num); int GetRankPointParam1(int rank); diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index be3ca71..4b9cf92 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -210,6 +210,7 @@ message RankReward { optional int32 rank = 1; optional float parameter = 2; + optional string drop = 3; } message RankPoint