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/human.cc b/server/gameserver/human.cc index 89ab99d..fb4173c 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2540,10 +2540,17 @@ void Human::SendBattleReport() } } else { if (JsonDataMgr::Instance()->channel != 0) { - url = a8::Format("http://game2004api.kingsome.cn/%d/webapp/index.php?c=Role&a=battleReport", - { - JsonDataMgr::Instance()->channel - }); + if (kTouTiaoChannelId == JsonDataMgr::Instance()->channel) { + url = a8::Format("http://game2004api-al.kingsome.cn/%d/webapp/index.php?c=Role&a=battleReport", + { + JsonDataMgr::Instance()->channel + }); + } else { + url = a8::Format("http://game2004api.kingsome.cn/%d/webapp/index.php?c=Role&a=battleReport", + { + JsonDataMgr::Instance()->channel + }); + } } else { url = "http://game2004api.kingsome.cn/webapp/index.php?c=Role&a=battleReport"; } @@ -2632,6 +2639,7 @@ void Human::ProcLootCar(Loot* entity, MetaData::Equip* item_meta) if (car_.meta->i->buffid()) { RemoveBuffById(car_.meta->i->buffid()); } + car_weapon = Weapon(); } car_.car_uniid = entity->GetEntityUniId(); car_.car_id = item_meta->i->id(); 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..de02cd6 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1301,6 +1301,81 @@ 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); + } + } else { + switch (item_meta->i->equip_type()) { + case 7: + { + //背包 + if (backpack == 0) { + MetaData::Equip* old_item_meta = MetaMgr::Instance()->GetEquip(backpack); + if (old_item_meta) { + if (old_item_meta->i->equip_lv() >= item_meta->i->equip_lv()) { + break; + } + room->DropItem(GetPos(), old_item_meta->i->id(), 1, 1); + } + backpack = item_meta->i->id(); + RecalcVolume(); + } + } + break; + default: + break; + } + } + } + } + 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 +1454,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_zb; + } else { + drop_id = MetaMgr::Instance()->prebattle_box_id_chiji; + } + 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/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index c51ab1a..d901f24 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -175,6 +175,7 @@ void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg) msg.account_id() }); } + OnJoinRoomOk(msg, hum); } void RoomMgr::_CMReconnect(f8::MsgHdr& hdr, const cs::CMReconnect& msg) @@ -544,3 +545,93 @@ bool RoomMgr::IsGM(const std::string& account_id) { return gm_hash_.find(account_id) != gm_hash_.end(); } + +std::string RoomMgr::GenTeamHashData(const std::string& team_uuid, std::map* team_hash) +{ + std::string data; + data += a8::Format("team_uuid:%s ", {team_uuid}); + for (auto pair : *team_hash) { + data += a8::Format("%s->%d ", {pair.first, pair.second}); + } + return data; +} + +void RoomMgr::OnJoinRoomOk(const cs::CMJoin& msg, Player* hum) +{ + if (msg.team_members().size() <= 1) { + return; + } + std::map* team_hash = nullptr; + { + auto itr = team_room_hash_.find(msg.team_uuid()); + if (itr == team_room_hash_.end()) { + team_room_hash_[msg.team_uuid()] = std::map(); + itr = team_room_hash_.find(msg.team_uuid()); + team_hash = &itr->second; + for (auto& team_member : msg.team_members()) { + team_hash->insert(std::make_pair(team_member.account_id(), 0)); + } + a8::Timer::Instance()->AddDeadLineTimer + (1000 * 60, + a8::XParams() + .SetSender(msg.team_uuid()), + [] (const a8::XParams& params) + { + RoomMgr::Instance()->TeamRoomTimeOut(params.sender); + } + ); + } else { + team_hash = &itr->second; + } + } + if (!team_hash) { + abort(); + } + { + auto itr = team_hash->find(hum->account_id); + if (itr != team_hash->end()) { + itr->second = hum->room->GetRoomUuid(); + } else { + a8::UdpLog::Instance()->Warning + ("team_data:%s account_id:%s not exists", + { + GenTeamHashData(msg.team_uuid(), team_hash), + hum->account_id + }); + } + } +} + +void RoomMgr::TeamRoomTimeOut(const std::string& team_uuid) +{ + std::map* team_hash = nullptr; + { + auto itr = team_room_hash_.find(team_uuid); + if (itr != team_room_hash_.end()) { + team_hash = &itr->second; + } + } + if (team_hash) { + bool ok = true; + for (auto pair : *team_hash) { + if (pair.second == 0) { + ok = false; + break; + } + } + if (!ok) { + a8::UdpLog::Instance()->Warning + ("team match failed team_data:%s ", + { + GenTeamHashData(team_uuid, team_hash), + }); + } + team_room_hash_.erase(team_uuid); + } else { + a8::UdpLog::Instance()->Warning + ("team not found team_uuid:s", + { + team_uuid + }); + } +} diff --git a/server/gameserver/roommgr.h b/server/gameserver/roommgr.h index f571b6e..0b7e339 100644 --- a/server/gameserver/roommgr.h +++ b/server/gameserver/roommgr.h @@ -53,6 +53,9 @@ class RoomMgr : public a8::Singleton int creator_proto_version, int creator_channel); void JoinErrorHandle(const cs::CMJoin& msg, int error_code, int socket_handle); + std::string GenTeamHashData(const std::string& team_uuid, std::map* team_hash); + void OnJoinRoomOk(const cs::CMJoin& msg, Player* hum); + void TeamRoomTimeOut(const std::string& team_uuid); private: int current_room_idx_ = 0; @@ -63,4 +66,5 @@ class RoomMgr : public a8::Singleton std::map over_room_hash_; a8::TimerAttacher reportstate_timer_attacher_; std::map gm_hash_; + std::map> team_room_hash_; }; 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 ac43eb7..6183582 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 { diff --git a/third_party/framework b/third_party/framework index ea69b96..98f1d40 160000 --- a/third_party/framework +++ b/third_party/framework @@ -1 +1 @@ -Subproject commit ea69b96451e7004430e99b86db1cfd3ae4d76c6b +Subproject commit 98f1d402cba91a1983dac2eb00de731657e133a5