diff --git a/server/gameserver/human.h b/server/gameserver/human.h index c8edb2a..f829e11 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -42,6 +42,7 @@ class Human : public Entity std::string session_id; std::string from_appid; std::string team_uuid; + bool auto_fill = false; int account_registertime = 0; MetaData::Player* meta = nullptr; MetaData::Equip* helmet_meta = nullptr; diff --git a/server/gameserver/player.h b/server/gameserver/player.h index 122eefe..6544970 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -22,7 +22,6 @@ class Player : public Human public: int team_mode = 0; - bool auto_fill = false; bool use_touch = false; long long create_tick = 0; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 49aa72f..b6597b5 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -880,6 +880,7 @@ void Room::UpdateGas() CreateAndroid(ROOM_MAX_PLAYER_NUM - human_hash_.size()); NotifyUiUpdate(); } + CombineTeam(); ShuaPlane(); NotifyWxVoip(); RoomMgr::Instance()->ActiveRoom(room_uuid); @@ -1115,6 +1116,63 @@ void Room::MatchTeam(Human* hum) } } +void Room::CombineTeam() +{ + std::map need_combine_teams; + std::map need_combine_teams_copy; + + for (auto& pair : team_hash_) { + for (Human* hum : pair.second) { + if (hum->auto_fill) { + need_combine_teams[pair.first] = pair.second.size(); + } + } + } + + need_combine_teams_copy = need_combine_teams; + bool combine_ok = false; + do { + combine_ok = false; + for (auto& pair1 : need_combine_teams) { + for (auto& pair2 : need_combine_teams_copy) { + if (pair1.first != pair2.first) { + if (pair1.second + pair2.second <= MAX_TEAM_NUM) { + int team_id1 = pair1.first; + int team_id2 = pair2.first; + + { + std::set& team1_members = team_hash_[team_id1]; + std::set& team2_members = team_hash_[team_id2]; + if (pair1.second > pair2.second) { + for (Human* hum : team2_members) { + hum->team_id = team_id1; + hum->team_members = &team1_members; + team1_members.insert(hum); + } + team_hash_.erase(pair2.first); + } else { + for (Human* hum : team1_members) { + hum->team_id = team_id2; + hum->team_members = &team2_members; + team2_members.insert(hum); + } + team_hash_.erase(pair1.first); + } + } + + need_combine_teams.erase(team_id1); + need_combine_teams.erase(team_id2); + need_combine_teams_copy.erase(team_id1); + need_combine_teams_copy.erase(team_id2); + combine_ok = true; + break; + } + } + } + } + } while (combine_ok); +} + void Room::InitAirDrop() { std::list& air_drops = MetaMgr::Instance()->GetAirDrops(); diff --git a/server/gameserver/room.h b/server/gameserver/room.h index dc8e307..a56af97 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -101,6 +101,7 @@ private: a8::Vec2& out_pos); void AutoMatchTeam(); void MatchTeam(Human* hum); + void CombineTeam(); void InitAirDrop(); void AirDrop(int appear_time, int box_id); void ShuaPlane();