From 3238fc42d11937b342214753e139e58da5652a75 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 9 Sep 2021 05:36:05 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=98=9F=E4=BC=8D=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/room.cc | 34 ++++++++++++++++++++++++---------- server/gameserver/room.h | 1 + server/gameserver/team.cc | 12 ++++++++++++ server/gameserver/team.h | 6 ++++++ 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 64bbbce..fc56bb5 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1358,22 +1358,36 @@ void Room::MatchTeam(Human* hum) if (!hum->team_uuid.empty()) { for (auto& pair : human_hash_) { if (pair.second != hum) { - if (!hum->team_uuid.empty() && pair.second->team_uuid == hum->team_uuid) { - if (!pair.second->GetTeam()) { - Team* new_team = NewTeam(); - new_team->SetInitTeamMemberNum(hum->init_team_member_num); - new_team->AddMember(pair.second); - } - if (!pair.second->GetTeam()->IsFull()) { + if (pair.second->team_uuid == hum->team_uuid) { + if (pair.second->GetTeam() && !pair.second->GetTeam()->IsFull()) { pair.second->GetTeam()->AddMember(hum); + return; } - break; } } - } + }//end for human_hash_ + if (MetaMgr::Instance()->prebattle_combine_team) { + if (!hum->GetTeam() && hum->auto_fill && combineable_team_hash_.size() > 1) { + for (auto& pair : combineable_team_hash_) { + Team* team = pair.second; + if (team->CanCombine(hum)) { + team->AddMember(hum); + team->AddCombineMemberNum(hum->init_team_member_num); + return; + } + } + } + }//end if } + if (!hum->GetTeam()) { - NewTeam()->AddMember(hum); + Team* new_team = NewTeam(); + new_team->SetInitTeamMemberNum(hum->init_team_member_num); + new_team->SetAutoFill(hum->auto_fill); + new_team->AddMember(hum); + if (hum->IsPlayer() && hum->auto_fill) { + combineable_team_hash_[new_team->GetTeamId()] = new_team; + } } } diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 02e7112..ec23d2e 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -356,6 +356,7 @@ private: std::set refreshed_robot_set_; std::map team_hash_; + std::map combineable_team_hash_; std::map accountid_hash_; std::map moveable_hash_; std::map uniid_hash_; diff --git a/server/gameserver/team.cc b/server/gameserver/team.cc index 9121658..79b86c3 100644 --- a/server/gameserver/team.cc +++ b/server/gameserver/team.cc @@ -47,6 +47,8 @@ void Team::AddMember(Human* member) { if (!first_member_) { first_member_ = member; + init_team_member_num_ = member->init_team_member_num; + combined_team_member_num_ = member->init_team_member_num; } member->team_id = team_id_; member->SetTeam(this); @@ -124,3 +126,13 @@ Human* Team::GetMemberByUniId(int member_id) } return nullptr; } + +bool Team::CanCombine(Human* member) +{ + return !IsFull() && (combined_team_member_num_ + member->init_team_member_num < MAX_TEAM_NUM); +} + +void Team::AddCombineMemberNum(int member_num) +{ + combined_team_member_num_ += member_num; +} diff --git a/server/gameserver/team.h b/server/gameserver/team.h index 9230016..1ab3b87 100644 --- a/server/gameserver/team.h +++ b/server/gameserver/team.h @@ -8,6 +8,8 @@ class Team Room* room = nullptr; void SetInitTeamMemberNum(int init_num) { init_team_member_num_ = init_num; }; + void SetAutoFill(bool auto_fill) { auto_fill_ = auto_fill; }; + bool IsAutoFill() { return auto_fill_; }; int GetTeamId() { return team_id_; } void SetTeamId(int team_id) { team_id_ = team_id; } void TraverseMembers(std::function func); @@ -20,12 +22,16 @@ class Team bool IsFull(); void CombineBornPoint(); void CombineTeam(Team* b_team); + bool CanCombine(Human* member); + void AddCombineMemberNum(int member_num); Human* GetMemberByUniId(int member_id); int GetInitTeamMemberNum() { return init_team_member_num_; }; private: int team_id_ = 0; int init_team_member_num_ = 0; + int combined_team_member_num_ = 0; std::set members_; Human* first_member_ = nullptr; + bool auto_fill_ = false; };