From 41c3bd0ba981711ac9afd679e4e24d538fa6ba75 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 31 Jan 2024 11:08:15 +0800 Subject: [PATCH] 1 --- server/gameserver/custom_battle.cc | 127 ++++++++++++++++++++--------- server/gameserver/custom_team.cc | 5 ++ server/gameserver/custom_team.h | 1 + server/gameserver/pbutils.cc | 1 + 4 files changed, 96 insertions(+), 38 deletions(-) diff --git a/server/gameserver/custom_battle.cc b/server/gameserver/custom_battle.cc index 882444de..d66f4688 100644 --- a/server/gameserver/custom_battle.cc +++ b/server/gameserver/custom_battle.cc @@ -28,51 +28,102 @@ void CustomBattle::ParseResult(a8::XObject& obj) start_time_ = obj.Get("start_time"); sign_ = obj.Get("sign").GetString(); - auto team_list = obj.At("team_list"); - if (!team_list || !team_list->IsArray()) { - parse_ok_ = false; - return; + { + auto team_list = obj.At("team_list"); + if (!team_list || !team_list->IsArray()) { + parse_ok_ = false; + return; + } + for (int i = 0;i < team_list->Size(); ++i) { + auto team_obj = team_list->At(i); + if (!team_obj || !team_obj->IsObject()) { + parse_ok_ = false; + return; + } + std::string team_uuid = team_obj->Get("team_uuid").GetString(); + int is_view = team_obj->Get("is_view").GetInt(); + auto member_list = team_obj->At("members"); + if (!member_list || + !member_list->IsArray()) { + parse_ok_ = false; + return; + } + auto team = GetTeamByTeamUuid(team_uuid); + if (!team) { + team = std::make_shared(); + team->team_uuid_ = team_uuid; + team->is_view_ = is_view ? true : false; + uuid_hash_[team->team_uuid_] = team; + } + for (int ii = 0; ii < member_list->Size(); ++ii) { + auto member_obj = member_list->At(ii); + if (!member_obj || !member_obj->IsObject()) { + parse_ok_ = false; + return; + } + auto member = std::make_shared(); + member->team_ = team.get(); + member->account_id_ = member_obj->Get("account_id").GetString(); + member->session_id_ = member_obj->Get("session_id").GetString(); + member->name_ = member_obj->Get("name").GetString(); + member->sex_ = member_obj->Get("sex"); + member->battle_context_ = std::make_shared(); + member->battle_context_->ParseResult(*member_obj); + if (!member->battle_context_->parse_ok) { + parse_ok_ = false; + return; + } + member_id_hash_[member->account_id_] = member; + team->member_hash_[member->account_id_] = member; + account_hash_[member->account_id_] = team; + } + } } - for (int i = 0;i < team_list->Size(); ++i) { - auto team_obj = team_list->At(i); - if (!team_obj || !team_obj->IsObject()) { - parse_ok_ = false; - return; - } - std::string team_uuid = team_obj->Get("team_uuid").GetString(); - int is_view = team_obj->Get("is_view").GetInt(); - auto member_list = team_obj->At("members"); - if (!member_list || - !member_list->IsArray()) { - parse_ok_ = false; - return; - } - auto team = GetTeamByTeamUuid(team_uuid); - if (!team) { - team = std::make_shared(); - team->team_uuid_ = team_uuid; - team->is_view_ = is_view ? true : false; - uuid_hash_[team->team_uuid_] = team; - } - for (int ii = 0; ii < member_list->Size(); ++ii) { - auto member_obj = member_list->At(ii); - if (!member_obj || !member_obj->IsObject()) { + { + auto ob_list = obj.At("ob_list"); + for (int i = 0;i < ob_list->Size(); ++i) { + auto team_obj = ob_list->At(i); + if (!team_obj || !team_obj->IsObject()) { parse_ok_ = false; return; } - auto member = std::make_shared(); - member->team_ = team.get(); - member->account_id_ = member_obj->Get("account_id").GetString(); - member->session_id_ = member_obj->Get("session_id").GetString(); - member->battle_context_ = std::make_shared(); - member->battle_context_->ParseResult(*member_obj); - if (!member->battle_context_->parse_ok) { + std::string team_uuid = team_obj->Get("team_uuid").GetString(); + int is_view = team_obj->Get("is_view").GetInt(); + auto member_list = team_obj->At("members"); + if (!member_list || + !member_list->IsArray()) { parse_ok_ = false; return; } - member_id_hash_[member->account_id_] = member; - team->member_hash_[member->account_id_] = member; - account_hash_[member->account_id_] = team; + auto team = GetTeamByTeamUuid(team_uuid); + if (!team) { + team = std::make_shared(); + team->team_uuid_ = team_uuid; + team->is_view_ = is_view ? true : false; + uuid_hash_[team->team_uuid_] = team; + } + for (int ii = 0; ii < member_list->Size(); ++ii) { + auto member_obj = member_list->At(ii); + if (!member_obj || !member_obj->IsObject()) { + parse_ok_ = false; + return; + } + auto member = std::make_shared(); + member->team_ = team.get(); + member->account_id_ = member_obj->Get("account_id").GetString(); + member->session_id_ = member_obj->Get("session_id").GetString(); + member->name_ = member_obj->Get("name").GetString(); + member->sex_ = member_obj->Get("sex"); + member->battle_context_ = std::make_shared(); + member->battle_context_->ParseResult(*member_obj); + if (!member->battle_context_->parse_ok) { + parse_ok_ = false; + return; + } + member_id_hash_[member->account_id_] = member; + team->member_hash_[member->account_id_] = member; + account_hash_[member->account_id_] = team; + } } } diff --git a/server/gameserver/custom_team.cc b/server/gameserver/custom_team.cc index 40aefe9b..a831a185 100644 --- a/server/gameserver/custom_team.cc +++ b/server/gameserver/custom_team.cc @@ -16,3 +16,8 @@ void CustomTeam::TraverseMember(std::function GetMember(const std::string& account_id); bool IsView() { return is_view_; } void TraverseMember(std::function)> cb); + int GetMemberNum(); private: std::string team_uuid_; diff --git a/server/gameserver/pbutils.cc b/server/gameserver/pbutils.cc index 1f371cd2..e2ea2fce 100644 --- a/server/gameserver/pbutils.cc +++ b/server/gameserver/pbutils.cc @@ -2787,6 +2787,7 @@ int Room::InitWithCustomBattle(long ip_saddr, int socket_handle, std::shared_ptr for (size_t i = 0; i < net_teams.size(); ++i) { auto net_team = net_teams.at(i); auto room_team = room_teams.at(i); + room_team->SetInitTeamMemberNum(net_team->GetMemberNum()); net_team->TraverseMember ( [join_msg, p, room_team] (std::shared_ptr m) mutable -> bool