/** Checks que main queue to try to form a Lfg group. Returns first match found (if any) @param[in] check List of guids trying to match with other groups @param[in] all List of all other guids in main queue to match against @return LfgCompatibility type of compatibility between groups */ LfgCompatibility LFGQueue::FindNewGroups(LfgGuidList& check, LfgGuidList& all) { std::string strGuids = ConcatenateGuids(check); LfgCompatibility compatibles = GetCompatibles(strGuids); TC_LOG_DEBUG("lfg.queue.match.check", "Guids: (%s): %s - all(%s)", strGuids.c_str(), GetCompatibleString(compatibles), ConcatenateGuids(all).c_str()); if (compatibles == LFG_COMPATIBILITY_PENDING) // Not previously cached, calculate compatibles = CheckCompatibility(check); if (compatibles == LFG_COMPATIBLES_BAD_STATES && sLFGMgr->AllQueued(check)) { TC_LOG_DEBUG("lfg.queue.match.check", "Guids: (%s) compatibles (cached) changed from bad states to match", strGuids.c_str()); SetCompatibles(strGuids, LFG_COMPATIBLES_MATCH); return LFG_COMPATIBLES_MATCH; } if (compatibles != LFG_COMPATIBLES_WITH_LESS_PLAYERS) return compatibles; // Try to match with queued groups while (!all.empty()) { check.push_back(all.front()); all.pop_front(); LfgCompatibility subcompatibility = FindNewGroups(check, all); if (subcompatibility == LFG_COMPATIBLES_MATCH) return LFG_COMPATIBLES_MATCH; check.pop_back(); } return compatibles; }
uint8 LFGQueue::FindGroups() { uint8 proposals = 0; LfgGuidList firstNew; while (!newToQueueStore.empty()) { uint64 frontguid = newToQueueStore.front(); TC_LOG_DEBUG("lfg.queue.match.check.new", "Checking [" UI64FMTD "] newToQueue(%u), currentQueue(%u)", frontguid, uint32(newToQueueStore.size()), uint32(currentQueueStore.size())); firstNew.clear(); firstNew.push_back(frontguid); RemoveFromNewQueue(frontguid); LfgGuidList temporalList = currentQueueStore; LfgCompatibility compatibles = FindNewGroups(firstNew, temporalList); if (compatibles == LFG_COMPATIBLES_MATCH) ++proposals; else AddToCurrentQueue(frontguid); // Lfg group not found, add this group to the queue. } return proposals; }
uint8 LfgQueue::FindGroups() { uint8 proposals = 0; LfgGuidList firstNew; while (!m_newToQueue.empty()) { uint64 frontguid = m_newToQueue.front(); sLog->outDebug(LOG_FILTER_LFG, "LfgQueue::FindGroups: checking [" UI64FMTD "] newToQueue(%u), currentQueue(%u)", frontguid, uint32(m_newToQueue.size()), uint32(m_currentQueue.size())); firstNew.clear(); firstNew.push_back(frontguid); RemoveFromNewQueue(frontguid); LfgGuidList temporalList = m_currentQueue; LfgCompatibility compatibles = FindNewGroups(firstNew, temporalList); if (compatibles == LFG_COMPATIBLES_MATCH) ++proposals; else AddToCurrentQueue(frontguid); // Lfg group not found, add this group to the queue. } return proposals; }
/** Checks que main queue to try to form a Lfg group. Returns first match found (if any) @param[in] check List of guids trying to match with other groups @param[in] all List of all other guids in main queue to match against @return LfgCompatibility type of compatibility between groups */ LfgCompatibility LfgQueue::FindNewGroups(LfgGuidList& check, LfgGuidList& all) { std::string strGuids = ConcatenateGuids(check); LfgCompatibility compatibles = GetCompatibles(strGuids); sLog->outDebug(LOG_FILTER_LFG, "LFGQueue::FindNewGroup: (%s): %s - all(%s)", strGuids.c_str(), GetCompatibleString(compatibles), ConcatenateGuids(all).c_str()); if (compatibles == LFG_COMPATIBILITY_PENDING || compatibles == LFG_COMPATIBLES_BAD_STATES) // Not previously cached, calculate compatibles = CheckCompatibility(check); if (compatibles != LFG_COMPATIBLES_WITH_LESS_PLAYERS) return compatibles; // Try to match with queued groups while (!all.empty()) { check.push_back(all.front()); all.pop_front(); LfgCompatibility subcompatibility = FindNewGroups(check, all); if (subcompatibility == LFG_COMPATIBLES_MATCH) return LFG_COMPATIBLES_MATCH; check.pop_back(); } return compatibles; }