添加组队合并队伍功能

This commit is contained in:
aozhiwei 2019-08-14 14:49:43 +08:00
parent e6ab525906
commit efe64536c6
4 changed files with 60 additions and 1 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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<int, size_t> need_combine_teams;
std::map<int, size_t> 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<Human*>& team1_members = team_hash_[team_id1];
std::set<Human*>& 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<MetaData::AirDrop>& air_drops = MetaMgr::Instance()->GetAirDrops();

View File

@ -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();