From 0b5b0691539065ceb42be9dbbba29fc3a5dd41c2 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 26 Aug 2020 15:05:26 +0800 Subject: [PATCH 1/9] 1 --- server/gameserver/human.cc | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index ddcdb43..464b81b 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"; } From a067330169d438d021197b9dec41089d4f293e06 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 31 Aug 2020 13:09:03 +0800 Subject: [PATCH 2/9] 1 --- server/gameserver/human.h | 1 + server/gameserver/playermgr.cc | 7 +++++++ server/gameserver/roommgr.h | 1 + 3 files changed, 9 insertions(+) diff --git a/server/gameserver/human.h b/server/gameserver/human.h index d2cbed4..a11d6ac 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -98,6 +98,7 @@ class Human : public MoveableEntity bool dead = false; long long dead_frameno = 0; long long real_dead_frameno = 0; + std::set join_team_members; Weapon default_weapon; Weapon car_weapon; diff --git a/server/gameserver/playermgr.cc b/server/gameserver/playermgr.cc index 5218bda..4c8b486 100644 --- a/server/gameserver/playermgr.cc +++ b/server/gameserver/playermgr.cc @@ -105,6 +105,13 @@ Player* PlayerMgr::CreatePlayerByCMJoin(Player* hum, } } #if 1 + { + for (auto& member : msg.team_members()) { + if (member.account_id() != hum->account_id) { + hum->join_team_members.insert(member.account_id()); + } + } + } { int idx = 0; for (int skin_id : msg.baseskin()) { diff --git a/server/gameserver/roommgr.h b/server/gameserver/roommgr.h index f571b6e..2869345 100644 --- a/server/gameserver/roommgr.h +++ b/server/gameserver/roommgr.h @@ -63,4 +63,5 @@ class RoomMgr : public a8::Singleton std::map over_room_hash_; a8::TimerAttacher reportstate_timer_attacher_; std::map gm_hash_; + std::map team_hash_; }; From 5012b4117d74e7927db82d0953bc05e717b8335e Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 31 Aug 2020 13:23:50 +0800 Subject: [PATCH 3/9] 1 --- server/gameserver/human.h | 1 - server/gameserver/playermgr.cc | 7 ------- 2 files changed, 8 deletions(-) diff --git a/server/gameserver/human.h b/server/gameserver/human.h index a11d6ac..d2cbed4 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -98,7 +98,6 @@ class Human : public MoveableEntity bool dead = false; long long dead_frameno = 0; long long real_dead_frameno = 0; - std::set join_team_members; Weapon default_weapon; Weapon car_weapon; diff --git a/server/gameserver/playermgr.cc b/server/gameserver/playermgr.cc index 4c8b486..5218bda 100644 --- a/server/gameserver/playermgr.cc +++ b/server/gameserver/playermgr.cc @@ -105,13 +105,6 @@ Player* PlayerMgr::CreatePlayerByCMJoin(Player* hum, } } #if 1 - { - for (auto& member : msg.team_members()) { - if (member.account_id() != hum->account_id) { - hum->join_team_members.insert(member.account_id()); - } - } - } { int idx = 0; for (int skin_id : msg.baseskin()) { From a1be31c98b803b76f7e1e83b7a0173f5005005eb Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 31 Aug 2020 15:12:31 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BB=84=E9=98=9F?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/roommgr.cc | 90 ++++++++++++++++++++++++++++++++++++ server/gameserver/roommgr.h | 5 +- 2 files changed, 94 insertions(+), 1 deletion(-) diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index c51ab1a..e0d98d6 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,92 @@ 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), + }); + } + } 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 2869345..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,5 +66,5 @@ class RoomMgr : public a8::Singleton std::map over_room_hash_; a8::TimerAttacher reportstate_timer_attacher_; std::map gm_hash_; - std::map team_hash_; + std::map> team_room_hash_; }; From 24998d2f0d3434190c430502aba1798809b7b588 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 1 Sep 2020 17:25:09 +0800 Subject: [PATCH 5/9] 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 { From 13b65e9658d50787e1bb21d89fb8254e3c8cdfce Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 2 Sep 2020 14:02:18 +0800 Subject: [PATCH 6/9] 1 --- server/gameserver/player.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index d2f2e11..c69bfcf 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1447,9 +1447,9 @@ std::vector>* Player::GetBox(int box_id) } 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; + } else { + drop_id = MetaMgr::Instance()->prebattle_box_id_chiji; } MetaData::Drop* drop_meta = MetaMgr::Instance()->GetDrop(drop_id); if (drop_meta) { From 881044b0b64ce6af604d19f67c9c0d736125c628 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 2 Sep 2020 19:11:02 +0800 Subject: [PATCH 7/9] 1 --- server/gameserver/player.cc | 21 +++++++++++++++++++++ server/gameserver/roommgr.cc | 2 ++ 2 files changed, 23 insertions(+) diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index c69bfcf..de02cd6 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1341,6 +1341,27 @@ void Player::_CMOpenBox(f8::MsgHdr& hdr, const cs::CMOpenBox& msg) 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; + } } } } diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index e0d98d6..2510b60 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -626,6 +626,8 @@ void RoomMgr::TeamRoomTimeOut(const std::string& team_uuid) GenTeamHashData(team_uuid, team_hash), }); } + delete team_hash; + team_room_hash_.erase(team_uuid); } else { a8::UdpLog::Instance()->Warning ("team not found team_uuid:s", From f24e49355bfbc716a6761266f563d75fe3008bb1 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 2 Sep 2020 19:46:13 +0800 Subject: [PATCH 8/9] 1 --- server/gameserver/roommgr.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index 2510b60..d901f24 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -626,7 +626,6 @@ void RoomMgr::TeamRoomTimeOut(const std::string& team_uuid) GenTeamHashData(team_uuid, team_hash), }); } - delete team_hash; team_room_hash_.erase(team_uuid); } else { a8::UdpLog::Instance()->Warning From 4ebeb286e9e1d9ccb9b32e85bdc8593d60a48005 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 21 Oct 2020 10:31:15 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E5=9D=90=E9=AA=91=E5=AD=90=E5=BC=B9=E6=B2=A1=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/human.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 464b81b..331938b 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2639,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();