From 24998d2f0d3434190c430502aba1798809b7b588 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 1 Sep 2020 17:25:09 +0800 Subject: [PATCH] 1 --- server/gameserver/handlermgr.cc | 2 + server/gameserver/metadata.h | 1 + server/gameserver/metamgr.cc | 4 ++ server/gameserver/metamgr.h | 3 + server/gameserver/player.cc | 83 ++++++++++++++++++++++++++ server/gameserver/player.h | 7 +++ server/tools/protobuild/cs_msgid.proto | 4 ++ server/tools/protobuild/cs_proto.proto | 28 +++++++++ 8 files changed, 132 insertions(+) diff --git a/server/gameserver/handlermgr.cc b/server/gameserver/handlermgr.cc index fc2f4c0..efdc4ed 100644 --- a/server/gameserver/handlermgr.cc +++ b/server/gameserver/handlermgr.cc @@ -97,6 +97,8 @@ void HandlerMgr::RegisterNetMsgHandlers() RegisterNetMsgHandler(&ggmsghandler, &Player::_CMAdStart); RegisterNetMsgHandler(&ggmsghandler, &Player::_CMAdCancel); RegisterNetMsgHandler(&ggmsghandler, &Player::_CMAdEnd); + RegisterNetMsgHandler(&ggmsghandler, &Player::_CMGetBoxInfo); + RegisterNetMsgHandler(&ggmsghandler, &Player::_CMOpenBox); } void HandlerMgr::ProcGMMsg(unsigned long saddr, int sockhandle, diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 3da5088..a7739f4 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -110,6 +110,7 @@ namespace MetaData const metatable::Drop* i = nullptr; void Init(); + //0:item_id 1:item_num 2:weight void RandItems(std::vector>& drop_items); private: diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 35f448d..2adab43 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -203,6 +203,10 @@ public: MetaMgr::Instance()->zbmode_player_num) { abort(); } + { + METAMGR_READ(prebattle_box_id_chiji, 0); + METAMGR_READ(prebattle_box_id_zb, 0); + } { METAMGR_READ(newbie_first_robot_ammo, 3); METAMGR_READ(newbie_first_robot_appeartime, 8); diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 08707af..76a9aae 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -134,6 +134,9 @@ class MetaMgr : public a8::Singleton MetaData::Player* android_meta = nullptr; MetaData::Player* terminator_meta = nullptr; + int prebattle_box_id_chiji = 0; + int prebattle_box_id_zb = 0; + private: MetaDataLoader* loader_ = nullptr; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 245de3c..d2f2e11 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1301,6 +1301,60 @@ void Player::_CMAdEnd(f8::MsgHdr& hdr, const cs::CMAdEnd& msg) InternalAdOk(); } +void Player::_CMGetBoxInfo(f8::MsgHdr& hdr, const cs::CMGetBoxInfo& msg) +{ + cs::SMGetBoxInfo respmsg; + respmsg.set_box_id(msg.box_id()); + std::vector>* items = GetBox(msg.box_id()); + if (items) { + for (auto& tuple : *items) { + auto p = respmsg.add_items(); + p->add_values(std::get<0>(tuple)); + p->add_values(std::get<1>(tuple)); + } + } + SendNotifyMsg(respmsg); +} + +void Player::_CMOpenBox(f8::MsgHdr& hdr, const cs::CMOpenBox& msg) +{ + cs::SMOpenBox respmsg; + respmsg.set_box_id(msg.box_id()); + respmsg.set_errcode(0); + if (msg.box_id() == 1) { + if (receved_box_hash_.find(msg.box_id()) == receved_box_hash_.end()) { + std::vector>* items = GetBox(msg.box_id()); + if (items) { + for (auto& tuple : *items) { + MetaData::Equip* item_meta = MetaMgr::Instance()->GetEquip(std::get<0>(tuple)); + if (item_meta) { + auto p = respmsg.add_items(); + p->add_values(std::get<0>(tuple)); + p->add_values(std::get<1>(tuple)); + if (item_meta->i->_inventory_slot() >= 0 && + item_meta->i->_inventory_slot() < IS_END) { + if (GetInventory(item_meta->i->_inventory_slot()) < + GetVolume(item_meta->i->_inventory_slot())) { + int add_num = GetVolume(item_meta->i->_inventory_slot()) - + GetInventory(item_meta->i->_inventory_slot()); + add_num = std::min(std::get<1>(tuple), add_num); + + AddInventory(item_meta->i->_inventory_slot(), add_num); + } + } + } + } + need_sync_active_player = true; + } + receved_box_hash_.insert(msg.box_id()); + } else { + respmsg.set_errcode(1); + respmsg.set_errmsg("不能重复领取"); + } + } + SendNotifyMsg(respmsg); +} + void Player::InternalAdCancel() { if (GetBuffByEffectId(kBET_AdPlaying)) { @@ -1379,3 +1433,32 @@ void Player::ProcPreSettlementInfo(const std::string& pre_settlement_info) rank = a8::XValue(tmp_strings[3]); } } + +std::vector>* Player::GetBox(int box_id) +{ + if (box_id != 1) { + return nullptr; + } + { + auto itr = box_hash_.find(box_id); + if (itr != box_hash_.end()) { + return &itr->second; + } + } + int drop_id = 0; + if (room->GetRoomMode() == kZombieMode) { + drop_id = MetaMgr::Instance()->prebattle_box_id_chiji; + } else { + drop_id = MetaMgr::Instance()->prebattle_box_id_zb; + } + MetaData::Drop* drop_meta = MetaMgr::Instance()->GetDrop(drop_id); + if (drop_meta) { + std::vector> drop_items; + drop_meta->RandItems(drop_items); + box_hash_[box_id] = drop_items; + } + { + auto itr = box_hash_.find(box_id); + return itr != box_hash_.end() ? &itr->second : nullptr; + } +} diff --git a/server/gameserver/player.h b/server/gameserver/player.h index a9ecf9d..4d86f00 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -101,6 +101,8 @@ class Player : public Human void _CMAdStart(f8::MsgHdr& hdr, const cs::CMAdStart& msg); void _CMAdCancel(f8::MsgHdr& hdr, const cs::CMAdCancel& msg); void _CMAdEnd(f8::MsgHdr& hdr, const cs::CMAdEnd& msg); + void _CMGetBoxInfo(f8::MsgHdr& hdr, const cs::CMGetBoxInfo& msg); + void _CMOpenBox(f8::MsgHdr& hdr, const cs::CMOpenBox& msg); protected: Player(); @@ -109,6 +111,11 @@ private: void InternalAdCancel(); void InternalAdOk(); void InternalUpdate(int delta_time); + std::vector>* GetBox(int box_id); + +private: + std::map>> box_hash_; + std::set receved_box_hash_; friend class EntityFactory; }; diff --git a/server/tools/protobuild/cs_msgid.proto b/server/tools/protobuild/cs_msgid.proto index 42686a3..50ecbc3 100644 --- a/server/tools/protobuild/cs_msgid.proto +++ b/server/tools/protobuild/cs_msgid.proto @@ -18,6 +18,8 @@ enum CMMessageId_e _CMAdStart = 212; _CMAdCancel = 213; _CMAdEnd = 214; + _CMGetBoxInfo = 215; + _CMOpenBox = 216; } enum SMMessageId_e @@ -28,6 +30,8 @@ enum SMMessageId_e _SMWatchWar = 208; _SMLeave = 209; + _SMGetBoxInfo = 216; + _SMOpenBox = 217; _SMJoinedNotify = 103; _SMMapInfo = 1002; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 26d3cc9..3728d5c 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -857,6 +857,18 @@ message CMAdEnd optional int32 param = 1; //1:屠夫 2:南瓜 } +//获取宝箱信息 +message CMGetBoxInfo +{ + optional int32 box_id = 1; //1:战前宝箱 +} + +//获取宝箱信息 +message CMOpenBox +{ + optional int32 box_id = 1; //1: 战前宝箱 +} + //endcmmsg //观战error_code == 0 时关闭结算界面,回到战斗界面 @@ -959,6 +971,22 @@ message SMLeave { } +//获取宝箱信息回复 +message SMGetBoxInfo +{ + optional int32 box_id = 1; //1:战前宝箱 + repeated MFTuple items = 2; //values[0]:道具id values[1]:道具数量 +} + +//开宝箱回复 +message SMOpenBox +{ + optional int32 box_id = 1; //1: 战前宝箱 + optional int32 errcode = 2; //错误码 + optional string errmsg = 3; //错误描述 + repeated MFTuple items = 4; //values[0]:道具id values[1]:道具数量 +} + //断线通知 message SMDisconnectNotify {