void CBattlegroundManager::EventQueueUpdate() { deque<Player*> tempPlayerVec[2]; uint32 i,j,k; Player * plr; CBattleground * bg; list<uint32>::iterator it3, it4; //vector<Player*>::iterator it6; map<uint32, CBattleground*>::iterator iitr; Arena * arena; int32 team; m_queueLock.Acquire(); m_instanceLock.Acquire(); for(i = 0; i < BATTLEGROUND_NUM_TYPES; ++i) { for(j = 0; j < MAX_LEVEL_GROUP; ++j) { if(!m_queuedPlayers[i][j].size()) continue; tempPlayerVec[0].clear(); tempPlayerVec[1].clear(); for(it3 = m_queuedPlayers[i][j].begin(); it3 != m_queuedPlayers[i][j].end();) { it4 = it3++; plr = objmgr.GetPlayer(*it4); if(!plr || GetLevelGrouping(plr->getLevel()) != j) { m_queuedPlayers[i][j].erase(it4); continue; } // queued to a specific instance id? if(plr->m_bgQueueInstanceId != 0) { iitr = m_instances[i].find(plr->m_bgQueueInstanceId); if(iitr == m_instances[i].end()) { // queue no longer valid plr->GetSession()->SystemMessage("Your queue on battleground instance id %u is no longer valid. Reason: Instance Deleted.", plr->m_bgQueueInstanceId); plr->m_bgIsQueued = false; plr->m_bgQueueType = 0; plr->m_bgQueueInstanceId = 0; m_queuedPlayers[i][j].erase(it4); } // can we join? bg = iitr->second; if(bg->CanPlayerJoin(plr)) { bg->AddPlayer(plr, plr->GetTeam()); m_queuedPlayers[i][j].erase(it4); } } else { if(IS_ARENA(i)) tempPlayerVec[0].push_back(plr); else tempPlayerVec[plr->GetTeam()].push_back(plr); } } // try to join existing instances for(iitr = m_instances[i].begin(); iitr != m_instances[i].end(); ++iitr) { if( iitr->second->HasEnded() ) continue; if(IS_ARENA(i)) { arena = ((Arena*)iitr->second); if(arena->Rated()) continue; team = arena->GetFreeTeam(); while(team >= 0 && tempPlayerVec[0].size()) { plr = *tempPlayerVec[0].begin(); tempPlayerVec[0].pop_front(); plr->m_bgTeam=team; arena->AddPlayer(plr, team); ErasePlayerFromList(plr->GetLowGUID(), &m_queuedPlayers[i][j]); team = arena->GetFreeTeam(); } } else { bg = iitr->second; for(k = 0; k < 2; ++k) { while(tempPlayerVec[k].size() && bg->HasFreeSlots(k)) { plr = *tempPlayerVec[k].begin(); tempPlayerVec[k].pop_front(); bg->AddPlayer(plr, plr->GetTeam()); ErasePlayerFromList(plr->GetLowGUID(), &m_queuedPlayers[i][j]); } } } } if(IS_ARENA(i)) { // enough players to start a round? if(tempPlayerVec[0].size() < BGMinimumPlayers[i]) continue; if(CanCreateInstance(i,j)) { arena = ((Arena*)CreateInstance(i, j)); if ( arena == NULL ) { m_queueLock.Release(); m_instanceLock.Release(); return; } team = arena->GetFreeTeam(); while(!arena->IsFull() && tempPlayerVec[0].size() && team >= 0) { plr = *tempPlayerVec[0].begin(); tempPlayerVec[0].pop_front(); arena->AddPlayer(plr, team); team = arena->GetFreeTeam(); // remove from the main queue (painful!) ErasePlayerFromList(plr->GetLowGUID(), &m_queuedPlayers[i][j]); } } } else { #ifdef ONLY_ONE_PERSON_REQUIRED_TO_JOIN_DEBUG if(tempPlayerVec[0].size() >= 1 || tempPlayerVec[1].size() >= 1) #else if(tempPlayerVec[0].size() >= BGMinimumPlayers[i] && tempPlayerVec[1].size() >= BGMinimumPlayers[i]) #endif { if(CanCreateInstance(i,j)) { bg = CreateInstance(i,j); //ASSERT(bg); if ( bg == NULL ) { m_queueLock.Release(); m_instanceLock.Release(); return; } // push as many as possible in for(k = 0; k < 2; ++k) { while(tempPlayerVec[k].size() && bg->HasFreeSlots(k)) { plr = *tempPlayerVec[k].begin(); tempPlayerVec[k].pop_front(); bg->AddPlayer(plr, k); ErasePlayerFromList(plr->GetLowGUID(), &m_queuedPlayers[i][j]); } } } } } } } /* Handle paired arena team joining */ Group * group1, *group2; uint32 n; list<uint32>::iterator itz; for(i = BATTLEGROUND_ARENA_2V2; i < BATTLEGROUND_ARENA_5V5+1; ++i) { for(;;) { if(m_queuedGroups[i].size() < 2) /* got enough to have an arena battle ;P */ { break; } group1 = group2 = NULL; while(group1 == NULL) { n = RandomUInt((uint32)m_queuedGroups[i].size()) - 1; for(itz = m_queuedGroups[i].begin(); itz != m_queuedGroups[i].end() && n>0; ++itz) --n; if(itz == m_queuedGroups[i].end()) itz=m_queuedGroups[i].begin(); if(itz == m_queuedGroups[i].end()) { Log.Error("BattlegroundMgr", "Internal error at %s:%u", __FILE__, __LINE__); m_queueLock.Release(); m_instanceLock.Release(); return; } group1 = objmgr.GetGroupById(*itz); m_queuedGroups[i].erase(itz); } while(group2 == NULL) { n = RandomUInt((uint32)m_queuedGroups[i].size()) - 1; for(itz = m_queuedGroups[i].begin(); itz != m_queuedGroups[i].end() && n>0; ++itz) --n; if(itz == m_queuedGroups[i].end()) itz=m_queuedGroups[i].begin(); if(itz == m_queuedGroups[i].end()) { Log.Error("BattlegroundMgr", "Internal error at %s:%u", __FILE__, __LINE__); m_queueLock.Release(); m_instanceLock.Release(); return; } group2 = objmgr.GetGroupById(*itz); m_queuedGroups[i].erase(itz); } Arena * ar = ((Arena*)CreateInstance(i,LEVEL_GROUP_70)); GroupMembersSet::iterator itx; ar->rated_match=true; for(itx = group1->GetSubGroup(0)->GetGroupMembersBegin(); itx != group1->GetSubGroup(0)->GetGroupMembersEnd(); ++itx) { if((*itx)->m_loggedInPlayer) { if( ar->HasFreeSlots(0) ) ar->AddPlayer((*itx)->m_loggedInPlayer, 0); } } for(itx = group2->GetSubGroup(0)->GetGroupMembersBegin(); itx != group2->GetSubGroup(0)->GetGroupMembersEnd(); ++itx) { if((*itx)->m_loggedInPlayer) { if( ar->HasFreeSlots(1) ) ar->AddPlayer((*itx)->m_loggedInPlayer, 1); } } } } m_queueLock.Release(); m_instanceLock.Release(); }
void CBattlegroundManager::EventQueueUpdate() { deque<Player*> tempPlayerVec[2]; uint32 i,j,k; Player * plr; CBattleground * bg; list<uint32>::iterator it3, it4; //vector<Player*>::iterator it6; map<uint32, CBattleground*>::iterator iitr; Arena * arena; int32 team; m_queueLock.Acquire(); m_instanceLock.Acquire(); for(i = 0; i < BATTLEGROUND_NUM_TYPES; ++i) { for(j = 0; j < MAX_LEVEL_GROUP; ++j) { if(!m_queuedPlayers[i][j].size()) continue; tempPlayerVec[0].clear(); tempPlayerVec[1].clear(); for(it3 = m_queuedPlayers[i][j].begin(); it3 != m_queuedPlayers[i][j].end();) { it4 = it3++; plr = objmgr.GetPlayer(*it4); if(!plr || GetLevelGrouping(plr->getLevel()) != j) { m_queuedPlayers[i][j].erase(it4); continue; } // queued to a specific instance id? if(plr->m_bgQueueInstanceId != 0) { iitr = m_instances[i].find(plr->m_bgQueueInstanceId); if(iitr == m_instances[i].end()) { // queue no longer valid plr->GetSession()->SystemMessage("Your queue on battleground instance id %u is no longer valid. Reason: Instance Deleted.", plr->m_bgQueueInstanceId); plr->m_bgIsQueued = false; plr->m_bgQueueType = 0; plr->m_bgQueueInstanceId = 0; m_queuedPlayers[i][j].erase(it4); } // can we join? bg = iitr->second; if(bg->CanPlayerJoin(plr)) { bg->AddPlayer(plr, plr->GetTeam()); m_queuedPlayers[i][j].erase(it4); } } else { if(IS_ARENA(i)) tempPlayerVec[0].push_back(plr); else tempPlayerVec[plr->GetTeam()].push_back(plr); } } // try to join existing instances for(iitr = m_instances[i].begin(); iitr != m_instances[i].end(); ++iitr) { if( iitr->second->HasEnded() || iitr->second->GetLevelGroup() != j) continue; if(IS_ARENA(i)) { arena = ((Arena*)iitr->second); if(arena->Rated()) continue; team = arena->GetFreeTeam(); while(team >= 0 && tempPlayerVec[0].size()) { plr = *tempPlayerVec[0].begin(); tempPlayerVec[0].pop_front(); plr->m_bgTeam=team; arena->AddPlayer(plr, team); ErasePlayerFromList(plr->GetLowGUID(), &m_queuedPlayers[i][j]); team = arena->GetFreeTeam(); } } else { bg = iitr->second; for(k = 0; k < 2; ++k) { while(tempPlayerVec[k].size() && bg->HasFreeSlots(k)) { plr = *tempPlayerVec[k].begin(); tempPlayerVec[k].pop_front(); bg->AddPlayer(plr, plr->GetTeam()); ErasePlayerFromList(plr->GetLowGUID(), &m_queuedPlayers[i][j]); } } } } if(IS_ARENA(i)) { // enough players to start a round? if(tempPlayerVec[0].size() < BGMinimumPlayers[i]) continue; if(CanCreateInstance(i,j)) { arena = ((Arena*)CreateInstance(i, j)); team = arena->GetFreeTeam(); while(!arena->IsFull() && tempPlayerVec[0].size() && team >= 0) { plr = *tempPlayerVec[0].begin(); tempPlayerVec[0].pop_front(); plr->m_bgTeam=team; arena->AddPlayer(plr, team); team = arena->GetFreeTeam(); // remove from the main queue (painful!) ErasePlayerFromList(plr->GetLowGUID(), &m_queuedPlayers[i][j]); } } } else { #ifdef ONLY_ONE_PERSON_REQUIRED_TO_JOIN_DEBUG if(tempPlayerVec[0].size() >= 1 || tempPlayerVec[1].size() >= 1) #else if(tempPlayerVec[0].size() >= BGMinimumPlayers[i] && tempPlayerVec[1].size() >= BGMinimumPlayers[i]) #endif { if(CanCreateInstance(i,j)) { bg = CreateInstance(i,j); if( bg == NULL ) { // creation failed for(k = 0; k < 2; ++k) { while(tempPlayerVec[k].size()) { plr = *tempPlayerVec[k].begin(); tempPlayerVec[k].pop_front(); ErasePlayerFromList(plr->GetLowGUID(), &m_queuedPlayers[i][j]); } } } else { // push as many as possible in for(k = 0; k < 2; ++k) { while(tempPlayerVec[k].size() && bg->HasFreeSlots(k)) { plr = *tempPlayerVec[k].begin(); tempPlayerVec[k].pop_front(); plr->m_bgTeam=k; bg->AddPlayer(plr, k); ErasePlayerFromList(plr->GetLowGUID(), &m_queuedPlayers[i][j]); } } } } } } } } /* Handle paired arena team joining */ list<uint32>::iterator itz; list<uint32>::iterator itp; for(i = BATTLEGROUND_ARENA_2V2; i < BATTLEGROUND_ARENA_5V5+1; ++i) { // We need at least this many :( if(m_queuedGroups[i].size() < 2) continue; list<uint32> removegroups; for(itz = m_queuedGroups[i].begin(); itz != m_queuedGroups[i].end(); itz++) { Group * pGroup = objmgr.GetGroupById(*itz); if(!pGroup || !pGroup->m_isqueued || !pGroup->GetLeader() || pGroup->GetLeader()->arenaTeam[i - 4] == NULL) continue; uint32 maxRange = pGroup->GetLeader()->arenaTeam[i - 4]->m_queueSearchRange; pGroup->GetLeader()->arenaTeam[i - 4]->m_queueSearchRange += 100; vector<uint32> inRangeGroups; uint32 rating = pGroup->GetLeader()->arenaTeam[i - 4]->m_stat_rating; for(itp = m_queuedGroups[i].begin(); itp != m_queuedGroups[i].end();) { Group * tGrp = objmgr.GetGroupById(*itp); if(!tGrp || !tGrp->m_isqueued || !tGrp->GetLeader() || tGrp->GetLeader()->arenaTeam[i - 4] == NULL) { itp = m_queuedGroups[i].erase(itp); continue; } ++itp; if( pGroup == tGrp ) continue; uint32 tRating = tGrp->GetLeader()->arenaTeam[i - 4]->m_stat_rating; int32 diff = (int32)tRating - (int32)rating; if(diff < 0) diff = -diff; if(diff > (int32)maxRange) continue; //Log.Notice("Debug", "EventQueueUpdate added 1 in range arena"); inRangeGroups.push_back(tGrp->GetID()); } // K, we have a giant list of groups that we could group with, hopefully! // or not, we can't go on :( if(!inRangeGroups.size()) continue; // But if we're here, we can :D uint32 r = 0; if( inRangeGroups.size() > 1 ) r = RandomUInt((uint32)inRangeGroups.size() - 1); Group * pairGroup = objmgr.GetGroupById(inRangeGroups[r]); if(!pairGroup) continue; // Now, let's create this rated Arena Match :) //Log.Notice("Debug", "EventQueueUpdate creating arena"); Arena * arena = (Arena*)CreateInstance(i, LEVEL_GROUP_70); ArenaTeam *pTeamPair[2]; if(arena) { //Log.Notice("Debug", "EventQueueUpdate arena created"); removegroups.push_back(pGroup->GetID()); removegroups.push_back(pairGroup->GetID()); pGroup->m_isqueued = false; pairGroup->m_isqueued = false; arena->rated_match = true; if( pGroup->GetLeader()->arenaTeam[i - 4] != NULL ) { arena->m_ratedTeams[0] = pGroup->GetLeader()->arenaTeam[i - 4]->m_id; pTeamPair[0] = pGroup->GetLeader()->arenaTeam[i - 4]; } else pTeamPair[0] = NULL; if( pairGroup->GetLeader()->arenaTeam[i - 4] != NULL ) { arena->m_ratedTeams[1] = pairGroup->GetLeader()->arenaTeam[i - 4]->m_id; pTeamPair[1] = pairGroup->GetLeader()->arenaTeam[i - 4]; } else pTeamPair[1] = NULL; pGroup->GetLeader()->arenaTeam[i - 4]->m_queueSearchRange = 100; pairGroup->GetLeader()->arenaTeam[i - 4]->m_queueSearchRange = 100; GroupMembersSet::iterator gitr; pGroup->Lock(); for(gitr = pGroup->GetSubGroup(0)->GetGroupMembersBegin(); gitr != pGroup->GetSubGroup(0)->GetGroupMembersEnd(); gitr++) { PlayerInfo * pi = (*gitr); if(!pi->m_loggedInPlayer) continue; //Log.Notice("Debug", "EventQueueUpdate player lewp"); pi->m_loggedInPlayer->m_bgTeam = 0; if(arena->HasFreeSlots(0)) { arena->AddPlayer(pi->m_loggedInPlayer, 0); arena->m_RatedPlayers[0].insert(pi); if( pTeamPair[0] != NULL ) { ArenaTeamMember * atm = pTeamPair[0]->GetMember(pi); if(atm) { atm->Played_ThisSeason++; atm->Played_ThisWeek++; } //Log.Notice("Debug", "EventQueueUpdate added player %s", pi->m_loggedInPlayer->GetName()); } } } pGroup->Unlock(); pairGroup->Lock(); for(gitr = pairGroup->GetSubGroup(0)->GetGroupMembersBegin(); gitr != pairGroup->GetSubGroup(0)->GetGroupMembersEnd(); gitr++) { PlayerInfo * pi = (*gitr); if(!pi->m_loggedInPlayer || pi->arenaTeam[i-4] == NULL) continue; pi->m_loggedInPlayer->m_bgTeam = 1; if(arena->HasFreeSlots(1)) { arena->AddPlayer(pi->m_loggedInPlayer, 1); arena->m_RatedPlayers[1].insert(pi); if( pTeamPair[1] != NULL ) { ArenaTeamMember * atm = pTeamPair[1]->GetMember(pi); if(atm) { atm->Played_ThisSeason++; atm->Played_ThisWeek++; } } } } pairGroup->Unlock(); } } for(itz = removegroups.begin(); itz != removegroups.end(); itz++) { m_queuedGroups[i].remove(*itz); } } m_queueLock.Release(); m_instanceLock.Release(); }