/* * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #ifndef _LFGQUEUE_H #define _LFGQUEUE_H #include "LFG.h" namespace lfg { enum LfgCompatibility { LFG_COMPATIBILITY_PENDING, LFG_INCOMPATIBLES_WRONG_GROUP_SIZE, LFG_INCOMPATIBLES_TOO_MUCH_PLAYERS, LFG_INCOMPATIBLES_MULTIPLE_LFG_GROUPS, LFG_INCOMPATIBLES_HAS_IGNORES, LFG_INCOMPATIBLES_NO_ROLES, LFG_INCOMPATIBLES_NO_DUNGEONS, LFG_COMPATIBLES_WITH_LESS_PLAYERS, // Values under this = not compatible (do not modify order) LFG_COMPATIBLES_MATCH // Must be the last one }; // Stores player or group queue info struct LfgQueueData { LfgQueueData(); LfgQueueData(time_t _joinTime, LfgDungeonSet _dungeons, LfgRolesMap _roles): joinTime(_joinTime), lastRefreshTime(_joinTime), tanks(LFG_TANKS_NEEDED), healers(LFG_HEALERS_NEEDED), dps(LFG_DPS_NEEDED), dungeons(std::move(_dungeons)), roles(std::move(_roles)) { } time_t joinTime; // Player queue join time (to calculate wait times) time_t lastRefreshTime; // pussywizard uint8 tanks{LFG_TANKS_NEEDED}; // Tanks needed uint8 healers{LFG_HEALERS_NEEDED}; // Healers needed uint8 dps{LFG_DPS_NEEDED}; // Dps needed LfgDungeonSet dungeons; // Selected Player/Group Dungeon/s LfgRolesMap roles; // Selected Player Role/s Lfg5Guids bestCompatible; // Best compatible combination of people queued }; struct LfgWaitTime { LfgWaitTime() = default; int32 time{-1}; // Wait time uint32 number{0}; // Number of people used to get that wait time }; typedef std::map LfgWaitTimesContainer; typedef std::map LfgQueueDataContainer; typedef std::list LfgCompatibleContainer; /** Stores all data related to queue */ class LFGQueue { public: // Add/Remove from queue void AddToQueue(ObjectGuid guid, bool failedProposal = false); void RemoveFromQueue(ObjectGuid guid, bool partial = false); // xinef: partial remove, dont delete data from list! void AddQueueData(ObjectGuid guid, time_t joinTime, LfgDungeonSet const& dungeons, LfgRolesMap const& rolesMap); void RemoveQueueData(ObjectGuid guid); // Update Timers (when proposal success) void UpdateWaitTimeAvg(int32 waitTime, uint32 dungeonId); void UpdateWaitTimeTank(int32 waitTime, uint32 dungeonId); void UpdateWaitTimeHealer(int32 waitTime, uint32 dungeonId); void UpdateWaitTimeDps(int32 waitTime, uint32 dungeonId); // Update Queue timers void UpdateQueueTimers(uint32 diff); time_t GetJoinTime(ObjectGuid guid); // Find new group uint8 FindGroups(); private: void SetQueueUpdateData(std::string const& strGuids, LfgRolesMap const& proposalRoles); void AddToNewQueue(ObjectGuid guid, bool front); void RemoveFromNewQueue(ObjectGuid guid); void RemoveFromCompatibles(ObjectGuid guid); void AddToCompatibles(Lfg5Guids const& key); uint32 FindBestCompatibleInQueue(LfgQueueDataContainer::iterator itrQueue); void UpdateBestCompatibleInQueue(LfgQueueDataContainer::iterator itrQueue, Lfg5Guids const& key); LfgCompatibility FindNewGroups(const ObjectGuid& newGuid); LfgCompatibility CheckCompatibility(Lfg5Guids const& checkWith, const ObjectGuid& newGuid, uint64& foundMask, uint32& foundCount, const std::set& currentCompatibles); // Queue uint32 m_QueueStatusTimer; // used to check interval of sending queue status LfgQueueDataContainer QueueDataStore; // Queued groups LfgCompatibleContainer CompatibleList; // Compatible dungeons LfgCompatibleContainer CompatibleTempList; // new compatibles are added to this container while main one is being iterated LfgWaitTimesContainer waitTimesAvgStore; // Average wait time to find a group queuing as multiple roles LfgWaitTimesContainer waitTimesTankStore; // Average wait time to find a group queuing as tank LfgWaitTimesContainer waitTimesHealerStore; // Average wait time to find a group queuing as healer LfgWaitTimesContainer waitTimesDpsStore; // Average wait time to find a group queuing as dps LfgGuidList newToQueueStore; // New groups to add to queue LfgGuidList restoredAfterProposal; }; } #endif