AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
lfg::LFGMgr Class Reference

#include "LFGMgr.h"

Public Member Functions

void Update (uint32 diff, uint8 task)
 
void FinishDungeon (ObjectGuid gguid, uint32 dungeonId, Map const *currMap)
 Finish the dungeon for the given group. All check are performed using internal lfg data.
 
void LoadRewards ()
 Loads rewards for random dungeons.
 
void LoadLFGDungeons (bool reload=false)
 Loads dungeons from dbc and adds teleport coords.
 
LfgDungeonSet FilterCooldownDungeons (LfgDungeonSet const &dungeons, LfgRolesMap const &players)
 Filters out recently completed dungeons from the proposal set for the given players.
 
void ClearDungeonCooldowns ()
 Clears all dungeon cooldowns for all players.
 
bool selectedRandomLfgDungeon (ObjectGuid guid)
 Check if given guid applied for random dungeon.
 
bool inLfgDungeonMap (ObjectGuid guid, uint32 map, Difficulty difficulty)
 Check if given guid applied for given map and difficulty. Used to know.
 
LfgDungeonSet const & GetSelectedDungeons (ObjectGuid guid)
 Get selected dungeons.
 
LfgState GetState (ObjectGuid guid)
 Get current lfg state.
 
uint32 GetDungeon (ObjectGuid guid, bool asId=true)
 Get current dungeon.
 
uint32 GetDungeonMapId (ObjectGuid guid)
 Get the map id of the current dungeon.
 
uint8 GetKicksLeft (ObjectGuid gguid)
 Get kicks left in current group.
 
void _LoadFromDB (Field *fields, ObjectGuid guid)
 Load Lfg group info from DB.
 
void SetupGroupMember (ObjectGuid guid, ObjectGuid gguid)
 Initializes player data after loading group data from DB.
 
uint32 GetLFGDungeonEntry (uint32 id)
 Return Lfg dungeon entry for given dungeon id.
 
uint8 GetRoles (ObjectGuid guid)
 Get current player roles.
 
std::string const & GetComment (ObjectGuid gguid)
 Get current player comment (used for LFR)
 
uint32 GetOptions ()
 Gets current lfg options.
 
void SetOptions (uint32 options)
 Sets new lfg options.
 
bool isOptionEnabled (uint32 option)
 Checks if given lfg option is enabled.
 
void Clean ()
 Clears queue - Only for internal testing.
 
ObjectGuid GetLeader (ObjectGuid guid)
 Get leader of the group (using internal data)
 
void InitializeLockedDungeons (Player *player, Group const *group=nullptr)
 Initializes locked dungeons for given player (called at login or level change)
 
void SetTeam (ObjectGuid guid, TeamId teamId)
 Sets player team.
 
void SetGroup (ObjectGuid guid, ObjectGuid group)
 Sets player group.
 
ObjectGuid GetGroup (ObjectGuid guid)
 Gets player group.
 
void SetLeader (ObjectGuid gguid, ObjectGuid leader)
 Sets the leader of the group.
 
void RemoveGroupData (ObjectGuid guid)
 Removes saved group data.
 
uint8 RemovePlayerFromGroup (ObjectGuid gguid, ObjectGuid guid)
 Removes a player from a group.
 
void AddPlayerToGroup (ObjectGuid gguid, ObjectGuid guid)
 Adds player to group.
 
void AddPlayerQueuedForRandomDungeonToGroup (ObjectGuid gguid, ObjectGuid guid)
 Store player that selected random queue to group.
 
bool IsPlayerQueuedForRandomDungeon (ObjectGuid guid)
 
void SetRandomPlayersCount (ObjectGuid guid, uint8 count)
 Xinef: Set Random Players Count.
 
uint8 GetRandomPlayersCount (ObjectGuid guid)
 Xinef: Get Random Players Count.
 
LfgLockMap const & GetLockedDungeons (ObjectGuid guid)
 Get locked dungeons.
 
LfgUpdateData GetLfgStatus (ObjectGuid guid)
 Returns current lfg status.
 
bool IsSeasonActive (uint32 dungeonId)
 Checks if Seasonal dungeon is active.
 
bool IsDungeonDisabled (uint32 mapId, Difficulty difficulty) const
 Checks if given dungeon map is disabled.
 
LfgReward const * GetRandomDungeonReward (uint32 dungeon, uint8 level)
 Gets the random dungeon reward corresponding to given dungeon and player level.
 
LfgDungeonSet GetRandomAndSeasonalDungeons (uint8 level, uint8 expansion)
 Returns all random and seasonal dungeons for given level and expansion.
 
void TeleportPlayer (Player *player, bool out, WorldLocation const *teleportLocation=nullptr)
 Teleport a player to/from selected dungeon.
 
void InitBoot (ObjectGuid gguid, ObjectGuid kicker, ObjectGuid victim, std::string const &reason)
 Inits new proposal to boot a player.
 
void UpdateBoot (ObjectGuid guid, bool accept)
 Updates player boot proposal with new player answer.
 
void UpdateProposal (uint32 proposalId, ObjectGuid guid, bool accept)
 Updates proposal to join dungeon with player answer.
 
void UpdateRoleCheck (ObjectGuid gguid, ObjectGuid guid=ObjectGuid::Empty, uint8 roles=PLAYER_ROLE_NONE)
 Updates the role check with player answer.
 
void SetRoles (ObjectGuid guid, uint8 roles)
 Sets player lfg roles.
 
void SetComment (ObjectGuid guid, std::string const &comment)
 Sets player lfr comment.
 
void JoinLfg (Player *player, uint8 roles, LfgDungeonSet &dungeons, std::string const &comment)
 Join Lfg with selected roles, dungeons and comment.
 
void LeaveLfg (ObjectGuid guid)
 Leaves lfg.
 
void LeaveAllLfgQueues (ObjectGuid guid, bool allowgroup, ObjectGuid groupguid=ObjectGuid::Empty)
 pussywizard: cleans all queues' data
 
void JoinRaidBrowser (Player *player, uint8 roles, LfgDungeonSet &dungeons, std::string comment)
 pussywizard: Raid Browser
 
void LeaveRaidBrowser (ObjectGuid guid)
 
void LfrSearchAdd (Player *p, uint32 dungeonId)
 
void LfrSearchRemove (Player *p)
 
void SendRaidBrowserCachedList (Player *player, uint32 dungeonId)
 
void UpdateRaidBrowser (uint32 diff)
 
void LfrSetComment (Player *p, std::string comment)
 
void SendRaidBrowserJoinedPacket (Player *p, LfgDungeonSet &dungeons, std::string comment)
 
void RBPacketAppendGroup (RBInternalInfo const &info, ByteBuffer &buffer)
 
void RBPacketAppendPlayer (RBInternalInfo const &info, ByteBuffer &buffer)
 
void RBPacketBuildDifference (WorldPacket &differencePacket, uint32 dungeonId, uint32 deletedCounter, ByteBuffer const &bufferDeleted, uint32 groupCounter, ByteBuffer const &bufferGroups, uint32 playerCounter, ByteBuffer const &bufferPlayers)
 
void RBPacketBuildFull (WorldPacket &fullPacket, uint32 dungeonId, RBInternalInfoMap const &infoMap)
 
LfgState GetOldState (ObjectGuid guid)
 Get last lfg state (NONE, DUNGEON or FINISHED_DUNGEON)
 
bool IsLfgGroup (ObjectGuid guid)
 Check if given group guid is lfg.
 
uint8 GetPlayerCount (ObjectGuid guid)
 Gets the player count of given group.
 
uint32 AddProposal (LfgProposal &proposal)
 Add a new Proposal.
 
bool AllQueued (Lfg5Guids const &check)
 Checks if all players are queued.
 
void ToggleTesting ()
 
bool IsTesting () const
 For 1 player queue testing.
 
void SetDungeon (ObjectGuid guid, uint32 dungeon)
 

Static Public Member Functions

static LFGMgrinstance ()
 
static uint8 CheckGroupRoles (LfgRolesMap &groles)
 Checks if given roles match, modifies given roles map with new roles.
 
static bool HasIgnore (ObjectGuid guid1, ObjectGuid guid2)
 Checks if given players are ignoring each other.
 
static void SendLfgQueueStatus (ObjectGuid guid, LfgQueueStatusData const &data)
 Sends queue status to player.
 

Private Types

typedef std::unordered_map< ObjectGuid, RBEntryInfoRBEntryInfoMap
 
typedef std::unordered_map< uint32, RBEntryInfoMapRBStoreMap
 
typedef std::unordered_map< ObjectGuid, uint32RBSearchersMap
 
typedef std::unordered_map< uint32, WorldPacketRBCacheMap
 
typedef std::unordered_map< ObjectGuid, RBInternalInfoRBInternalInfoMap
 
typedef std::unordered_map< uint32, RBInternalInfoMapRBInternalInfoMapMap
 
typedef std::set< uint32RBUsedDungeonsSet
 
typedef std::unordered_map< uint32, TimePointLfgDungeonCooldownMap
 
typedef std::unordered_map< ObjectGuid, LfgDungeonCooldownMapLfgDungeonCooldownContainer
 

Private Member Functions

 LFGMgr ()
 
 ~LFGMgr ()
 
TeamId GetTeam (ObjectGuid guid)
 
void RestoreState (ObjectGuid guid, char const *debugMsg)
 
void ClearState (ObjectGuid guid, char const *debugMsg)
 
void SetSelectedDungeons (ObjectGuid guid, LfgDungeonSet const &dungeons)
 
void SetLockedDungeons (ObjectGuid guid, LfgLockMap const &lock)
 
void DecreaseKicksLeft (ObjectGuid guid)
 
void SetState (ObjectGuid guid, LfgState state)
 
void SetCanOverrideRBState (ObjectGuid guid, bool val)
 
void GetCompatibleDungeons (LfgDungeonSet &dungeons, LfgGuidSet const &players, LfgLockPartyMap &lockMap, uint32 randomDungeonId=0)
 
void _SaveToDB (ObjectGuid guid)
 
LFGDungeonData const * GetLFGDungeon (uint32 id)
 
void RemoveProposal (LfgProposalContainer::iterator itProposal, LfgUpdateType type)
 
void MakeNewGroup (LfgProposal const &proposal)
 
LFGQueueGetQueue (ObjectGuid guid)
 
LfgDungeonSet const & GetDungeonsByRandom (uint32 randomdungeon)
 
LfgType GetDungeonType (uint32 dungeon)
 
void SendLfgBootProposalUpdate (ObjectGuid guid, LfgPlayerBoot const &boot)
 
void SendLfgJoinResult (ObjectGuid guid, LfgJoinResultData const &data)
 
void SendLfgRoleChosen (ObjectGuid guid, ObjectGuid pguid, uint8 roles)
 
void SendLfgRoleCheckUpdate (ObjectGuid guid, LfgRoleCheck const &roleCheck)
 
void SendLfgUpdateParty (ObjectGuid guid, LfgUpdateData const &data)
 
void SendLfgUpdatePlayer (ObjectGuid guid, LfgUpdateData const &data)
 
void SendLfgUpdateProposal (ObjectGuid guid, LfgProposal const &proposal)
 
LfgGuidSet const & GetPlayers (ObjectGuid guid)
 
void AddDungeonCooldown (ObjectGuid guid, uint32 dungeonId)
 
void CleanupDungeonCooldowns ()
 
Seconds GetDungeonCooldownDuration () const
 

Private Attributes

RBStoreMap RaidBrowserStore [2]
 
RBSearchersMap RBSearchersStore [2]
 
RBCacheMap RBCacheStore [2]
 
RBInternalInfoMapMap RBInternalInfoStorePrev [2]
 
RBInternalInfoMapMap RBInternalInfoStoreCurr [2]
 
RBUsedDungeonsSet RBUsedDungeonsStore [2]
 
uint32 m_lfgProposalId
 used as internal counter for proposals
 
uint32 m_options
 Stores config options.
 
uint32 lastProposalId
 pussywizard, store it here because of splitting LFGMgr update into tasks
 
uint32 m_raidBrowserUpdateTimer [2]
 pussywizard
 
uint32 m_raidBrowserLastUpdatedDungeonId [2]
 pussywizard: for 2 factions
 
ByteBuffer _rbBufferDeleted
 
ByteBuffer _rbBufferGroups
 
ByteBuffer _rbBufferPlayers
 
GuidSet _rbDeletedGroups
 
GuidSet _rbDeletedGroupsToErase
 
RBInternalInfoMap _rbCopy
 
LfgQueueContainer QueuesStore
 Queues.
 
LfgCachedDungeonContainer CachedDungeonMapStore
 Stores all dungeons by groupType.
 
LfgRewardContainer RewardMapStore
 Stores rewards for random dungeons.
 
LFGDungeonContainer LfgDungeonStore
 
LfgRoleCheckContainer RoleChecksStore
 Current Role checks.
 
LfgProposalContainer ProposalsStore
 Current Proposals.
 
LfgPlayerBootContainer BootsStore
 Current player kicks.
 
LfgPlayerDataContainer PlayersStore
 Player data.
 
LfgGroupDataContainer GroupsStore
 Group data.
 
bool m_Testing
 
LfgDungeonCooldownContainer DungeonCooldownStore
 Stores dungeon cooldowns per player.
 

Detailed Description

Member Typedef Documentation

◆ LfgDungeonCooldownContainer

◆ LfgDungeonCooldownMap

typedef std::unordered_map<uint32 , TimePoint > lfg::LFGMgr::LfgDungeonCooldownMap
private

◆ RBCacheMap

typedef std::unordered_map<uint32 , WorldPacket> lfg::LFGMgr::RBCacheMap
private

◆ RBEntryInfoMap

typedef std::unordered_map<ObjectGuid , RBEntryInfo> lfg::LFGMgr::RBEntryInfoMap
private

◆ RBInternalInfoMap

typedef std::unordered_map<ObjectGuid , RBInternalInfo> lfg::LFGMgr::RBInternalInfoMap
private

◆ RBInternalInfoMapMap

typedef std::unordered_map<uint32 , RBInternalInfoMap> lfg::LFGMgr::RBInternalInfoMapMap
private

◆ RBSearchersMap

typedef std::unordered_map<ObjectGuid , uint32 > lfg::LFGMgr::RBSearchersMap
private

◆ RBStoreMap

typedef std::unordered_map<uint32 , RBEntryInfoMap> lfg::LFGMgr::RBStoreMap
private

◆ RBUsedDungeonsSet

typedef std::set<uint32 > lfg::LFGMgr::RBUsedDungeonsSet
private

Constructor & Destructor Documentation

◆ LFGMgr()

lfg::LFGMgr::LFGMgr ( )
private
47 {
48 for (uint8 team = 0; team < 2; ++team)
49 {
50 m_raidBrowserUpdateTimer[team] = 10000;
52 }
53 }
std::uint8_t uint8
Definition Define.h:109
@ CONFIG_LFG_OPTIONSMASK
Definition WorldConfig.h:331
@ CONFIG_DEBUG_LFG
Definition WorldConfig.h:124
bool m_Testing
Definition LFGMgr.h:649
uint32 m_lfgProposalId
used as internal counter for proposals
Definition LFGMgr.h:626
uint32 m_raidBrowserLastUpdatedDungeonId[2]
pussywizard: for 2 factions
Definition LFGMgr.h:630
uint32 m_options
Stores config options.
Definition LFGMgr.h:627
uint32 m_raidBrowserUpdateTimer[2]
pussywizard
Definition LFGMgr.h:629
#define sWorld
Definition World.h:318

References m_raidBrowserLastUpdatedDungeonId, and m_raidBrowserUpdateTimer.

◆ ~LFGMgr()

lfg::LFGMgr::~LFGMgr ( )
private
56 {
57 for (LfgRewardContainer::iterator itr = RewardMapStore.begin(); itr != RewardMapStore.end(); ++itr)
58 delete itr->second;
59 }
LfgRewardContainer RewardMapStore
Stores rewards for random dungeons.
Definition LFGMgr.h:641

References RewardMapStore.

Member Function Documentation

◆ _LoadFromDB()

void lfg::LFGMgr::_LoadFromDB ( Field fields,
ObjectGuid  guid 
)

Load Lfg group info from DB.

68 {
69 if (!fields)
70 return;
71
72 if (!guid.IsGroup())
73 return;
74
75 SetLeader(guid, ObjectGuid::Create<HighGuid::Player>(fields[0].Get<uint32>()));
76
77 uint32 dungeon = fields[17].Get<uint32>();
78 uint8 state = fields[18].Get<uint8>();
79
80 if (!dungeon || !state)
81 return;
82
83 SetDungeon(guid, dungeon);
84
85 switch (state)
86 {
89 SetState(guid, (LfgState)state);
90 break;
91 default:
92 break;
93 }
94 }
std::uint32_t uint32
Definition Define.h:107
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:112
bool IsGroup() const
Definition ObjectGuid.h:182
void SetDungeon(ObjectGuid guid, uint32 dungeon)
Definition LFGMgr.cpp:2610
void SetState(ObjectGuid guid, LfgState state)
Definition LFGMgr.cpp:2583
void SetLeader(ObjectGuid gguid, ObjectGuid leader)
Sets the leader of the group.
Definition LFGMgr.cpp:2709
LfgState
Definition LFG.h:67
@ LFG_STATE_FINISHED_DUNGEON
Definition LFG.h:74
@ LFG_STATE_DUNGEON
Definition LFG.h:73

References Field::Get(), ObjectGuid::IsGroup(), lfg::LFG_STATE_DUNGEON, lfg::LFG_STATE_FINISHED_DUNGEON, SetDungeon(), SetLeader(), and SetState().

◆ _SaveToDB()

void lfg::LFGMgr::_SaveToDB ( ObjectGuid  guid)
private
97 {
98 if (!guid.IsGroup())
99 return;
100
102 stmt->SetData(0, guid.GetCounter());
103 stmt->SetData(1, GetDungeon(guid));
104 stmt->SetData(2, GetState(guid));
105 CharacterDatabase.Execute(stmt);
106 }
@ CHAR_REP_LFG_DATA
Definition CharacterDatabase.h:328
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
LowType GetCounter() const
Definition ObjectGuid.h:149
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157
LfgState GetState(ObjectGuid guid)
Get current lfg state.
Definition LFGMgr.cpp:2479
uint32 GetDungeon(ObjectGuid guid, bool asId=true)
Get current dungeon.
Definition LFGMgr.cpp:2503

References CHAR_REP_LFG_DATA, CharacterDatabase, ObjectGuid::GetCounter(), GetDungeon(), GetState(), ObjectGuid::IsGroup(), and PreparedStatementBase::SetData().

Referenced by FinishDungeon(), and MakeNewGroup().

◆ AddDungeonCooldown()

void lfg::LFGMgr::AddDungeonCooldown ( ObjectGuid  guid,
uint32  dungeonId 
)
private
170 {
172 return;
173
174 DungeonCooldownStore[guid][dungeonId] = GameTime::Now();
175 }
@ CONFIG_LFG_DUNGEON_SELECTION_COOLDOWN
Definition WorldConfig.h:332
LfgDungeonCooldownContainer DungeonCooldownStore
Stores dungeon cooldowns per player.
Definition LFGMgr.h:654
TimePoint Now()
Current chrono steady_clock time point.
Definition GameTime.cpp:53

References CONFIG_LFG_DUNGEON_SELECTION_COOLDOWN, DungeonCooldownStore, GameTime::Now(), and sWorld.

Referenced by FinishDungeon().

◆ AddPlayerQueuedForRandomDungeonToGroup()

void lfg::LFGMgr::AddPlayerQueuedForRandomDungeonToGroup ( ObjectGuid  gguid,
ObjectGuid  guid 
)

Store player that selected random queue to group.

2698 {
2699 LfgDungeonSet const& dungeons = GetSelectedDungeons(guid);
2700 if (dungeons.empty())
2701 return;
2702
2703 uint32 dungeonId = *dungeons.begin();
2704 LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId);
2705 if (dungeon && (dungeon->type == LFG_TYPE_RANDOM))
2706 GroupsStore[gguid].AddRandomQueuedPlayer(guid);
2707 }
LFGDungeonData const * GetLFGDungeon(uint32 id)
Definition LFGMgr.cpp:250
LfgGroupDataContainer GroupsStore
Group data.
Definition LFGMgr.h:648
LfgDungeonSet const & GetSelectedDungeons(ObjectGuid guid)
Get selected dungeons.
Definition LFGMgr.cpp:2535
@ LFG_TYPE_RANDOM
Definition LFGMgr.h:75
std::set< uint32 > LfgDungeonSet
Definition LFG.h:114

References GetLFGDungeon(), GetSelectedDungeons(), GroupsStore, lfg::LFG_TYPE_RANDOM, and lfg::LFGDungeonData::type.

◆ AddPlayerToGroup()

void lfg::LFGMgr::AddPlayerToGroup ( ObjectGuid  gguid,
ObjectGuid  guid 
)

Adds player to group.

2693 {
2694 GroupsStore[gguid].AddPlayer(guid);
2695 }

References GroupsStore.

Referenced by SetupGroupMember().

◆ AddProposal()

uint32 lfg::LFGMgr::AddProposal ( LfgProposal proposal)

Add a new Proposal.

1906 {
1907 proposal.id = ++m_lfgProposalId;
1908 ProposalsStore[m_lfgProposalId] = proposal;
1909 return m_lfgProposalId;
1910 }
LfgProposalContainer ProposalsStore
Current Proposals.
Definition LFGMgr.h:645

References lfg::LfgProposal::id, m_lfgProposalId, and ProposalsStore.

◆ AllQueued()

bool lfg::LFGMgr::AllQueued ( Lfg5Guids const &  check)

Checks if all players are queued.

2835 {
2836 bool ok = true;
2837
2838 if (check.empty())
2839 return false;
2840
2841 for (uint8 i = 0; i < 5 && check.guids[i]; ++i)
2842 {
2843 ObjectGuid guid = check.guids[i];
2844 if (GetState(guid) != LFG_STATE_QUEUED)
2845 {
2846 LFGQueue& queue = GetQueue(guid);
2847 queue.RemoveFromQueue(guid);
2848 ok = false;
2849 }
2850 }
2851
2852 return ok;
2853 }
Definition ObjectGuid.h:121
LFGQueue & GetQueue(ObjectGuid guid)
Definition LFGMgr.cpp:2817
@ LFG_STATE_QUEUED
Definition LFG.h:70

References lfg::Lfg5Guids::empty(), GetQueue(), GetState(), lfg::Lfg5Guids::guids, lfg::LFG_STATE_QUEUED, and lfg::LFGQueue::RemoveFromQueue().

◆ CheckGroupRoles()

uint8 lfg::LFGMgr::CheckGroupRoles ( LfgRolesMap groles)
static

Checks if given roles match, modifies given roles map with new roles.

1604 {
1605 if (groles.empty())
1606 return 0;
1607
1608 uint8 damage = 0;
1609 uint8 tank = 0;
1610 uint8 healer = 0;
1611
1612 for (LfgRolesMap::iterator it = groles.begin(); it != groles.end(); ++it)
1613 {
1614 uint8 const role = it->second & ~PLAYER_ROLE_LEADER;
1615 if (role == PLAYER_ROLE_NONE)
1616 return 0;
1617
1618 if (role & PLAYER_ROLE_DAMAGE)
1619 {
1620 if (role != PLAYER_ROLE_DAMAGE)
1621 {
1622 it->second -= PLAYER_ROLE_DAMAGE;
1623 if (uint8 x = CheckGroupRoles(groles))
1624 return x;
1625 it->second += PLAYER_ROLE_DAMAGE;
1626 }
1627 else if (damage == LFG_DPS_NEEDED)
1628 return 0;
1629 else
1630 damage++;
1631 }
1632
1633 if (role & PLAYER_ROLE_HEALER)
1634 {
1635 if (role != PLAYER_ROLE_HEALER)
1636 {
1637 it->second -= PLAYER_ROLE_HEALER;
1638 if (uint8 x = CheckGroupRoles(groles))
1639 return x;
1640 it->second += PLAYER_ROLE_HEALER;
1641 }
1642 else if (healer == LFG_HEALERS_NEEDED)
1643 return 0;
1644 else
1645 healer++;
1646 }
1647
1648 if (role & PLAYER_ROLE_TANK)
1649 {
1650 if (role != PLAYER_ROLE_TANK)
1651 {
1652 it->second -= PLAYER_ROLE_TANK;
1653 if (uint8 x = CheckGroupRoles(groles))
1654 return x;
1655 it->second += PLAYER_ROLE_TANK;
1656 }
1657 else if (tank == LFG_TANKS_NEEDED)
1658 return 0;
1659 else
1660 tank++;
1661 }
1662 }
1663 if ((tank + healer + damage) == uint8(groles.size()))
1664 return (8 * tank + 4 * healer + damage);
1665 return 0;
1666 }
static uint8 CheckGroupRoles(LfgRolesMap &groles)
Checks if given roles match, modifies given roles map with new roles.
Definition LFGMgr.cpp:1603
@ LFG_HEALERS_NEEDED
Definition LFG.h:33
@ LFG_TANKS_NEEDED
Definition LFG.h:32
@ LFG_DPS_NEEDED
Definition LFG.h:34
@ PLAYER_ROLE_DAMAGE
Definition LFG.h:43
@ PLAYER_ROLE_TANK
Definition LFG.h:41
@ PLAYER_ROLE_NONE
Definition LFG.h:39
@ PLAYER_ROLE_HEALER
Definition LFG.h:42

References CheckGroupRoles(), lfg::LFG_DPS_NEEDED, lfg::LFG_HEALERS_NEEDED, lfg::LFG_TANKS_NEEDED, lfg::PLAYER_ROLE_DAMAGE, lfg::PLAYER_ROLE_HEALER, lfg::PLAYER_ROLE_NONE, and lfg::PLAYER_ROLE_TANK.

Referenced by lfg::LFGQueue::CheckCompatibility(), CheckGroupRoles(), and UpdateRoleCheck().

◆ Clean()

void lfg::LFGMgr::Clean ( )

Clears queue - Only for internal testing.

2857 {
2858 QueuesStore.clear();
2859 }
LfgQueueContainer QueuesStore
Queues.
Definition LFGMgr.h:638

References QueuesStore.

◆ CleanupDungeonCooldowns()

void lfg::LFGMgr::CleanupDungeonCooldowns ( )
private
178 {
180 return;
181
182 Seconds cooldownDuration = GetDungeonCooldownDuration();
183
184 for (auto itPlayer = DungeonCooldownStore.begin(); itPlayer != DungeonCooldownStore.end(); )
185 {
186 for (auto itDungeon = itPlayer->second.begin(); itDungeon != itPlayer->second.end(); )
187 {
188 if (GameTime::HasElapsed(itDungeon->second, cooldownDuration))
189 itDungeon = itPlayer->second.erase(itDungeon);
190 else
191 ++itDungeon;
192 }
193
194 if (itPlayer->second.empty())
195 itPlayer = DungeonCooldownStore.erase(itPlayer);
196 else
197 ++itPlayer;
198 }
199 }
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition Duration.h:30
Seconds GetDungeonCooldownDuration() const
Definition LFGMgr.cpp:206
bool HasElapsed(TimePoint start, T duration)
Check if a duration has elapsed since a given time point.
Definition GameTime.h:52

References CONFIG_LFG_DUNGEON_SELECTION_COOLDOWN, DungeonCooldownStore, GetDungeonCooldownDuration(), GameTime::HasElapsed(), and sWorld.

Referenced by Update().

◆ ClearDungeonCooldowns()

void lfg::LFGMgr::ClearDungeonCooldowns ( )

Clears all dungeon cooldowns for all players.

202 {
203 DungeonCooldownStore.clear();
204 }

References DungeonCooldownStore.

◆ ClearState()

void lfg::LFGMgr::ClearState ( ObjectGuid  guid,
char const *  debugMsg 
)
private

◆ DecreaseKicksLeft()

void lfg::LFGMgr::DecreaseKicksLeft ( ObjectGuid  guid)
private
2654 {
2655 LOG_DEBUG("lfg", "LFGMgr::DecreaseKicksLeft: [{}]", guid.ToString());
2656 GroupsStore[guid].DecreaseKicksLeft();
2657 }
#define LOG_DEBUG(filterType__,...)
Definition Log.h:157
std::string ToString() const
Definition ObjectGuid.cpp:48

References GroupsStore, LOG_DEBUG, and ObjectGuid::ToString().

Referenced by UpdateBoot().

◆ FilterCooldownDungeons()

LfgDungeonSet lfg::LFGMgr::FilterCooldownDungeons ( LfgDungeonSet const &  dungeons,
LfgRolesMap const &  players 
)

Filters out recently completed dungeons from the proposal set for the given players.

212 {
214 return dungeons;
215
216 Seconds cooldownDuration = GetDungeonCooldownDuration();
217
218 LfgDungeonSet filtered;
219 for (uint32 dungeonId : dungeons)
220 {
221 bool onCooldown = false;
222 for (auto const& playerPair : players)
223 {
224 auto itPlayer = DungeonCooldownStore.find(playerPair.first);
225 if (itPlayer != DungeonCooldownStore.end())
226 {
227 auto itDungeon = itPlayer->second.find(dungeonId);
228 if (itDungeon != itPlayer->second.end() && !GameTime::HasElapsed(itDungeon->second, cooldownDuration))
229 {
230 onCooldown = true;
231 break;
232 }
233 }
234 }
235
236 if (!onCooldown)
237 filtered.insert(dungeonId);
238 }
239
240 // If all dungeons are on cooldown, return original set to avoid blocking the queue
241 if (filtered.empty())
242 {
243 LOG_DEBUG("lfg", "LFGMgr::FilterCooldownDungeons: All {} dungeons on cooldown for group, bypassing cooldown filter", dungeons.size());
244 return dungeons;
245 }
246
247 return filtered;
248 }

References CONFIG_LFG_DUNGEON_SELECTION_COOLDOWN, DungeonCooldownStore, GetDungeonCooldownDuration(), GameTime::HasElapsed(), LOG_DEBUG, and sWorld.

◆ FinishDungeon()

void lfg::LFGMgr::FinishDungeon ( ObjectGuid  gguid,
uint32  dungeonId,
Map const *  currMap 
)

Finish the dungeon for the given group. All check are performed using internal lfg data.

Finish a dungeon and give reward, if any.

Parameters
[in]guidGroup guid
[in]dungeonIdDungeonid
2319 {
2320 uint32 gDungeonId = GetDungeon(gguid);
2321 if (gDungeonId != dungeonId)
2322 {
2323 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] Finished dungeon {} but group queued for {}. Ignoring", gguid.ToString(), dungeonId, gDungeonId);
2324 return;
2325 }
2326
2327 if (GetState(gguid) == LFG_STATE_FINISHED_DUNGEON) // Shouldn't happen. Do not reward multiple times
2328 {
2329 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] Already rewarded group. Ignoring", gguid.ToString());
2330 return;
2331 }
2332
2334 _SaveToDB(gguid); // pussywizard
2335
2336 LfgGuidSet const& players = GetPlayers(gguid);
2337 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
2338 {
2339 ObjectGuid guid = (*it);
2341 {
2342 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] Already rewarded player. Ignoring", guid.ToString());
2343 continue;
2344 }
2345
2346 uint32 rDungeonId = 0;
2347 LfgDungeonSet const& dungeons = GetSelectedDungeons(guid);
2348 if (!dungeons.empty())
2349 rDungeonId = (*dungeons.begin());
2350
2352
2353 // Give rewards only if its a random dungeon
2354 LFGDungeonData const* dungeon = GetLFGDungeon(rDungeonId);
2355
2356 if (!dungeon || (dungeon->type != LFG_TYPE_RANDOM && !dungeon->seasonal))
2357 {
2358 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] dungeon {} is not random or seasonal", guid.ToString(), rDungeonId);
2359 continue;
2360 }
2361
2362 // Record dungeon cooldown for this player (the actual dungeon completed, not the random entry)
2363 AddDungeonCooldown(guid, dungeonId);
2364
2365 Player* player = ObjectAccessor::FindPlayer(guid);
2366 if (!player || player->FindMap() != currMap) // pussywizard: currMap - multithreading crash if on other map (map id check is not enough, binding system is not reliable)
2367 {
2368 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] not found in world", guid.ToString());
2369 continue;
2370 }
2371
2372 LFGDungeonData const* dungeonDone = GetLFGDungeon(dungeonId);
2373 uint32 mapId = dungeonDone ? uint32(dungeonDone->map) : 0;
2374
2375 if (player->GetMapId() != mapId)
2376 {
2377 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] is in map {} and should be in {} to get reward", guid.ToString(), player->GetMapId(), mapId);
2378 continue;
2379 }
2380
2381 // Remove Dungeon Finder Cooldown if still exists
2383 {
2385 }
2386
2387 // Xinef: Update achievements, set correct amount of randomly grouped players
2388 if (dungeon->difficulty == DUNGEON_DIFFICULTY_HEROIC)
2389 if (uint8 count = GetRandomPlayersCount(player->GetGUID()))
2391
2392 LfgReward const* reward = GetRandomDungeonReward(rDungeonId, player->GetLevel());
2393 if (!reward)
2394 continue;
2395
2396 // CAIS full restriction: grant no dungeon reward and leave the daily available for later
2398 continue;
2399
2400 bool done = false;
2401 Quest const* quest = sObjectMgr->GetQuestTemplate(reward->firstQuest);
2402 if (!quest)
2403 continue;
2404
2405 // if we can take the quest, means that we haven't done this kind of "run", IE: First Heroic Random of Day.
2406 if (player->CanRewardQuest(quest, false))
2407 player->RewardQuest(quest, 0, nullptr, false, true);
2408 else
2409 {
2410 done = true;
2411 quest = sObjectMgr->GetQuestTemplate(reward->otherQuest);
2412 if (!quest)
2413 continue;
2414 // we give reward without informing client (retail does this)
2415 player->RewardQuest(quest, 0, nullptr, false, true);
2416 }
2417
2418 // Give rewards
2419 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] done dungeon {}, {} previously done.", player->GetGUID().ToString(), GetDungeon(gguid), done ? " " : " not");
2420 LfgPlayerRewardData data = LfgPlayerRewardData(dungeon->Entry(), GetDungeon(gguid, false), done, quest);
2421 player->GetSession()->SendLfgPlayerReward(data);
2422 }
2423 }
@ DUNGEON_DIFFICULTY_HEROIC
Definition DBCEnums.h:270
@ ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS
Definition DBCEnums.h:223
#define sObjectMgr
Definition ObjectMgr.h:1730
@ PLAYER_FLAGS_NO_PLAY_TIME
Definition Player.h:472
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114
Definition Player.h:1086
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition PlayerUpdates.cpp:2181
bool CanRewardQuest(Quest const *quest, bool msg)
Definition PlayerQuest.cpp:387
WorldSession * GetSession() const
Definition Player.h:2030
void RewardQuest(Quest const *quest, uint32 reward, Object *questGiver, bool announce=true, bool isLFGReward=false)
Definition PlayerQuest.cpp:675
bool HasPlayerFlag(PlayerFlags flags) const
Definition Player.h:1125
Definition QuestDef.h:210
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:6017
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:5189
uint8 GetLevel() const
Definition Unit.h:1104
uint32 GetMapId() const
Definition Position.h:281
Map * FindMap() const
Definition Object.h:632
void SendLfgPlayerReward(lfg::LfgPlayerRewardData const &lfgPlayerRewardData)
Definition LFGHandler.cpp:475
void AddDungeonCooldown(ObjectGuid guid, uint32 dungeonId)
Definition LFGMgr.cpp:169
uint8 GetRandomPlayersCount(ObjectGuid guid)
Xinef: Get Random Players Count.
Definition LFGMgr.cpp:2752
void _SaveToDB(ObjectGuid guid)
Definition LFGMgr.cpp:96
LfgReward const * GetRandomDungeonReward(uint32 dungeon, uint8 level)
Gets the random dungeon reward corresponding to given dungeon and player level.
Definition LFGMgr.cpp:2449
LfgGuidSet const & GetPlayers(ObjectGuid guid)
Definition LFGMgr.cpp:2732
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:269
GuidSet LfgGuidSet
Definition LFG.h:117
@ LFG_SPELL_DUNGEON_COOLDOWN
Definition LFGMgr.h:53

References _SaveToDB(), ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS, AddDungeonCooldown(), Player::CanRewardQuest(), lfg::LFGDungeonData::difficulty, DUNGEON_DIFFICULTY_HEROIC, lfg::LFGDungeonData::Entry(), WorldObject::FindMap(), ObjectAccessor::FindPlayer(), lfg::LfgReward::firstQuest, GetDungeon(), Object::GetGUID(), Unit::GetLevel(), GetLFGDungeon(), WorldLocation::GetMapId(), GetPlayers(), GetRandomDungeonReward(), GetRandomPlayersCount(), GetSelectedDungeons(), Player::GetSession(), GetState(), Unit::HasAura(), Player::HasPlayerFlag(), lfg::LFG_SPELL_DUNGEON_COOLDOWN, lfg::LFG_STATE_FINISHED_DUNGEON, lfg::LFG_TYPE_RANDOM, LOG_DEBUG, lfg::LFGDungeonData::map, lfg::LfgReward::otherQuest, PLAYER_FLAGS_NO_PLAY_TIME, Unit::RemoveAurasDueToSpell(), Player::RewardQuest(), lfg::LFGDungeonData::seasonal, WorldSession::SendLfgPlayerReward(), SetState(), sObjectMgr, ObjectGuid::ToString(), lfg::LFGDungeonData::type, and Player::UpdateAchievementCriteria().

◆ GetComment()

std::string const & lfg::LFGMgr::GetComment ( ObjectGuid  gguid)

Get current player comment (used for LFR)

2530 {
2531 LOG_DEBUG("lfg", "LFGMgr::GetComment: [{}] = {}", guid.ToString(), PlayersStore[guid].GetComment());
2532 return PlayersStore[guid].GetComment();
2533 }
LfgPlayerDataContainer PlayersStore
Player data.
Definition LFGMgr.h:647

References LOG_DEBUG, PlayersStore, and ObjectGuid::ToString().

Referenced by RemoveProposal(), Update(), and UpdateRoleCheck().

◆ GetCompatibleDungeons()

void lfg::LFGMgr::GetCompatibleDungeons ( LfgDungeonSet dungeons,
LfgGuidSet const &  players,
LfgLockPartyMap lockMap,
uint32  randomDungeonId = 0 
)
private

Given a list of dungeons remove the dungeons players have restrictions.

Parameters
[in,out]dungeonsDungeons to check restrictions
[in]playersSet of players to check their dungeon restrictions
[out]lockMapMap of players Lock status info of given dungeons (Empty if dungeons is not empty)
[in]randomDungeonIdRandom dungeon ID (0 for non-random selections), used to filter disabled maps
1574 {
1575 lockMap.clear();
1576 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end() && !dungeons.empty(); ++it)
1577 {
1578 ObjectGuid guid = (*it);
1579 LfgLockMap const& cachedLockMap = GetLockedDungeons(guid);
1580 for (LfgLockMap::const_iterator it2 = cachedLockMap.begin(); it2 != cachedLockMap.end() && !dungeons.empty(); ++it2)
1581 {
1582 uint32 dungeonId = (it2->first & 0x00FFFFFF); // Compare dungeon ids
1583
1584 LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId);
1585
1586 uint8 difficultyFlag = (randomDungeonId == RANDOM_DUNGEON_NORMAL_TBC || randomDungeonId == RANDOM_DUNGEON_NORMAL_WOTLK) ? 0 : 1;
1587
1588 if (dungeon && !IsDungeonDisabled(dungeon->map, (Difficulty)difficultyFlag) && it2->second == LFG_LOCKSTATUS_RAID_LOCKED && randomDungeonId && sWorld->getBoolConfig(CONFIG_LFG_ALLOW_COMPLETED))
1589 continue;
1590
1591 LfgDungeonSet::iterator itDungeon = dungeons.find(dungeonId);
1592 if (itDungeon != dungeons.end())
1593 {
1594 dungeons.erase(itDungeon);
1595 lockMap[guid][dungeonId] = it2->second;
1596 }
1597 }
1598 }
1599 if (!dungeons.empty())
1600 lockMap.clear();
1601 }
Difficulty
Definition DBCEnums.h:266
@ CONFIG_LFG_ALLOW_COMPLETED
Definition WorldConfig.h:97
bool IsDungeonDisabled(uint32 mapId, Difficulty difficulty) const
Checks if given dungeon map is disabled.
Definition LFGMgr.cpp:2959
LfgLockMap const & GetLockedDungeons(ObjectGuid guid)
Get locked dungeons.
Definition LFGMgr.cpp:2541
@ LFG_LOCKSTATUS_RAID_LOCKED
Definition LFG.h:86
std::map< uint32, uint32 > LfgLockMap
Definition LFG.h:115
@ RANDOM_DUNGEON_NORMAL_TBC
Definition LFG.h:105
@ RANDOM_DUNGEON_NORMAL_WOTLK
Definition LFG.h:107

References CONFIG_LFG_ALLOW_COMPLETED, GetLFGDungeon(), GetLockedDungeons(), IsDungeonDisabled(), lfg::LFG_LOCKSTATUS_RAID_LOCKED, lfg::LFGDungeonData::map, lfg::RANDOM_DUNGEON_NORMAL_TBC, lfg::RANDOM_DUNGEON_NORMAL_WOTLK, and sWorld.

Referenced by JoinLfg().

◆ GetDungeon()

uint32 lfg::LFGMgr::GetDungeon ( ObjectGuid  guid,
bool  asId = true 
)

Get current dungeon.

2504 {
2505 uint32 dungeon = GroupsStore[guid].GetDungeon(asId);
2506 LOG_DEBUG("lfg", "LFGMgr::GetDungeon: [{}] asId: {} = {}", guid.ToString(), asId, dungeon);
2507 return dungeon;
2508 }

References GroupsStore, LOG_DEBUG, and ObjectGuid::ToString().

Referenced by _SaveToDB(), FinishDungeon(), inLfgDungeonMap(), JoinLfg(), LeaveLfg(), SetupGroupMember(), and TeleportPlayer().

◆ GetDungeonCooldownDuration()

Seconds lfg::LFGMgr::GetDungeonCooldownDuration ( ) const
private
207 {
209 }
constexpr auto MINUTE
Definition Common.h:47

References CONFIG_LFG_DUNGEON_SELECTION_COOLDOWN, MINUTE, and sWorld.

Referenced by CleanupDungeonCooldowns(), and FilterCooldownDungeons().

◆ GetDungeonMapId()

uint32 lfg::LFGMgr::GetDungeonMapId ( ObjectGuid  guid)

Get the map id of the current dungeon.

2511 {
2512 uint32 dungeonId = GroupsStore[guid].GetDungeon(true);
2513 uint32 mapId = 0;
2514 if (dungeonId)
2515 if (LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId))
2516 mapId = dungeon->map;
2517
2518 LOG_DEBUG("lfg", "LFGMgr::GetDungeonMapId: [{}] = {} (DungeonId = {})", guid.ToString(), mapId, dungeonId);
2519 return mapId;
2520 }

References GetLFGDungeon(), GroupsStore, LOG_DEBUG, and ObjectGuid::ToString().

◆ GetDungeonsByRandom()

LfgDungeonSet const & lfg::LFGMgr::GetDungeonsByRandom ( uint32  randomdungeon)
private

Get the dungeon list that can be done given a random dungeon entry.

Parameters
[in]randomdungeonRandom dungeon id (if value = 0 will return all dungeons)
Returns
Set of dungeons that can be done.
2436 {
2437 LFGDungeonData const* dungeon = GetLFGDungeon(randomdungeon);
2438 uint32 group = dungeon ? dungeon->group : 0;
2439 return CachedDungeonMapStore[group];
2440 }
LfgCachedDungeonContainer CachedDungeonMapStore
Stores all dungeons by groupType.
Definition LFGMgr.h:639

References CachedDungeonMapStore, GetLFGDungeon(), and lfg::LFGDungeonData::group.

Referenced by InitializeLockedDungeons(), and JoinLfg().

◆ GetDungeonType()

LfgType lfg::LFGMgr::GetDungeonType ( uint32  dungeonId)
private

Given a Dungeon id returns the dungeon Type

Parameters
[in]dungeondungeon id
Returns
Dungeon type
2471 {
2472 LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId);
2473 if (!dungeon)
2474 return LFG_TYPE_NONE;
2475
2476 return LfgType(dungeon->type);
2477 }
LfgType
Determines the type of instance.
Definition LFGMgr.h:69
@ LFG_TYPE_NONE
Definition LFGMgr.h:70

References GetLFGDungeon(), lfg::LFG_TYPE_NONE, and lfg::LFGDungeonData::type.

Referenced by JoinLfg().

◆ GetGroup()

ObjectGuid lfg::LFGMgr::GetGroup ( ObjectGuid  guid)

Gets player group.

2723 {
2724 return PlayersStore[guid].GetGroup();
2725 }

References PlayersStore.

Referenced by inLfgDungeonMap(), IsPlayerQueuedForRandomDungeon(), LeaveAllLfgQueues(), LeaveLfg(), MakeNewGroup(), Update(), and UpdateBoot().

◆ GetKicksLeft()

uint8 lfg::LFGMgr::GetKicksLeft ( ObjectGuid  gguid)

Get kicks left in current group.

2548 {
2549 uint8 kicks = GroupsStore[guid].GetKicksLeft();
2550 LOG_DEBUG("lfg", "LFGMgr::GetKicksLeft: [{}] = {}", guid.ToString(), kicks);
2551 return kicks;
2552 }

References GroupsStore, LOG_DEBUG, and ObjectGuid::ToString().

◆ GetLeader()

ObjectGuid lfg::LFGMgr::GetLeader ( ObjectGuid  guid)

Get leader of the group (using internal data)

2743 {
2744 return GroupsStore[guid].GetLeader();
2745 }

References GroupsStore.

Referenced by GetQueue(), and LeaveLfg().

◆ GetLFGDungeon()

LFGDungeonData const * lfg::LFGMgr::GetLFGDungeon ( uint32  id)
private
251 {
252 LFGDungeonContainer::const_iterator itr = LfgDungeonStore.find(id);
253 if (itr != LfgDungeonStore.end())
254 return &(itr->second);
255
256 return nullptr;
257 }
LFGDungeonContainer LfgDungeonStore
Definition LFGMgr.h:642

References LfgDungeonStore.

Referenced by AddPlayerQueuedForRandomDungeonToGroup(), FinishDungeon(), GetCompatibleDungeons(), GetDungeonMapId(), GetDungeonsByRandom(), GetDungeonType(), GetLFGDungeonEntry(), InitializeLockedDungeons(), inLfgDungeonMap(), JoinRaidBrowser(), MakeNewGroup(), selectedRandomLfgDungeon(), TeleportPlayer(), and UpdateRaidBrowser().

◆ GetLFGDungeonEntry()

uint32 lfg::LFGMgr::GetLFGDungeonEntry ( uint32  id)

Return Lfg dungeon entry for given dungeon id.

2938 {
2939 if (id)
2940 if (LFGDungeonData const* dungeon = GetLFGDungeon(id))
2941 return dungeon->Entry();
2942
2943 return 0;
2944 }

References GetLFGDungeon().

Referenced by LoadRewards().

◆ GetLfgStatus()

LfgUpdateData lfg::LFGMgr::GetLfgStatus ( ObjectGuid  guid)

Returns current lfg status.

2877 {
2878 LfgPlayerData& playerData = PlayersStore[guid];
2879 return LfgUpdateData(LFG_UPDATETYPE_UPDATE_STATUS, playerData.GetState(), playerData.GetSelectedDungeons());
2880 }
@ LFG_UPDATETYPE_UPDATE_STATUS
Definition LFG.h:61

References lfg::LfgPlayerData::GetSelectedDungeons(), lfg::LfgPlayerData::GetState(), lfg::LFG_UPDATETYPE_UPDATE_STATUS, and PlayersStore.

◆ GetLockedDungeons()

LfgLockMap const & lfg::LFGMgr::GetLockedDungeons ( ObjectGuid  guid)

Get locked dungeons.

2542 {
2543 LOG_DEBUG("lfg", "LFGMgr::GetLockedDungeons: [{}]", guid.ToString());
2544 return PlayersStore[guid].GetLockedDungeons();
2545 }

References LOG_DEBUG, PlayersStore, and ObjectGuid::ToString().

Referenced by GetCompatibleDungeons().

◆ GetOldState()

LfgState lfg::LFGMgr::GetOldState ( ObjectGuid  guid)

Get last lfg state (NONE, DUNGEON or FINISHED_DUNGEON)

2492 {
2493 LfgState state;
2494 if (guid.IsGroup())
2495 state = GroupsStore[guid].GetOldState();
2496 else
2497 state = PlayersStore[guid].GetOldState();
2498
2499 LOG_DEBUG("lfg", "LFGMgr::GetOldState: [{}] = {}", guid.ToString(), state);
2500 return state;
2501 }

References GroupsStore, ObjectGuid::IsGroup(), LOG_DEBUG, PlayersStore, and ObjectGuid::ToString().

◆ GetOptions()

uint32 lfg::LFGMgr::GetOptions ( )

Gets current lfg options.

2867 {
2868 return m_options;
2869 }

References m_options.

◆ GetPlayerCount()

uint8 lfg::LFGMgr::GetPlayerCount ( ObjectGuid  guid)

Gets the player count of given group.

2738 {
2739 return GroupsStore[guid].GetPlayerCount();
2740 }

References GroupsStore.

◆ GetPlayers()

LfgGuidSet const & lfg::LFGMgr::GetPlayers ( ObjectGuid  guid)
private
2733 {
2734 return GroupsStore[guid].GetPlayers();
2735 }

References GroupsStore.

Referenced by FinishDungeon(), GetQueue(), InitBoot(), LeaveAllLfgQueues(), and LeaveLfg().

◆ GetQueue()

LFGQueue & lfg::LFGMgr::GetQueue ( ObjectGuid  guid)
private
2818 {
2819 uint8 queueId = 0;
2820 if (guid.IsGroup())
2821 {
2822 LfgGuidSet const& players = GetPlayers(guid);
2823 ObjectGuid pguid = players.empty() ? ObjectGuid::Empty : (*players.begin());
2824 if (pguid)
2825 queueId = GetTeam(pguid);
2826 else
2827 queueId = GetTeam(GetLeader(guid));
2828 }
2829 else
2830 queueId = GetTeam(guid);
2831 return QueuesStore[queueId];
2832 }
static ObjectGuid const Empty
Definition ObjectGuid.h:123
ObjectGuid GetLeader(ObjectGuid guid)
Get leader of the group (using internal data)
Definition LFGMgr.cpp:2742
TeamId GetTeam(ObjectGuid guid)
Definition LFGMgr.cpp:2682

References ObjectGuid::Empty, GetLeader(), GetPlayers(), GetTeam(), ObjectGuid::IsGroup(), and QueuesStore.

Referenced by AllQueued(), JoinLfg(), LeaveLfg(), RemoveProposal(), UpdateProposal(), and UpdateRoleCheck().

◆ GetRandomAndSeasonalDungeons()

LfgDungeonSet lfg::LFGMgr::GetRandomAndSeasonalDungeons ( uint8  level,
uint8  expansion 
)

Returns all random and seasonal dungeons for given level and expansion.

2947 {
2948 LfgDungeonSet randomDungeons;
2949 for (lfg::LFGDungeonContainer::const_iterator itr = LfgDungeonStore.begin(); itr != LfgDungeonStore.end(); ++itr)
2950 {
2951 lfg::LFGDungeonData const& dungeon = itr->second;
2952 if ((dungeon.type == lfg::LFG_TYPE_RANDOM || (dungeon.seasonal && sLFGMgr->IsSeasonActive(dungeon.id)))
2953 && dungeon.expansion <= expansion && dungeon.minlevel <= level && level <= dungeon.maxlevel)
2954 randomDungeons.insert(dungeon.Entry());
2955 }
2956 return randomDungeons;
2957 }
#define sLFGMgr
Definition LFGMgr.h:665
Definition LFGMgr.h:395
uint8 expansion
Definition LFGMgr.h:408
uint8 minlevel
Definition LFGMgr.h:410
uint8 maxlevel
Definition LFGMgr.h:411
uint8 type
Definition LFGMgr.h:407
uint32 Entry() const
Definition LFGMgr.h:417
bool seasonal
Definition LFGMgr.h:413
uint32 id
Definition LFGMgr.h:404

References lfg::LFGDungeonData::Entry(), lfg::LFGDungeonData::expansion, lfg::LFGDungeonData::id, lfg::LFG_TYPE_RANDOM, LfgDungeonStore, lfg::LFGDungeonData::maxlevel, lfg::LFGDungeonData::minlevel, lfg::LFGDungeonData::seasonal, sLFGMgr, and lfg::LFGDungeonData::type.

◆ GetRandomDungeonReward()

LfgReward const * lfg::LFGMgr::GetRandomDungeonReward ( uint32  dungeon,
uint8  level 
)

Gets the random dungeon reward corresponding to given dungeon and player level.

Get the reward of a given random dungeon at a certain level

Parameters
[in]dungeondungeon id
[in]levelPlayer level
Returns
Reward
2450 {
2451 LfgReward const* rew = nullptr;
2452 LfgRewardContainerBounds bounds = RewardMapStore.equal_range(dungeon & 0x00FFFFFF);
2453 for (LfgRewardContainer::const_iterator itr = bounds.first; itr != bounds.second; ++itr)
2454 {
2455 rew = itr->second;
2456 // ordered properly at loading
2457 if (itr->second->maxLevel >= level)
2458 break;
2459 }
2460
2461 return rew;
2462 }
std::pair< LfgRewardContainer::const_iterator, LfgRewardContainer::const_iterator > LfgRewardContainerBounds
Definition LFGMgr.h:268

References RewardMapStore.

Referenced by FinishDungeon().

◆ GetRandomPlayersCount()

uint8 lfg::LFGMgr::GetRandomPlayersCount ( ObjectGuid  guid)

Xinef: Get Random Players Count.

2753 {
2754 return PlayersStore[guid].GetRandomPlayersCount();
2755 }

References PlayersStore.

Referenced by FinishDungeon().

◆ GetRoles()

uint8 lfg::LFGMgr::GetRoles ( ObjectGuid  guid)

Get current player roles.

2523 {
2524 uint8 roles = PlayersStore[guid].GetRoles();
2525 LOG_DEBUG("lfg", "LFGMgr::GetRoles: [{}] = {}", guid.ToString(), roles);
2526 return roles;
2527 }

References LOG_DEBUG, PlayersStore, and ObjectGuid::ToString().

Referenced by UpdateProposal().

◆ GetSelectedDungeons()

LfgDungeonSet const & lfg::LFGMgr::GetSelectedDungeons ( ObjectGuid  guid)

Get selected dungeons.

2536 {
2537 LOG_DEBUG("lfg", "LFGMgr::GetSelectedDungeons: [{}]", guid.ToString());
2538 return PlayersStore[guid].GetSelectedDungeons();
2539 }

References LOG_DEBUG, PlayersStore, and ObjectGuid::ToString().

Referenced by AddPlayerQueuedForRandomDungeonToGroup(), FinishDungeon(), RemoveProposal(), selectedRandomLfgDungeon(), Update(), and UpdateProposal().

◆ GetState()

LfgState lfg::LFGMgr::GetState ( ObjectGuid  guid)

Get current lfg state.

2480 {
2481 LfgState state;
2482 if (guid.IsGroup())
2483 state = GroupsStore[guid].GetState();
2484 else
2485 state = PlayersStore[guid].GetState();
2486
2487 LOG_DEBUG("lfg", "LFGMgr::GetState: [{}] = {}", guid.ToString(), state);
2488 return state;
2489 }

References GroupsStore, ObjectGuid::IsGroup(), LOG_DEBUG, PlayersStore, and ObjectGuid::ToString().

Referenced by _SaveToDB(), AllQueued(), FinishDungeon(), JoinLfg(), LeaveAllLfgQueues(), LeaveLfg(), RemoveGroupData(), selectedRandomLfgDungeon(), and SetupGroupMember().

◆ GetTeam()

TeamId lfg::LFGMgr::GetTeam ( ObjectGuid  guid)
private
2683 {
2684 return PlayersStore[guid].GetTeam();
2685 }

References PlayersStore.

Referenced by GetQueue().

◆ HasIgnore()

bool lfg::LFGMgr::HasIgnore ( ObjectGuid  guid1,
ObjectGuid  guid2 
)
static

Checks if given players are ignoring each other.

2758 {
2761 return plr1 && plr2 && (plr1->GetSocial()->HasIgnore(guid2) || plr2->GetSocial()->HasIgnore(guid1));
2762 }
bool HasIgnore(ObjectGuid const &ignore_guid) const
Definition SocialMgr.cpp:194
PlayerSocial * GetSocial()
Definition Player.h:1158
Player * FindConnectedPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:281

References ObjectAccessor::FindConnectedPlayer(), Player::GetSocial(), and PlayerSocial::HasIgnore().

◆ InitBoot()

void lfg::LFGMgr::InitBoot ( ObjectGuid  gguid,
ObjectGuid  kicker,
ObjectGuid  victim,
std::string const &  reason 
)

Inits new proposal to boot a player.

Initialize a boot kick vote

Parameters
[in]gguidGroup the vote kicks belongs to
[in]kickerKicker guid
[in]victimVictim guid
[in]reasonKick reason
2132 {
2133 SetState(gguid, LFG_STATE_BOOT);
2134
2135 LfgPlayerBoot& boot = BootsStore[gguid];
2136 boot.inProgress = true;
2137 boot.cancelTime = time_t(GameTime::GetGameTime().count()) + LFG_TIME_BOOT;
2138 boot.reason = reason;
2139 boot.victim = victim;
2140
2141 LfgGuidSet const& players = GetPlayers(gguid);
2142
2143 // Set votes
2144 for (LfgGuidSet::const_iterator itr = players.begin(); itr != players.end(); ++itr)
2145 {
2146 ObjectGuid guid = (*itr);
2147 SetState(guid, LFG_STATE_BOOT);
2148 boot.votes[guid] = LFG_ANSWER_PENDING;
2149 }
2150
2151 boot.votes[victim] = LFG_ANSWER_DENY; // Victim auto vote NO
2152 boot.votes[kicker] = LFG_ANSWER_AGREE; // Kicker auto vote YES
2153
2154 // Notify players
2155 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
2156 SendLfgBootProposalUpdate(*it, boot);
2157 }
void SendLfgBootProposalUpdate(ObjectGuid guid, LfgPlayerBoot const &boot)
Definition LFGMgr.cpp:2794
LfgPlayerBootContainer BootsStore
Current player kicks.
Definition LFGMgr.h:646
Seconds GetGameTime()
Definition GameTime.cpp:38
@ LFG_STATE_BOOT
Definition LFG.h:72
@ LFG_TIME_BOOT
Definition LFGMgr.h:50
@ LFG_ANSWER_AGREE
Definition LFG.h:100
@ LFG_ANSWER_PENDING
Definition LFG.h:98
@ LFG_ANSWER_DENY
Definition LFG.h:99

References BootsStore, lfg::LfgPlayerBoot::cancelTime, GameTime::GetGameTime(), GetPlayers(), lfg::LfgPlayerBoot::inProgress, lfg::LFG_ANSWER_AGREE, lfg::LFG_ANSWER_DENY, lfg::LFG_ANSWER_PENDING, lfg::LFG_STATE_BOOT, lfg::LFG_TIME_BOOT, lfg::LfgPlayerBoot::reason, SendLfgBootProposalUpdate(), SetState(), lfg::LfgPlayerBoot::victim, and lfg::LfgPlayerBoot::votes.

◆ InitializeLockedDungeons()

void lfg::LFGMgr::InitializeLockedDungeons ( Player player,
Group const *  group = nullptr 
)

Initializes locked dungeons for given player (called at login or level change)

Generate the dungeon lock map for a given player

Parameters
[in]playerPlayer we need to initialize the lock status map
475 {
476 ObjectGuid guid = player->GetGUID();
477
478 uint8 level = player->GetLevel();
479 uint8 expansion = player->GetSession()->Expansion();
480 LfgDungeonSet const& dungeons = GetDungeonsByRandom(0);
481 LfgLockMap lock;
482
483 bool onlySeasonalBosses = m_options == LFG_OPTION_ENABLE_SEASONAL_BOSSES;
484
485 float avgItemLevel = player->GetAverageItemLevelForDF();
486
487 for (LfgDungeonSet::const_iterator it = dungeons.begin(); it != dungeons.end(); ++it)
488 {
489 LFGDungeonData const* dungeon = GetLFGDungeon(*it);
490 if (!dungeon) // should never happen - We provide a list from sLFGDungeonStore
491 continue;
492 MapEntry const* mapEntry = sMapStore.LookupEntry(dungeon->map);
493 DungeonProgressionRequirements const* ar = sObjectMgr->GetAccessRequirement(dungeon->map, Difficulty(dungeon->difficulty));
494
495 uint32 lockData = 0;
496
499 else if (dungeon->expansion > expansion || (onlySeasonalBosses && !dungeon->seasonal))
501 else if (IsDungeonDisabled(dungeon->map, dungeon->difficulty))
503 else if (dungeon->difficulty > DUNGEON_DIFFICULTY_NORMAL && (!mapEntry || !mapEntry->IsRaid()) && sInstanceSaveMgr->PlayerIsPermBoundToInstance(player->GetGUID(), dungeon->map, Difficulty(dungeon->difficulty)))
505 else if ((dungeon->minlevel > level && !sWorld->getBoolConfig(CONFIG_DUNGEON_ACCESS_REQUIREMENTS_LFG_DBC_LEVEL_OVERRIDE)) || (sWorld->getBoolConfig(CONFIG_DUNGEON_ACCESS_REQUIREMENTS_LFG_DBC_LEVEL_OVERRIDE) && ar && ar->levelMin > 0 && ar->levelMin > level))
507 else if ((dungeon->maxlevel < level && !sWorld->getBoolConfig(CONFIG_DUNGEON_ACCESS_REQUIREMENTS_LFG_DBC_LEVEL_OVERRIDE)) || (sWorld->getBoolConfig(CONFIG_DUNGEON_ACCESS_REQUIREMENTS_LFG_DBC_LEVEL_OVERRIDE) && ar && ar->levelMax > 0 && ar->levelMax < level))
509 else if (dungeon->seasonal && !IsSeasonActive(dungeon->id))
511 else if (player->IsClass(CLASS_DEATH_KNIGHT) && !player->IsGameMaster() &&!(player->IsQuestRewarded(13188) || player->IsQuestRewarded(13189)))
513 else if (ar)
514 {
515 // Check required items
516 for (ProgressionRequirement const* itemRequirement : ar->items)
517 {
518 if (!itemRequirement->checkLeaderOnly || !group || group->GetLeaderGUID() == player->GetGUID())
519 {
520 if (itemRequirement->faction == TEAM_NEUTRAL || itemRequirement->faction == player->GetTeamId(true))
521 {
522 if (!player->HasItemCount(itemRequirement->id, 1))
523 {
525 break;
526 }
527 }
528 }
529 }
530
531 //Check for quests
532 for (ProgressionRequirement const* questRequirement : ar->quests)
533 {
534 if (!questRequirement->checkLeaderOnly || !group || group->GetLeaderGUID() == player->GetGUID())
535 {
536 if (questRequirement->faction == TEAM_NEUTRAL || questRequirement->faction == player->GetTeamId(true))
537 {
538 if (!player->GetQuestRewardStatus(questRequirement->id))
539 {
541 break;
542 }
543 }
544 }
545 }
546
547 //Check for ilvl
548 if (ar->reqItemLevel && (float)ar->reqItemLevel > avgItemLevel)
549 {
551 }
552
553 //Check if player has the required achievements
554 for (ProgressionRequirement const* achievementRequirement : ar->achievements)
555 {
556 if (!achievementRequirement->checkLeaderOnly || !group || group->GetLeaderGUID() == player->GetGUID())
557 {
558 if (achievementRequirement->faction == TEAM_NEUTRAL || achievementRequirement->faction == player->GetTeamId(true))
559 {
560 if (!player->HasAchieved(achievementRequirement->id))
561 {
563 break;
564 }
565 }
566 }
567 }
568 }
569
570 sScriptMgr->OnInitializeLockedDungeons(player, level, lockData, dungeon);
571
572 /* TODO VoA closed if WG is not under team control (LFG_LOCKSTATUS_RAID_LOCKED)
573 lockData = LFG_LOCKSTATUS_TOO_LOW_GEAR_SCORE;
574 lockData = LFG_LOCKSTATUS_TOO_HIGH_GEAR_SCORE;
575 lockData = LFG_LOCKSTATUS_ATTUNEMENT_TOO_LOW_LEVEL;
576 lockData = LFG_LOCKSTATUS_ATTUNEMENT_TOO_HIGH_LEVEL;
577 */
578
579 if (lockData)
580 lock[dungeon->Entry()] = lockData;
581 }
582
583 sScriptMgr->OnAfterInitializeLockedDungeons(player);
584
585 SetLockedDungeons(guid, lock);
586 }
@ DUNGEON_DIFFICULTY_NORMAL
Definition DBCEnums.h:269
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
#define sInstanceSaveMgr
Definition InstanceSaveMgr.h:233
#define sScriptMgr
Definition ScriptMgr.h:743
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:131
@ TEAM_NEUTRAL
Definition SharedDefines.h:750
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_LFG_DBC_LEVEL_OVERRIDE
Definition WorldConfig.h:126
float GetAverageItemLevelForDF()
Definition Player.cpp:16195
bool GetQuestRewardStatus(uint32 quest_id) const
Definition PlayerQuest.cpp:1474
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition PlayerStorage.cpp:659
TeamId GetTeamId(bool original=false) const
Definition Player.h:2138
bool HasAchieved(uint32 achievementId) const
Definition Player.cpp:14232
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition Player.cpp:1348
bool IsGameMaster() const
Definition Player.h:1178
bool IsQuestRewarded(uint32 quest_id) const
Definition Player.h:1652
uint8 Expansion() const
Definition WorldSession.h:491
bool HasPermission(uint32 permissionId)
Definition WorldSession.cpp:1671
void SetLockedDungeons(ObjectGuid guid, LfgLockMap const &lock)
Definition LFGMgr.cpp:2647
LfgDungeonSet const & GetDungeonsByRandom(uint32 randomdungeon)
Definition LFGMgr.cpp:2435
bool IsSeasonActive(uint32 dungeonId)
Checks if Seasonal dungeon is active.
Definition LFGMgr.cpp:2882
@ LFG_LOCKSTATUS_INSUFFICIENT_EXPANSION
Definition LFG.h:81
@ LFG_LOCKSTATUS_TOO_LOW_LEVEL
Definition LFG.h:82
@ LFG_LOCKSTATUS_TOO_LOW_GEAR_SCORE
Definition LFG.h:84
@ LFG_LOCKSTATUS_MISSING_ITEM
Definition LFG.h:90
@ LFG_LOCKSTATUS_TOO_HIGH_LEVEL
Definition LFG.h:83
@ LFG_LOCKSTATUS_MISSING_ACHIEVEMENT
Definition LFG.h:92
@ LFG_LOCKSTATUS_NOT_IN_SEASON
Definition LFG.h:91
@ LFG_LOCKSTATUS_QUEST_NOT_COMPLETED
Definition LFG.h:89
@ LFG_OPTION_ENABLE_SEASONAL_BOSSES
Definition LFGMgr.h:44
@ RBAC_PERM_JOIN_DUNGEON_FINDER
Definition RBAC.h:57
Definition Player.h:936
uint8 levelMax
Definition Player.h:938
uint8 levelMin
Definition Player.h:937
uint16 reqItemLevel
Definition Player.h:939
Definition DBCStructure.h:1325
bool IsRaid() const
Definition DBCStructure.h:1354
Definition Player.h:927

References DungeonProgressionRequirements::achievements, CLASS_DEATH_KNIGHT, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_LFG_DBC_LEVEL_OVERRIDE, lfg::LFGDungeonData::difficulty, DUNGEON_DIFFICULTY_NORMAL, lfg::LFGDungeonData::Entry(), lfg::LFGDungeonData::expansion, WorldSession::Expansion(), Player::GetAverageItemLevelForDF(), GetDungeonsByRandom(), Object::GetGUID(), Group::GetLeaderGUID(), Unit::GetLevel(), GetLFGDungeon(), Player::GetQuestRewardStatus(), Player::GetSession(), Player::GetTeamId(), Player::HasAchieved(), Player::HasItemCount(), WorldSession::HasPermission(), lfg::LFGDungeonData::id, Player::IsClass(), IsDungeonDisabled(), Player::IsGameMaster(), Player::IsQuestRewarded(), MapEntry::IsRaid(), IsSeasonActive(), DungeonProgressionRequirements::items, DungeonProgressionRequirements::levelMax, DungeonProgressionRequirements::levelMin, lfg::LFG_LOCKSTATUS_INSUFFICIENT_EXPANSION, lfg::LFG_LOCKSTATUS_MISSING_ACHIEVEMENT, lfg::LFG_LOCKSTATUS_MISSING_ITEM, lfg::LFG_LOCKSTATUS_NOT_IN_SEASON, lfg::LFG_LOCKSTATUS_QUEST_NOT_COMPLETED, lfg::LFG_LOCKSTATUS_RAID_LOCKED, lfg::LFG_LOCKSTATUS_TOO_HIGH_LEVEL, lfg::LFG_LOCKSTATUS_TOO_LOW_GEAR_SCORE, lfg::LFG_LOCKSTATUS_TOO_LOW_LEVEL, lfg::LFG_OPTION_ENABLE_SEASONAL_BOSSES, m_options, lfg::LFGDungeonData::map, lfg::LFGDungeonData::maxlevel, lfg::LFGDungeonData::minlevel, DungeonProgressionRequirements::quests, rbac::RBAC_PERM_JOIN_DUNGEON_FINDER, DungeonProgressionRequirements::reqItemLevel, lfg::LFGDungeonData::seasonal, SetLockedDungeons(), sInstanceSaveMgr, sMapStore, sObjectMgr, sScriptMgr, sWorld, and TEAM_NEUTRAL.

Referenced by LoadLFGDungeons().

◆ inLfgDungeonMap()

bool lfg::LFGMgr::inLfgDungeonMap ( ObjectGuid  guid,
uint32  map,
Difficulty  difficulty 
)

Check if given guid applied for given map and difficulty. Used to know.

2925 {
2926 if (!guid.IsGroup())
2927 guid = GetGroup(guid);
2928
2929 if (uint32 dungeonId = GetDungeon(guid, true))
2930 if (LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId))
2931 if (uint32(dungeon->map) == map && dungeon->difficulty == difficulty)
2932 return true;
2933
2934 return false;
2935 }
ObjectGuid GetGroup(ObjectGuid guid)
Gets player group.
Definition LFGMgr.cpp:2722

References GetDungeon(), GetGroup(), GetLFGDungeon(), and ObjectGuid::IsGroup().

◆ instance()

LFGMgr * lfg::LFGMgr::instance ( )
static
62 {
63 static LFGMgr instance;
64 return &instance;
65 }
static LFGMgr * instance()
Definition LFGMgr.cpp:61
LFGMgr()
Definition LFGMgr.cpp:46

References instance().

Referenced by instance().

◆ IsDungeonDisabled()

bool lfg::LFGMgr::IsDungeonDisabled ( uint32  mapId,
Difficulty  difficulty 
) const

Checks if given dungeon map is disabled.

2960 {
2961 return sDisableMgr->IsDisabledFor(DISABLE_TYPE_MAP, mapId, nullptr, difficulty) ||
2962 sDisableMgr->IsDisabledFor(DISABLE_TYPE_LFG_MAP, mapId, nullptr);
2963 }
#define sDisableMgr
Definition DisableMgr.h:88
@ DISABLE_TYPE_MAP
Definition DisableMgr.h:30
@ DISABLE_TYPE_LFG_MAP
Definition DisableMgr.h:36

References DISABLE_TYPE_LFG_MAP, DISABLE_TYPE_MAP, and sDisableMgr.

Referenced by GetCompatibleDungeons(), and InitializeLockedDungeons().

◆ IsLfgGroup()

bool lfg::LFGMgr::IsLfgGroup ( ObjectGuid  guid)

Check if given group guid is lfg.

2813 {
2814 return guid && guid.IsGroup() && GroupsStore[guid].IsLfgGroup();
2815 }

References GroupsStore, and ObjectGuid::IsGroup().

◆ isOptionEnabled()

bool lfg::LFGMgr::isOptionEnabled ( uint32  option)

Checks if given lfg option is enabled.

2862 {
2863 return m_options & option;
2864 }

References m_options.

Referenced by Update().

◆ IsPlayerQueuedForRandomDungeon()

bool lfg::LFGMgr::IsPlayerQueuedForRandomDungeon ( ObjectGuid  guid)
2966 {
2967 auto gguid = GetGroup(guid);
2968 if (!gguid)
2969 return false;
2970
2971 return GroupsStore[gguid].IsRandomQueuedPlayer(guid);
2972 }

References GetGroup(), and GroupsStore.

◆ IsSeasonActive()

bool lfg::LFGMgr::IsSeasonActive ( uint32  dungeonId)

Checks if Seasonal dungeon is active.

2883 {
2884 switch (dungeonId)
2885 {
2894 }
2895 return false;
2896 }
bool IsHolidayActive(HolidayIds id)
Definition GameEventMgr.cpp:2032
@ HOLIDAY_HALLOWS_END
Definition SharedDefines.h:2986
@ HOLIDAY_FIRE_FESTIVAL
Definition SharedDefines.h:2989
@ HOLIDAY_LOVE_IS_IN_THE_AIR
Definition SharedDefines.h:3001
@ HOLIDAY_BREWFEST
Definition SharedDefines.h:2991
@ LFG_DUNGEON_FROST_LORD_AHUNE
Definition LFGMgr.h:150
@ LFG_DUNGEON_HEADLESS_HORSEMAN
Definition LFGMgr.h:149
@ LFG_DUNGEON_CROWN_CHEMICAL_CO
Definition LFGMgr.h:152
@ LFG_DUNGEON_COREN_DIREBREW
Definition LFGMgr.h:151

References HOLIDAY_BREWFEST, HOLIDAY_FIRE_FESTIVAL, HOLIDAY_HALLOWS_END, HOLIDAY_LOVE_IS_IN_THE_AIR, IsHolidayActive(), lfg::LFG_DUNGEON_COREN_DIREBREW, lfg::LFG_DUNGEON_CROWN_CHEMICAL_CO, lfg::LFG_DUNGEON_FROST_LORD_AHUNE, and lfg::LFG_DUNGEON_HEADLESS_HORSEMAN.

Referenced by InitializeLockedDungeons().

◆ IsTesting()

bool lfg::LFGMgr::IsTesting ( ) const
inline

For 1 player queue testing.

589{ return m_Testing; }

References m_Testing.

◆ JoinLfg()

void lfg::LFGMgr::JoinLfg ( Player player,
uint8  roles,
LfgDungeonSet dungeons,
std::string const &  comment 
)

Join Lfg with selected roles, dungeons and comment.

Adds the player/group to lfg queue. If player is in a group then it is the leader of the group tying to join the group. Join conditions are checked before adding to the new queue.

Parameters
[in]playerPlayer trying to join (or leader of group trying to join)
[in]rolesPlayer selected roles
[in]dungeonsDungeons the player/group is applying for
[in]commentPlayer selected comment
599 {
600 if (!player || dungeons.empty())
601 return;
602
603 Group* grp = player->GetGroup();
604 ObjectGuid guid = player->GetGUID();
605 ObjectGuid gguid = grp ? grp->GetGUID() : guid;
606 LfgJoinResultData joinData;
607 LfgGuidSet players;
608 uint32 rDungeonId = 0;
609 bool isContinue = grp && grp->isLFGGroup() && GetState(gguid) != LFG_STATE_FINISHED_DUNGEON;
610
611 if (grp && (grp->isBGGroup() || grp->isBFGroup()))
612 return;
613
614 if (!sScriptMgr->OnPlayerCanJoinLfg(player, roles, dungeons, comment))
615 return;
616
617 // pussywizard: can't join LFG/LFR while using LFR
618 if (GetState(player->GetGUID()) == LFG_STATE_RAIDBROWSER)
619 {
620 LfgDungeonSet tmp;
621 SendRaidBrowserJoinedPacket(player, tmp, ""); // the df "eye" can disappear in various case, resend if needed
622 return;
623 }
624
625 // Do not allow to change dungeon in the middle of a current dungeon
626 if (isContinue)
627 {
628 dungeons.clear();
629 dungeons.insert(GetDungeon(gguid));
630 }
631
632 LfgState state = GetState(gguid);
633 switch (state)
634 {
635 case LFG_STATE_ROLECHECK: // if joining again during rolecheck (eg. many players clicked continue inside instance)
636 if (gguid.IsGroup())
637 UpdateRoleCheck(gguid); // abort role check and remove from RoleChecksStore
638 break;
639 case LFG_STATE_QUEUED: // joining again while in a queue
640 {
641 LFGQueue& queue = GetQueue(gguid);
642 queue.RemoveFromQueue(gguid);
643 }
644 break;
645 case LFG_STATE_PROPOSAL: // if joining again during proposal
646 joinData.result = LFG_JOIN_INTERNAL_ERROR;
647 break;
648 /*case LFG_STATE_FINISHED_DUNGEON:
649 if (grp && grp->isLFGGroup())
650 joinData.result = LFG_JOIN_PARTY_NOT_MEET_REQS;
651 break;
652 */
653 default:
654 break;
655 }
656
657 // Check if all dungeons are valid
658 bool isRaid = false;
659 if (joinData.result == LFG_JOIN_OK)
660 {
661 bool isDungeon = false;
662 for (LfgDungeonSet::const_iterator it = dungeons.begin(); it != dungeons.end() && joinData.result == LFG_JOIN_OK; ++it)
663 {
664 LfgType type = GetDungeonType(*it);
665 switch (type)
666 {
667 case LFG_TYPE_RANDOM:
668 if (dungeons.size() > 1) // Only allow 1 random dungeon
669 {
670 joinData.result = LFG_JOIN_DUNGEON_INVALID;
671 }
672 else
673 {
674 rDungeonId = (*dungeons.begin());
675 sScriptMgr->OnPlayerQueueRandomDungeon(player, rDungeonId);
676 }
677 [[fallthrough]]; // On purpose (Random can only be dungeon or heroic dungeon)
678 case LFG_TYPE_HEROIC:
679 case LFG_TYPE_DUNGEON:
680 if (isRaid)
681 {
682 joinData.result = LFG_JOIN_MIXED_RAID_DUNGEON;
683 }
684 isDungeon = true;
685 break;
686 case LFG_TYPE_RAID:
687 if (isDungeon)
688 {
689 joinData.result = LFG_JOIN_MIXED_RAID_DUNGEON;
690 }
691 isRaid = true;
692 break;
693 default:
694 LOG_ERROR("lfg", "Wrong dungeon type {} for dungeon {}", type, *it);
695 joinData.result = LFG_JOIN_DUNGEON_INVALID;
696 break;
697 }
698 }
699 }
700
701 if (!isRaid && joinData.result == LFG_JOIN_OK)
702 {
703 // Check player or group member restrictions
705 {
706 joinData.result = LFG_JOIN_NOT_MEET_REQS;
707 }
708 else if (player->InBattleground() || (player->InBattlegroundQueue() && !sWorld->getBoolConfig(CONFIG_ALLOW_JOIN_BG_AND_LFG)))
709 {
710 joinData.result = LFG_JOIN_USING_BG_SYSTEM;
711 }
712 else if (player->HasAura(LFG_SPELL_DUNGEON_DESERTER))
713 {
714 joinData.result = LFG_JOIN_DESERTER;
715 }
716 else if (dungeons.empty())
717 {
718 joinData.result = LFG_JOIN_NOT_MEET_REQS;
719 }
720 else if (grp)
721 {
722 if (grp->GetMembersCount() > MAXGROUPSIZE)
723 joinData.result = LFG_JOIN_TOO_MUCH_MEMBERS;
724 else
725 {
726 uint8 memberCount = 0;
727 for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr && joinData.result == LFG_JOIN_OK; itr = itr->next())
728 {
729 if (Player* plrg = itr->GetSource())
730 {
731 if (!plrg->GetSession()->HasPermission(rbac::RBAC_PERM_JOIN_DUNGEON_FINDER))
732 {
733 joinData.result = LFG_JOIN_PARTY_NOT_MEET_REQS;
734 }
735 else if (plrg->HasAura(LFG_SPELL_DUNGEON_DESERTER))
736 {
737 joinData.result = LFG_JOIN_PARTY_DESERTER;
738 }
739 else if (plrg->InBattleground() || (plrg->InBattlegroundQueue() && !sWorld->getBoolConfig(CONFIG_ALLOW_JOIN_BG_AND_LFG)))
740 {
741 joinData.result = LFG_JOIN_USING_BG_SYSTEM;
742 }
743
744 ++memberCount;
745 players.insert(plrg->GetGUID());
746 }
747 }
748
749 if (joinData.result == LFG_JOIN_OK && memberCount != grp->GetMembersCount())
750 joinData.result = LFG_JOIN_DISCONNECTED;
751 }
752 }
753 else
754 players.insert(player->GetGUID());
755
756 // Xinef: Check dungeon cooldown only for random dungeons
757 // Xinef: Moreover check this only if dungeon is not started, afterwards its obvious that players will have the cooldown
758 if (joinData.result == LFG_JOIN_OK && !isContinue && rDungeonId)
759 {
760 if (player->HasAura(LFG_SPELL_DUNGEON_COOLDOWN)) // xinef: added !isContinue
761 joinData.result = LFG_JOIN_RANDOM_COOLDOWN;
762 else if (grp)
763 {
764 for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr && joinData.result == LFG_JOIN_OK; itr = itr->next())
765 if (Player* plrg = itr->GetSource())
766 if (plrg->HasAura(LFG_SPELL_DUNGEON_COOLDOWN)) // xinef: added !isContinue
767 joinData.result = LFG_JOIN_PARTY_RANDOM_COOLDOWN;
768 }
769 }
770 }
771
772 if (isRaid)
773 players.insert(player->GetGUID());
774
775 if (joinData.result == LFG_JOIN_OK)
776 {
777 // Expand random dungeons and check restrictions
778 if (rDungeonId)
779 dungeons = GetDungeonsByRandom(rDungeonId);
780
781 // if we have lockmap then there are no compatible dungeons
782 // xinef: dont check compatibile dungeons for already running group (bind problems)
783 if (!isContinue)
784 {
785 GetCompatibleDungeons(dungeons, players, joinData.lockmap, rDungeonId);
786 if (dungeons.empty())
788 }
789 }
790
791 // pussywizard:
792 if (isRaid && grp && (grp->isLFGGroup() || guid != grp->GetLeaderGUID()))
793 return;
794
795 // Do not allow to change dungeon in the middle of a current dungeon
796 if (!isRaid && isContinue && grp->GetMembersCount() == 5)
797 {
798 dungeons.clear();
799 dungeons.insert(GetDungeon(gguid));
800 joinData.result = LFG_JOIN_PARTY_NOT_MEET_REQS;
801 }
802
803 // Can't join. Send result
804 if (joinData.result != LFG_JOIN_OK)
805 {
806 LOG_DEBUG("lfg", "LFGMgr::Join: [{}] joining with {} members. result: {}", guid.ToString(), grp ? grp->GetMembersCount() : 1, joinData.result);
807 if (!dungeons.empty()) // Only should show lockmap when have no dungeons available
808 joinData.lockmap.clear();
809 player->GetSession()->SendLfgJoinResult(joinData);
810 return;
811 }
812
813 SetComment(guid, comment);
814
815 if (isRaid)
816 {
817 if (grp)
818 roles = PLAYER_ROLE_LEADER;
819 else
821 if (!roles)
822 return;
823 JoinRaidBrowser(player, roles, dungeons, comment);
825 SendRaidBrowserJoinedPacket(player, dungeons, comment);
826 return;
827 }
828
829 if (grp) // Begin rolecheck
830 {
831 // Create new rolecheck
832 LfgRoleCheck& roleCheck = RoleChecksStore[gguid];
833 roleCheck.roles.clear(); // pussywizard: NEW rolecheck, not old one with trash data >_>
834 roleCheck.cancelTime = time_t(GameTime::GetGameTime().count()) + LFG_TIME_ROLECHECK;
835 roleCheck.state = LFG_ROLECHECK_INITIALITING;
836 roleCheck.leader = guid;
837 roleCheck.dungeons = dungeons;
838 roleCheck.rDungeonId = rDungeonId;
839
840 if (rDungeonId)
841 {
842 dungeons.clear();
843 dungeons.insert(rDungeonId);
844 }
845
847 // Send update to player
848 LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_JOIN_QUEUE, dungeons, comment);
849 for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next())
850 {
851 if (Player* plrg = itr->GetSource())
852 {
853 ObjectGuid pguid = plrg->GetGUID();
854 plrg->GetSession()->SendLfgUpdateParty(updateData);
856 if (!isContinue)
857 SetSelectedDungeons(pguid, dungeons);
858 roleCheck.roles[pguid] = 0;
859 }
860 }
861 // Update leader role
862 UpdateRoleCheck(gguid, guid, roles);
863 }
864 else // Add player to queue
865 {
866 LfgRolesMap rolesMap;
867 rolesMap[guid] = roles;
868 LFGQueue& queue = GetQueue(guid);
869 queue.AddQueueData(guid, GameTime::GetGameTime().count(), dungeons, rolesMap);
870
871 if (!isContinue)
872 {
873 if (rDungeonId)
874 {
875 dungeons.clear();
876 dungeons.insert(rDungeonId);
877 }
878 SetSelectedDungeons(guid, dungeons);
879 }
880 // Send update to player
881 player->GetSession()->SendLfgJoinResult(joinData);
882 player->GetSession()->SendLfgUpdatePlayer(LfgUpdateData(LFG_UPDATETYPE_JOIN_QUEUE, dungeons, comment));
884 SetRoles(guid, roles);
885 }
886 }
#define MAXGROUPSIZE
Definition Group.h:44
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
@ CONFIG_ALLOW_JOIN_BG_AND_LFG
Definition WorldConfig.h:132
Definition GroupReference.h:27
Definition Group.h:177
bool isLFGGroup(bool restricted=false) const
Definition Group.cpp:2471
ObjectGuid GetGUID() const
Definition Group.cpp:2512
bool isBGGroup() const
Definition Group.cpp:2482
uint32 GetMembersCount() const
Definition Group.h:254
bool isBFGroup() const
Definition Group.cpp:2487
GroupReference * GetFirstMember()
Definition Group.h:252
ObjectGuid GetLeaderGUID() const
Definition Group.cpp:2502
bool InBattleground() const
Definition Player.h:2298
bool InBattlegroundQueue(bool ignoreArena=false) const
Definition Player.cpp:12445
Group * GetGroup()
Definition Player.h:2516
void SendLfgJoinResult(lfg::LfgJoinResultData const &joinData)
Definition LFGHandler.cpp:441
void SendLfgUpdatePlayer(lfg::LfgUpdateData const &updateData)
Definition LFGHandler.cpp:302
void SetSelectedDungeons(ObjectGuid guid, LfgDungeonSet const &dungeons)
Definition LFGMgr.cpp:2641
void SetComment(ObjectGuid guid, std::string const &comment)
Sets player lfr comment.
Definition LFGMgr.cpp:2622
void JoinRaidBrowser(Player *player, uint8 roles, LfgDungeonSet &dungeons, std::string comment)
pussywizard: Raid Browser
Definition LFGMgr.cpp:989
void SendRaidBrowserJoinedPacket(Player *p, LfgDungeonSet &dungeons, std::string comment)
Definition LFGMgr.cpp:1011
void UpdateRoleCheck(ObjectGuid gguid, ObjectGuid guid=ObjectGuid::Empty, uint8 roles=PLAYER_ROLE_NONE)
Updates the role check with player answer.
Definition LFGMgr.cpp:1487
LfgRoleCheckContainer RoleChecksStore
Current Role checks.
Definition LFGMgr.h:644
void GetCompatibleDungeons(LfgDungeonSet &dungeons, LfgGuidSet const &players, LfgLockPartyMap &lockMap, uint32 randomDungeonId=0)
Definition LFGMgr.cpp:1573
void SetRoles(ObjectGuid guid, uint8 roles)
Sets player lfg roles.
Definition LFGMgr.cpp:2616
LfgType GetDungeonType(uint32 dungeon)
Definition LFGMgr.cpp:2470
std::map< ObjectGuid, uint8 > LfgRolesMap
Definition LFG.h:119
@ LFG_STATE_RAIDBROWSER
Definition LFG.h:75
@ LFG_STATE_ROLECHECK
Definition LFG.h:69
@ LFG_STATE_PROPOSAL
Definition LFG.h:71
@ LFG_UPDATETYPE_JOIN_QUEUE
Definition LFG.h:53
@ LFG_TIME_ROLECHECK
Definition LFGMgr.h:49
@ LFG_SPELL_DUNGEON_DESERTER
Definition LFGMgr.h:54
@ LFG_TYPE_RAID
Definition LFGMgr.h:72
@ LFG_TYPE_DUNGEON
Definition LFGMgr.h:71
@ LFG_TYPE_HEROIC
Definition LFGMgr.h:74
@ LFG_ROLECHECK_INITIALITING
Definition LFGMgr.h:127
@ PLAYER_ROLE_LEADER
Definition LFG.h:40
@ LFG_JOIN_TOO_MUCH_MEMBERS
Definition LFGMgr.h:118
@ LFG_JOIN_DISCONNECTED
Definition LFGMgr.h:111
@ LFG_JOIN_DUNGEON_INVALID
Definition LFGMgr.h:113
@ LFG_JOIN_USING_BG_SYSTEM
Definition LFGMgr.h:119
@ LFG_JOIN_INTERNAL_ERROR
Definition LFGMgr.h:106
@ LFG_JOIN_MIXED_RAID_DUNGEON
Definition LFGMgr.h:109
@ LFG_JOIN_PARTY_NOT_MEET_REQS
Definition LFGMgr.h:108
@ LFG_JOIN_DESERTER
Definition LFGMgr.h:114
@ LFG_JOIN_RANDOM_COOLDOWN
Definition LFGMgr.h:116
@ LFG_JOIN_PARTY_RANDOM_COOLDOWN
Definition LFGMgr.h:117
@ LFG_JOIN_OK
Definition LFGMgr.h:103
@ LFG_JOIN_PARTY_DESERTER
Definition LFGMgr.h:115
@ LFG_JOIN_NOT_MEET_REQS
Definition LFGMgr.h:107

References lfg::LFGQueue::AddQueueData(), lfg::LfgRoleCheck::cancelTime, CONFIG_ALLOW_JOIN_BG_AND_LFG, lfg::LfgRoleCheck::dungeons, GetCompatibleDungeons(), GetDungeon(), GetDungeonsByRandom(), GetDungeonType(), Group::GetFirstMember(), GameTime::GetGameTime(), Player::GetGroup(), Group::GetGUID(), Object::GetGUID(), Group::GetLeaderGUID(), Group::GetMembersCount(), GetQueue(), Player::GetSession(), GetState(), Unit::HasAura(), WorldSession::HasPermission(), Player::InBattleground(), Player::InBattlegroundQueue(), Group::isBFGroup(), Group::isBGGroup(), ObjectGuid::IsGroup(), Group::isLFGGroup(), JoinRaidBrowser(), lfg::LfgRoleCheck::leader, lfg::LFG_JOIN_DESERTER, lfg::LFG_JOIN_DISCONNECTED, lfg::LFG_JOIN_DUNGEON_INVALID, lfg::LFG_JOIN_INTERNAL_ERROR, lfg::LFG_JOIN_MIXED_RAID_DUNGEON, lfg::LFG_JOIN_NOT_MEET_REQS, lfg::LFG_JOIN_OK, lfg::LFG_JOIN_PARTY_DESERTER, lfg::LFG_JOIN_PARTY_NOT_MEET_REQS, lfg::LFG_JOIN_PARTY_RANDOM_COOLDOWN, lfg::LFG_JOIN_RANDOM_COOLDOWN, lfg::LFG_JOIN_TOO_MUCH_MEMBERS, lfg::LFG_JOIN_USING_BG_SYSTEM, lfg::LFG_ROLECHECK_INITIALITING, lfg::LFG_SPELL_DUNGEON_COOLDOWN, lfg::LFG_SPELL_DUNGEON_DESERTER, lfg::LFG_STATE_FINISHED_DUNGEON, lfg::LFG_STATE_PROPOSAL, lfg::LFG_STATE_QUEUED, lfg::LFG_STATE_RAIDBROWSER, lfg::LFG_STATE_ROLECHECK, lfg::LFG_TIME_ROLECHECK, lfg::LFG_TYPE_DUNGEON, lfg::LFG_TYPE_HEROIC, lfg::LFG_TYPE_RAID, lfg::LFG_TYPE_RANDOM, lfg::LFG_UPDATETYPE_JOIN_QUEUE, lfg::LfgJoinResultData::lockmap, LOG_DEBUG, LOG_ERROR, MAXGROUPSIZE, lfg::PLAYER_ROLE_DAMAGE, lfg::PLAYER_ROLE_HEALER, lfg::PLAYER_ROLE_LEADER, lfg::PLAYER_ROLE_TANK, rbac::RBAC_PERM_JOIN_DUNGEON_FINDER, lfg::LfgRoleCheck::rDungeonId, lfg::LFGQueue::RemoveFromQueue(), lfg::LfgJoinResultData::result, RoleChecksStore, lfg::LfgRoleCheck::roles, WorldSession::SendLfgJoinResult(), WorldSession::SendLfgUpdatePlayer(), SendRaidBrowserJoinedPacket(), SetComment(), SetRoles(), SetSelectedDungeons(), SetState(), sScriptMgr, lfg::LfgRoleCheck::state, sWorld, ObjectGuid::ToString(), and UpdateRoleCheck().

◆ JoinRaidBrowser()

void lfg::LFGMgr::JoinRaidBrowser ( Player player,
uint8  roles,
LfgDungeonSet dungeons,
std::string  comment 
)

pussywizard: Raid Browser

990 {
991 // pussywizard: client limit for comment length is 64 @ 3.3.5a
992 if (comment.size() > 64)
993 comment = comment.substr(0, 64);
994
995 RBEntryInfo entry(roles, comment);
996 for (LfgDungeonSet::const_iterator itr = dungeons.begin(); itr != dungeons.end(); ++itr)
997 if (GetLFGDungeon(*itr)) // ensure dungeon data exists for such dungeon id
998 {
999 RaidBrowserStore[player->GetTeamId()][*itr][player->GetGUID()] = entry;
1000 RBUsedDungeonsStore[player->GetTeamId()].insert(*itr);
1001 }
1002 }
RBUsedDungeonsSet RBUsedDungeonsStore[2]
Definition LFGMgr.h:439
RBStoreMap RaidBrowserStore[2]
Definition LFGMgr.h:429

References Object::GetGUID(), GetLFGDungeon(), Player::GetTeamId(), RaidBrowserStore, and RBUsedDungeonsStore.

Referenced by JoinLfg().

◆ LeaveAllLfgQueues()

void lfg::LFGMgr::LeaveAllLfgQueues ( ObjectGuid  guid,
bool  allowgroup,
ObjectGuid  groupguid = ObjectGuid::Empty 
)

pussywizard: cleans all queues' data

1433 {
1434 ObjectGuid pguid, gguid;
1435 if (guid.IsGroup())
1436 gguid = guid;
1437 else if (groupguid && groupguid.IsGroup())
1438 {
1439 pguid = guid;
1440 gguid = groupguid;
1441 }
1442 else
1443 {
1444 pguid = guid;
1445 gguid = GetGroup(guid);
1446 }
1447 if (!allowgroup)
1448 gguid.Clear();
1449
1450 if (pguid)
1451 for (lfg::LfgQueueContainer::iterator itr = QueuesStore.begin(); itr != QueuesStore.end(); ++itr)
1452 itr->second.RemoveFromQueue(pguid);
1453 if (gguid)
1454 for (lfg::LfgQueueContainer::iterator itr = QueuesStore.begin(); itr != QueuesStore.end(); ++itr)
1455 itr->second.RemoveFromQueue(gguid);
1456
1457 if (pguid && !gguid)
1458 {
1459 if (GetState(pguid) == LFG_STATE_QUEUED)
1460 {
1462 SetState(pguid, LFG_STATE_NONE);
1463 }
1464 }
1465 if (gguid)
1466 {
1467 if (GetState(gguid) == LFG_STATE_QUEUED)
1468 {
1469 SetState(gguid, LFG_STATE_NONE);
1470 LfgGuidSet const& players = GetPlayers(gguid);
1471 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
1472 {
1475 }
1476 }
1477 }
1478 }
void Clear()
Definition ObjectGuid.h:141
void SendLfgUpdateParty(ObjectGuid guid, LfgUpdateData const &data)
Definition LFGMgr.cpp:2782
void SendLfgUpdatePlayer(ObjectGuid guid, LfgUpdateData const &data)
Definition LFGMgr.cpp:2776
@ LFG_STATE_NONE
Definition LFG.h:68
@ LFG_UPDATETYPE_REMOVED_FROM_QUEUE
Definition LFG.h:55

References ObjectGuid::Clear(), GetGroup(), GetPlayers(), GetState(), ObjectGuid::IsGroup(), lfg::LFG_STATE_NONE, lfg::LFG_STATE_QUEUED, lfg::LFG_UPDATETYPE_REMOVED_FROM_QUEUE, QueuesStore, SendLfgUpdateParty(), SendLfgUpdatePlayer(), and SetState().

◆ LeaveLfg()

void lfg::LFGMgr::LeaveLfg ( ObjectGuid  guid)

Leaves lfg.

Leaves Dungeon System. Player/Group is removed from queue, rolechecks, proposals or votekicks. Player or group needs to be not nullptr and using Dungeon System

Parameters
[in]guidPlayer or group guid
909 {
910 LOG_DEBUG("lfg", "LFGMgr::Leave: [{}]", guid.ToString());
911 ObjectGuid gguid = guid.IsGroup() ? guid : GetGroup(guid);
912 LfgState state = GetState(guid);
913 switch (state)
914 {
915 case LFG_STATE_QUEUED:
916 if (gguid)
917 {
918 LFGQueue& queue = GetQueue(gguid);
919 queue.RemoveFromQueue(gguid);
920 uint32 dungeonId = GetDungeon(gguid);
921 SetState(gguid, LFG_STATE_NONE);
922 LfgGuidSet const& players = GetPlayers(gguid);
923 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
924 {
927 }
928 if (Group* group = sGroupMgr->GetGroupByGUID(gguid.GetCounter()))
929 {
930 if (group->isLFGGroup())
931 {
932 SetDungeon(gguid, dungeonId);
933 }
934 }
935 }
936 else
937 {
938 LFGQueue& queue = GetQueue(guid);
939 queue.RemoveFromQueue(guid);
942 }
943 break;
945 if (gguid)
946 UpdateRoleCheck(gguid); // No player to update role = LFG_ROLECHECK_ABORTED
947 break;
949 {
950 // Remove from Proposals
951 LfgProposalContainer::iterator it = ProposalsStore.begin();
952 ObjectGuid pguid = gguid == guid ? GetLeader(gguid) : guid;
953 while (it != ProposalsStore.end())
954 {
955 LfgProposalPlayerContainer::iterator itPlayer = it->second.players.find(pguid);
956 if (itPlayer != it->second.players.end())
957 {
958 // Mark the player/leader of group who left as didn't accept the proposal
959 itPlayer->second.accept = LFG_ANSWER_DENY;
960 break;
961 }
962 ++it;
963 }
964
965 // Remove from queue - if proposal is found, RemoveProposal will call RemoveFromQueue
966 if (it != ProposalsStore.end())
968 break;
969 }
970 case LFG_STATE_NONE:
971 break;
974 case LFG_STATE_BOOT:
975 if (guid != gguid) // Player
977 break;
979 LeaveRaidBrowser(guid);
980 SetCanOverrideRBState(guid, true);
982 SetCanOverrideRBState(guid, false);
985 break;
986 }
987 }
#define sGroupMgr
Definition GroupMgr.h:51
void LeaveRaidBrowser(ObjectGuid guid)
Definition LFGMgr.cpp:1004
void RemoveProposal(LfgProposalContainer::iterator itProposal, LfgUpdateType type)
Definition LFGMgr.cpp:2022
void SetCanOverrideRBState(ObjectGuid guid, bool val)
Definition LFGMgr.cpp:2605
@ LFG_UPDATETYPE_PROPOSAL_DECLINED
Definition LFG.h:57
@ LFG_UPDATETYPE_LEAVE_RAIDBROWSER
Definition LFG.h:50

References ObjectGuid::GetCounter(), GetDungeon(), GetGroup(), GetLeader(), GetPlayers(), GetQueue(), GetState(), ObjectGuid::IsGroup(), LeaveRaidBrowser(), lfg::LFG_ANSWER_DENY, lfg::LFG_STATE_BOOT, lfg::LFG_STATE_DUNGEON, lfg::LFG_STATE_FINISHED_DUNGEON, lfg::LFG_STATE_NONE, lfg::LFG_STATE_PROPOSAL, lfg::LFG_STATE_QUEUED, lfg::LFG_STATE_RAIDBROWSER, lfg::LFG_STATE_ROLECHECK, lfg::LFG_UPDATETYPE_LEAVE_RAIDBROWSER, lfg::LFG_UPDATETYPE_PROPOSAL_DECLINED, lfg::LFG_UPDATETYPE_REMOVED_FROM_QUEUE, LOG_DEBUG, ProposalsStore, lfg::LFGQueue::RemoveFromQueue(), RemoveProposal(), SendLfgUpdateParty(), SendLfgUpdatePlayer(), SetCanOverrideRBState(), SetDungeon(), SetState(), sGroupMgr, ObjectGuid::ToString(), and UpdateRoleCheck().

◆ LeaveRaidBrowser()

void lfg::LFGMgr::LeaveRaidBrowser ( ObjectGuid  guid)
1005 {
1006 for (uint8 team = 0; team < 2; ++team)
1007 for (RBStoreMap::iterator itr = RaidBrowserStore[team].begin(); itr != RaidBrowserStore[team].end(); ++itr)
1008 itr->second.erase(guid);
1009 }

References RaidBrowserStore.

Referenced by LeaveLfg().

◆ LfrSearchAdd()

void lfg::LFGMgr::LfrSearchAdd ( Player p,
uint32  dungeonId 
)
1039 {
1040 RBSearchersStore[p->GetTeamId()][p->GetGUID()] = dungeonId;
1041 }
RBSearchersMap RBSearchersStore[2]
Definition LFGMgr.h:431

References Object::GetGUID(), Player::GetTeamId(), and RBSearchersStore.

◆ LfrSearchRemove()

void lfg::LFGMgr::LfrSearchRemove ( Player p)
1044 {
1045 RBSearchersStore[p->GetTeamId()].erase(p->GetGUID());
1046 }

References Object::GetGUID(), Player::GetTeamId(), and RBSearchersStore.

◆ LfrSetComment()

void lfg::LFGMgr::LfrSetComment ( Player p,
std::string  comment 
)
2629 {
2630 // pussywizard: client limit for comment length is 64 @ 3.3.5a
2631 if (comment.size() > 64)
2632 comment = comment.substr(0, 64);
2633
2634 uint8 teamId = p->GetTeamId();
2635 RBEntryInfoMap::iterator iter;
2636 for (RBStoreMap::iterator itr = RaidBrowserStore[teamId].begin(); itr != RaidBrowserStore[teamId].end(); ++itr)
2637 if ((iter = itr->second.find(p->GetGUID())) != itr->second.end())
2638 iter->second.comment = comment;
2639 }

References Object::GetGUID(), Player::GetTeamId(), and RaidBrowserStore.

◆ LoadLFGDungeons()

void lfg::LFGMgr::LoadLFGDungeons ( bool  reload = false)

Loads dungeons from dbc and adds teleport coords.

260 {
261 uint32 oldMSTime = getMSTime();
262
263 LfgDungeonStore.clear();
264
265 // Initialize Dungeon map with data from dbcs
266 for (uint32 i = 0; i < sLFGDungeonStore.GetNumRows(); ++i)
267 {
268 LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(i);
269 if (!dungeon)
270 continue;
271
272 switch (dungeon->TypeID)
273 {
274 case LFG_TYPE_DUNGEON:
275 case LFG_TYPE_HEROIC:
276 case LFG_TYPE_RAID:
277 case LFG_TYPE_RANDOM:
278 LfgDungeonStore[dungeon->ID] = LFGDungeonData(dungeon);
279 break;
280 }
281 }
282
283 // Fill teleport locations from DB
284 // 0 1 2 3 4
285 QueryResult result = WorldDatabase.Query("SELECT dungeonId, position_x, position_y, position_z, orientation FROM lfg_dungeon_template");
286
287 if (!result)
288 {
289 LOG_ERROR("lfg", ">> Loaded 0 LFG Entrance Positions. DB Table `lfg_dungeon_template` Is Empty!");
290 LOG_INFO("server.loading", " ");
291 return;
292 }
293
294 uint32 count = 0;
295
296 do
297 {
298 Field* fields = result->Fetch();
299 uint32 dungeonId = fields[0].Get<uint32>();
300 LFGDungeonContainer::iterator dungeonItr = LfgDungeonStore.find(dungeonId);
301 if (dungeonItr == LfgDungeonStore.end())
302 {
303 LOG_ERROR("lfg", "table `lfg_dungeon_template` contains coordinates for wrong dungeon {}", dungeonId);
304 continue;
305 }
306
307 LFGDungeonData& data = dungeonItr->second;
308 data.x = fields[1].Get<float>();
309 data.y = fields[2].Get<float>();
310 data.z = fields[3].Get<float>();
311 data.o = fields[4].Get<float>();
312
313 ++count;
314 } while (result->NextRow());
315
316 LOG_INFO("server.loading", ">> Loaded {} LFG Entrance Positions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
317 LOG_INFO("server.loading", " ");
318
319 // Fill all other teleport coords from areatriggers
320 for (LFGDungeonContainer::iterator itr = LfgDungeonStore.begin(); itr != LfgDungeonStore.end(); ++itr)
321 {
322 LFGDungeonData& dungeon = itr->second;
323
324 // No teleport coords in database, load from areatriggers
325 if (dungeon.type != LFG_TYPE_RANDOM && dungeon.x == 0.0f && dungeon.y == 0.0f && dungeon.z == 0.0f)
326 {
327 AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(dungeon.map);
328 if (!at)
329 {
330 LOG_ERROR("lfg", "LFGMgr::LoadLFGDungeons: Failed to load dungeon {}, cant find areatrigger for map {}", dungeon.name, dungeon.map);
331 continue;
332 }
333
334 dungeon.map = at->target_mapId;
335 dungeon.x = at->target_X;
336 dungeon.y = at->target_Y;
337 dungeon.z = at->target_Z;
338 dungeon.o = at->target_Orientation;
339 }
340
341 if (dungeon.type != LFG_TYPE_RANDOM)
342 CachedDungeonMapStore[dungeon.group].insert(dungeon.id);
343 CachedDungeonMapStore[0].insert(dungeon.id);
344 }
345
346 if (reload)
347 {
348 CachedDungeonMapStore.clear();
349 // Recalculate locked dungeons
350 for (LfgPlayerDataContainer::const_iterator it = PlayersStore.begin(); it != PlayersStore.end(); ++it)
351 if (Player* player = ObjectAccessor::FindConnectedPlayer(it->first))
352 InitializeLockedDungeons(player, nullptr);
353 }
354 }
DBCStorage< LFGDungeonEntry > sLFGDungeonStore(LFGDungeonEntryfmt)
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
Definition DatabaseEnv.cpp:20
#define LOG_INFO(filterType__,...)
Definition Log.h:153
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition Timer.h:131
uint32 getMSTime()
Definition Timer.h:103
Class used to access individual fields of database query result.
Definition Field.h:98
void InitializeLockedDungeons(Player *player, Group const *group=nullptr)
Initializes locked dungeons for given player (called at login or level change)
Definition LFGMgr.cpp:474
Definition ObjectMgr.h:414
float target_Z
Definition ObjectMgr.h:418
float target_X
Definition ObjectMgr.h:416
float target_Orientation
Definition ObjectMgr.h:419
float target_Y
Definition ObjectMgr.h:417
uint32 target_mapId
Definition ObjectMgr.h:415
Definition DBCStructure.h:1245
uint32 TypeID
Definition DBCStructure.h:1257
uint32 ID
Definition DBCStructure.h:1246

References CachedDungeonMapStore, ObjectAccessor::FindConnectedPlayer(), Field::Get(), getMSTime(), GetMSTimeDiffToNow(), lfg::LFGDungeonData::group, lfg::LFGDungeonData::id, LFGDungeonEntry::ID, InitializeLockedDungeons(), lfg::LFG_TYPE_DUNGEON, lfg::LFG_TYPE_HEROIC, lfg::LFG_TYPE_RAID, lfg::LFG_TYPE_RANDOM, LfgDungeonStore, LOG_ERROR, LOG_INFO, lfg::LFGDungeonData::map, lfg::LFGDungeonData::name, lfg::LFGDungeonData::o, PlayersStore, sLFGDungeonStore, sObjectMgr, AreaTriggerTeleport::target_mapId, AreaTriggerTeleport::target_Orientation, AreaTriggerTeleport::target_X, AreaTriggerTeleport::target_Y, AreaTriggerTeleport::target_Z, lfg::LFGDungeonData::type, LFGDungeonEntry::TypeID, WorldDatabase, lfg::LFGDungeonData::x, lfg::LFGDungeonData::y, and lfg::LFGDungeonData::z.

◆ LoadRewards()

void lfg::LFGMgr::LoadRewards ( )

Loads rewards for random dungeons.

Load rewards for completing dungeons.

110 {
111 uint32 oldMSTime = getMSTime();
112
113 for (LfgRewardContainer::iterator itr = RewardMapStore.begin(); itr != RewardMapStore.end(); ++itr)
114 delete itr->second;
115 RewardMapStore.clear();
116
117 // ORDER BY is very important for GetRandomDungeonReward!
118 QueryResult result = WorldDatabase.Query("SELECT dungeonId, maxLevel, firstQuestId, otherQuestId FROM lfg_dungeon_rewards ORDER BY dungeonId, maxLevel ASC");
119
120 if (!result)
121 {
122 LOG_ERROR("lfg", ">> Loaded 0 lfg dungeon rewards. DB table `lfg_dungeon_rewards` is empty!");
123 return;
124 }
125
126 uint32 count = 0;
127
128 Field* fields = nullptr;
129 do
130 {
131 fields = result->Fetch();
132 uint32 dungeonId = fields[0].Get<uint32>();
133 uint32 maxLevel = fields[1].Get<uint8>();
134 uint32 firstQuestId = fields[2].Get<uint32>();
135 uint32 otherQuestId = fields[3].Get<uint32>();
136
137 if (!GetLFGDungeonEntry(dungeonId))
138 {
139 LOG_ERROR("lfg", "Dungeon {} specified in table `lfg_dungeon_rewards` does not exist!", dungeonId);
140 continue;
141 }
142
143 if (!maxLevel || maxLevel > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
144 {
145 LOG_ERROR("lfg", "Level {} specified for dungeon {} in table `lfg_dungeon_rewards` can never be reached!", maxLevel, dungeonId);
146 maxLevel = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
147 }
148
149 if (!firstQuestId || !sObjectMgr->GetQuestTemplate(firstQuestId))
150 {
151 LOG_ERROR("lfg", "First quest {} specified for dungeon {} in table `lfg_dungeon_rewards` does not exist!", firstQuestId, dungeonId);
152 continue;
153 }
154
155 if (otherQuestId && !sObjectMgr->GetQuestTemplate(otherQuestId))
156 {
157 LOG_ERROR("lfg", "Other quest {} specified for dungeon {} in table `lfg_dungeon_rewards` does not exist!", otherQuestId, dungeonId);
158 otherQuestId = 0;
159 }
160
161 RewardMapStore.insert(LfgRewardContainer::value_type(dungeonId, new LfgReward(maxLevel, firstQuestId, otherQuestId)));
162 ++count;
163 } while (result->NextRow());
164
165 LOG_INFO("server.loading", ">> Loaded {} LFG Dungeon Rewards in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
166 LOG_INFO("server.loading", " ");
167 }
@ CONFIG_MAX_PLAYER_LEVEL
Definition WorldConfig.h:195
uint32 GetLFGDungeonEntry(uint32 id)
Return Lfg dungeon entry for given dungeon id.
Definition LFGMgr.cpp:2937

References CONFIG_MAX_PLAYER_LEVEL, Field::Get(), GetLFGDungeonEntry(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, RewardMapStore, sObjectMgr, sWorld, and WorldDatabase.

◆ MakeNewGroup()

void lfg::LFGMgr::MakeNewGroup ( LfgProposal const &  proposal)
private

Makes a new group given a proposal

Parameters
[in]proposalProposal to get info from
1673 {
1674 LfgGuidList players;
1675 GuidUnorderedSet playersToTeleport;
1676
1677 // Sort players by role, leader first, then tank, healer and dps
1678 std::vector<ObjectGuid> tanks, healers, dps;
1679
1680 if (proposal.leader && proposal.players.contains(proposal.leader))
1681 players.push_back(proposal.leader);
1682
1683 for (auto const& [guid, player] : proposal.players)
1684 {
1685 if (proposal.isNew || GetGroup(guid) != proposal.group)
1686 playersToTeleport.insert(guid);
1687
1688 if (guid == proposal.leader)
1689 continue;
1690
1691 if (player.role & lfg::PLAYER_ROLE_TANK)
1692 tanks.push_back(guid);
1693 else if (player.role & lfg::PLAYER_ROLE_HEALER)
1694 healers.push_back(guid);
1695 else
1696 dps.push_back(guid);
1697 }
1698
1699 players.insert(players.end(), tanks.begin(), tanks.end());
1700 players.insert(players.end(), healers.begin(), healers.end());
1701 players.insert(players.end(), dps.begin(), dps.end());
1702
1703 // Set the dungeon difficulty
1704 LFGDungeonData const* dungeon = GetLFGDungeon(proposal.dungeonId);
1705 ASSERT(dungeon);
1706
1707 bool isPremadeGroup = false;
1708 Group* grp = proposal.group ? sGroupMgr->GetGroupByGUID(proposal.group.GetCounter()) : nullptr;
1709 if (!grp)
1710 {
1711 ObjectGuid groupGUID;
1712 for (ObjectGuid const& guid : players)
1713 {
1714 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
1715 {
1716 Group* group = player->GetGroup();
1717 if (!group || (groupGUID && groupGUID != group->GetGUID()))
1718 {
1719 isPremadeGroup = false;
1720 break;
1721 }
1722
1723 groupGUID = group->GetGUID();
1724 isPremadeGroup = true;
1725 }
1726 }
1727 }
1728
1729 ObjectGuid oldGroupGUID;
1730 bool hasRandomLfgMember = proposal.group.IsEmpty();
1731 for (LfgGuidList::const_iterator it = players.begin(); it != players.end(); ++it)
1732 {
1733 ObjectGuid pguid = (*it);
1735 if (!player)
1736 continue;
1737
1738 Group* group = player->GetGroup();
1739 if (isPremadeGroup && !grp)
1740 {
1741 oldGroupGUID = group->GetGUID();
1742 grp = group;
1743 grp->ConvertToLFG(false);
1745 }
1746
1747 if (auto const proposalPlayer = proposal.players.find(pguid); proposalPlayer != proposal.players.end())
1748 {
1749 if (!hasRandomLfgMember && (proposalPlayer->second.group.IsEmpty() || proposalPlayer->second.group != proposal.group))
1750 hasRandomLfgMember = true;
1751 }
1752 else
1753 hasRandomLfgMember = true;
1754
1755 // Xinef: Apply Random Buff
1756 if (grp && !grp->IsLfgWithBuff() && hasRandomLfgMember)
1757 {
1758 if (!group || group->GetGUID() != oldGroupGUID)
1759 grp->AddLfgBuffFlag();
1760 else
1761 oldGroupGUID = group->GetGUID();
1762 }
1763
1764 // Xinef: Store amount of random players player grouped with
1765 if (group)
1766 {
1767 SetRandomPlayersCount(pguid, group->GetMembersCount() >= MAXGROUPSIZE ? 0 : MAXGROUPSIZE - group->GetMembersCount());
1768 oldGroupGUID = group->GetGUID();
1769 if (group != grp)
1770 group->RemoveMember(player->GetGUID());
1771 }
1772 else
1774
1775 if (!grp)
1776 {
1777 grp = new Group();
1778 grp->ConvertToLFG();
1779 grp->Create(player);
1780 ObjectGuid gguid = grp->GetGUID();
1782 sGroupMgr->AddGroup(grp);
1783 grp->SetLfgRoles(pguid, proposal.players.find(pguid)->second.role);
1784 }
1785 else if (group != grp)
1786 {
1787 if (!grp->IsFull())
1788 grp->AddMember(player, proposal.players.find(pguid)->second.role);
1789 }
1790 else
1791 {
1792 grp->SetLfgRoles(pguid, proposal.players.find(pguid)->second.role);
1793 }
1794 }
1795
1796 // pussywizard: crashfix, group wasn't created when iterating players (no player found by guid), proposal is deleted by the calling function
1797 if (!grp)
1798 return;
1799
1800 grp->SetDungeonDifficulty(Difficulty(dungeon->difficulty));
1801 ObjectGuid gguid = grp->GetGUID();
1802 SetDungeon(gguid, dungeon->Entry());
1804
1805 _SaveToDB(gguid);
1806
1807 // Select a player inside to be teleported to
1808 WorldLocation const* teleportLocation = nullptr;
1809 bool leaderTeleportIncluded = false;
1810 for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next())
1811 {
1812 if (Player* plr = itr->GetSource())
1813 {
1814 if (grp->IsLeader(plr->GetGUID()) && playersToTeleport.find(plr->GetGUID()) != playersToTeleport.end())
1815 {
1816 leaderTeleportIncluded = true;
1817 }
1818
1819 if (plr->GetMapId() == uint32(dungeon->map) && !proposal.isNew)
1820 {
1821 teleportLocation = plr;
1822 break;
1823 }
1824
1825 // Remove from battleground queues
1826 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
1827 {
1828 if (BattlegroundQueueTypeId bgQueueTypeId = plr->GetBattlegroundQueueTypeId(i))
1829 {
1830 if (bgQueueTypeId != BATTLEGROUND_QUEUE_NONE)
1831 {
1832 plr->RemoveBattlegroundQueueId(bgQueueTypeId);
1833 sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId).RemovePlayer(plr->GetGUID(), true);
1834 }
1835 }
1836 }
1837 }
1838 }
1839
1840 bool randomDungeon = false;
1841 std::vector<Player*> playersTeleported;
1842 // Teleport Player
1843 for (GuidUnorderedSet::const_iterator it = playersToTeleport.begin(); it != playersToTeleport.end(); ++it)
1844 {
1845 if (Player* player = ObjectAccessor::FindPlayer(*it))
1846 {
1847 if (player->GetGroup() != grp) // pussywizard: could not add because group was full
1848 continue;
1849
1850 // Add the cooldown spell if queued for a random dungeon
1851 // xinef: add aura
1852 if ((randomDungeon || selectedRandomLfgDungeon(player->GetGUID())) && !player->HasAura(LFG_SPELL_DUNGEON_COOLDOWN))
1853 {
1854 randomDungeon = true;
1855 // if player is debugging, don't add dungeon cooldown
1856 if (!m_Testing)
1857 {
1858 player->AddAura(LFG_SPELL_DUNGEON_COOLDOWN, player);
1859 }
1860 }
1861
1862 if (player->GetMapId() == uint32(dungeon->map))
1863 {
1864 // check instance id with leader
1865 if (!leaderTeleportIncluded)
1866 {
1867 if (InstancePlayerBind* ilb = sInstanceSaveMgr->PlayerGetBoundInstance(grp->GetLeaderGUID(), dungeon->map, player->GetDungeonDifficulty()))
1868 {
1869 if (player->GetInstanceId() == ilb->save->GetInstanceId())
1870 {
1871 // Do not teleport if in the same map and instance as leader
1872 continue;
1873 }
1874 }
1875 }
1876
1877 // Remove bind to that map
1878 sInstanceSaveMgr->PlayerUnbindInstance(player->GetGUID(), dungeon->map, player->GetDungeonDifficulty(), true);
1879 }
1880 else
1881 {
1882 // RDF removes all binds to that map
1883 if (randomDungeon)
1884 sInstanceSaveMgr->PlayerUnbindInstance(player->GetGUID(), dungeon->map, player->GetDungeonDifficulty(), true);
1885 }
1886
1887 playersTeleported.push_back(player);
1888 }
1889 }
1890
1891 for (Player* player : playersTeleported)
1892 {
1893 TeleportPlayer(player, false, teleportLocation);
1894 }
1895
1896 if (randomDungeon)
1898 if (Difficulty(dungeon->difficulty) == DUNGEON_DIFFICULTY_HEROIC)
1899 grp->AddLfgHeroicFlag();
1900
1901 // Update group info
1902 grp->SendUpdate();
1903 }
#define sBattlegroundMgr
Definition BattlegroundMgr.h:190
#define ASSERT
Definition Errors.h:68
std::unordered_set< ObjectGuid > GuidUnorderedSet
Definition ObjectGuid.h:261
BattlegroundQueueTypeId
Definition SharedDefines.h:3875
@ BATTLEGROUND_QUEUE_NONE
Definition SharedDefines.h:3876
#define PLAYER_MAX_BATTLEGROUND_QUEUES
Definition SharedDefines.h:153
void AddLfgRandomInstanceFlag()
Definition Group.h:324
void SetDungeonDifficulty(Difficulty difficulty)
Definition Group.cpp:2279
void SetLfgRoles(ObjectGuid guid, const uint8 roles)
Definition Group.cpp:2456
bool IsLeader(ObjectGuid guid) const
Definition Group.cpp:2547
void SendUpdate()
Definition Group.cpp:1858
bool IsLfgWithBuff() const
Definition Group.h:326
void AddLfgBuffFlag()
Definition Group.h:323
void ConvertToLFG(bool restricted=true)
Definition Group.cpp:295
bool AddMember(Player *player, uint8 roles=0)
Definition Group.cpp:425
bool RemoveMember(ObjectGuid guid, RemoveMethod const &method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, char const *reason=nullptr)
Definition Group.cpp:627
void AddLfgHeroicFlag()
Definition Group.h:325
bool Create(Player *leader)
Definition Group.cpp:143
bool IsFull() const
Definition Group.cpp:2466
bool IsEmpty() const
Definition ObjectGuid.h:165
Difficulty GetDungeonDifficulty() const
Definition Player.h:1948
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:15137
Definition Position.h:256
uint32 GetInstanceId() const
Definition Object.h:514
void TeleportPlayer(Player *player, bool out, WorldLocation const *teleportLocation=nullptr)
Teleport a player to/from selected dungeon.
Definition LFGMgr.cpp:2228
bool selectedRandomLfgDungeon(ObjectGuid guid)
Check if given guid applied for random dungeon.
Definition LFGMgr.cpp:2908
void SetRandomPlayersCount(ObjectGuid guid, uint8 count)
Xinef: Set Random Players Count.
Definition LFGMgr.cpp:2747
GuidList LfgGuidList
Definition LFG.h:118
Definition InstanceSaveMgr.h:40

References _SaveToDB(), Group::AddLfgBuffFlag(), Group::AddLfgHeroicFlag(), Group::AddLfgRandomInstanceFlag(), Group::AddMember(), ASSERT, BATTLEGROUND_QUEUE_NONE, Group::ConvertToLFG(), Group::Create(), lfg::LFGDungeonData::difficulty, DUNGEON_DIFFICULTY_HEROIC, lfg::LfgProposal::dungeonId, lfg::LFGDungeonData::Entry(), ObjectAccessor::FindConnectedPlayer(), ObjectAccessor::FindPlayer(), ObjectGuid::GetCounter(), Group::GetFirstMember(), Player::GetGroup(), GetGroup(), Group::GetGUID(), Object::GetGUID(), Group::GetLeaderGUID(), GetLFGDungeon(), Group::GetMembersCount(), lfg::LfgProposal::group, ObjectGuid::IsEmpty(), Group::IsFull(), Group::IsLeader(), Group::IsLfgWithBuff(), lfg::LfgProposal::isNew, lfg::LfgProposal::leader, lfg::LFG_SPELL_DUNGEON_COOLDOWN, lfg::LFG_STATE_DUNGEON, lfg::LFG_STATE_PROPOSAL, m_Testing, lfg::LFGDungeonData::map, MAXGROUPSIZE, PLAYER_MAX_BATTLEGROUND_QUEUES, lfg::PLAYER_ROLE_HEALER, lfg::PLAYER_ROLE_TANK, lfg::LfgProposal::players, Group::RemoveMember(), sBattlegroundMgr, selectedRandomLfgDungeon(), Group::SendUpdate(), SetDungeon(), Group::SetDungeonDifficulty(), Group::SetLfgRoles(), SetRandomPlayersCount(), SetState(), sGroupMgr, sInstanceSaveMgr, and TeleportPlayer().

Referenced by UpdateProposal().

◆ RBPacketAppendGroup()

void lfg::LFGMgr::RBPacketAppendGroup ( RBInternalInfo const &  info,
ByteBuffer buffer 
)
1322 {
1323 buffer << info.groupGuid;
1325 buffer << (uint32)flags;
1326 if (flags & LFG_UPDATE_FLAG_COMMENT)
1327 buffer << info.comment;
1328 if (flags & LFG_UPDATE_FLAG_ROLES)
1329 for (uint8 j = 0; j < 3; ++j)
1330 buffer << (uint8)0;
1331 if (!(flags & LFG_UPDATE_FLAG_BINDED))
1332 return;
1333 buffer << info.instanceGuid;
1334 buffer << (uint32)info.encounterMask;
1335 }
@ LFG_UPDATE_FLAG_BINDED
Definition LFGMgr.h:144
@ LFG_UPDATE_FLAG_COMMENT
Definition LFGMgr.h:138
@ LFG_UPDATE_FLAG_ROLES
Definition LFGMgr.h:141

References lfg::RBInternalInfo::comment, lfg::RBInternalInfo::encounterMask, lfg::RBInternalInfo::groupGuid, lfg::RBInternalInfo::instanceGuid, lfg::LFG_UPDATE_FLAG_BINDED, lfg::LFG_UPDATE_FLAG_COMMENT, and lfg::LFG_UPDATE_FLAG_ROLES.

Referenced by RBPacketBuildFull(), and UpdateRaidBrowser().

◆ RBPacketAppendPlayer()

void lfg::LFGMgr::RBPacketAppendPlayer ( RBInternalInfo const &  info,
ByteBuffer buffer 
)
1338 {
1339 buffer << info.guid;
1340 uint32 flags = LFG_UPDATE_FLAG_CHARACTERINFO | LFG_UPDATE_FLAG_ROLES | LFG_UPDATE_FLAG_COMMENT | (info.groupGuid ? LFG_UPDATE_FLAG_GROUPGUID : LFG_UPDATE_FLAG_BINDED) | (info.isGroupLeader ? LFG_UPDATE_FLAG_GROUPLEADER : 0) | (!info.groupGuid || info.isGroupLeader ? LFG_UPDATE_FLAG_AREA : 0);
1341 buffer << (uint32)flags;
1342
1344 {
1345 buffer << (uint8)info._level;
1346 buffer << (uint8)info._class;
1347 buffer << (uint8)info._race;
1348 buffer << (uint8)info._talents0;
1349 buffer << (uint8)info._talents1;
1350 buffer << (uint8)info._talents2;
1351 buffer << (uint32)info._armor;
1352 buffer << (uint32)info._spellDamage;
1353 buffer << (uint32)info._spellHeal;
1354 buffer << (uint32)info._critRatingMelee;
1355 buffer << (uint32)info._critRatingRanged;
1356 buffer << (uint32)info._critRatingSpell;
1357 buffer << (float)info._mp5;
1358 buffer << (float)info._mp5combat;
1359 buffer << (uint32)info._attackPower;
1360 buffer << (uint32)info._agility;
1361 buffer << (uint32)info._health;
1362 buffer << (uint32)info._mana;
1363 buffer << (uint32)info._online; // talentpoints, used as online/offline marker :D
1364 buffer << (float)info._avgItemLevel; // avgitemlevel
1365 buffer << (uint32)info._defenseSkill;
1366 buffer << (uint32)info._dodgeRating;
1367 buffer << (uint32)info._blockRating;
1368 buffer << (uint32)info._parryRating;
1369 buffer << (uint32)info._hasteRating;
1370 buffer << (uint32)info._expertiseRating;
1371 }
1372
1373 if (flags & LFG_UPDATE_FLAG_COMMENT)
1374 buffer << (info.groupGuid ? std::string("") : info.comment);
1375 if (flags & LFG_UPDATE_FLAG_GROUPLEADER)
1376 buffer << (uint8)1; // isLFM
1377 if (flags & LFG_UPDATE_FLAG_GROUPGUID)
1378 buffer << info.groupGuid;
1379 if (flags & LFG_UPDATE_FLAG_ROLES)
1380 buffer << (uint8)(info.groupGuid ? (info.isGroupLeader ? PLAYER_ROLE_LEADER : 0) : info.roles);
1381 if (flags & LFG_UPDATE_FLAG_AREA)
1382 buffer << (uint32)info._area;
1383 if (flags & LFG_UPDATE_FLAG_STATUS)
1384 buffer << (uint8)0;
1385 if (!(flags & LFG_UPDATE_FLAG_BINDED))
1386 return;
1387 buffer << info.instanceGuid;
1388 buffer << (uint32)info.encounterMask;
1389 }
@ LFG_UPDATE_FLAG_AREA
Definition LFGMgr.h:142
@ LFG_UPDATE_FLAG_GROUPLEADER
Definition LFGMgr.h:139
@ LFG_UPDATE_FLAG_STATUS
Definition LFGMgr.h:143
@ LFG_UPDATE_FLAG_CHARACTERINFO
Definition LFGMgr.h:137
@ LFG_UPDATE_FLAG_GROUPGUID
Definition LFGMgr.h:140

References lfg::RBInternalInfo::_agility, lfg::RBInternalInfo::_area, lfg::RBInternalInfo::_armor, lfg::RBInternalInfo::_attackPower, lfg::RBInternalInfo::_avgItemLevel, lfg::RBInternalInfo::_blockRating, lfg::RBInternalInfo::_class, lfg::RBInternalInfo::_critRatingMelee, lfg::RBInternalInfo::_critRatingRanged, lfg::RBInternalInfo::_critRatingSpell, lfg::RBInternalInfo::_defenseSkill, lfg::RBInternalInfo::_dodgeRating, lfg::RBInternalInfo::_expertiseRating, lfg::RBInternalInfo::_hasteRating, lfg::RBInternalInfo::_health, lfg::RBInternalInfo::_level, lfg::RBInternalInfo::_mana, lfg::RBInternalInfo::_mp5, lfg::RBInternalInfo::_mp5combat, lfg::RBInternalInfo::_online, lfg::RBInternalInfo::_parryRating, lfg::RBInternalInfo::_race, lfg::RBInternalInfo::_spellDamage, lfg::RBInternalInfo::_spellHeal, lfg::RBInternalInfo::_talents0, lfg::RBInternalInfo::_talents1, lfg::RBInternalInfo::_talents2, lfg::RBInternalInfo::comment, lfg::RBInternalInfo::encounterMask, lfg::RBInternalInfo::groupGuid, lfg::RBInternalInfo::guid, lfg::RBInternalInfo::instanceGuid, lfg::RBInternalInfo::isGroupLeader, lfg::LFG_UPDATE_FLAG_AREA, lfg::LFG_UPDATE_FLAG_BINDED, lfg::LFG_UPDATE_FLAG_CHARACTERINFO, lfg::LFG_UPDATE_FLAG_COMMENT, lfg::LFG_UPDATE_FLAG_GROUPGUID, lfg::LFG_UPDATE_FLAG_GROUPLEADER, lfg::LFG_UPDATE_FLAG_ROLES, lfg::LFG_UPDATE_FLAG_STATUS, lfg::PLAYER_ROLE_LEADER, and lfg::RBInternalInfo::roles.

Referenced by RBPacketBuildFull(), and UpdateRaidBrowser().

◆ RBPacketBuildDifference()

void lfg::LFGMgr::RBPacketBuildDifference ( WorldPacket differencePacket,
uint32  dungeonId,
uint32  deletedCounter,
ByteBuffer const &  bufferDeleted,
uint32  groupCounter,
ByteBuffer const &  bufferGroups,
uint32  playerCounter,
ByteBuffer const &  bufferPlayers 
)
1392 {
1393 differencePacket << (uint32)LFG_TYPE_RAID;
1394 differencePacket << (uint32)dungeonId;
1395 differencePacket << (uint8)1;
1396 differencePacket << (uint32)deletedCounter;
1397 differencePacket.append(bufferDeleted);
1398 differencePacket << (uint32)groupCounter;
1399 differencePacket << (uint32)0;
1400 differencePacket.append(bufferGroups);
1401 differencePacket << (uint32)playerCounter;
1402 differencePacket << (uint32)0;
1403 differencePacket.append(bufferPlayers);
1404 }
void append(T value)
Definition ByteBuffer.h:129

References ByteBuffer::append(), and lfg::LFG_TYPE_RAID.

Referenced by UpdateRaidBrowser().

◆ RBPacketBuildFull()

void lfg::LFGMgr::RBPacketBuildFull ( WorldPacket fullPacket,
uint32  dungeonId,
RBInternalInfoMap const &  infoMap 
)
1407 {
1408 fullPacket << (uint32)LFG_TYPE_RAID;
1409 fullPacket << (uint32)dungeonId;
1410 fullPacket << (uint8)0;
1411 uint32 groupCounter = 0, playerCounter = 0;
1412 ByteBuffer bufferGroups, bufferPlayers;
1413 for (RBInternalInfoMap::const_iterator itr = infoMap.begin(); itr != infoMap.end(); ++itr)
1414 {
1415 if (itr->second.isGroupLeader)
1416 {
1417 ++groupCounter;
1418 RBPacketAppendGroup(itr->second, bufferGroups);
1419 }
1420 ++playerCounter;
1421 RBPacketAppendPlayer(itr->second, bufferPlayers);
1422 }
1423 fullPacket << (uint32)groupCounter;
1424 fullPacket << (uint32)0;
1425 fullPacket.append(bufferGroups);
1426 fullPacket << (uint32)playerCounter;
1427 fullPacket << (uint32)0;
1428 fullPacket.append(bufferPlayers);
1429 }
Definition ByteBuffer.h:70
void RBPacketAppendPlayer(RBInternalInfo const &info, ByteBuffer &buffer)
Definition LFGMgr.cpp:1337
void RBPacketAppendGroup(RBInternalInfo const &info, ByteBuffer &buffer)
Definition LFGMgr.cpp:1321

References ByteBuffer::append(), lfg::LFG_TYPE_RAID, RBPacketAppendGroup(), and RBPacketAppendPlayer().

Referenced by UpdateRaidBrowser().

◆ RemoveGroupData()

void lfg::LFGMgr::RemoveGroupData ( ObjectGuid  guid)

Removes saved group data.

2660 {
2661 LOG_DEBUG("lfg", "LFGMgr::RemoveGroupData: [{}]", guid.ToString());
2662 LfgGroupDataContainer::iterator it = GroupsStore.find(guid);
2663 if (it == GroupsStore.end())
2664 return;
2665
2666 LfgState state = GetState(guid);
2667 // If group is being formed after proposal success do nothing more
2668 LfgGuidSet const& players = it->second.GetPlayers();
2669 for (auto iterator = players.begin(); iterator != players.end(); ++iterator)
2670 {
2671 ObjectGuid objectGuid = (*iterator);
2672 SetGroup(*iterator, ObjectGuid::Empty);
2673 if (state != LFG_STATE_PROPOSAL)
2674 {
2675 SetState(*iterator, LFG_STATE_NONE);
2676 SendLfgUpdateParty(objectGuid, LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE));
2677 }
2678 }
2679 GroupsStore.erase(it);
2680 }
void SetGroup(ObjectGuid guid, ObjectGuid group)
Sets player group.
Definition LFGMgr.cpp:2727

References ObjectGuid::Empty, GetState(), GroupsStore, lfg::LFG_STATE_NONE, lfg::LFG_STATE_PROPOSAL, lfg::LFG_UPDATETYPE_REMOVED_FROM_QUEUE, LOG_DEBUG, SendLfgUpdateParty(), SetGroup(), SetState(), and ObjectGuid::ToString().

◆ RemovePlayerFromGroup()

uint8 lfg::LFGMgr::RemovePlayerFromGroup ( ObjectGuid  gguid,
ObjectGuid  guid 
)

Removes a player from a group.

2688 {
2689 return GroupsStore[gguid].RemovePlayer(guid);
2690 }

References GroupsStore.

◆ RemoveProposal()

void lfg::LFGMgr::RemoveProposal ( LfgProposalContainer::iterator  itProposal,
LfgUpdateType  type 
)
private

Remove a proposal from the pool, remove the group that didn't accept (if needed) and readd the other members to the queue

Parameters
[in]itProposalIterator to the proposal to remove
[in]typeType of removal (LFG_UPDATETYPE_PROPOSAL_FAILED, LFG_UPDATETYPE_PROPOSAL_DECLINED)
2023 {
2024 LfgProposal& proposal = itProposal->second;
2025 proposal.state = LFG_PROPOSAL_FAILED;
2026
2027 LOG_DEBUG("lfg", "LFGMgr::RemoveProposal: Proposal {}, state FAILED, UpdateType {}", itProposal->first, type);
2028 // Mark all people that didn't answered as no accept
2030 for (LfgProposalPlayerContainer::iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
2031 if (it->second.accept == LFG_ANSWER_PENDING)
2032 it->second.accept = LFG_ANSWER_DENY;
2033
2034 // pussywizard: add cooldown for not accepting (after 40 secs) or declining
2035 for (LfgProposalPlayerContainer::iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
2036 if (it->second.accept == LFG_ANSWER_DENY)
2037 if (Player* plr = ObjectAccessor::FindPlayer(it->first))
2038 if (Aura* aura = plr->AddAura(LFG_SPELL_DUNGEON_COOLDOWN, plr))
2039 aura->SetDuration(150 * IN_MILLISECONDS);
2040
2041 // Mark players/groups to be removed
2042 LfgGuidSet toRemove;
2043 for (LfgProposalPlayerContainer::iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
2044 {
2045 if (it->second.accept == LFG_ANSWER_AGREE)
2046 continue;
2047
2048 ObjectGuid guid = it->second.group ? it->second.group : it->first;
2049 // Player didn't accept or still pending when no secs left
2050 if (it->second.accept == LFG_ANSWER_DENY || type == LFG_UPDATETYPE_PROPOSAL_FAILED)
2051 {
2052 it->second.accept = LFG_ANSWER_DENY;
2053 toRemove.insert(guid);
2054 }
2055 }
2056
2057 // Notify players
2058 for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
2059 {
2060 ObjectGuid guid = it->first;
2061 ObjectGuid gguid = it->second.group ? it->second.group : guid;
2062
2063 SendLfgUpdateProposal(guid, proposal);
2064
2065 if (toRemove.find(gguid) != toRemove.end()) // Didn't accept or in same group that someone that didn't accept
2066 {
2067 LfgUpdateData updateData;
2068 if (it->second.accept == LFG_ANSWER_DENY)
2069 {
2070 updateData.updateType = type;
2071 LOG_DEBUG("lfg", "LFGMgr::RemoveProposal: [{}] didn't accept. Removing from queue and compatible cache", guid.ToString());
2072 }
2073 else
2074 {
2075 updateData.updateType = LFG_UPDATETYPE_REMOVED_FROM_QUEUE;
2076 LOG_DEBUG("lfg", "LFGMgr::RemoveProposal: [{}] in same group that someone that didn't accept. Removing from queue and compatible cache", guid.ToString());
2077 }
2078
2079 RestoreState(guid, "Proposal Fail (didn't accepted or in group with someone that didn't accept");
2080 if (gguid != guid)
2081 {
2082 RestoreState(it->second.group, "Proposal Fail (someone in group didn't accepted)");
2083 SendLfgUpdateParty(guid, updateData);
2084 }
2085 else
2086 SendLfgUpdatePlayer(guid, updateData);
2087 }
2088 else
2089 {
2090 LOG_DEBUG("lfg", "LFGMgr::RemoveProposal: Readding [{}] to queue.", guid.ToString());
2092 if (gguid != guid)
2093 {
2094 SetState(gguid, LFG_STATE_QUEUED);
2096 }
2097 else
2099 }
2100 }
2101
2102 LFGQueue& queue = GetQueue(proposal.players.begin()->first);
2103 // Remove players/groups from queue
2104 for (LfgGuidSet::const_iterator it = toRemove.begin(); it != toRemove.end(); ++it)
2105 {
2106 ObjectGuid guid = *it;
2107 queue.RemoveFromQueue(guid);
2108 proposal.queues.remove(guid);
2109 }
2110
2111 // Readd to queue
2112 for (uint8 i = 0; i < 5 && proposal.queues.guids[i]; ++i)
2113 {
2114 // xinef: this will work as data is not deleted, only references to this data are cleared
2115 // xinef: when new proposal is created
2116 // xinef: successful proposal is also taken into account is similar manner
2117 queue.AddToQueue(proposal.queues.guids[i], true);
2118 }
2119
2120 ProposalsStore.erase(itProposal);
2121 }
constexpr auto IN_MILLISECONDS
Definition Common.h:53
Definition SpellAuras.h:87
void RestoreState(ObjectGuid guid, char const *debugMsg)
Definition LFGMgr.cpp:2554
std::string const & GetComment(ObjectGuid gguid)
Get current player comment (used for LFR)
Definition LFGMgr.cpp:2529
void SendLfgUpdateProposal(ObjectGuid guid, LfgProposal const &proposal)
Definition LFGMgr.cpp:2800
@ LFG_UPDATETYPE_ADDED_TO_QUEUE
Definition LFG.h:59
@ LFG_UPDATETYPE_PROPOSAL_FAILED
Definition LFG.h:56
@ LFG_PROPOSAL_FAILED
Definition LFGMgr.h:82

References lfg::LFGQueue::AddToQueue(), ObjectAccessor::FindPlayer(), GetComment(), GetQueue(), GetSelectedDungeons(), lfg::Lfg5Guids::guids, IN_MILLISECONDS, lfg::LFG_ANSWER_AGREE, lfg::LFG_ANSWER_DENY, lfg::LFG_ANSWER_PENDING, lfg::LFG_PROPOSAL_FAILED, lfg::LFG_SPELL_DUNGEON_COOLDOWN, lfg::LFG_STATE_QUEUED, lfg::LFG_UPDATETYPE_ADDED_TO_QUEUE, lfg::LFG_UPDATETYPE_PROPOSAL_FAILED, lfg::LFG_UPDATETYPE_REMOVED_FROM_QUEUE, LOG_DEBUG, lfg::LfgProposal::players, ProposalsStore, lfg::LfgProposal::queues, lfg::Lfg5Guids::remove(), lfg::LFGQueue::RemoveFromQueue(), RestoreState(), SendLfgUpdateParty(), SendLfgUpdatePlayer(), SendLfgUpdateProposal(), SetState(), lfg::LfgProposal::state, ObjectGuid::ToString(), and lfg::LfgUpdateData::updateType.

Referenced by LeaveLfg(), Update(), and UpdateProposal().

◆ RestoreState()

void lfg::LFGMgr::RestoreState ( ObjectGuid  guid,
char const *  debugMsg 
)
private
2555 {
2556 if (guid.IsGroup())
2557 {
2558 LfgGroupData& data = GroupsStore[guid];
2559 /*if (sLog->ShouldLog(LOG_FILTER_LFG, LOG_LEVEL_DEBUG))
2560 {
2561 std::string const& ps = GetStateString(data.GetState());
2562 std::string const& os = GetStateString(data.GetOldState());
2563 LOG_TRACE("lfg", "LFGMgr::RestoreState: Group: [{}] ({}) State: {}, oldState: {}",
2564 guid.ToString(), debugMsg, ps, os);
2565 }*/
2566
2567 data.RestoreState();
2568 }
2569 else
2570 {
2571 LfgPlayerData& data = PlayersStore[guid];
2572 /*if (sLog->ShouldLog(LOG_FILTER_LFG, LOG_LEVEL_DEBUG))
2573 {
2574 std::string const& ps = GetStateString(data.GetState());
2575 std::string const& os = GetStateString(data.GetOldState());
2576 LOG_TRACE("lfg", "LFGMgr::RestoreState: Player: [{}] ({}) State: {}, oldState: {}",
2577 guid.ToString(), debugMsg, ps, os);
2578 }*/
2579 data.RestoreState();
2580 }
2581 }

References GroupsStore, ObjectGuid::IsGroup(), PlayersStore, lfg::LfgGroupData::RestoreState(), and lfg::LfgPlayerData::RestoreState().

Referenced by RemoveProposal(), Update(), and UpdateRoleCheck().

◆ selectedRandomLfgDungeon()

bool lfg::LFGMgr::selectedRandomLfgDungeon ( ObjectGuid  guid)

Check if given guid applied for random dungeon.

2909 {
2910 if (GetState(guid) != LFG_STATE_NONE)
2911 {
2912 LfgDungeonSet const& dungeons = GetSelectedDungeons(guid);
2913 if (!dungeons.empty())
2914 {
2915 LFGDungeonData const* dungeon = GetLFGDungeon(*dungeons.begin());
2916 if (dungeon && (dungeon->type == LFG_TYPE_RANDOM || dungeon->seasonal))
2917 return true;
2918 }
2919 }
2920
2921 return false;
2922 }

References GetLFGDungeon(), GetSelectedDungeons(), GetState(), lfg::LFG_STATE_NONE, lfg::LFG_TYPE_RANDOM, lfg::LFGDungeonData::seasonal, and lfg::LFGDungeonData::type.

Referenced by MakeNewGroup().

◆ SendLfgBootProposalUpdate()

void lfg::LFGMgr::SendLfgBootProposalUpdate ( ObjectGuid  guid,
LfgPlayerBoot const &  boot 
)
private
2795 {
2796 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2797 player->GetSession()->SendLfgBootProposalUpdate(boot);
2798 }

References ObjectAccessor::FindConnectedPlayer().

Referenced by InitBoot(), Update(), and UpdateBoot().

◆ SendLfgJoinResult()

void lfg::LFGMgr::SendLfgJoinResult ( ObjectGuid  guid,
LfgJoinResultData const &  data 
)
private
2789 {
2790 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2791 player->GetSession()->SendLfgJoinResult(data);
2792 }

References ObjectAccessor::FindConnectedPlayer().

Referenced by Update(), and UpdateRoleCheck().

◆ SendLfgQueueStatus()

void lfg::LFGMgr::SendLfgQueueStatus ( ObjectGuid  guid,
LfgQueueStatusData const &  data 
)
static

Sends queue status to player.

2807 {
2808 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2809 player->GetSession()->SendLfgQueueStatus(data);
2810 }

References ObjectAccessor::FindConnectedPlayer().

Referenced by lfg::LFGQueue::UpdateQueueTimers().

◆ SendLfgRoleCheckUpdate()

void lfg::LFGMgr::SendLfgRoleCheckUpdate ( ObjectGuid  guid,
LfgRoleCheck const &  roleCheck 
)
private
2771 {
2772 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2773 player->GetSession()->SendLfgRoleCheckUpdate(roleCheck);
2774 }

References ObjectAccessor::FindConnectedPlayer().

Referenced by Update(), and UpdateRoleCheck().

◆ SendLfgRoleChosen()

void lfg::LFGMgr::SendLfgRoleChosen ( ObjectGuid  guid,
ObjectGuid  pguid,
uint8  roles 
)
private
2765 {
2766 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2767 player->GetSession()->SendLfgRoleChosen(pguid, roles);
2768 }

References ObjectAccessor::FindConnectedPlayer(), Player::GetSession(), and WorldSession::SendLfgRoleChosen().

Referenced by UpdateRoleCheck().

◆ SendLfgUpdateParty()

void lfg::LFGMgr::SendLfgUpdateParty ( ObjectGuid  guid,
LfgUpdateData const &  data 
)
private
2783 {
2784 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2785 player->GetSession()->SendLfgUpdateParty(data);
2786 }

References ObjectAccessor::FindConnectedPlayer().

Referenced by LeaveAllLfgQueues(), LeaveLfg(), RemoveGroupData(), RemoveProposal(), Update(), UpdateProposal(), and UpdateRoleCheck().

◆ SendLfgUpdatePlayer()

void lfg::LFGMgr::SendLfgUpdatePlayer ( ObjectGuid  guid,
LfgUpdateData const &  data 
)
private
2777 {
2778 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2779 player->GetSession()->SendLfgUpdatePlayer(data);
2780 }

References ObjectAccessor::FindConnectedPlayer().

Referenced by LeaveAllLfgQueues(), LeaveLfg(), RemoveProposal(), Update(), and UpdateProposal().

◆ SendLfgUpdateProposal()

void lfg::LFGMgr::SendLfgUpdateProposal ( ObjectGuid  guid,
LfgProposal const &  proposal 
)
private
2801 {
2802 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2803 player->GetSession()->SendLfgUpdateProposal(proposal);
2804 }

References ObjectAccessor::FindConnectedPlayer().

Referenced by RemoveProposal(), Update(), and UpdateProposal().

◆ SendRaidBrowserCachedList()

void lfg::LFGMgr::SendRaidBrowserCachedList ( Player player,
uint32  dungeonId 
)
1049 {
1050 RBCacheMap::iterator itr = RBCacheStore[player->GetTeamId()].find(dungeonId);
1051 if (itr != RBCacheStore[player->GetTeamId()].end())
1052 {
1053 player->SendDirectMessage(&(itr->second));
1054 return;
1055 }
1056 // send empty packet if cache not found
1058 data << (uint32)LFG_TYPE_RAID;
1059 data << (uint32)dungeonId;
1060 data << (uint8)0;
1061 data << (uint32)0;
1062 data << (uint32)0;
1063 data << (uint32)0;
1064 data << (uint32)0;
1065 player->SendDirectMessage(&data);
1066 }
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5852
Definition WorldPacket.h:26
RBCacheMap RBCacheStore[2]
Definition LFGMgr.h:433
@ SMSG_UPDATE_LFG_LIST
Definition Opcodes.h:894

References Player::GetTeamId(), lfg::LFG_TYPE_RAID, RBCacheStore, Player::SendDirectMessage(), and SMSG_UPDATE_LFG_LIST.

◆ SendRaidBrowserJoinedPacket()

void lfg::LFGMgr::SendRaidBrowserJoinedPacket ( Player p,
LfgDungeonSet dungeons,
std::string  comment 
)
1012 {
1013 if (dungeons.empty())
1014 {
1015 RBEntryInfoMap::iterator iter;
1016 uint8 team = p->GetTeamId();
1017 bool setComment = true;
1018 for (RBStoreMap::iterator itr = RaidBrowserStore[team].begin(); itr != RaidBrowserStore[team].end(); ++itr)
1019 if ((iter = itr->second.find(p->GetGUID())) != itr->second.end())
1020 {
1021 dungeons.insert(itr->first);
1022 if (setComment)
1023 {
1024 comment = iter->second.comment;
1025 setComment = false;
1026 }
1027 }
1028 }
1029 LfgJoinResultData joinData;
1030 p->GetSession()->SendLfgJoinResult(joinData);
1031 LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_JOIN_RAIDBROWSER, dungeons, comment);
1032 if (p->GetGroup())
1033 p->GetSession()->SendLfgUpdateParty(updateData);
1034 else
1035 p->GetSession()->SendLfgUpdatePlayer(updateData);
1036 }
void SendLfgUpdateParty(lfg::LfgUpdateData const &updateData)
Definition LFGHandler.cpp:339
@ LFG_UPDATETYPE_JOIN_RAIDBROWSER
Definition LFG.h:51

References Player::GetGroup(), Object::GetGUID(), Player::GetSession(), Player::GetTeamId(), lfg::LFG_UPDATETYPE_JOIN_RAIDBROWSER, RaidBrowserStore, WorldSession::SendLfgJoinResult(), WorldSession::SendLfgUpdateParty(), and WorldSession::SendLfgUpdatePlayer().

Referenced by JoinLfg().

◆ SetCanOverrideRBState()

void lfg::LFGMgr::SetCanOverrideRBState ( ObjectGuid  guid,
bool  val 
)
private
2606 {
2607 PlayersStore[guid].SetCanOverrideRBState(val);
2608 }

References PlayersStore.

Referenced by LeaveLfg().

◆ SetComment()

void lfg::LFGMgr::SetComment ( ObjectGuid  guid,
std::string const &  comment 
)

Sets player lfr comment.

2623 {
2624 LOG_DEBUG("lfg", "LFGMgr::SetComment: [{}] comment: {}", guid.ToString(), comment);
2625 PlayersStore[guid].SetComment(comment);
2626 }

References LOG_DEBUG, PlayersStore, and ObjectGuid::ToString().

Referenced by JoinLfg().

◆ SetDungeon()

void lfg::LFGMgr::SetDungeon ( ObjectGuid  guid,
uint32  dungeon 
)
2611 {
2612 LOG_DEBUG("lfg", "LFGMgr::SetDungeon: [{}] dungeon {}", guid.ToString(), dungeon);
2613 GroupsStore[guid].SetDungeon(dungeon);
2614 }

References GroupsStore, LOG_DEBUG, and ObjectGuid::ToString().

Referenced by _LoadFromDB(), LeaveLfg(), and MakeNewGroup().

◆ SetGroup()

void lfg::LFGMgr::SetGroup ( ObjectGuid  guid,
ObjectGuid  group 
)

Sets player group.

2728 {
2729 PlayersStore[guid].SetGroup(group);
2730 }

References PlayersStore.

Referenced by RemoveGroupData(), and SetupGroupMember().

◆ SetLeader()

void lfg::LFGMgr::SetLeader ( ObjectGuid  gguid,
ObjectGuid  leader 
)

Sets the leader of the group.

2710 {
2711 GroupsStore[gguid].SetLeader(leader);
2712 }

References GroupsStore.

Referenced by _LoadFromDB().

◆ SetLockedDungeons()

void lfg::LFGMgr::SetLockedDungeons ( ObjectGuid  guid,
LfgLockMap const &  lock 
)
private
2648 {
2649 LOG_DEBUG("lfg", "LFGMgr::SetLockedDungeons: [{}]", guid.ToString());
2650 PlayersStore[guid].SetLockedDungeons(lock);
2651 }

References LOG_DEBUG, PlayersStore, and ObjectGuid::ToString().

Referenced by InitializeLockedDungeons().

◆ SetOptions()

void lfg::LFGMgr::SetOptions ( uint32  options)

Sets new lfg options.

2872 {
2873 m_options = options;
2874 }

References m_options.

◆ SetRandomPlayersCount()

void lfg::LFGMgr::SetRandomPlayersCount ( ObjectGuid  guid,
uint8  count 
)

Xinef: Set Random Players Count.

2748 {
2749 PlayersStore[guid].SetRandomPlayersCount(count);
2750 }

References PlayersStore.

Referenced by MakeNewGroup().

◆ SetRoles()

void lfg::LFGMgr::SetRoles ( ObjectGuid  guid,
uint8  roles 
)

Sets player lfg roles.

2617 {
2618 LOG_DEBUG("lfg", "LFGMgr::SetRoles: [{}] roles: {}", guid.ToString(), roles);
2619 PlayersStore[guid].SetRoles(roles);
2620 }

References LOG_DEBUG, PlayersStore, and ObjectGuid::ToString().

Referenced by JoinLfg(), and UpdateRoleCheck().

◆ SetSelectedDungeons()

void lfg::LFGMgr::SetSelectedDungeons ( ObjectGuid  guid,
LfgDungeonSet const &  dungeons 
)
private
2642 {
2643 LOG_DEBUG("lfg", "LFGMgr::SetLockedDungeons: [{}]", guid.ToString());
2644 PlayersStore[guid].SetSelectedDungeons(dungeons);
2645 }

References LOG_DEBUG, PlayersStore, and ObjectGuid::ToString().

Referenced by JoinLfg(), and SetupGroupMember().

◆ SetState()

void lfg::LFGMgr::SetState ( ObjectGuid  guid,
LfgState  state 
)
private
2584 {
2585 if (guid.IsGroup())
2586 {
2587 LfgGroupData& data = GroupsStore[guid];
2588 std::string ns = GetStateString(state);
2589 std::string ps = GetStateString(data.GetState());
2590 std::string os = GetStateString(data.GetOldState());
2591 LOG_DEBUG("lfg", "LFGMgr::SetState: Group: [{}] newState: {}, previous: {}, oldState: {}", guid.ToString(), ns, ps, os);
2592 data.SetState(state);
2593 }
2594 else
2595 {
2596 LfgPlayerData& data = PlayersStore[guid];
2597 std::string ns = GetStateString(state);
2598 std::string ps = GetStateString(data.GetState());
2599 std::string os = GetStateString(data.GetOldState());
2600 LOG_DEBUG("lfg", "LFGMgr::SetState: Player: [{}] newState: {}, previous: {}, oldState: {}", guid.ToString(), ns, ps, os);
2601 data.SetState(state);
2602 }
2603 }
std::string GetStateString(LfgState state)
Definition LFG.cpp:73

References lfg::LfgGroupData::GetOldState(), lfg::LfgPlayerData::GetOldState(), lfg::LfgGroupData::GetState(), lfg::LfgPlayerData::GetState(), lfg::GetStateString(), GroupsStore, ObjectGuid::IsGroup(), LOG_DEBUG, PlayersStore, lfg::LfgGroupData::SetState(), lfg::LfgPlayerData::SetState(), and ObjectGuid::ToString().

Referenced by _LoadFromDB(), FinishDungeon(), InitBoot(), JoinLfg(), LeaveAllLfgQueues(), LeaveLfg(), MakeNewGroup(), RemoveGroupData(), RemoveProposal(), SetupGroupMember(), Update(), UpdateBoot(), UpdateProposal(), and UpdateRoleCheck().

◆ SetTeam()

void lfg::LFGMgr::SetTeam ( ObjectGuid  guid,
TeamId  teamId 
)

Sets player team.

2715 {
2717 teamId = TEAM_ALLIANCE; // @Not Sure About That TeamId is supposed to be uint8 Team = 0(@TrinityCore)
2718
2719 PlayersStore[guid].SetTeam(teamId);
2720 }
@ TEAM_ALLIANCE
Definition SharedDefines.h:748
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition WorldConfig.h:35

References CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP, PlayersStore, sWorld, and TEAM_ALLIANCE.

◆ SetupGroupMember()

void lfg::LFGMgr::SetupGroupMember ( ObjectGuid  guid,
ObjectGuid  gguid 
)

Initializes player data after loading group data from DB.

2899 {
2900 LfgDungeonSet dungeons;
2901 dungeons.insert(GetDungeon(gguid));
2902 SetSelectedDungeons(guid, dungeons);
2903 SetState(guid, GetState(gguid));
2904 SetGroup(guid, gguid);
2905 AddPlayerToGroup(gguid, guid);
2906 }
void AddPlayerToGroup(ObjectGuid gguid, ObjectGuid guid)
Adds player to group.
Definition LFGMgr.cpp:2692

References AddPlayerToGroup(), GetDungeon(), GetState(), SetGroup(), SetSelectedDungeons(), and SetState().

◆ TeleportPlayer()

void lfg::LFGMgr::TeleportPlayer ( Player player,
bool  out,
WorldLocation const *  teleportLocation = nullptr 
)

Teleport a player to/from selected dungeon.

Teleports the player in or out the dungeon

Parameters
[in]playerPlayer to teleport
[in]outTeleport out (true) or in (false)
[in]fromOpcodeFunction called from opcode handlers? (Default false)
2229 {
2230 LFGDungeonData const* dungeon = nullptr;
2231 Group* group = player->GetGroup();
2232
2233 if (group && group->isLFGGroup())
2234 dungeon = GetLFGDungeon(GetDungeon(group->GetGUID()));
2235
2236 if (!dungeon)
2237 {
2239 return;
2240 }
2241
2243
2244 if (!player->IsAlive())
2245 {
2247 }
2248 else if (player->IsFalling() || player->HasUnitState(UNIT_STATE_JUMPING))
2249 {
2251 }
2252 else if (player->IsMirrorTimerActive(FATIGUE_TIMER))
2253 {
2255 }
2256 else if (player->GetVehicle())
2257 {
2259 }
2260 // GetCharm() validates the charmed unit still exists and clears a stale reference,
2261 // unlike GetCharmGUID(); a despawned vehicle must not permanently block the teleport.
2262 else if (player->GetCharm() || player->IsInCombat())
2263 {
2265 }
2266 else if (out && error == LFG_TELEPORTERROR_OK)
2267 {
2268 if (player->GetMapId() == uint32(dungeon->map))
2269 player->TeleportToEntryPoint();
2270
2271 return;
2272 }
2273 else
2274 {
2275 uint32 mapid = dungeon->map;
2276 float x = dungeon->x;
2277 float y = dungeon->y;
2278 float z = dungeon->z;
2279 float orientation = dungeon->o;
2280
2281 if (teleportLocation)
2282 {
2283 teleportLocation->GetWorldLocation(mapid, x, y, z, orientation);
2284 }
2285
2286 if (!player->GetMap()->IsDungeon() || player->GetEntryPoint().GetMapId() == MAPID_INVALID)
2287 {
2288 player->SetEntryPoint();
2289 }
2290
2291 if (!player->TeleportTo(mapid, x, y, z, orientation, 0, nullptr, mapid == player->GetMapId()))
2292 {
2294 }
2295 }
2296
2297 if (error != LFG_TELEPORTERROR_OK)
2298 {
2299 player->GetSession()->SendLfgTeleportError(uint8(error));
2300
2301 LOG_DEBUG("lfg", "Player [{}] could NOT be teleported in to map [{}] (x: {}, y: {}, z: {}) Error: {}",
2302 player->GetName(), dungeon->map, dungeon->x, dungeon->y, dungeon->z, error);
2303 }
2304 else
2305 {
2306 LOG_DEBUG("lfg", "Player [{}] is being teleported in to map [{}] (x: {}, y: {}, z: {})",
2307 player->GetName(), dungeon->map, dungeon->x, dungeon->y, dungeon->z);
2308 }
2309
2310 }
@ FATIGUE_TIMER
Definition Player.h:559
#define MAPID_INVALID
Definition Position.h:253
@ UNIT_STATE_JUMPING
Definition UnitDefines.h:191
bool IsDungeon() const
Definition Map.h:299
void SetEntryPoint()
Definition Player.cpp:11454
bool IsMirrorTimerActive(MirrorTimerType type)
Definition Player.h:2092
bool TeleportToEntryPoint()
Definition Player.cpp:1646
WorldLocation const & GetEntryPoint() const
Definition Player.h:2426
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1399
bool IsFalling() const
Definition Player.cpp:2189
Vehicle * GetVehicle() const
Definition Unit.h:1926
Unit * GetCharm() const
Definition Unit.cpp:7817
bool IsAlive() const
Definition Unit.h:1793
bool HasUnitState(const uint32 f) const
Definition Unit.h:737
bool IsInCombat() const
Definition Unit.h:936
Map * GetMap() const
Definition Object.h:631
std::string const & GetName() const
Definition Object.h:529
void SendLfgTeleportError(uint8 err)
Definition LFGHandler.cpp:636
LfgTeleportError
Teleport errors.
Definition LFGMgr.h:88
@ LFG_TELEPORTERROR_INVALID_LOCATION
Definition LFGMgr.h:95
@ LFG_TELEPORTERROR_OK
Definition LFGMgr.h:90
@ LFG_TELEPORTERROR_FATIGUE
Definition LFGMgr.h:94
@ LFG_TELEPORTERROR_COMBAT
Definition LFGMgr.h:96
@ LFG_TELEPORTERROR_PLAYER_DEAD
Definition LFGMgr.h:91
@ LFG_TELEPORTERROR_FALLING
Definition LFGMgr.h:92
@ LFG_TELEPORTERROR_IN_VEHICLE
Definition LFGMgr.h:93

References FATIGUE_TIMER, Unit::GetCharm(), GetDungeon(), Player::GetEntryPoint(), Player::GetGroup(), Group::GetGUID(), GetLFGDungeon(), WorldObject::GetMap(), WorldLocation::GetMapId(), WorldObject::GetName(), Player::GetSession(), Unit::GetVehicle(), WorldLocation::GetWorldLocation(), Unit::HasUnitState(), Unit::IsAlive(), Map::IsDungeon(), Player::IsFalling(), Unit::IsInCombat(), Group::isLFGGroup(), Player::IsMirrorTimerActive(), lfg::LFG_TELEPORTERROR_COMBAT, lfg::LFG_TELEPORTERROR_FALLING, lfg::LFG_TELEPORTERROR_FATIGUE, lfg::LFG_TELEPORTERROR_IN_VEHICLE, lfg::LFG_TELEPORTERROR_INVALID_LOCATION, lfg::LFG_TELEPORTERROR_OK, lfg::LFG_TELEPORTERROR_PLAYER_DEAD, LOG_DEBUG, lfg::LFGDungeonData::map, MAPID_INVALID, lfg::LFGDungeonData::o, WorldSession::SendLfgTeleportError(), Player::SetEntryPoint(), Player::TeleportTo(), Player::TeleportToEntryPoint(), UNIT_STATE_JUMPING, lfg::LFGDungeonData::x, lfg::LFGDungeonData::y, and lfg::LFGDungeonData::z.

Referenced by MakeNewGroup().

◆ ToggleTesting()

void lfg::LFGMgr::ToggleTesting ( )
889 {
890 if (sWorld->getBoolConfig(CONFIG_DEBUG_LFG))
891 {
892 m_Testing = true;
894 }
895 else
896 {
899 }
900 }
@ LANG_DEBUG_LFG_ON
Definition Language.h:1427
@ LANG_DEBUG_LFG_OFF
Definition Language.h:1428
@ LANG_DEBUG_LFG_CONF
Definition Language.h:1429
Definition Chat.h:37
void SendWorldText(std::string_view str)
Definition Chat.cpp:139

References CONFIG_DEBUG_LFG, LANG_DEBUG_LFG_CONF, LANG_DEBUG_LFG_OFF, LANG_DEBUG_LFG_ON, m_Testing, ChatHandler::SendWorldText(), and sWorld.

◆ Update()

void lfg::LFGMgr::Update ( uint32  diff,
uint8  task 
)
357 {
359 return;
360
361 if (task == 0)
362 {
363 time_t currTime = GameTime::GetGameTime().count();
364
365 // Remove obsolete role checks
366 for (LfgRoleCheckContainer::iterator it = RoleChecksStore.begin(); it != RoleChecksStore.end();)
367 {
368 LfgRoleCheckContainer::iterator itRoleCheck = it++;
369 LfgRoleCheck& roleCheck = itRoleCheck->second;
370 if (currTime < roleCheck.cancelTime)
371 continue;
372 roleCheck.state = LFG_ROLECHECK_MISSING_ROLE;
373
374 for (LfgRolesMap::const_iterator itRoles = roleCheck.roles.begin(); itRoles != roleCheck.roles.end(); ++itRoles)
375 {
376 ObjectGuid guid = itRoles->first;
377 RestoreState(guid, "Remove Obsolete RoleCheck");
378 SendLfgRoleCheckUpdate(guid, roleCheck);
379 if (guid == roleCheck.leader)
381 }
382
383 RestoreState(itRoleCheck->first, "Remove Obsolete RoleCheck");
384 RoleChecksStore.erase(itRoleCheck);
385 }
386
387 // Remove obsolete proposals
388 for (LfgProposalContainer::iterator it = ProposalsStore.begin(); it != ProposalsStore.end();)
389 {
390 LfgProposalContainer::iterator itRemove = it++;
391 if (itRemove->second.cancelTime < currTime)
393 }
394
395 // Remove obsolete kicks
396 for (LfgPlayerBootContainer::iterator it = BootsStore.begin(); it != BootsStore.end();)
397 {
398 LfgPlayerBootContainer::iterator itBoot = it++;
399 LfgPlayerBoot& boot = itBoot->second;
400 if (boot.cancelTime < currTime)
401 {
402 boot.inProgress = false;
403 for (LfgAnswerContainer::const_iterator itVotes = boot.votes.begin(); itVotes != boot.votes.end(); ++itVotes)
404 {
405 ObjectGuid pguid = itVotes->first;
406 if (pguid != boot.victim)
407 SendLfgBootProposalUpdate(pguid, boot);
409 }
410 SetState(itBoot->first, LFG_STATE_DUNGEON);
411 BootsStore.erase(itBoot);
412 }
413 }
414
415 // Cleanup expired dungeon cooldowns
417 }
418 else if (task == 1)
419 {
420 this->lastProposalId = m_lfgProposalId; // pussywizard: task 2 is done independantly, store previous value in LFGMgr for future use
421 uint8 newGroupsProcessed = 0;
422 // Check if a proposal can be formed with the new groups being added
423 for (LfgQueueContainer::iterator it = QueuesStore.begin(); it != QueuesStore.end(); ++it)
424 {
425 newGroupsProcessed += it->second.FindGroups();
426 if (newGroupsProcessed)
427 break;
428 }
429
430 // Update all players status queue info
431 if (!newGroupsProcessed) // don't do this on updates that precessed groups (performance)
432 for (LfgQueueContainer::iterator it = QueuesStore.begin(); it != QueuesStore.end(); ++it)
433 it->second.UpdateQueueTimers(tdiff);
434 }
435 else if (task == 2)
436 {
438 {
439 // pussywizard: only one proposal can be created in World::Update (during maps update), and it has id == m_lfgProposalId, so try to find only that one, dunno why for loop here xD
440 for (LfgProposalContainer::const_iterator itProposal = ProposalsStore.find(m_lfgProposalId); itProposal != ProposalsStore.end(); ++itProposal)
441 {
442 uint32 proposalId = itProposal->first;
443 LfgProposal& proposal = ProposalsStore[proposalId];
444
445 ObjectGuid guid;
446 for (LfgProposalPlayerContainer::const_iterator itPlayers = proposal.players.begin(); itPlayers != proposal.players.end(); ++itPlayers)
447 {
448 guid = itPlayers->first;
450 if (ObjectGuid gguid = GetGroup(guid))
451 {
454 }
455 else
457 SendLfgUpdateProposal(guid, proposal);
458 }
459
460 if (proposal.state == LFG_PROPOSAL_SUCCESS) // pussywizard: no idea what's the purpose of this xD
461 UpdateProposal(proposalId, guid, true);
462 }
463 }
464
465 UpdateRaidBrowser(tdiff);
466 }
467 }
void SendLfgRoleCheckUpdate(ObjectGuid guid, LfgRoleCheck const &roleCheck)
Definition LFGMgr.cpp:2770
void SendLfgJoinResult(ObjectGuid guid, LfgJoinResultData const &data)
Definition LFGMgr.cpp:2788
bool isOptionEnabled(uint32 option)
Checks if given lfg option is enabled.
Definition LFGMgr.cpp:2861
uint32 lastProposalId
pussywizard, store it here because of splitting LFGMgr update into tasks
Definition LFGMgr.h:628
void UpdateProposal(uint32 proposalId, ObjectGuid guid, bool accept)
Updates proposal to join dungeon with player answer.
Definition LFGMgr.cpp:1919
void CleanupDungeonCooldowns()
Definition LFGMgr.cpp:177
void UpdateRaidBrowser(uint32 diff)
Definition LFGMgr.cpp:1068
@ LFG_OPTION_ENABLE_DUNGEON_FINDER
Definition LFGMgr.h:42
@ LFG_OPTION_ENABLE_RAID_BROWSER
Definition LFGMgr.h:43
@ LFG_UPDATETYPE_PROPOSAL_BEGIN
Definition LFG.h:60
@ LFG_ROLECHECK_MISSING_ROLE
Definition LFGMgr.h:128
@ LFG_PROPOSAL_SUCCESS
Definition LFGMgr.h:83
@ LFG_JOIN_FAILED
Definition LFGMgr.h:104

References BootsStore, lfg::LfgRoleCheck::cancelTime, lfg::LfgPlayerBoot::cancelTime, CleanupDungeonCooldowns(), GetComment(), GameTime::GetGameTime(), GetGroup(), GetSelectedDungeons(), lfg::LfgPlayerBoot::inProgress, isOptionEnabled(), lastProposalId, lfg::LfgRoleCheck::leader, lfg::LFG_JOIN_FAILED, lfg::LFG_OPTION_ENABLE_DUNGEON_FINDER, lfg::LFG_OPTION_ENABLE_RAID_BROWSER, lfg::LFG_OPTION_ENABLE_SEASONAL_BOSSES, lfg::LFG_PROPOSAL_SUCCESS, lfg::LFG_ROLECHECK_MISSING_ROLE, lfg::LFG_STATE_DUNGEON, lfg::LFG_STATE_PROPOSAL, lfg::LFG_UPDATETYPE_PROPOSAL_BEGIN, lfg::LFG_UPDATETYPE_PROPOSAL_FAILED, m_lfgProposalId, lfg::LfgProposal::players, ProposalsStore, QueuesStore, RemoveProposal(), RestoreState(), RoleChecksStore, lfg::LfgRoleCheck::roles, SendLfgBootProposalUpdate(), SendLfgJoinResult(), SendLfgRoleCheckUpdate(), SendLfgUpdateParty(), SendLfgUpdatePlayer(), SendLfgUpdateProposal(), SetState(), lfg::LfgProposal::state, lfg::LfgRoleCheck::state, UpdateProposal(), UpdateRaidBrowser(), lfg::LfgPlayerBoot::victim, and lfg::LfgPlayerBoot::votes.

◆ UpdateBoot()

void lfg::LFGMgr::UpdateBoot ( ObjectGuid  guid,
bool  accept 
)

Updates player boot proposal with new player answer.

Update Boot info with player answer

Parameters
[in]guidPlayer who has answered
[in]playeranswer
2166 {
2167 ObjectGuid gguid = GetGroup(guid);
2168 if (!gguid)
2169 return;
2170
2171 LfgPlayerBootContainer::iterator itBoot = BootsStore.find(gguid);
2172 if (itBoot == BootsStore.end())
2173 return;
2174
2175 LfgPlayerBoot& boot = itBoot->second;
2176
2177 if (boot.votes[guid] != LFG_ANSWER_PENDING) // Cheat check: Player can't vote twice
2178 return;
2179
2180 boot.votes[guid] = LfgAnswer(accept);
2181
2182 uint8 votesNum = 0;
2183 uint8 agreeNum = 0;
2184 for (LfgAnswerContainer::const_iterator itVotes = boot.votes.begin(); itVotes != boot.votes.end(); ++itVotes)
2185 {
2186 if (itVotes->second != LFG_ANSWER_PENDING)
2187 {
2188 ++votesNum;
2189 if (itVotes->second == LFG_ANSWER_AGREE)
2190 ++agreeNum;
2191 }
2192 }
2193
2194 // if we don't have enough votes (agree or deny) do nothing
2195 if (agreeNum < LFG_GROUP_KICK_VOTES_NEEDED && (votesNum - agreeNum) < LFG_GROUP_KICK_VOTES_NEEDED)
2196 return;
2197
2198 // Send update info to all players
2199 boot.inProgress = false;
2200 for (LfgAnswerContainer::const_iterator itVotes = boot.votes.begin(); itVotes != boot.votes.end(); ++itVotes)
2201 {
2202 ObjectGuid pguid = itVotes->first;
2203 if (pguid != boot.victim)
2204 {
2206 SendLfgBootProposalUpdate(pguid, boot);
2207 }
2208 }
2209
2211 if (agreeNum == LFG_GROUP_KICK_VOTES_NEEDED) // Vote passed - Kick player
2212 {
2213 if (Group* group = sGroupMgr->GetGroupByGUID(gguid.GetCounter()))
2215
2216 DecreaseKicksLeft(gguid);
2217 }
2218 BootsStore.erase(itBoot);
2219 }
@ GROUP_REMOVEMETHOD_KICK_LFG
Definition SharedDefines.h:3846
static void RemoveFromGroup(Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, char const *reason=nullptr)
Definition Player.cpp:2374
void DecreaseKicksLeft(ObjectGuid guid)
Definition LFGMgr.cpp:2653
@ LFG_GROUP_KICK_VOTES_NEEDED
Definition LFGMgr.h:56
LfgAnswer
Answer state (Also used to check compatibilites)
Definition LFG.h:97

References BootsStore, DecreaseKicksLeft(), ObjectGuid::GetCounter(), GetGroup(), GROUP_REMOVEMETHOD_KICK_LFG, lfg::LfgPlayerBoot::inProgress, lfg::LFG_ANSWER_AGREE, lfg::LFG_ANSWER_PENDING, lfg::LFG_GROUP_KICK_VOTES_NEEDED, lfg::LFG_STATE_DUNGEON, Player::RemoveFromGroup(), SendLfgBootProposalUpdate(), SetState(), sGroupMgr, lfg::LfgPlayerBoot::victim, and lfg::LfgPlayerBoot::votes.

◆ UpdateProposal()

void lfg::LFGMgr::UpdateProposal ( uint32  proposalId,
ObjectGuid  guid,
bool  accept 
)

Updates proposal to join dungeon with player answer.

Update Proposal info with player answer

Parameters
[in]proposalIdProposal id to be updated
[in]guidPlayer guid to update answer
[in]acceptPlayer answer
1920 {
1921 // Check if the proposal exists
1922 LfgProposalContainer::iterator itProposal = ProposalsStore.find(proposalId);
1923 if (itProposal == ProposalsStore.end())
1924 return;
1925
1926 LfgProposal& proposal = itProposal->second;
1927
1928 // Check if proposal have the current player
1929 LfgProposalPlayerContainer::iterator itProposalPlayer = proposal.players.find(guid);
1930 if (itProposalPlayer == proposal.players.end())
1931 return;
1932
1933 LfgProposalPlayer& player = itProposalPlayer->second;
1934 player.accept = LfgAnswer(accept);
1935
1936 LOG_DEBUG("lfg", "LFGMgr::UpdateProposal: Player [{}] of proposal {} selected: {}", guid.ToString(), proposalId, accept);
1937 if (!accept)
1938 {
1940 return;
1941 }
1942
1943 // check if all have answered and reorder players (leader first)
1944 bool allAnswered = true;
1945 for (LfgProposalPlayerContainer::const_iterator itPlayers = proposal.players.begin(); itPlayers != proposal.players.end(); ++itPlayers)
1946 if (itPlayers->second.accept != LFG_ANSWER_AGREE) // No answer (-1) or not accepted (0)
1947 allAnswered = false;
1948
1949 if (!m_Testing && !allAnswered)
1950 {
1951 for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
1952 SendLfgUpdateProposal(it->first, proposal);
1953
1954 return;
1955 }
1956
1957 bool sendUpdate = proposal.state != LFG_PROPOSAL_SUCCESS;
1958 proposal.state = LFG_PROPOSAL_SUCCESS;
1959 time_t joinTime = GameTime::GetGameTime().count();
1960
1961 LFGQueue& queue = GetQueue(guid);
1962 LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_GROUP_FOUND);
1963 for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
1964 {
1965 ObjectGuid pguid = it->first;
1966 ObjectGuid gguid = it->second.group;
1967 uint32 dungeonId = (*GetSelectedDungeons(pguid).begin());
1968 int32 waitTime = -1;
1969 if (sendUpdate)
1970 SendLfgUpdateProposal(pguid, proposal);
1971
1972 if (gguid)
1973 {
1974 waitTime = int32((joinTime - queue.GetJoinTime(gguid)) / IN_MILLISECONDS);
1975 SendLfgUpdateParty(pguid, updateData);
1976 }
1977 else
1978 {
1979 waitTime = int32((joinTime - queue.GetJoinTime(pguid)) / IN_MILLISECONDS);
1980 SendLfgUpdatePlayer(pguid, updateData);
1981 }
1982 updateData.updateType = LFG_UPDATETYPE_REMOVED_FROM_QUEUE;
1983 SendLfgUpdatePlayer(pguid, updateData);
1984 SendLfgUpdateParty(pguid, updateData);
1985
1986 // Update timers
1987 uint8 role = GetRoles(pguid);
1988 role &= ~PLAYER_ROLE_LEADER;
1989 switch (role)
1990 {
1991 case PLAYER_ROLE_DAMAGE:
1992 queue.UpdateWaitTimeDps(waitTime, dungeonId);
1993 break;
1994 case PLAYER_ROLE_HEALER:
1995 queue.UpdateWaitTimeHealer(waitTime, dungeonId);
1996 break;
1997 case PLAYER_ROLE_TANK:
1998 queue.UpdateWaitTimeTank(waitTime, dungeonId);
1999 break;
2000 default:
2001 queue.UpdateWaitTimeAvg(waitTime, dungeonId);
2002 break;
2003 }
2004
2006 }
2007
2008 // Remove players/groups from Queue
2009 for (uint8 i = 0; i < 5 && proposal.queues.guids[i]; ++i)
2010 queue.RemoveQueueData(proposal.queues.guids[i]);
2011
2012 MakeNewGroup(proposal);
2013 ProposalsStore.erase(itProposal);
2014 }
std::int32_t int32
Definition Define.h:103
uint8 GetRoles(ObjectGuid guid)
Get current player roles.
Definition LFGMgr.cpp:2522
void MakeNewGroup(LfgProposal const &proposal)
Definition LFGMgr.cpp:1672
@ LFG_UPDATETYPE_GROUP_FOUND
Definition LFG.h:58

References lfg::LfgProposalPlayer::accept, GameTime::GetGameTime(), lfg::LFGQueue::GetJoinTime(), GetQueue(), GetRoles(), GetSelectedDungeons(), lfg::Lfg5Guids::guids, IN_MILLISECONDS, lfg::LFG_ANSWER_AGREE, lfg::LFG_PROPOSAL_SUCCESS, lfg::LFG_STATE_DUNGEON, lfg::LFG_UPDATETYPE_GROUP_FOUND, lfg::LFG_UPDATETYPE_PROPOSAL_DECLINED, lfg::LFG_UPDATETYPE_REMOVED_FROM_QUEUE, LOG_DEBUG, m_Testing, MakeNewGroup(), lfg::PLAYER_ROLE_DAMAGE, lfg::PLAYER_ROLE_HEALER, lfg::PLAYER_ROLE_TANK, lfg::LfgProposal::players, ProposalsStore, lfg::LfgProposal::queues, RemoveProposal(), lfg::LFGQueue::RemoveQueueData(), SendLfgUpdateParty(), SendLfgUpdatePlayer(), SendLfgUpdateProposal(), SetState(), lfg::LfgProposal::state, ObjectGuid::ToString(), lfg::LfgUpdateData::updateType, lfg::LFGQueue::UpdateWaitTimeAvg(), lfg::LFGQueue::UpdateWaitTimeDps(), lfg::LFGQueue::UpdateWaitTimeHealer(), and lfg::LFGQueue::UpdateWaitTimeTank().

Referenced by Update().

◆ UpdateRaidBrowser()

void lfg::LFGMgr::UpdateRaidBrowser ( uint32  diff)
1069 {
1070 for (uint8 team = 0; team < 2; ++team)
1071 {
1072 if (m_raidBrowserUpdateTimer[team] > diff)
1073 m_raidBrowserUpdateTimer[team] -= diff;
1074 else
1075 m_raidBrowserUpdateTimer[team] = 0;
1076 }
1077
1078 if (GetMSTimeDiff(GameTime::GetGameTimeMS(), GetTimeMS()) > 98ms) // prevent lagging
1079 {
1080 return;
1081 }
1082
1083 ObjectGuid guid, groupGuid, instanceGuid;
1084 uint8 level, Class, race, talents[3];
1085 float iLevel, mp5, mp5combat, baseAP, rangedAP;
1086 int32 spellDamage, spellHeal;
1087 uint32 dungeonId, encounterMask, maxPower;
1088 uint32 deletedCounter, groupCounter, playerCounter;
1089 std::string emptyComment;
1090
1091 for (uint8 team = 0; team < 2; ++team)
1092 {
1093 if (m_raidBrowserLastUpdatedDungeonId[team] == 0) // new loop
1094 {
1095 if (m_raidBrowserUpdateTimer[team] > 0) // allowed only with some time interval
1096 continue;
1097 else // reset timer
1098 m_raidBrowserUpdateTimer[team] = 5000;
1099 }
1100
1101 RBUsedDungeonsSet::const_iterator neitr, titr;
1102 for (neitr = RBUsedDungeonsStore[team].begin(); neitr != RBUsedDungeonsStore[team].end(); )
1103 {
1104 titr = neitr++;
1105 dungeonId = (*titr);
1106
1107 // go to next dungeon than previously (one dungeon updated in one LFGMgr::UpdateRaidBrowser)
1108 if (dungeonId <= m_raidBrowserLastUpdatedDungeonId[team])
1109 continue;
1110 m_raidBrowserLastUpdatedDungeonId[team] = dungeonId;
1111
1112 RBEntryInfoMap& entryInfoMap = RaidBrowserStore[team][dungeonId];
1113 LFGDungeonData const* dungeonData = GetLFGDungeon(dungeonId); // checked if exists before inserting to the container
1114 RBInternalInfoMap& currInternalInfoMap = RBInternalInfoStoreCurr[team][dungeonId];
1115 for (RBEntryInfoMap::const_iterator sitr = entryInfoMap.begin(); sitr != entryInfoMap.end(); ++sitr)
1116 {
1117 guid = sitr->first;
1118 groupGuid.Clear();
1120 ASSERT(p);
1121 if (sitr->second.roles == PLAYER_ROLE_LEADER)
1122 {
1123 ASSERT(p->GetGroup());
1124 groupGuid = p->GetGroup()->GetGUID();
1125 }
1126 encounterMask = 0;
1127 instanceGuid.Clear();
1128 if (InstancePlayerBind* bind = sInstanceSaveMgr->PlayerGetBoundInstance(guid, dungeonData->map, dungeonData->difficulty))
1129 if (bind->perm)
1130 {
1131 instanceGuid = ObjectGuid::Create<HighGuid::Instance>(bind->save->GetInstanceId());
1132 encounterMask = bind->save->GetCompletedEncounterMask();
1133 }
1134
1135 talents[0] = 0;
1136 talents[1] = 0;
1137 talents[2] = 0;
1138 p->GetTalentTreePoints(talents);
1145 maxPower = 0;
1146 if (p->IsClass(CLASS_DRUID))
1147 maxPower = p->GetMaxPower(POWER_MANA);
1148 else
1149 maxPower = (p->getPowerType() == POWER_RAGE || p->getPowerType() == POWER_RUNIC_POWER) ? p->GetMaxPower(p->getPowerType()) / 10 : p->GetMaxPower(p->getPowerType());
1150
1151 currInternalInfoMap[sitr->first] = RBInternalInfo(guid, sitr->second.comment, !groupGuid.IsEmpty(), groupGuid, sitr->second.roles, encounterMask, instanceGuid,
1152 1, p->GetLevel(), p->getClass(), p->getRace(), p->GetAverageItemLevel(),
1153 talents, p->GetAreaId(), p->GetArmor(), (uint32)std::max<int32>(0, spellDamage), (uint32)std::max<int32>(0, spellHeal),
1154 p->GetUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + static_cast<uint16>(CR_CRIT_MELEE)), p->GetUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + static_cast<uint16>(CR_CRIT_RANGED)), p->GetUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + static_cast<uint16>(CR_CRIT_SPELL)), std::max<float>(0.0f, mp5), std::max<float>(0.0f, mp5combat),
1155 std::max<uint32>(baseAP, rangedAP), (uint32)p->GetStat(STAT_AGILITY), p->GetMaxHealth(), maxPower, p->GetDefenseSkillValue(),
1157
1158 if (!groupGuid)
1159 continue;
1160 for (Group::member_citerator mitr = p->GetGroup()->GetMemberSlots().begin(); mitr != p->GetGroup()->GetMemberSlots().end(); ++mitr)
1161 {
1162 if (mitr->guid == sitr->first) // leader already added
1163 continue;
1164
1165 guid = mitr->guid;
1166 level = 1;
1167 Class = 0;
1168 race = 0;
1169 iLevel = 0.0f;
1170 talents[0] = 0;
1171 talents[1] = 0;
1172 talents[2] = 0;
1173 if (CharacterCacheEntry const* gpd = sCharacterCache->GetCharacterCacheByGuid(mitr->guid))
1174 {
1175 level = gpd->Level;
1176 Class = gpd->Class;
1177 race = gpd->Race;
1178 }
1180 if (mplr)
1181 {
1182 iLevel = mplr->GetAverageItemLevel();
1183 mplr->GetTalentTreePoints(talents);
1184 }
1185 currInternalInfoMap[mitr->guid] = RBInternalInfo(guid, emptyComment, false, groupGuid, 0, 0, ObjectGuid::Empty,
1186 (mplr ? 1 : 0), level, Class, race, iLevel,
1187 talents, 0, 0, 0, 0,
1188 0, 0, 0, 0, 0,
1189 0, 0, 0, 0, 0,
1190 0, 0, 0, 0, 0);
1191 }
1192 }
1193
1194 _rbCopy.clear();
1195 _rbCopy = currInternalInfoMap; // will be saved as prev at the end
1196
1197 // compare prev with curr to build difference packet
1198 deletedCounter = 0;
1199 groupCounter = 0;
1200 playerCounter = 0;
1204 _rbDeletedGroups.clear();
1206
1207 RBInternalInfoMap& prevInternalInfoMap = RBInternalInfoStorePrev[team][dungeonId];
1208 RBInternalInfoMap::iterator iter, iterTmp;
1209 for (RBInternalInfoMap::const_iterator sitr = prevInternalInfoMap.begin(); sitr != prevInternalInfoMap.end(); ++sitr)
1210 {
1211 iter = currInternalInfoMap.find(sitr->first);
1212 if (iter == currInternalInfoMap.end()) // was -> isn't
1213 {
1214 if (sitr->second.isGroupLeader)
1215 _rbDeletedGroups.insert(sitr->second.groupGuid);
1216
1217 ++deletedCounter;
1218 _rbBufferDeleted << sitr->second.guid;
1219 }
1220 else // was -> is
1221 {
1222 if (sitr->second.isGroupLeader) // was a leader
1223 {
1224 if (!iter->second.isGroupLeader) // leader -> no longer a leader
1225 _rbDeletedGroups.insert(sitr->second.groupGuid);
1226 else if (sitr->second.groupGuid != iter->second.groupGuid) // leader -> leader of another group
1227 {
1228 _rbDeletedGroups.insert(sitr->second.groupGuid);
1229 _rbDeletedGroupsToErase.insert(iter->second.groupGuid);
1230 ++groupCounter;
1231 RBPacketAppendGroup(iter->second, _rbBufferGroups);
1232 }
1233 else if (sitr->second.comment != iter->second.comment || sitr->second.encounterMask != iter->second.encounterMask || sitr->second.instanceGuid != iter->second.instanceGuid) // leader -> nothing changed
1234 {
1235 ++groupCounter;
1236 RBPacketAppendGroup(iter->second, _rbBufferGroups);
1237 }
1238 }
1239 else if (iter->second.isGroupLeader) // wasn't a leader -> is a leader
1240 {
1241 _rbDeletedGroupsToErase.insert(iter->second.groupGuid);
1242 ++groupCounter;
1243 RBPacketAppendGroup(iter->second, _rbBufferGroups);
1244 }
1245
1246 if (!iter->second._online) // if offline, copy previous stats (itemLevel, talents, area, etc.)
1247 {
1248 iterTmp = _rbCopy.find(sitr->first); // copied container is for building a full packet, so modify it there (currInternalInfoMap is erased)
1249 iterTmp->second.CopyStats(sitr->second);
1250 if (!sitr->second.PlayerSameAs(iterTmp->second)) // player info changed
1251 {
1252 ++playerCounter;
1253 RBPacketAppendPlayer(iterTmp->second, _rbBufferPlayers);
1254 }
1255 }
1256 else if (!sitr->second.PlayerSameAs(iter->second)) // player info changed
1257 {
1258 ++playerCounter;
1260 }
1261 currInternalInfoMap.erase(iter);
1262 }
1263 }
1264 // left entries (new)
1265 for (RBInternalInfoMap::const_iterator sitr = currInternalInfoMap.begin(); sitr != currInternalInfoMap.end(); ++sitr)
1266 {
1267 if (sitr->second.isGroupLeader)
1268 {
1269 _rbDeletedGroupsToErase.insert(sitr->second.groupGuid);
1270 ++groupCounter;
1271 RBPacketAppendGroup(sitr->second, _rbBufferGroups);
1272 }
1273 ++playerCounter;
1275 }
1276
1277 if (!_rbDeletedGroupsToErase.empty())
1278 {
1279 for (ObjectGuid const& toErase : _rbDeletedGroupsToErase)
1280 {
1281 _rbDeletedGroups.erase(toErase);
1282 }
1283 }
1284
1285 if (!_rbDeletedGroups.empty())
1286 {
1287 for (ObjectGuid const& deletedGroup : _rbDeletedGroups)
1288 {
1289 ++deletedCounter;
1290 _rbBufferDeleted << deletedGroup;
1291 }
1292 }
1293
1294 WorldPacket differencePacket(SMSG_UPDATE_LFG_LIST, 1000);
1295 RBPacketBuildDifference(differencePacket, dungeonId, deletedCounter, _rbBufferDeleted, groupCounter, _rbBufferGroups, playerCounter, _rbBufferPlayers);
1296 WorldPacket fullPacket(SMSG_UPDATE_LFG_LIST, 1000);
1297 RBPacketBuildFull(fullPacket, dungeonId, _rbCopy);
1298
1299 RBCacheStore[team][dungeonId] = fullPacket;
1300 prevInternalInfoMap = _rbCopy;
1301 currInternalInfoMap.clear();
1302
1303 if (entryInfoMap.empty())
1304 RBUsedDungeonsStore[team].erase(titr);
1305
1306 // send difference packet to browsing players
1307 for (RBSearchersMap::const_iterator sitr = RBSearchersStore[team].begin(); sitr != RBSearchersStore[team].end(); ++sitr)
1308 if (sitr->second == dungeonId)
1309 if (Player* p = ObjectAccessor::FindConnectedPlayer(sitr->first))
1310 p->SendDirectMessage(&differencePacket);
1311
1312 break; // one dungeon updated in one LFGMgr::UpdateRaidBrowser
1313 }
1314
1315 // already updated all in this time interval
1316 if (neitr == RBUsedDungeonsStore[team].end())
1318 }
1319 }
#define sCharacterCache
Definition CharacterCache.h:88
std::uint16_t uint16
Definition Define.h:108
@ Class
Requires the player to be a specific class.
@ POWER_RAGE
Definition SharedDefines.h:258
@ POWER_RUNIC_POWER
Definition SharedDefines.h:263
@ POWER_MANA
Definition SharedDefines.h:257
@ CLASS_DRUID
Definition SharedDefines.h:136
@ STAT_AGILITY
Definition SharedDefines.h:247
@ SPELL_SCHOOL_MASK_ALL
Definition SharedDefines.h:303
Milliseconds GetTimeMS()
Definition Timer.h:84
Milliseconds GetMSTimeDiff(Milliseconds oldMSTime, Milliseconds newMSTime)
Definition Timer.h:91
@ BASE_ATTACK
Definition Unit.h:216
@ RANGED_ATTACK
Definition Unit.h:218
@ CR_EXPERTISE
Definition Unit.h:247
@ CR_CRIT_MELEE
Definition Unit.h:232
@ CR_CRIT_RANGED
Definition Unit.h:233
@ CR_PARRY
Definition Unit.h:227
@ CR_DODGE
Definition Unit.h:226
@ CR_BLOCK
Definition Unit.h:228
@ CR_HASTE_SPELL
Definition Unit.h:243
@ CR_CRIT_SPELL
Definition Unit.h:234
@ PLAYER_FIELD_COMBAT_RATING_1
Definition UpdateFields.h:380
@ UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER
Definition UpdateFields.h:113
@ UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER
Definition UpdateFields.h:112
void clear()
Definition ByteBuffer.h:122
MemberSlotList const & GetMemberSlots() const
Definition Group.h:251
MemberSlotList::const_iterator member_citerator
Definition Group.h:189
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:298
float GetFloatValue(uint16 index) const
Definition Object.cpp:310
void GetTalentTreePoints(uint8(&specPoints)[3]) const
Definition Player.cpp:15697
float GetAverageItemLevel()
Definition Player.cpp:16174
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:9835
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition Unit.cpp:12302
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition Unit.cpp:3779
uint32 GetMaxHealth() const
Definition Unit.h:1110
uint8 getClass() const
Definition Unit.h:844
uint8 getRace(bool original=false) const
Definition Unit.cpp:17057
uint32 GetMaxPower(Powers power) const
Definition Unit.h:1137
uint32 GetArmor() const
Definition Unit.h:1158
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:9078
float GetStat(Stats stat) const
Definition Unit.h:1059
Powers getPowerType() const
Definition Unit.h:1132
uint32 GetAreaId() const
Definition Object.cpp:3174
ByteBuffer _rbBufferGroups
Definition LFGMgr.h:632
ByteBuffer _rbBufferDeleted
Definition LFGMgr.h:631
GuidSet _rbDeletedGroupsToErase
Definition LFGMgr.h:635
std::unordered_map< ObjectGuid, RBInternalInfo > RBInternalInfoMap
Definition LFGMgr.h:434
RBInternalInfoMapMap RBInternalInfoStorePrev[2]
Definition LFGMgr.h:436
void RBPacketBuildDifference(WorldPacket &differencePacket, uint32 dungeonId, uint32 deletedCounter, ByteBuffer const &bufferDeleted, uint32 groupCounter, ByteBuffer const &bufferGroups, uint32 playerCounter, ByteBuffer const &bufferPlayers)
Definition LFGMgr.cpp:1391
std::unordered_map< ObjectGuid, RBEntryInfo > RBEntryInfoMap
Definition LFGMgr.h:427
ByteBuffer _rbBufferPlayers
Definition LFGMgr.h:633
void RBPacketBuildFull(WorldPacket &fullPacket, uint32 dungeonId, RBInternalInfoMap const &infoMap)
Definition LFGMgr.cpp:1406
RBInternalInfoMapMap RBInternalInfoStoreCurr[2]
Definition LFGMgr.h:437
RBInternalInfoMap _rbCopy
Definition LFGMgr.h:636
GuidSet _rbDeletedGroups
Definition LFGMgr.h:634
Milliseconds GetGameTimeMS()
Definition GameTime.cpp:43
Definition CharacterCache.h:28

References _rbBufferDeleted, _rbBufferGroups, _rbBufferPlayers, _rbCopy, _rbDeletedGroups, _rbDeletedGroupsToErase, ASSERT, BASE_ATTACK, Class, CLASS_DRUID, ObjectGuid::Clear(), ByteBuffer::clear(), CR_BLOCK, CR_CRIT_MELEE, CR_CRIT_RANGED, CR_CRIT_SPELL, CR_DODGE, CR_EXPERTISE, CR_HASTE_SPELL, CR_PARRY, lfg::LFGDungeonData::difficulty, ObjectGuid::Empty, ObjectAccessor::FindConnectedPlayer(), WorldObject::GetAreaId(), Unit::GetArmor(), Player::GetAverageItemLevel(), Unit::getClass(), Unit::GetDefenseSkillValue(), Object::GetFloatValue(), GameTime::GetGameTimeMS(), Player::GetGroup(), Group::GetGUID(), Unit::GetLevel(), GetLFGDungeon(), Unit::GetMaxHealth(), Unit::GetMaxPower(), Group::GetMemberSlots(), GetMSTimeDiff(), Unit::getPowerType(), Unit::getRace(), Unit::GetStat(), Player::GetTalentTreePoints(), GetTimeMS(), Unit::GetTotalAttackPowerValue(), Object::GetUInt32Value(), Player::IsClass(), ObjectGuid::IsEmpty(), m_raidBrowserLastUpdatedDungeonId, m_raidBrowserUpdateTimer, lfg::LFGDungeonData::map, PLAYER_FIELD_COMBAT_RATING_1, lfg::PLAYER_ROLE_LEADER, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, RaidBrowserStore, RANGED_ATTACK, RBCacheStore, RBInternalInfoStoreCurr, RBInternalInfoStorePrev, RBPacketAppendGroup(), RBPacketAppendPlayer(), RBPacketBuildDifference(), RBPacketBuildFull(), RBSearchersStore, RBUsedDungeonsStore, sCharacterCache, sInstanceSaveMgr, SMSG_UPDATE_LFG_LIST, SPELL_SCHOOL_MASK_ALL, Unit::SpellBaseDamageBonusDone(), Unit::SpellBaseHealingBonusDone(), STAT_AGILITY, UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, and UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER.

Referenced by Update().

◆ UpdateRoleCheck()

void lfg::LFGMgr::UpdateRoleCheck ( ObjectGuid  gguid,
ObjectGuid  guid = ObjectGuid::Empty,
uint8  roles = PLAYER_ROLE_NONE 
)

Updates the role check with player answer.

Update the Role check info with the player selected role.

Parameters
[in]grpGroup guid to update rolecheck
[in]guidPlayer guid (0 = rolecheck failed)
[in]rolesPlayer selected roles
1488 {
1489 if (!gguid)
1490 return;
1491
1492 LfgRoleCheckContainer::iterator itRoleCheck = RoleChecksStore.find(gguid);
1493 if (itRoleCheck == RoleChecksStore.end())
1494 return;
1495
1496 LfgRoleCheck& roleCheck = itRoleCheck->second;
1497 bool sendRoleChosen = roleCheck.state != LFG_ROLECHECK_DEFAULT && guid;
1498
1499 if (!guid)
1500 roleCheck.state = LFG_ROLECHECK_ABORTED;
1501 else if (roles < PLAYER_ROLE_TANK) // Player selected no role.
1502 roleCheck.state = LFG_ROLECHECK_NO_ROLE;
1503 else
1504 {
1505 roleCheck.roles[guid] = roles;
1506
1507 // Check if all players have selected a role
1508 LfgRolesMap::const_iterator itRoles = roleCheck.roles.begin();
1509 while (itRoles != roleCheck.roles.end() && itRoles->second != PLAYER_ROLE_NONE)
1510 ++itRoles;
1511
1512 if (itRoles == roleCheck.roles.end())
1513 {
1514 roleCheck.state = CheckGroupRoles(roleCheck.roles) ? LFG_ROLECHECK_FINISHED : LFG_ROLECHECK_WRONG_ROLES;
1515 }
1516 }
1517
1518 LfgDungeonSet dungeons;
1519 if (roleCheck.rDungeonId)
1520 dungeons.insert(roleCheck.rDungeonId);
1521 else
1522 dungeons = roleCheck.dungeons;
1523
1524 LfgJoinResultData joinData = LfgJoinResultData(LFG_JOIN_FAILED, roleCheck.state);
1525 for (LfgRolesMap::const_iterator it = roleCheck.roles.begin(); it != roleCheck.roles.end(); ++it)
1526 {
1527 ObjectGuid pguid = it->first;
1528
1529 if (sendRoleChosen)
1530 SendLfgRoleChosen(pguid, guid, roles);
1531
1532 SendLfgRoleCheckUpdate(pguid, roleCheck);
1533 switch (roleCheck.state)
1534 {
1536 continue;
1538 SetState(pguid, LFG_STATE_QUEUED);
1539 SetRoles(pguid, it->second);
1540 SendLfgUpdateParty(pguid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, dungeons, GetComment(pguid)));
1541 break;
1542 default:
1543 if (roleCheck.leader == pguid)
1544 SendLfgJoinResult(pguid, joinData);
1546 RestoreState(pguid, "Rolecheck Failed");
1547 break;
1548 }
1549 }
1550
1551 if (roleCheck.state == LFG_ROLECHECK_FINISHED)
1552 {
1553 SetState(gguid, LFG_STATE_QUEUED);
1554 LFGQueue& queue = GetQueue(gguid);
1555 queue.AddQueueData(gguid, time_t(GameTime::GetGameTime().count()), roleCheck.dungeons, roleCheck.roles);
1556 RoleChecksStore.erase(itRoleCheck);
1557 }
1558 else if (roleCheck.state != LFG_ROLECHECK_INITIALITING)
1559 {
1560 RestoreState(gguid, "Rolecheck Failed");
1561 RoleChecksStore.erase(itRoleCheck);
1562 }
1563 }
void SendLfgRoleChosen(ObjectGuid guid, ObjectGuid pguid, uint8 roles)
Definition LFGMgr.cpp:2764
@ LFG_UPDATETYPE_ROLECHECK_FAILED
Definition LFG.h:54
@ LFG_ROLECHECK_WRONG_ROLES
Definition LFGMgr.h:129
@ LFG_ROLECHECK_ABORTED
Definition LFGMgr.h:130
@ LFG_ROLECHECK_DEFAULT
Definition LFGMgr.h:125
@ LFG_ROLECHECK_FINISHED
Definition LFGMgr.h:126
@ LFG_ROLECHECK_NO_ROLE
Definition LFGMgr.h:131

References lfg::LFGQueue::AddQueueData(), CheckGroupRoles(), lfg::LfgRoleCheck::dungeons, GetComment(), GameTime::GetGameTime(), GetQueue(), lfg::LfgRoleCheck::leader, lfg::LFG_JOIN_FAILED, lfg::LFG_ROLECHECK_ABORTED, lfg::LFG_ROLECHECK_DEFAULT, lfg::LFG_ROLECHECK_FINISHED, lfg::LFG_ROLECHECK_INITIALITING, lfg::LFG_ROLECHECK_NO_ROLE, lfg::LFG_ROLECHECK_WRONG_ROLES, lfg::LFG_STATE_QUEUED, lfg::LFG_UPDATETYPE_ADDED_TO_QUEUE, lfg::LFG_UPDATETYPE_ROLECHECK_FAILED, lfg::PLAYER_ROLE_NONE, lfg::PLAYER_ROLE_TANK, lfg::LfgRoleCheck::rDungeonId, RestoreState(), RoleChecksStore, lfg::LfgRoleCheck::roles, SendLfgJoinResult(), SendLfgRoleCheckUpdate(), SendLfgRoleChosen(), SendLfgUpdateParty(), SetRoles(), SetState(), and lfg::LfgRoleCheck::state.

Referenced by JoinLfg(), and LeaveLfg().

Member Data Documentation

◆ _rbBufferDeleted

ByteBuffer lfg::LFGMgr::_rbBufferDeleted
private

Referenced by UpdateRaidBrowser().

◆ _rbBufferGroups

ByteBuffer lfg::LFGMgr::_rbBufferGroups
private

Referenced by UpdateRaidBrowser().

◆ _rbBufferPlayers

ByteBuffer lfg::LFGMgr::_rbBufferPlayers
private

Referenced by UpdateRaidBrowser().

◆ _rbCopy

RBInternalInfoMap lfg::LFGMgr::_rbCopy
private

Referenced by UpdateRaidBrowser().

◆ _rbDeletedGroups

GuidSet lfg::LFGMgr::_rbDeletedGroups
private

Referenced by UpdateRaidBrowser().

◆ _rbDeletedGroupsToErase

GuidSet lfg::LFGMgr::_rbDeletedGroupsToErase
private

Referenced by UpdateRaidBrowser().

◆ BootsStore

LfgPlayerBootContainer lfg::LFGMgr::BootsStore
private

Current player kicks.

Referenced by InitBoot(), Update(), and UpdateBoot().

◆ CachedDungeonMapStore

LfgCachedDungeonContainer lfg::LFGMgr::CachedDungeonMapStore
private

Stores all dungeons by groupType.

Referenced by GetDungeonsByRandom(), and LoadLFGDungeons().

◆ DungeonCooldownStore

LfgDungeonCooldownContainer lfg::LFGMgr::DungeonCooldownStore
private

Stores dungeon cooldowns per player.

Referenced by AddDungeonCooldown(), CleanupDungeonCooldowns(), ClearDungeonCooldowns(), and FilterCooldownDungeons().

◆ GroupsStore

◆ lastProposalId

uint32 lfg::LFGMgr::lastProposalId
private

pussywizard, store it here because of splitting LFGMgr update into tasks

Referenced by Update().

◆ LfgDungeonStore

LFGDungeonContainer lfg::LFGMgr::LfgDungeonStore
private

◆ m_lfgProposalId

uint32 lfg::LFGMgr::m_lfgProposalId
private

used as internal counter for proposals

Referenced by AddProposal(), and Update().

◆ m_options

uint32 lfg::LFGMgr::m_options
private

Stores config options.

Referenced by GetOptions(), InitializeLockedDungeons(), isOptionEnabled(), and SetOptions().

◆ m_raidBrowserLastUpdatedDungeonId

uint32 lfg::LFGMgr::m_raidBrowserLastUpdatedDungeonId[2]
private

pussywizard: for 2 factions

Referenced by LFGMgr(), and UpdateRaidBrowser().

◆ m_raidBrowserUpdateTimer

uint32 lfg::LFGMgr::m_raidBrowserUpdateTimer[2]
private

pussywizard

Referenced by LFGMgr(), and UpdateRaidBrowser().

◆ m_Testing

bool lfg::LFGMgr::m_Testing
private

◆ PlayersStore

◆ ProposalsStore

LfgProposalContainer lfg::LFGMgr::ProposalsStore
private

Current Proposals.

Referenced by AddProposal(), LeaveLfg(), RemoveProposal(), Update(), and UpdateProposal().

◆ QueuesStore

LfgQueueContainer lfg::LFGMgr::QueuesStore
private

Queues.

Referenced by Clean(), GetQueue(), LeaveAllLfgQueues(), and Update().

◆ RaidBrowserStore

◆ RBCacheStore

RBCacheMap lfg::LFGMgr::RBCacheStore[2]
private

◆ RBInternalInfoStoreCurr

RBInternalInfoMapMap lfg::LFGMgr::RBInternalInfoStoreCurr[2]
private

Referenced by UpdateRaidBrowser().

◆ RBInternalInfoStorePrev

RBInternalInfoMapMap lfg::LFGMgr::RBInternalInfoStorePrev[2]
private

Referenced by UpdateRaidBrowser().

◆ RBSearchersStore

RBSearchersMap lfg::LFGMgr::RBSearchersStore[2]
private

◆ RBUsedDungeonsStore

RBUsedDungeonsSet lfg::LFGMgr::RBUsedDungeonsStore[2]
private

◆ RewardMapStore

LfgRewardContainer lfg::LFGMgr::RewardMapStore
private

Stores rewards for random dungeons.

Referenced by GetRandomDungeonReward(), LoadRewards(), and ~LFGMgr().

◆ RoleChecksStore

LfgRoleCheckContainer lfg::LFGMgr::RoleChecksStore
private

Current Role checks.

Referenced by JoinLfg(), Update(), and UpdateRoleCheck().


The documentation for this class was generated from the following files: