mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-28 16:16:27 +00:00
First Commit
For Azeroth!
This commit is contained in:
129
src/server/game/DungeonFinding/LFGQueue.h
Normal file
129
src/server/game/DungeonFinding/LFGQueue.h
Normal file
@@ -0,0 +1,129 @@
|
||||
/*
|
||||
* Copyright (C)
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#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(): joinTime(time_t(time(NULL))), lastRefreshTime(joinTime), tanks(LFG_TANKS_NEEDED),
|
||||
healers(LFG_HEALERS_NEEDED), dps(LFG_DPS_NEEDED)
|
||||
{ }
|
||||
|
||||
LfgQueueData(time_t _joinTime, LfgDungeonSet const& _dungeons, LfgRolesMap const& _roles):
|
||||
joinTime(_joinTime), lastRefreshTime(_joinTime), tanks(LFG_TANKS_NEEDED), healers(LFG_HEALERS_NEEDED),
|
||||
dps(LFG_DPS_NEEDED), dungeons(_dungeons), roles(_roles)
|
||||
{ }
|
||||
|
||||
time_t joinTime; ///< Player queue join time (to calculate wait times)
|
||||
time_t lastRefreshTime; ///< pussywizard
|
||||
uint8 tanks; ///< Tanks needed
|
||||
uint8 healers; ///< Healers needed
|
||||
uint8 dps; ///< 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(): time(-1), number(0) {}
|
||||
int32 time; ///< Wait time
|
||||
uint32 number; ///< Number of people used to get that wait time
|
||||
};
|
||||
|
||||
typedef std::map<uint32, LfgWaitTime> LfgWaitTimesContainer;
|
||||
typedef std::map<uint64, LfgQueueData> LfgQueueDataContainer;
|
||||
typedef std::list<Lfg5Guids> LfgCompatibleContainer;
|
||||
|
||||
/**
|
||||
Stores all data related to queue
|
||||
*/
|
||||
class LFGQueue
|
||||
{
|
||||
public:
|
||||
|
||||
// Add/Remove from queue
|
||||
void AddToQueue(uint64 guid, bool failedProposal = false);
|
||||
void RemoveFromQueue(uint64 guid, bool partial = false); // xinef: partial remove, dont delete data from list!
|
||||
void AddQueueData(uint64 guid, time_t joinTime, LfgDungeonSet const& dungeons, LfgRolesMap const& rolesMap);
|
||||
void RemoveQueueData(uint64 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(uint64 guid);
|
||||
|
||||
// Find new group
|
||||
uint8 FindGroups();
|
||||
|
||||
private:
|
||||
void SetQueueUpdateData(std::string const& strGuids, LfgRolesMap const& proposalRoles);
|
||||
|
||||
void AddToNewQueue(uint64 guid, bool front);
|
||||
void RemoveFromNewQueue(uint64 guid);
|
||||
|
||||
void RemoveFromCompatibles(uint64 guid);
|
||||
void AddToCompatibles(Lfg5Guids const& key);
|
||||
|
||||
uint32 FindBestCompatibleInQueue(LfgQueueDataContainer::iterator itrQueue);
|
||||
void UpdateBestCompatibleInQueue(LfgQueueDataContainer::iterator itrQueue, Lfg5Guids const& key);
|
||||
|
||||
LfgCompatibility FindNewGroups(const uint64& newGuid);
|
||||
LfgCompatibility CheckCompatibility(Lfg5Guids const& checkWith, const uint64& newGuid, uint64& foundMask, uint32& foundCount, const std::set<Lfg5Guids>& 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;
|
||||
};
|
||||
|
||||
} // namespace lfg
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user