From c50633cbeae1ea8382e2c4cf49db7a8034792028 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 26 May 2020 15:42:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=AD=A6=E5=99=A8=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/human.cc | 32 +++++++++++++++++++++++++ server/gameserver/human.h | 1 + server/gameserver/metamgr.cc | 6 +++++ server/gameserver/metamgr.h | 1 + server/gameserver/playermgr.cc | 7 ++++++ server/gameserver/types.h | 1 + server/tools/protobuild/metatable.proto | 2 ++ 7 files changed, 50 insertions(+) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 862230e..aadc738 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -228,6 +228,12 @@ 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); @@ -2063,6 +2069,32 @@ 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 && rank_reward_meta->i->drop() > 0) { + if (rand() % 100 < rank_reward_meta->i->drop()) { + MetaData::Equip* item_meta = MetaMgr::Instance()->GetEquip(grow_weapon.weapon_id); + if (item_meta) { + MetaData::Drop* drop_meta = MetaMgr::Instance()->GetDrop(item_meta->i->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}); + } + } + } + } + }//end if rank_reward_meta + 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/human.h b/server/gameserver/human.h index db3f41a..3f9dc68 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -119,6 +119,7 @@ class Human : public Entity long long send_msg_times = 0; Weapon spec_weapon; + Weapon grow_weapon; std::map weapon_configs; std::map skin_configs; diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 895bcab..4c03f73 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -503,6 +503,12 @@ MetaData::Dress* MetaMgr::RandDress() return loader_->dress_vec[rand() % loader_->dress_vec.size()]; } +MetaData::RankReward* MetaMgr::GetRankReward(int rank) +{ + auto itr = loader_->rankreward_hash.find(rank); + return itr != loader_->rankreward_hash.end() ? itr->second : nullptr; +} + float MetaMgr::GetRankRewardParam(int rank) { auto itr = loader_->rankreward_hash.find(rank); diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index fbe222a..8a31ffd 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/gameserver/playermgr.cc b/server/gameserver/playermgr.cc index 471691b..77e6fcb 100644 --- a/server/gameserver/playermgr.cc +++ b/server/gameserver/playermgr.cc @@ -79,6 +79,13 @@ Player* PlayerMgr::CreatePlayerByCMJoin(long ip_saddr, int socket, const cs::CMJ hum->spec_weapon.ammo = weapon.ammo(); } } + for (auto& weapon : msg.grow_weapons()) { + if (weapon.weapon_id() != 0) { + hum->grow_weapon.weapon_id = weapon.weapon_id(); + hum->grow_weapon.weapon_lv = weapon.weapon_lv(); + hum->grow_weapon.ammo = weapon.ammo(); + } + } for (auto& skin : msg.skins()) { if (skin.skin_id() != 0 && skin.skin_lv() > 0) { hum->skin_configs[skin.skin_id()] = skin.skin_lv(); diff --git a/server/gameserver/types.h b/server/gameserver/types.h index 32c9168..f4a1956 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -83,6 +83,7 @@ struct PlayerStats int gold = 0; int score = 0; + std::vector> items; int pass_score = 0; int rank_score = 0; diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index be3ca71..6e3560a 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -89,6 +89,7 @@ message Equip optional float rad = 36; //半径 optional float rad2 = 37; optional int32 buffid = 38; + optional int32 drop_id = 40; optional string inventory_slot = 31; //库存槽位 optional int32 _inventory_slot = 32; //库存槽位 @@ -210,6 +211,7 @@ message RankReward { optional int32 rank = 1; optional float parameter = 2; + optional int32 drop = 3; } message RankPoint