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, const Map *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 (const RBInternalInfo &info, ByteBuffer &buffer)
 
void RBPacketAppendPlayer (const RBInternalInfo &info, ByteBuffer &buffer)
 
void RBPacketBuildDifference (WorldPacket &differencePacket, uint32 dungeonId, uint32 deletedCounter, ByteBuffer &buffer_deleted, uint32 groupCounter, ByteBuffer &buffer_groups, uint32 playerCounter, ByteBuffer &buffer_players)
 
void RBPacketBuildFull (WorldPacket &fullPacket, uint32 dungeonId, RBInternalInfoMap &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
 
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:319
@ CONFIG_DEBUG_LFG
Definition WorldConfig.h:122
bool m_Testing
Definition LFGMgr.h:642
uint32 m_lfgProposalId
used as internal counter for proposals
Definition LFGMgr.h:625
uint32 m_raidBrowserLastUpdatedDungeonId[2]
pussywizard: for 2 factions
Definition LFGMgr.h:629
uint32 m_options
Stores config options.
Definition LFGMgr.h:626
uint32 m_raidBrowserUpdateTimer[2]
pussywizard
Definition LFGMgr.h:628
#define sWorld
Definition World.h:317

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:634

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:178
void SetDungeon(ObjectGuid guid, uint32 dungeon)
Definition LFGMgr.cpp:2605
void SetState(ObjectGuid guid, LfgState state)
Definition LFGMgr.cpp:2578
void SetLeader(ObjectGuid gguid, ObjectGuid leader)
Sets the leader of the group.
Definition LFGMgr.cpp:2704
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:327
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
LowType GetCounter() const
Definition ObjectGuid.h:145
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:2474
uint32 GetDungeon(ObjectGuid guid, bool asId=true)
Get current dungeon.
Definition LFGMgr.cpp:2498

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:320
LfgDungeonCooldownContainer DungeonCooldownStore
Stores dungeon cooldowns per player.
Definition LFGMgr.h:647
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.

2693 {
2694 const LfgDungeonSet& dungeons = GetSelectedDungeons(guid);
2695 if (dungeons.empty())
2696 return;
2697
2698 uint32 dungeonId = *dungeons.begin();
2699 LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId);
2700 if (dungeon && (dungeon->type == LFG_TYPE_RANDOM))
2701 GroupsStore[gguid].AddRandomQueuedPlayer(guid);
2702 }
LFGDungeonData const * GetLFGDungeon(uint32 id)
Definition LFGMgr.cpp:250
LfgGroupDataContainer GroupsStore
Group data.
Definition LFGMgr.h:641
LfgDungeonSet const & GetSelectedDungeons(ObjectGuid guid)
Get selected dungeons.
Definition LFGMgr.cpp:2530
@ LFG_TYPE_RANDOM
Definition LFGMgr.h:74
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.

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

References GroupsStore.

Referenced by SetupGroupMember().

◆ AddProposal()

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

Add a new Proposal.

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

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

◆ AllQueued()

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

Checks if all players are queued.

2830 {
2831 bool ok = true;
2832
2833 if (check.empty())
2834 return false;
2835
2836 for (uint8 i = 0; i < 5 && check.guids[i]; ++i)
2837 {
2838 ObjectGuid guid = check.guids[i];
2839 if (GetState(guid) != LFG_STATE_QUEUED)
2840 {
2841 LFGQueue& queue = GetQueue(guid);
2842 queue.RemoveFromQueue(guid);
2843 ok = false;
2844 }
2845 }
2846
2847 return ok;
2848 }
Definition ObjectGuid.h:118
LFGQueue & GetQueue(ObjectGuid guid)
Definition LFGMgr.cpp:2812
@ 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.

1622 {
1623 if (groles.empty())
1624 return 0;
1625
1626 uint8 damage = 0;
1627 uint8 tank = 0;
1628 uint8 healer = 0;
1629
1630 for (LfgRolesMap::iterator it = groles.begin(); it != groles.end(); ++it)
1631 {
1632 uint8 const role = it->second & ~PLAYER_ROLE_LEADER;
1633 if (role == PLAYER_ROLE_NONE)
1634 return 0;
1635
1636 if (role & PLAYER_ROLE_DAMAGE)
1637 {
1638 if (role != PLAYER_ROLE_DAMAGE)
1639 {
1640 it->second -= PLAYER_ROLE_DAMAGE;
1641 if (uint8 x = CheckGroupRoles(groles))
1642 return x;
1643 it->second += PLAYER_ROLE_DAMAGE;
1644 }
1645 else if (damage == LFG_DPS_NEEDED)
1646 return 0;
1647 else
1648 damage++;
1649 }
1650
1651 if (role & PLAYER_ROLE_HEALER)
1652 {
1653 if (role != PLAYER_ROLE_HEALER)
1654 {
1655 it->second -= PLAYER_ROLE_HEALER;
1656 if (uint8 x = CheckGroupRoles(groles))
1657 return x;
1658 it->second += PLAYER_ROLE_HEALER;
1659 }
1660 else if (healer == LFG_HEALERS_NEEDED)
1661 return 0;
1662 else
1663 healer++;
1664 }
1665
1666 if (role & PLAYER_ROLE_TANK)
1667 {
1668 if (role != PLAYER_ROLE_TANK)
1669 {
1670 it->second -= PLAYER_ROLE_TANK;
1671 if (uint8 x = CheckGroupRoles(groles))
1672 return x;
1673 it->second += PLAYER_ROLE_TANK;
1674 }
1675 else if (tank == LFG_TANKS_NEEDED)
1676 return 0;
1677 else
1678 tank++;
1679 }
1680 }
1681 if ((tank + healer + damage) == uint8(groles.size()))
1682 return (8 * tank + 4 * healer + damage);
1683 return 0;
1684 }
static uint8 CheckGroupRoles(LfgRolesMap &groles)
Checks if given roles match, modifies given roles map with new roles.
Definition LFGMgr.cpp:1621
@ 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.

2852 {
2853 QueuesStore.clear();
2854 }
LfgQueueContainer QueuesStore
Queues.
Definition LFGMgr.h:631

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
2649 {
2650 LOG_DEBUG("lfg", "LFGMgr::DecreaseKicksLeft: [{}]", guid.ToString());
2651 GroupsStore[guid].DecreaseKicksLeft();
2652 }
#define LOG_DEBUG(filterType__,...)
Definition Log.h:157
std::string ToString() const
Definition ObjectGuid.cpp:47

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,
const Map 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
2318 {
2319 uint32 gDungeonId = GetDungeon(gguid);
2320 if (gDungeonId != dungeonId)
2321 {
2322 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] Finished dungeon {} but group queued for {}. Ignoring", gguid.ToString(), dungeonId, gDungeonId);
2323 return;
2324 }
2325
2326 if (GetState(gguid) == LFG_STATE_FINISHED_DUNGEON) // Shouldn't happen. Do not reward multiple times
2327 {
2328 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] Already rewarded group. Ignoring", gguid.ToString());
2329 return;
2330 }
2331
2333 _SaveToDB(gguid); // pussywizard
2334
2335 const LfgGuidSet& players = GetPlayers(gguid);
2336 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
2337 {
2338 ObjectGuid guid = (*it);
2340 {
2341 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] Already rewarded player. Ignoring", guid.ToString());
2342 continue;
2343 }
2344
2345 uint32 rDungeonId = 0;
2346 const LfgDungeonSet& dungeons = GetSelectedDungeons(guid);
2347 if (!dungeons.empty())
2348 rDungeonId = (*dungeons.begin());
2349
2351
2352 // Give rewards only if its a random dungeon
2353 LFGDungeonData const* dungeon = GetLFGDungeon(rDungeonId);
2354
2355 if (!dungeon || (dungeon->type != LFG_TYPE_RANDOM && !dungeon->seasonal))
2356 {
2357 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] dungeon {} is not random or seasonal", guid.ToString(), rDungeonId);
2358 continue;
2359 }
2360
2361 // Record dungeon cooldown for this player (the actual dungeon completed, not the random entry)
2362 AddDungeonCooldown(guid, dungeonId);
2363
2364 Player* player = ObjectAccessor::FindPlayer(guid);
2365 if (!player || player->FindMap() != currMap) // pussywizard: currMap - multithreading crash if on other map (map id check is not enough, binding system is not reliable)
2366 {
2367 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] not found in world", guid.ToString());
2368 continue;
2369 }
2370
2371 LFGDungeonData const* dungeonDone = GetLFGDungeon(dungeonId);
2372 uint32 mapId = dungeonDone ? uint32(dungeonDone->map) : 0;
2373
2374 if (player->GetMapId() != mapId)
2375 {
2376 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] is in map {} and should be in {} to get reward", guid.ToString(), player->GetMapId(), mapId);
2377 continue;
2378 }
2379
2380 // Remove Dungeon Finder Cooldown if still exists
2382 {
2384 }
2385
2386 // Xinef: Update achievements, set correct amount of randomly grouped players
2387 if (dungeon->difficulty == DUNGEON_DIFFICULTY_HEROIC)
2388 if (uint8 count = GetRandomPlayersCount(player->GetGUID()))
2390
2391 LfgReward const* reward = GetRandomDungeonReward(rDungeonId, player->GetLevel());
2392 if (!reward)
2393 continue;
2394
2395 bool done = false;
2396 Quest const* quest = sObjectMgr->GetQuestTemplate(reward->firstQuest);
2397 if (!quest)
2398 continue;
2399
2400 // if we can take the quest, means that we haven't done this kind of "run", IE: First Heroic Random of Day.
2401 if (player->CanRewardQuest(quest, false))
2402 player->RewardQuest(quest, 0, nullptr, false, true);
2403 else
2404 {
2405 done = true;
2406 quest = sObjectMgr->GetQuestTemplate(reward->otherQuest);
2407 if (!quest)
2408 continue;
2409 // we give reward without informing client (retail does this)
2410 player->RewardQuest(quest, 0, nullptr, false, true);
2411 }
2412
2413 // Give rewards
2414 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] done dungeon {}, {} previously done.", player->GetGUID().ToString(), GetDungeon(gguid), done ? " " : " not");
2415 LfgPlayerRewardData data = LfgPlayerRewardData(dungeon->Entry(), GetDungeon(gguid, false), done, quest);
2416 player->GetSession()->SendLfgPlayerReward(data);
2417 }
2418 }
@ 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:1723
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114
Definition Player.h:1084
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition PlayerUpdates.cpp:2169
bool CanRewardQuest(Quest const *quest, bool msg)
Definition PlayerQuest.cpp:386
WorldSession * GetSession() const
Definition Player.h:2020
void RewardQuest(Quest const *quest, uint32 reward, Object *questGiver, bool announce=true, bool isLFGReward=false)
Definition PlayerQuest.cpp:660
Definition QuestDef.h:210
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5999
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:5171
uint8 GetLevel() const
Definition Unit.h:1103
uint32 GetMapId() const
Definition Position.h:281
Map * FindMap() const
Definition Object.h:626
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:2747
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:2444
LfgGuidSet const & GetPlayers(ObjectGuid guid)
Definition LFGMgr.cpp:2727
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245
GuidSet LfgGuidSet
Definition LFG.h:117
@ LFG_SPELL_DUNGEON_COOLDOWN
Definition LFGMgr.h:52

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(), lfg::LFG_SPELL_DUNGEON_COOLDOWN, lfg::LFG_STATE_FINISHED_DUNGEON, lfg::LFG_TYPE_RANDOM, LOG_DEBUG, lfg::LFGDungeonData::map, lfg::LfgReward::otherQuest, Unit::RemoveAurasDueToSpell(), Player::RewardQuest(), lfg::LFGDungeonData::seasonal, WorldSession::SendLfgPlayerReward(), SetState(), sObjectMgr, ObjectGuid::ToString(), lfg::LFGDungeonData::type, and Player::UpdateAchievementCriteria().

◆ GetComment()

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

Get current player comment (used for LFR)

2525 {
2526 LOG_DEBUG("lfg", "LFGMgr::GetComment: [{}] = {}", guid.ToString(), PlayersStore[guid].GetComment());
2527 return PlayersStore[guid].GetComment();
2528 }
LfgPlayerDataContainer PlayersStore
Player data.
Definition LFGMgr.h:640

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
1592 {
1593 lockMap.clear();
1594 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end() && !dungeons.empty(); ++it)
1595 {
1596 ObjectGuid guid = (*it);
1597 LfgLockMap const& cachedLockMap = GetLockedDungeons(guid);
1598 for (LfgLockMap::const_iterator it2 = cachedLockMap.begin(); it2 != cachedLockMap.end() && !dungeons.empty(); ++it2)
1599 {
1600 uint32 dungeonId = (it2->first & 0x00FFFFFF); // Compare dungeon ids
1601
1602 LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId);
1603
1604 uint8 difficultyFlag = (randomDungeonId == RANDOM_DUNGEON_NORMAL_TBC || randomDungeonId == RANDOM_DUNGEON_NORMAL_WOTLK) ? 0 : 1;
1605
1606 if (dungeon && !IsDungeonDisabled(dungeon->map, (Difficulty)difficultyFlag) && it2->second == LFG_LOCKSTATUS_RAID_LOCKED && randomDungeonId && sWorld->getBoolConfig(CONFIG_LFG_ALLOW_COMPLETED))
1607 continue;
1608
1609 LfgDungeonSet::iterator itDungeon = dungeons.find(dungeonId);
1610 if (itDungeon != dungeons.end())
1611 {
1612 dungeons.erase(itDungeon);
1613 lockMap[guid][dungeonId] = it2->second;
1614 }
1615 }
1616 }
1617 if (!dungeons.empty())
1618 lockMap.clear();
1619 }
Difficulty
Definition DBCEnums.h:266
@ CONFIG_LFG_ALLOW_COMPLETED
Definition WorldConfig.h:95
bool IsDungeonDisabled(uint32 mapId, Difficulty difficulty) const
Checks if given dungeon map is disabled.
Definition LFGMgr.cpp:2954
LfgLockMap const & GetLockedDungeons(ObjectGuid guid)
Get locked dungeons.
Definition LFGMgr.cpp:2536
@ 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.

2499 {
2500 uint32 dungeon = GroupsStore[guid].GetDungeon(asId);
2501 LOG_DEBUG("lfg", "LFGMgr::GetDungeon: [{}] asId: {} = {}", guid.ToString(), asId, dungeon);
2502 return dungeon;
2503 }

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.

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

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.
2431 {
2432 LFGDungeonData const* dungeon = GetLFGDungeon(randomdungeon);
2433 uint32 group = dungeon ? dungeon->group : 0;
2434 return CachedDungeonMapStore[group];
2435 }
LfgCachedDungeonContainer CachedDungeonMapStore
Stores all dungeons by groupType.
Definition LFGMgr.h:632

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
2466 {
2467 LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId);
2468 if (!dungeon)
2469 return LFG_TYPE_NONE;
2470
2471 return LfgType(dungeon->type);
2472 }
LfgType
Determines the type of instance.
Definition LFGMgr.h:68
@ LFG_TYPE_NONE
Definition LFGMgr.h:69

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

Referenced by JoinLfg().

◆ GetGroup()

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

Gets player group.

2718 {
2719 return PlayersStore[guid].GetGroup();
2720 }

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.

2543 {
2544 uint8 kicks = GroupsStore[guid].GetKicksLeft();
2545 LOG_DEBUG("lfg", "LFGMgr::GetKicksLeft: [{}] = {}", guid.ToString(), kicks);
2546 return kicks;
2547 }

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

◆ GetLeader()

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

Get leader of the group (using internal data)

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

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:635

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.

2933 {
2934 if (id)
2935 if (LFGDungeonData const* dungeon = GetLFGDungeon(id))
2936 return dungeon->Entry();
2937
2938 return 0;
2939 }

References GetLFGDungeon().

Referenced by LoadRewards().

◆ GetLfgStatus()

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

Returns current lfg status.

2872 {
2873 LfgPlayerData& playerData = PlayersStore[guid];
2874 return LfgUpdateData(LFG_UPDATETYPE_UPDATE_STATUS, playerData.GetState(), playerData.GetSelectedDungeons());
2875 }
@ 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.

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

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)

2487 {
2488 LfgState state;
2489 if (guid.IsGroup())
2490 state = GroupsStore[guid].GetOldState();
2491 else
2492 state = PlayersStore[guid].GetOldState();
2493
2494 LOG_DEBUG("lfg", "LFGMgr::GetOldState: [{}] = {}", guid.ToString(), state);
2495 return state;
2496 }

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

◆ GetOptions()

uint32 lfg::LFGMgr::GetOptions ( )

Gets current lfg options.

2862 {
2863 return m_options;
2864 }

References m_options.

◆ GetPlayerCount()

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

Gets the player count of given group.

2733 {
2734 return GroupsStore[guid].GetPlayerCount();
2735 }

References GroupsStore.

◆ GetPlayers()

LfgGuidSet const & lfg::LFGMgr::GetPlayers ( ObjectGuid  guid)
private
2728 {
2729 return GroupsStore[guid].GetPlayers();
2730 }

References GroupsStore.

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

◆ GetQueue()

LFGQueue & lfg::LFGMgr::GetQueue ( ObjectGuid  guid)
private
2813 {
2814 uint8 queueId = 0;
2815 if (guid.IsGroup())
2816 {
2817 LfgGuidSet const& players = GetPlayers(guid);
2818 ObjectGuid pguid = players.empty() ? ObjectGuid::Empty : (*players.begin());
2819 if (pguid)
2820 queueId = GetTeam(pguid);
2821 else
2822 queueId = GetTeam(GetLeader(guid));
2823 }
2824 else
2825 queueId = GetTeam(guid);
2826 return QueuesStore[queueId];
2827 }
static ObjectGuid const Empty
Definition ObjectGuid.h:120
ObjectGuid GetLeader(ObjectGuid guid)
Get leader of the group (using internal data)
Definition LFGMgr.cpp:2737
TeamId GetTeam(ObjectGuid guid)
Definition LFGMgr.cpp:2677

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.

2942 {
2943 LfgDungeonSet randomDungeons;
2944 for (lfg::LFGDungeonContainer::const_iterator itr = LfgDungeonStore.begin(); itr != LfgDungeonStore.end(); ++itr)
2945 {
2946 lfg::LFGDungeonData const& dungeon = itr->second;
2947 if ((dungeon.type == lfg::LFG_TYPE_RANDOM || (dungeon.seasonal && sLFGMgr->IsSeasonActive(dungeon.id)))
2948 && dungeon.expansion <= expansion && dungeon.minlevel <= level && level <= dungeon.maxlevel)
2949 randomDungeons.insert(dungeon.Entry());
2950 }
2951 return randomDungeons;
2952 }
#define sLFGMgr
Definition LFGMgr.h:658
Definition LFGMgr.h:394
uint8 expansion
Definition LFGMgr.h:407
uint8 minlevel
Definition LFGMgr.h:409
uint8 maxlevel
Definition LFGMgr.h:410
uint8 type
Definition LFGMgr.h:406
uint32 Entry() const
Definition LFGMgr.h:416
bool seasonal
Definition LFGMgr.h:412
uint32 id
Definition LFGMgr.h:403

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
2445 {
2446 LfgReward const* rew = nullptr;
2447 LfgRewardContainerBounds bounds = RewardMapStore.equal_range(dungeon & 0x00FFFFFF);
2448 for (LfgRewardContainer::const_iterator itr = bounds.first; itr != bounds.second; ++itr)
2449 {
2450 rew = itr->second;
2451 // ordered properly at loading
2452 if (itr->second->maxLevel >= level)
2453 break;
2454 }
2455
2456 return rew;
2457 }
std::pair< LfgRewardContainer::const_iterator, LfgRewardContainer::const_iterator > LfgRewardContainerBounds
Definition LFGMgr.h:267

References RewardMapStore.

Referenced by FinishDungeon().

◆ GetRandomPlayersCount()

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

Xinef: Get Random Players Count.

2748 {
2749 return PlayersStore[guid].GetRandomPlayersCount();
2750 }

References PlayersStore.

Referenced by FinishDungeon().

◆ GetRoles()

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

Get current player roles.

2518 {
2519 uint8 roles = PlayersStore[guid].GetRoles();
2520 LOG_DEBUG("lfg", "LFGMgr::GetRoles: [{}] = {}", guid.ToString(), roles);
2521 return roles;
2522 }

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

Referenced by UpdateProposal().

◆ GetSelectedDungeons()

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

Get selected dungeons.

2531 {
2532 LOG_DEBUG("lfg", "LFGMgr::GetSelectedDungeons: [{}]", guid.ToString());
2533 return PlayersStore[guid].GetSelectedDungeons();
2534 }

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.

2475 {
2476 LfgState state;
2477 if (guid.IsGroup())
2478 state = GroupsStore[guid].GetState();
2479 else
2480 state = PlayersStore[guid].GetState();
2481
2482 LOG_DEBUG("lfg", "LFGMgr::GetState: [{}] = {}", guid.ToString(), state);
2483 return state;
2484 }

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
2678 {
2679 return PlayersStore[guid].GetTeam();
2680 }

References PlayersStore.

Referenced by GetQueue().

◆ HasIgnore()

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

Checks if given players are ignoring each other.

2753 {
2756 return plr1 && plr2 && (plr1->GetSocial()->HasIgnore(guid2) || plr2->GetSocial()->HasIgnore(guid1));
2757 }
bool HasIgnore(ObjectGuid const &ignore_guid) const
Definition SocialMgr.cpp:194
PlayerSocial * GetSocial()
Definition Player.h:1156
Player * FindConnectedPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:257

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
2133 {
2134 SetState(gguid, LFG_STATE_BOOT);
2135
2136 LfgPlayerBoot& boot = BootsStore[gguid];
2137 boot.inProgress = true;
2138 boot.cancelTime = time_t(GameTime::GetGameTime().count()) + LFG_TIME_BOOT;
2139 boot.reason = reason;
2140 boot.victim = victim;
2141
2142 LfgGuidSet const& players = GetPlayers(gguid);
2143
2144 // Set votes
2145 for (LfgGuidSet::const_iterator itr = players.begin(); itr != players.end(); ++itr)
2146 {
2147 ObjectGuid guid = (*itr);
2148 SetState(guid, LFG_STATE_BOOT);
2149 boot.votes[guid] = LFG_ANSWER_PENDING;
2150 }
2151
2152 boot.votes[victim] = LFG_ANSWER_DENY; // Victim auto vote NO
2153 boot.votes[kicker] = LFG_ANSWER_AGREE; // Kicker auto vote YES
2154
2155 // Notify players
2156 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
2157 SendLfgBootProposalUpdate(*it, boot);
2158 }
void SendLfgBootProposalUpdate(ObjectGuid guid, LfgPlayerBoot const &boot)
Definition LFGMgr.cpp:2789
LfgPlayerBootContainer BootsStore
Current player kicks.
Definition LFGMgr.h:639
Seconds GetGameTime()
Definition GameTime.cpp:38
@ LFG_STATE_BOOT
Definition LFG.h:72
@ LFG_TIME_BOOT
Definition LFGMgr.h:49
@ 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 (const ProgressionRequirement* 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 (const ProgressionRequirement* 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 (const ProgressionRequirement* 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:202
#define sScriptMgr
Definition ScriptMgr.h:737
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:131
@ TEAM_NEUTRAL
Definition SharedDefines.h:750
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_LFG_DBC_LEVEL_OVERRIDE
Definition WorldConfig.h:124
float GetAverageItemLevelForDF()
Definition Player.cpp:15902
bool GetQuestRewardStatus(uint32 quest_id) const
Definition PlayerQuest.cpp:1450
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition PlayerStorage.cpp:658
TeamId GetTeamId(bool original=false) const
Definition Player.h:2128
bool HasAchieved(uint32 achievementId) const
Definition Player.cpp:13975
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition Player.cpp:1302
bool IsGameMaster() const
Definition Player.h:1174
bool IsQuestRewarded(uint32 quest_id) const
Definition Player.h:1646
uint8 Expansion() const
Definition WorldSession.h:465
bool HasPermission(uint32 permissionId)
Definition WorldSession.cpp:1551
void SetLockedDungeons(ObjectGuid guid, LfgLockMap const &lock)
Definition LFGMgr.cpp:2642
LfgDungeonSet const & GetDungeonsByRandom(uint32 randomdungeon)
Definition LFGMgr.cpp:2430
bool IsSeasonActive(uint32 dungeonId)
Checks if Seasonal dungeon is active.
Definition LFGMgr.cpp:2877
@ 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:43
@ RBAC_PERM_JOIN_DUNGEON_FINDER
Definition RBAC.h:57
Definition Player.h:935
uint8 levelMax
Definition Player.h:937
uint8 levelMin
Definition Player.h:936
uint16 reqItemLevel
Definition Player.h:938
Definition DBCStructure.h:1325
bool IsRaid() const
Definition DBCStructure.h:1354
Definition Player.h:926

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.

2920 {
2921 if (!guid.IsGroup())
2922 guid = GetGroup(guid);
2923
2924 if (uint32 dungeonId = GetDungeon(guid, true))
2925 if (LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId))
2926 if (uint32(dungeon->map) == map && dungeon->difficulty == difficulty)
2927 return true;
2928
2929 return false;
2930 }
ObjectGuid GetGroup(ObjectGuid guid)
Gets player group.
Definition LFGMgr.cpp:2717

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.

2955 {
2956 return sDisableMgr->IsDisabledFor(DISABLE_TYPE_MAP, mapId, nullptr, difficulty) ||
2957 sDisableMgr->IsDisabledFor(DISABLE_TYPE_LFG_MAP, mapId, nullptr);
2958 }
#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.

2808 {
2809 return guid && guid.IsGroup() && GroupsStore[guid].IsLfgGroup();
2810 }

References GroupsStore, and ObjectGuid::IsGroup().

◆ isOptionEnabled()

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

Checks if given lfg option is enabled.

2857 {
2858 return m_options & option;
2859 }

References m_options.

Referenced by Update().

◆ IsPlayerQueuedForRandomDungeon()

bool lfg::LFGMgr::IsPlayerQueuedForRandomDungeon ( ObjectGuid  guid)
2961 {
2962 auto gguid = GetGroup(guid);
2963 if (!gguid)
2964 return false;
2965
2966 return GroupsStore[gguid].IsRandomQueuedPlayer(guid);
2967 }

References GetGroup(), and GroupsStore.

◆ IsSeasonActive()

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

Checks if Seasonal dungeon is active.

2878 {
2879 switch (dungeonId)
2880 {
2889 }
2890 return false;
2891 }
bool IsHolidayActive(HolidayIds id)
Definition GameEventMgr.cpp:2023
@ 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:149
@ LFG_DUNGEON_HEADLESS_HORSEMAN
Definition LFGMgr.h:148
@ LFG_DUNGEON_CROWN_CHEMICAL_CO
Definition LFGMgr.h:151
@ LFG_DUNGEON_COREN_DIREBREW
Definition LFGMgr.h:150

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.

588{ 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 std::string debugNames = "";
830 if (grp) // Begin rolecheck
831 {
832 // Create new rolecheck
833 LfgRoleCheck& roleCheck = RoleChecksStore[gguid];
834 roleCheck.roles.clear(); // pussywizard: NEW rolecheck, not old one with trash data >_>
835 roleCheck.cancelTime = time_t(GameTime::GetGameTime().count()) + LFG_TIME_ROLECHECK;
836 roleCheck.state = LFG_ROLECHECK_INITIALITING;
837 roleCheck.leader = guid;
838 roleCheck.dungeons = dungeons;
839 roleCheck.rDungeonId = rDungeonId;
840
841 if (rDungeonId)
842 {
843 dungeons.clear();
844 dungeons.insert(rDungeonId);
845 }
846
848 // Send update to player
849 LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_JOIN_QUEUE, dungeons, comment);
850 for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next())
851 {
852 if (Player* plrg = itr->GetSource())
853 {
854 ObjectGuid pguid = plrg->GetGUID();
855 plrg->GetSession()->SendLfgUpdateParty(updateData);
857 if (!isContinue)
858 SetSelectedDungeons(pguid, dungeons);
859 roleCheck.roles[pguid] = 0;
860 if (!debugNames.empty())
861 debugNames.append(", ");
862 debugNames.append(plrg->GetName());
863 }
864 }
865 // Update leader role
866 UpdateRoleCheck(gguid, guid, roles);
867 }
868 else // Add player to queue
869 {
870 LfgRolesMap rolesMap;
871 rolesMap[guid] = roles;
872 LFGQueue& queue = GetQueue(guid);
873 queue.AddQueueData(guid, GameTime::GetGameTime().count(), dungeons, rolesMap);
874
875 if (!isContinue)
876 {
877 if (rDungeonId)
878 {
879 dungeons.clear();
880 dungeons.insert(rDungeonId);
881 }
882 SetSelectedDungeons(guid, dungeons);
883 }
884 // Send update to player
885 player->GetSession()->SendLfgJoinResult(joinData);
886 player->GetSession()->SendLfgUpdatePlayer(LfgUpdateData(LFG_UPDATETYPE_JOIN_QUEUE, dungeons, comment));
888 SetRoles(guid, roles);
889 debugNames.append(player->GetName());
890 }
891
892 /*if (sLog->ShouldLog(LOG_FILTER_LFG, LOG_LEVEL_DEBUG))
893 {
894 std::ostringstream o;
895 o << "LFGMgr::Join: [" << guid << "] joined (" << (grp ? "group" : "player") << ") Members: " << debugNames.c_str()
896 << ". Dungeons (" << uint32(dungeons.size()) << "): " << ConcatenateDungeons(dungeons);
897 LOG_DEBUG("lfg", "{}", o.str());
898 }*/
899 }
#define MAXGROUPSIZE
Definition Group.h:43
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
@ CONFIG_ALLOW_JOIN_BG_AND_LFG
Definition WorldConfig.h:130
Definition GroupReference.h:27
Definition Group.h:169
bool isLFGGroup(bool restricted=false) const
Definition Group.cpp:2278
ObjectGuid GetGUID() const
Definition Group.cpp:2319
bool isBGGroup() const
Definition Group.cpp:2289
uint32 GetMembersCount() const
Definition Group.h:245
bool isBFGroup() const
Definition Group.cpp:2294
GroupReference * GetFirstMember()
Definition Group.h:243
ObjectGuid GetLeaderGUID() const
Definition Group.cpp:2309
bool InBattleground() const
Definition Player.h:2288
bool InBattlegroundQueue(bool ignoreArena=false) const
Definition Player.cpp:12196
Group * GetGroup()
Definition Player.h:2505
std::string const & GetName() const
Definition Object.h:528
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:2636
void SetComment(ObjectGuid guid, std::string const &comment)
Sets player lfr comment.
Definition LFGMgr.cpp:2617
void JoinRaidBrowser(Player *player, uint8 roles, LfgDungeonSet &dungeons, std::string comment)
pussywizard: Raid Browser
Definition LFGMgr.cpp:1002
void SendRaidBrowserJoinedPacket(Player *p, LfgDungeonSet &dungeons, std::string comment)
Definition LFGMgr.cpp:1024
void UpdateRoleCheck(ObjectGuid gguid, ObjectGuid guid=ObjectGuid::Empty, uint8 roles=PLAYER_ROLE_NONE)
Updates the role check with player answer.
Definition LFGMgr.cpp:1502
LfgRoleCheckContainer RoleChecksStore
Current Role checks.
Definition LFGMgr.h:637
void GetCompatibleDungeons(LfgDungeonSet &dungeons, LfgGuidSet const &players, LfgLockPartyMap &lockMap, uint32 randomDungeonId=0)
Definition LFGMgr.cpp:1591
void SetRoles(ObjectGuid guid, uint8 roles)
Sets player lfg roles.
Definition LFGMgr.cpp:2611
LfgType GetDungeonType(uint32 dungeon)
Definition LFGMgr.cpp:2465
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:48
@ LFG_SPELL_DUNGEON_DESERTER
Definition LFGMgr.h:53
@ LFG_TYPE_RAID
Definition LFGMgr.h:71
@ LFG_TYPE_DUNGEON
Definition LFGMgr.h:70
@ LFG_TYPE_HEROIC
Definition LFGMgr.h:73
@ LFG_ROLECHECK_INITIALITING
Definition LFGMgr.h:126
@ PLAYER_ROLE_LEADER
Definition LFG.h:40
@ LFG_JOIN_TOO_MUCH_MEMBERS
Definition LFGMgr.h:117
@ LFG_JOIN_DISCONNECTED
Definition LFGMgr.h:110
@ LFG_JOIN_DUNGEON_INVALID
Definition LFGMgr.h:112
@ LFG_JOIN_USING_BG_SYSTEM
Definition LFGMgr.h:118
@ LFG_JOIN_INTERNAL_ERROR
Definition LFGMgr.h:105
@ LFG_JOIN_MIXED_RAID_DUNGEON
Definition LFGMgr.h:108
@ LFG_JOIN_PARTY_NOT_MEET_REQS
Definition LFGMgr.h:107
@ LFG_JOIN_DESERTER
Definition LFGMgr.h:113
@ LFG_JOIN_RANDOM_COOLDOWN
Definition LFGMgr.h:115
@ LFG_JOIN_PARTY_RANDOM_COOLDOWN
Definition LFGMgr.h:116
@ LFG_JOIN_OK
Definition LFGMgr.h:102
@ LFG_JOIN_PARTY_DESERTER
Definition LFGMgr.h:114
@ LFG_JOIN_NOT_MEET_REQS
Definition LFGMgr.h:106

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(), WorldObject::GetName(), 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

1003 {
1004 // pussywizard: client limit for comment length is 64 @ 3.3.5a
1005 if (comment.size() > 64)
1006 comment = comment.substr(0, 64);
1007
1008 RBEntryInfo entry(roles, comment);
1009 for (LfgDungeonSet::const_iterator itr = dungeons.begin(); itr != dungeons.end(); ++itr)
1010 if (GetLFGDungeon(*itr)) // ensure dungeon data exists for such dungeon id
1011 {
1012 RaidBrowserStore[player->GetTeamId()][*itr][player->GetGUID()] = entry;
1013 RBUsedDungeonsStore[player->GetTeamId()].insert(*itr);
1014 }
1015 }
RBUsedDungeonsSet RBUsedDungeonsStore[2]
Definition LFGMgr.h:438
RBStoreMap RaidBrowserStore[2]
Definition LFGMgr.h:428

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

1448 {
1449 ObjectGuid pguid, gguid;
1450 if (guid.IsGroup())
1451 gguid = guid;
1452 else if (groupguid && groupguid.IsGroup())
1453 {
1454 pguid = guid;
1455 gguid = groupguid;
1456 }
1457 else
1458 {
1459 pguid = guid;
1460 gguid = GetGroup(guid);
1461 }
1462 if (!allowgroup)
1463 gguid.Clear();
1464
1465 if (pguid)
1466 for (lfg::LfgQueueContainer::iterator itr = QueuesStore.begin(); itr != QueuesStore.end(); ++itr)
1467 itr->second.RemoveFromQueue(pguid);
1468 if (gguid)
1469 for (lfg::LfgQueueContainer::iterator itr = QueuesStore.begin(); itr != QueuesStore.end(); ++itr)
1470 itr->second.RemoveFromQueue(gguid);
1471
1472 if (pguid && !gguid)
1473 {
1474 if (GetState(pguid) == LFG_STATE_QUEUED)
1475 {
1477 SetState(pguid, LFG_STATE_NONE);
1478 }
1479 }
1480 if (gguid)
1481 {
1482 if (GetState(gguid) == LFG_STATE_QUEUED)
1483 {
1484 SetState(gguid, LFG_STATE_NONE);
1485 const LfgGuidSet& players = GetPlayers(gguid);
1486 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
1487 {
1490 }
1491 }
1492 }
1493 }
void Clear()
Definition ObjectGuid.h:138
void SendLfgUpdateParty(ObjectGuid guid, LfgUpdateData const &data)
Definition LFGMgr.cpp:2777
void SendLfgUpdatePlayer(ObjectGuid guid, LfgUpdateData const &data)
Definition LFGMgr.cpp:2771
@ 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
922 {
923 LOG_DEBUG("lfg", "LFGMgr::Leave: [{}]", guid.ToString());
924 ObjectGuid gguid = guid.IsGroup() ? guid : GetGroup(guid);
925 LfgState state = GetState(guid);
926 switch (state)
927 {
928 case LFG_STATE_QUEUED:
929 if (gguid)
930 {
931 LFGQueue& queue = GetQueue(gguid);
932 queue.RemoveFromQueue(gguid);
933 uint32 dungeonId = GetDungeon(gguid);
934 SetState(gguid, LFG_STATE_NONE);
935 const LfgGuidSet& players = GetPlayers(gguid);
936 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
937 {
940 }
941 if (Group* group = sGroupMgr->GetGroupByGUID(gguid.GetCounter()))
942 {
943 if (group->isLFGGroup())
944 {
945 SetDungeon(gguid, dungeonId);
946 }
947 }
948 }
949 else
950 {
951 LFGQueue& queue = GetQueue(guid);
952 queue.RemoveFromQueue(guid);
955 }
956 break;
958 if (gguid)
959 UpdateRoleCheck(gguid); // No player to update role = LFG_ROLECHECK_ABORTED
960 break;
962 {
963 // Remove from Proposals
964 LfgProposalContainer::iterator it = ProposalsStore.begin();
965 ObjectGuid pguid = gguid == guid ? GetLeader(gguid) : guid;
966 while (it != ProposalsStore.end())
967 {
968 LfgProposalPlayerContainer::iterator itPlayer = it->second.players.find(pguid);
969 if (itPlayer != it->second.players.end())
970 {
971 // Mark the player/leader of group who left as didn't accept the proposal
972 itPlayer->second.accept = LFG_ANSWER_DENY;
973 break;
974 }
975 ++it;
976 }
977
978 // Remove from queue - if proposal is found, RemoveProposal will call RemoveFromQueue
979 if (it != ProposalsStore.end())
981 break;
982 }
983 case LFG_STATE_NONE:
984 break;
987 case LFG_STATE_BOOT:
988 if (guid != gguid) // Player
990 break;
992 LeaveRaidBrowser(guid);
993 SetCanOverrideRBState(guid, true);
995 SetCanOverrideRBState(guid, false);
998 break;
999 }
1000 }
#define sGroupMgr
Definition GroupMgr.h:51
void LeaveRaidBrowser(ObjectGuid guid)
Definition LFGMgr.cpp:1017
void RemoveProposal(LfgProposalContainer::iterator itProposal, LfgUpdateType type)
Definition LFGMgr.cpp:2023
void SetCanOverrideRBState(ObjectGuid guid, bool val)
Definition LFGMgr.cpp:2600
@ 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)
1018 {
1019 for (uint8 team = 0; team < 2; ++team)
1020 for (RBStoreMap::iterator itr = RaidBrowserStore[team].begin(); itr != RaidBrowserStore[team].end(); ++itr)
1021 itr->second.erase(guid);
1022 }

References RaidBrowserStore.

Referenced by LeaveLfg().

◆ LfrSearchAdd()

void lfg::LFGMgr::LfrSearchAdd ( Player p,
uint32  dungeonId 
)
1052 {
1053 RBSearchersStore[p->GetTeamId()][p->GetGUID()] = dungeonId;
1054 }
RBSearchersMap RBSearchersStore[2]
Definition LFGMgr.h:430

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

◆ LfrSearchRemove()

void lfg::LFGMgr::LfrSearchRemove ( Player p)
1057 {
1058 RBSearchersStore[p->GetTeamId()].erase(p->GetGUID());
1059 }

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

◆ LfrSetComment()

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

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:412
float target_Z
Definition ObjectMgr.h:416
float target_X
Definition ObjectMgr.h:414
float target_Orientation
Definition ObjectMgr.h:417
float target_Y
Definition ObjectMgr.h:415
uint32 target_mapId
Definition ObjectMgr.h:413
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:189
uint32 GetLFGDungeonEntry(uint32 id)
Return Lfg dungeon entry for given dungeon id.
Definition LFGMgr.cpp:2932

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

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::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 ( const RBInternalInfo info,
ByteBuffer buffer 
)
1337 {
1338 buffer << info.groupGuid;
1340 buffer << (uint32)flags;
1341 if (flags & LFG_UPDATE_FLAG_COMMENT)
1342 buffer << info.comment;
1343 if (flags & LFG_UPDATE_FLAG_ROLES)
1344 for (uint8 j = 0; j < 3; ++j)
1345 buffer << (uint8)0;
1346 if (!(flags & LFG_UPDATE_FLAG_BINDED))
1347 return;
1348 buffer << info.instanceGuid;
1349 buffer << (uint32)info.encounterMask;
1350 }
@ LFG_UPDATE_FLAG_BINDED
Definition LFGMgr.h:143
@ LFG_UPDATE_FLAG_COMMENT
Definition LFGMgr.h:137
@ LFG_UPDATE_FLAG_ROLES
Definition LFGMgr.h:140

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 ( const RBInternalInfo info,
ByteBuffer buffer 
)
1353 {
1354 buffer << info.guid;
1355 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);
1356 buffer << (uint32)flags;
1357
1359 {
1360 buffer << (uint8)info._level;
1361 buffer << (uint8)info._class;
1362 buffer << (uint8)info._race;
1363 buffer << (uint8)info._talents0;
1364 buffer << (uint8)info._talents1;
1365 buffer << (uint8)info._talents2;
1366 buffer << (uint32)info._armor;
1367 buffer << (uint32)info._spellDamage;
1368 buffer << (uint32)info._spellHeal;
1369 buffer << (uint32)info._critRatingMelee;
1370 buffer << (uint32)info._critRatingRanged;
1371 buffer << (uint32)info._critRatingSpell;
1372 buffer << (float)info._mp5;
1373 buffer << (float)info._mp5combat;
1374 buffer << (uint32)info._attackPower;
1375 buffer << (uint32)info._agility;
1376 buffer << (uint32)info._health;
1377 buffer << (uint32)info._mana;
1378 buffer << (uint32)info._online; // talentpoints, used as online/offline marker :D
1379 buffer << (float)info._avgItemLevel; // avgitemlevel
1380 buffer << (uint32)info._defenseSkill;
1381 buffer << (uint32)info._dodgeRating;
1382 buffer << (uint32)info._blockRating;
1383 buffer << (uint32)info._parryRating;
1384 buffer << (uint32)info._hasteRating;
1385 buffer << (uint32)info._expertiseRating;
1386 }
1387
1388 if (flags & LFG_UPDATE_FLAG_COMMENT)
1389 buffer << (info.groupGuid ? std::string("") : info.comment);
1390 if (flags & LFG_UPDATE_FLAG_GROUPLEADER)
1391 buffer << (uint8)1; // isLFM
1392 if (flags & LFG_UPDATE_FLAG_GROUPGUID)
1393 buffer << info.groupGuid;
1394 if (flags & LFG_UPDATE_FLAG_ROLES)
1395 buffer << (uint8)(info.groupGuid ? (info.isGroupLeader ? PLAYER_ROLE_LEADER : 0) : info.roles);
1396 if (flags & LFG_UPDATE_FLAG_AREA)
1397 buffer << (uint32)info._area;
1398 if (flags & LFG_UPDATE_FLAG_STATUS)
1399 buffer << (uint8)0;
1400 if (!(flags & LFG_UPDATE_FLAG_BINDED))
1401 return;
1402 buffer << info.instanceGuid;
1403 buffer << (uint32)info.encounterMask;
1404 }
@ LFG_UPDATE_FLAG_AREA
Definition LFGMgr.h:141
@ LFG_UPDATE_FLAG_GROUPLEADER
Definition LFGMgr.h:138
@ LFG_UPDATE_FLAG_STATUS
Definition LFGMgr.h:142
@ LFG_UPDATE_FLAG_CHARACTERINFO
Definition LFGMgr.h:136
@ LFG_UPDATE_FLAG_GROUPGUID
Definition LFGMgr.h:139

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 buffer_deleted,
uint32  groupCounter,
ByteBuffer buffer_groups,
uint32  playerCounter,
ByteBuffer buffer_players 
)
1407 {
1408 differencePacket << (uint32)LFG_TYPE_RAID;
1409 differencePacket << (uint32)dungeonId;
1410 differencePacket << (uint8)1;
1411 differencePacket << (uint32)deletedCounter;
1412 differencePacket.append(buffer_deleted);
1413 differencePacket << (uint32)groupCounter;
1414 differencePacket << (uint32)0;
1415 differencePacket.append(buffer_groups);
1416 differencePacket << (uint32)playerCounter;
1417 differencePacket << (uint32)0;
1418 differencePacket.append(buffer_players);
1419 }
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 infoMap 
)
1422 {
1423 fullPacket << (uint32)LFG_TYPE_RAID;
1424 fullPacket << (uint32)dungeonId;
1425 fullPacket << (uint8)0;
1426 uint32 groupCounter = 0, playerCounter = 0;
1427 ByteBuffer buffer_groups, buffer_players;
1428 for (RBInternalInfoMap::const_iterator itr = infoMap.begin(); itr != infoMap.end(); ++itr)
1429 {
1430 if (itr->second.isGroupLeader)
1431 {
1432 ++groupCounter;
1433 RBPacketAppendGroup(itr->second, buffer_groups);
1434 }
1435 ++playerCounter;
1436 RBPacketAppendPlayer(itr->second, buffer_players);
1437 }
1438 fullPacket << (uint32)groupCounter;
1439 fullPacket << (uint32)0;
1440 fullPacket.append(buffer_groups);
1441 fullPacket << (uint32)playerCounter;
1442 fullPacket << (uint32)0;
1443 fullPacket.append(buffer_players);
1444 }
Definition ByteBuffer.h:70
void RBPacketAppendGroup(const RBInternalInfo &info, ByteBuffer &buffer)
Definition LFGMgr.cpp:1336
void RBPacketAppendPlayer(const RBInternalInfo &info, ByteBuffer &buffer)
Definition LFGMgr.cpp:1352

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

Referenced by UpdateRaidBrowser().

◆ RemoveGroupData()

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

Removes saved group data.

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

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.

2683 {
2684 return GroupsStore[gguid].RemovePlayer(guid);
2685 }

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

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
2550 {
2551 if (guid.IsGroup())
2552 {
2553 LfgGroupData& data = GroupsStore[guid];
2554 /*if (sLog->ShouldLog(LOG_FILTER_LFG, LOG_LEVEL_DEBUG))
2555 {
2556 std::string const& ps = GetStateString(data.GetState());
2557 std::string const& os = GetStateString(data.GetOldState());
2558 LOG_TRACE("lfg", "LFGMgr::RestoreState: Group: [{}] ({}) State: {}, oldState: {}",
2559 guid.ToString(), debugMsg, ps, os);
2560 }*/
2561
2562 data.RestoreState();
2563 }
2564 else
2565 {
2566 LfgPlayerData& data = PlayersStore[guid];
2567 /*if (sLog->ShouldLog(LOG_FILTER_LFG, LOG_LEVEL_DEBUG))
2568 {
2569 std::string const& ps = GetStateString(data.GetState());
2570 std::string const& os = GetStateString(data.GetOldState());
2571 LOG_TRACE("lfg", "LFGMgr::RestoreState: Player: [{}] ({}) State: {}, oldState: {}",
2572 guid.ToString(), debugMsg, ps, os);
2573 }*/
2574 data.RestoreState();
2575 }
2576 }

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.

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

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
2790 {
2791 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2792 player->GetSession()->SendLfgBootProposalUpdate(boot);
2793 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendLfgJoinResult()

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

References ObjectAccessor::FindConnectedPlayer().

Referenced by Update(), and UpdateRoleCheck().

◆ SendLfgQueueStatus()

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

Sends queue status to player.

2802 {
2803 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2804 player->GetSession()->SendLfgQueueStatus(data);
2805 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendLfgRoleCheckUpdate()

void lfg::LFGMgr::SendLfgRoleCheckUpdate ( ObjectGuid  guid,
LfgRoleCheck const &  roleCheck 
)
private
2766 {
2767 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2768 player->GetSession()->SendLfgRoleCheckUpdate(roleCheck);
2769 }

References ObjectAccessor::FindConnectedPlayer().

Referenced by Update(), and UpdateRoleCheck().

◆ SendLfgRoleChosen()

void lfg::LFGMgr::SendLfgRoleChosen ( ObjectGuid  guid,
ObjectGuid  pguid,
uint8  roles 
)
private
2760 {
2761 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2762 player->GetSession()->SendLfgRoleChosen(pguid, roles);
2763 }

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

Referenced by UpdateRoleCheck().

◆ SendLfgUpdateParty()

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

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendLfgUpdatePlayer()

void lfg::LFGMgr::SendLfgUpdatePlayer ( ObjectGuid  guid,
LfgUpdateData const &  data 
)
private
2772 {
2773 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2774 player->GetSession()->SendLfgUpdatePlayer(data);
2775 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendLfgUpdateProposal()

void lfg::LFGMgr::SendLfgUpdateProposal ( ObjectGuid  guid,
LfgProposal const &  proposal 
)
private
2796 {
2797 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2798 player->GetSession()->SendLfgUpdateProposal(proposal);
2799 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendRaidBrowserCachedList()

void lfg::LFGMgr::SendRaidBrowserCachedList ( Player player,
uint32  dungeonId 
)
1062 {
1063 RBCacheMap::iterator itr = RBCacheStore[player->GetTeamId()].find(dungeonId);
1064 if (itr != RBCacheStore[player->GetTeamId()].end())
1065 {
1066 player->SendDirectMessage(&(itr->second));
1067 return;
1068 }
1069 // send empty packet if cache not found
1071 data << (uint32)LFG_TYPE_RAID;
1072 data << (uint32)dungeonId;
1073 data << (uint8)0;
1074 data << (uint32)0;
1075 data << (uint32)0;
1076 data << (uint32)0;
1077 data << (uint32)0;
1078 player->SendDirectMessage(&data);
1079 }
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5692
Definition WorldPacket.h:26
RBCacheMap RBCacheStore[2]
Definition LFGMgr.h:432
@ 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 
)
1025 {
1026 if (dungeons.empty())
1027 {
1028 RBEntryInfoMap::iterator iter;
1029 uint8 team = p->GetTeamId();
1030 bool setComment = true;
1031 for (RBStoreMap::iterator itr = RaidBrowserStore[team].begin(); itr != RaidBrowserStore[team].end(); ++itr)
1032 if ((iter = itr->second.find(p->GetGUID())) != itr->second.end())
1033 {
1034 dungeons.insert(itr->first);
1035 if (setComment)
1036 {
1037 comment = iter->second.comment;
1038 setComment = false;
1039 }
1040 }
1041 }
1042 LfgJoinResultData joinData;
1043 p->GetSession()->SendLfgJoinResult(joinData);
1044 LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_JOIN_RAIDBROWSER, dungeons, comment);
1045 if (p->GetGroup())
1046 p->GetSession()->SendLfgUpdateParty(updateData);
1047 else
1048 p->GetSession()->SendLfgUpdatePlayer(updateData);
1049 }
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
2601 {
2602 PlayersStore[guid].SetCanOverrideRBState(val);
2603 }

References PlayersStore.

Referenced by LeaveLfg().

◆ SetComment()

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

Sets player lfr comment.

2618 {
2619 LOG_DEBUG("lfg", "LFGMgr::SetComment: [{}] comment: {}", guid.ToString(), comment);
2620 PlayersStore[guid].SetComment(comment);
2621 }

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

Referenced by JoinLfg().

◆ SetDungeon()

void lfg::LFGMgr::SetDungeon ( ObjectGuid  guid,
uint32  dungeon 
)
2606 {
2607 LOG_DEBUG("lfg", "LFGMgr::SetDungeon: [{}] dungeon {}", guid.ToString(), dungeon);
2608 GroupsStore[guid].SetDungeon(dungeon);
2609 }

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.

2723 {
2724 PlayersStore[guid].SetGroup(group);
2725 }

References PlayersStore.

Referenced by RemoveGroupData(), and SetupGroupMember().

◆ SetLeader()

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

Sets the leader of the group.

2705 {
2706 GroupsStore[gguid].SetLeader(leader);
2707 }

References GroupsStore.

Referenced by _LoadFromDB().

◆ SetLockedDungeons()

void lfg::LFGMgr::SetLockedDungeons ( ObjectGuid  guid,
LfgLockMap const &  lock 
)
private
2643 {
2644 LOG_DEBUG("lfg", "LFGMgr::SetLockedDungeons: [{}]", guid.ToString());
2645 PlayersStore[guid].SetLockedDungeons(lock);
2646 }

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

Referenced by InitializeLockedDungeons().

◆ SetOptions()

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

Sets new lfg options.

2867 {
2868 m_options = options;
2869 }

References m_options.

◆ SetRandomPlayersCount()

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

Xinef: Set Random Players Count.

2743 {
2744 PlayersStore[guid].SetRandomPlayersCount(count);
2745 }

References PlayersStore.

Referenced by MakeNewGroup().

◆ SetRoles()

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

Sets player lfg roles.

2612 {
2613 LOG_DEBUG("lfg", "LFGMgr::SetRoles: [{}] roles: {}", guid.ToString(), roles);
2614 PlayersStore[guid].SetRoles(roles);
2615 }

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

Referenced by JoinLfg(), and UpdateRoleCheck().

◆ SetSelectedDungeons()

void lfg::LFGMgr::SetSelectedDungeons ( ObjectGuid  guid,
LfgDungeonSet const &  dungeons 
)
private
2637 {
2638 LOG_DEBUG("lfg", "LFGMgr::SetLockedDungeons: [{}]", guid.ToString());
2639 PlayersStore[guid].SetSelectedDungeons(dungeons);
2640 }

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

Referenced by JoinLfg(), and SetupGroupMember().

◆ SetState()

void lfg::LFGMgr::SetState ( ObjectGuid  guid,
LfgState  state 
)
private
2579 {
2580 if (guid.IsGroup())
2581 {
2582 LfgGroupData& data = GroupsStore[guid];
2583 std::string ns = GetStateString(state);
2584 std::string ps = GetStateString(data.GetState());
2585 std::string os = GetStateString(data.GetOldState());
2586 LOG_DEBUG("lfg", "LFGMgr::SetState: Group: [{}] newState: {}, previous: {}, oldState: {}", guid.ToString(), ns, ps, os);
2587 data.SetState(state);
2588 }
2589 else
2590 {
2591 LfgPlayerData& data = PlayersStore[guid];
2592 std::string ns = GetStateString(state);
2593 std::string ps = GetStateString(data.GetState());
2594 std::string os = GetStateString(data.GetOldState());
2595 LOG_DEBUG("lfg", "LFGMgr::SetState: Player: [{}] newState: {}, previous: {}, oldState: {}", guid.ToString(), ns, ps, os);
2596 data.SetState(state);
2597 }
2598 }
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.

2710 {
2712 teamId = TEAM_ALLIANCE; // @Not Sure About That TeamId is supposed to be uint8 Team = 0(@TrinityCore)
2713
2714 PlayersStore[guid].SetTeam(teamId);
2715 }
@ TEAM_ALLIANCE
Definition SharedDefines.h:748
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition WorldConfig.h:34

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.

2894 {
2895 LfgDungeonSet dungeons;
2896 dungeons.insert(GetDungeon(gguid));
2897 SetSelectedDungeons(guid, dungeons);
2898 SetState(guid, GetState(gguid));
2899 SetGroup(guid, gguid);
2900 AddPlayerToGroup(gguid, guid);
2901 }
void AddPlayerToGroup(ObjectGuid gguid, ObjectGuid guid)
Adds player to group.
Definition LFGMgr.cpp:2687

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)
2230 {
2231 LFGDungeonData const* dungeon = nullptr;
2232 Group* group = player->GetGroup();
2233
2234 if (group && group->isLFGGroup())
2235 dungeon = GetLFGDungeon(GetDungeon(group->GetGUID()));
2236
2237 if (!dungeon)
2238 {
2240 return;
2241 }
2242
2244
2245 if (!player->IsAlive())
2246 {
2248 }
2249 else if (player->IsFalling() || player->HasUnitState(UNIT_STATE_JUMPING))
2250 {
2252 }
2253 else if (player->IsMirrorTimerActive(FATIGUE_TIMER))
2254 {
2256 }
2257 else if (player->GetVehicle())
2258 {
2260 }
2261 else if (player->GetCharmGUID() || player->IsInCombat())
2262 {
2264 }
2265 else if (out && error == LFG_TELEPORTERROR_OK)
2266 {
2267 if (player->GetMapId() == uint32(dungeon->map))
2268 player->TeleportToEntryPoint();
2269
2270 return;
2271 }
2272 else
2273 {
2274 uint32 mapid = dungeon->map;
2275 float x = dungeon->x;
2276 float y = dungeon->y;
2277 float z = dungeon->z;
2278 float orientation = dungeon->o;
2279
2280 if (teleportLocation)
2281 {
2282 teleportLocation->GetWorldLocation(mapid, x, y, z, orientation);
2283 }
2284
2285 if (!player->GetMap()->IsDungeon() || player->GetEntryPoint().GetMapId() == MAPID_INVALID)
2286 {
2287 player->SetEntryPoint();
2288 }
2289
2290 if (!player->TeleportTo(mapid, x, y, z, orientation, 0, nullptr, mapid == player->GetMapId()))
2291 {
2293 }
2294 }
2295
2296 if (error != LFG_TELEPORTERROR_OK)
2297 {
2298 player->GetSession()->SendLfgTeleportError(uint8(error));
2299
2300 LOG_DEBUG("lfg", "Player [{}] could NOT be teleported in to map [{}] (x: {}, y: {}, z: {}) Error: {}",
2301 player->GetName(), dungeon->map, dungeon->x, dungeon->y, dungeon->z, error);
2302 }
2303 else
2304 {
2305 LOG_DEBUG("lfg", "Player [{}] is being teleported in to map [{}] (x: {}, y: {}, z: {})",
2306 player->GetName(), dungeon->map, dungeon->x, dungeon->y, dungeon->z);
2307 }
2308
2309 }
@ 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:297
void SetEntryPoint()
Definition Player.cpp:11232
bool IsMirrorTimerActive(MirrorTimerType type)
Definition Player.h:2082
bool TeleportToEntryPoint()
Definition Player.cpp:1600
WorldLocation const & GetEntryPoint() const
Definition Player.h:2415
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1353
bool IsFalling() const
Definition Player.cpp:2143
Vehicle * GetVehicle() const
Definition Unit.h:1927
bool IsAlive() const
Definition Unit.h:1794
ObjectGuid GetCharmGUID() const
Definition Unit.h:721
bool HasUnitState(const uint32 f) const
Definition Unit.h:736
bool IsInCombat() const
Definition Unit.h:935
Map * GetMap() const
Definition Object.h:625
void SendLfgTeleportError(uint8 err)
Definition LFGHandler.cpp:616
LfgTeleportError
Teleport errors.
Definition LFGMgr.h:87
@ LFG_TELEPORTERROR_INVALID_LOCATION
Definition LFGMgr.h:94
@ LFG_TELEPORTERROR_OK
Definition LFGMgr.h:89
@ LFG_TELEPORTERROR_FATIGUE
Definition LFGMgr.h:93
@ LFG_TELEPORTERROR_COMBAT
Definition LFGMgr.h:95
@ LFG_TELEPORTERROR_PLAYER_DEAD
Definition LFGMgr.h:90
@ LFG_TELEPORTERROR_FALLING
Definition LFGMgr.h:91
@ LFG_TELEPORTERROR_IN_VEHICLE
Definition LFGMgr.h:92

References FATIGUE_TIMER, Unit::GetCharmGUID(), 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 ( )
902 {
903 if (sWorld->getBoolConfig(CONFIG_DEBUG_LFG))
904 {
905 m_Testing = true;
907 }
908 else
909 {
912 }
913 }
@ LANG_DEBUG_LFG_ON
Definition Language.h:1418
@ LANG_DEBUG_LFG_OFF
Definition Language.h:1419
@ LANG_DEBUG_LFG_CONF
Definition Language.h:1420
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:2765
void SendLfgJoinResult(ObjectGuid guid, LfgJoinResultData const &data)
Definition LFGMgr.cpp:2783
bool isOptionEnabled(uint32 option)
Checks if given lfg option is enabled.
Definition LFGMgr.cpp:2856
uint32 lastProposalId
pussywizard, store it here because of splitting LFGMgr update into tasks
Definition LFGMgr.h:627
void UpdateProposal(uint32 proposalId, ObjectGuid guid, bool accept)
Updates proposal to join dungeon with player answer.
Definition LFGMgr.cpp:1920
void CleanupDungeonCooldowns()
Definition LFGMgr.cpp:177
void UpdateRaidBrowser(uint32 diff)
Definition LFGMgr.cpp:1081
@ LFG_OPTION_ENABLE_DUNGEON_FINDER
Definition LFGMgr.h:41
@ LFG_OPTION_ENABLE_RAID_BROWSER
Definition LFGMgr.h:42
@ LFG_UPDATETYPE_PROPOSAL_BEGIN
Definition LFG.h:60
@ LFG_ROLECHECK_MISSING_ROLE
Definition LFGMgr.h:127
@ LFG_PROPOSAL_SUCCESS
Definition LFGMgr.h:82
@ LFG_JOIN_FAILED
Definition LFGMgr.h:103

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
2167 {
2168 ObjectGuid gguid = GetGroup(guid);
2169 if (!gguid)
2170 return;
2171
2172 LfgPlayerBootContainer::iterator itBoot = BootsStore.find(gguid);
2173 if (itBoot == BootsStore.end())
2174 return;
2175
2176 LfgPlayerBoot& boot = itBoot->second;
2177
2178 if (boot.votes[guid] != LFG_ANSWER_PENDING) // Cheat check: Player can't vote twice
2179 return;
2180
2181 boot.votes[guid] = LfgAnswer(accept);
2182
2183 uint8 votesNum = 0;
2184 uint8 agreeNum = 0;
2185 for (LfgAnswerContainer::const_iterator itVotes = boot.votes.begin(); itVotes != boot.votes.end(); ++itVotes)
2186 {
2187 if (itVotes->second != LFG_ANSWER_PENDING)
2188 {
2189 ++votesNum;
2190 if (itVotes->second == LFG_ANSWER_AGREE)
2191 ++agreeNum;
2192 }
2193 }
2194
2195 // if we don't have enough votes (agree or deny) do nothing
2196 if (agreeNum < LFG_GROUP_KICK_VOTES_NEEDED && (votesNum - agreeNum) < LFG_GROUP_KICK_VOTES_NEEDED)
2197 return;
2198
2199 // Send update info to all players
2200 boot.inProgress = false;
2201 for (LfgAnswerContainer::const_iterator itVotes = boot.votes.begin(); itVotes != boot.votes.end(); ++itVotes)
2202 {
2203 ObjectGuid pguid = itVotes->first;
2204 if (pguid != boot.victim)
2205 {
2207 SendLfgBootProposalUpdate(pguid, boot);
2208 }
2209 }
2210
2212 if (agreeNum == LFG_GROUP_KICK_VOTES_NEEDED) // Vote passed - Kick player
2213 {
2214 if (Group* group = sGroupMgr->GetGroupByGUID(gguid.GetCounter()))
2216
2217 DecreaseKicksLeft(gguid);
2218 }
2219 BootsStore.erase(itBoot);
2220 }
@ GROUP_REMOVEMETHOD_KICK_LFG
Definition SharedDefines.h:3846
static void RemoveFromGroup(Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
Definition Player.cpp:2328
void DecreaseKicksLeft(ObjectGuid guid)
Definition LFGMgr.cpp:2648
@ LFG_GROUP_KICK_VOTES_NEEDED
Definition LFGMgr.h:55
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
1921 {
1922 // Check if the proposal exists
1923 LfgProposalContainer::iterator itProposal = ProposalsStore.find(proposalId);
1924 if (itProposal == ProposalsStore.end())
1925 return;
1926
1927 LfgProposal& proposal = itProposal->second;
1928
1929 // Check if proposal have the current player
1930 LfgProposalPlayerContainer::iterator itProposalPlayer = proposal.players.find(guid);
1931 if (itProposalPlayer == proposal.players.end())
1932 return;
1933
1934 LfgProposalPlayer& player = itProposalPlayer->second;
1935 player.accept = LfgAnswer(accept);
1936
1937 LOG_DEBUG("lfg", "LFGMgr::UpdateProposal: Player [{}] of proposal {} selected: {}", guid.ToString(), proposalId, accept);
1938 if (!accept)
1939 {
1941 return;
1942 }
1943
1944 // check if all have answered and reorder players (leader first)
1945 bool allAnswered = true;
1946 for (LfgProposalPlayerContainer::const_iterator itPlayers = proposal.players.begin(); itPlayers != proposal.players.end(); ++itPlayers)
1947 if (itPlayers->second.accept != LFG_ANSWER_AGREE) // No answer (-1) or not accepted (0)
1948 allAnswered = false;
1949
1950 if (!m_Testing && !allAnswered)
1951 {
1952 for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
1953 SendLfgUpdateProposal(it->first, proposal);
1954
1955 return;
1956 }
1957
1958 bool sendUpdate = proposal.state != LFG_PROPOSAL_SUCCESS;
1959 proposal.state = LFG_PROPOSAL_SUCCESS;
1960 time_t joinTime = GameTime::GetGameTime().count();
1961
1962 LFGQueue& queue = GetQueue(guid);
1963 LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_GROUP_FOUND);
1964 for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
1965 {
1966 ObjectGuid pguid = it->first;
1967 ObjectGuid gguid = it->second.group;
1968 uint32 dungeonId = (*GetSelectedDungeons(pguid).begin());
1969 int32 waitTime = -1;
1970 if (sendUpdate)
1971 SendLfgUpdateProposal(pguid, proposal);
1972
1973 if (gguid)
1974 {
1975 waitTime = int32((joinTime - queue.GetJoinTime(gguid)) / IN_MILLISECONDS);
1976 SendLfgUpdateParty(pguid, updateData);
1977 }
1978 else
1979 {
1980 waitTime = int32((joinTime - queue.GetJoinTime(pguid)) / IN_MILLISECONDS);
1981 SendLfgUpdatePlayer(pguid, updateData);
1982 }
1983 updateData.updateType = LFG_UPDATETYPE_REMOVED_FROM_QUEUE;
1984 SendLfgUpdatePlayer(pguid, updateData);
1985 SendLfgUpdateParty(pguid, updateData);
1986
1987 // Update timers
1988 uint8 role = GetRoles(pguid);
1989 role &= ~PLAYER_ROLE_LEADER;
1990 switch (role)
1991 {
1992 case PLAYER_ROLE_DAMAGE:
1993 queue.UpdateWaitTimeDps(waitTime, dungeonId);
1994 break;
1995 case PLAYER_ROLE_HEALER:
1996 queue.UpdateWaitTimeHealer(waitTime, dungeonId);
1997 break;
1998 case PLAYER_ROLE_TANK:
1999 queue.UpdateWaitTimeTank(waitTime, dungeonId);
2000 break;
2001 default:
2002 queue.UpdateWaitTimeAvg(waitTime, dungeonId);
2003 break;
2004 }
2005
2007 }
2008
2009 // Remove players/groups from Queue
2010 for (uint8 i = 0; i < 5 && proposal.queues.guids[i]; ++i)
2011 queue.RemoveQueueData(proposal.queues.guids[i]);
2012
2013 MakeNewGroup(proposal);
2014 ProposalsStore.erase(itProposal);
2015 }
std::int32_t int32
Definition Define.h:103
uint8 GetRoles(ObjectGuid guid)
Get current player roles.
Definition LFGMgr.cpp:2517
void MakeNewGroup(LfgProposal const &proposal)
Definition LFGMgr.cpp:1690
@ 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)
1082 {
1083 for (uint8 team = 0; team < 2; ++team)
1084 {
1085 if (m_raidBrowserUpdateTimer[team] > diff)
1086 m_raidBrowserUpdateTimer[team] -= diff;
1087 else
1088 m_raidBrowserUpdateTimer[team] = 0;
1089 }
1090
1091 if (GetMSTimeDiff(GameTime::GetGameTimeMS(), GetTimeMS()) > 98ms) // prevent lagging
1092 {
1093 return;
1094 }
1095
1096 ObjectGuid guid, groupGuid, instanceGuid;
1097 uint8 level, Class, race, talents[3];
1098 float iLevel, mp5, mp5combat, baseAP, rangedAP;
1099 int32 spellDamage, spellHeal;
1100 uint32 dungeonId, encounterMask, maxPower;
1101 uint32 deletedCounter, groupCounter, playerCounter;
1102 ByteBuffer buffer_deleted, buffer_groups, buffer_players;
1103 std::string emptyComment;
1104 GuidSet deletedGroups, deletedGroupsToErase;
1105 RBInternalInfoMap copy;
1106
1107 for (uint8 team = 0; team < 2; ++team)
1108 {
1109 if (m_raidBrowserLastUpdatedDungeonId[team] == 0) // new loop
1110 {
1111 if (m_raidBrowserUpdateTimer[team] > 0) // allowed only with some time interval
1112 continue;
1113 else // reset timer
1114 m_raidBrowserUpdateTimer[team] = 5000;
1115 }
1116
1117 RBUsedDungeonsSet::const_iterator neitr, titr;
1118 for (neitr = RBUsedDungeonsStore[team].begin(); neitr != RBUsedDungeonsStore[team].end(); )
1119 {
1120 titr = neitr++;
1121 dungeonId = (*titr);
1122
1123 // go to next dungeon than previously (one dungeon updated in one LFGMgr::UpdateRaidBrowser)
1124 if (dungeonId <= m_raidBrowserLastUpdatedDungeonId[team])
1125 continue;
1126 m_raidBrowserLastUpdatedDungeonId[team] = dungeonId;
1127
1128 RBEntryInfoMap& entryInfoMap = RaidBrowserStore[team][dungeonId];
1129 LFGDungeonData const* dungeonData = GetLFGDungeon(dungeonId); // checked if exists before inserting to the container
1130 RBInternalInfoMap& currInternalInfoMap = RBInternalInfoStoreCurr[team][dungeonId];
1131 for (RBEntryInfoMap::const_iterator sitr = entryInfoMap.begin(); sitr != entryInfoMap.end(); ++sitr)
1132 {
1133 guid = sitr->first;
1134 groupGuid.Clear();
1136 ASSERT(p);
1137 if (sitr->second.roles == PLAYER_ROLE_LEADER)
1138 {
1139 ASSERT(p->GetGroup());
1140 groupGuid = p->GetGroup()->GetGUID();
1141 }
1142 encounterMask = 0;
1143 instanceGuid.Clear();
1144 if (InstancePlayerBind* bind = sInstanceSaveMgr->PlayerGetBoundInstance(guid, dungeonData->map, dungeonData->difficulty))
1145 if (bind->perm)
1146 {
1147 instanceGuid = ObjectGuid::Create<HighGuid::Instance>(bind->save->GetInstanceId());
1148 encounterMask = bind->save->GetCompletedEncounterMask();
1149 }
1150
1151 talents[0] = 0;
1152 talents[1] = 0;
1153 talents[2] = 0;
1154 p->GetTalentTreePoints(talents);
1161 maxPower = 0;
1162 if (p->IsClass(CLASS_DRUID))
1163 maxPower = p->GetMaxPower(POWER_MANA);
1164 else
1165 maxPower = (p->getPowerType() == POWER_RAGE || p->getPowerType() == POWER_RUNIC_POWER) ? p->GetMaxPower(p->getPowerType()) / 10 : p->GetMaxPower(p->getPowerType());
1166
1167 currInternalInfoMap[sitr->first] = RBInternalInfo(guid, sitr->second.comment, !groupGuid.IsEmpty(), groupGuid, sitr->second.roles, encounterMask, instanceGuid,
1168 1, p->GetLevel(), p->getClass(), p->getRace(), p->GetAverageItemLevel(),
1169 talents, p->GetAreaId(), p->GetArmor(), (uint32)std::max<int32>(0, spellDamage), (uint32)std::max<int32>(0, spellHeal),
1170 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),
1171 std::max<uint32>(baseAP, rangedAP), (uint32)p->GetStat(STAT_AGILITY), p->GetMaxHealth(), maxPower, p->GetDefenseSkillValue(),
1173
1174 if (!groupGuid)
1175 continue;
1176 for (Group::member_citerator mitr = p->GetGroup()->GetMemberSlots().begin(); mitr != p->GetGroup()->GetMemberSlots().end(); ++mitr)
1177 {
1178 if (mitr->guid == sitr->first) // leader already added
1179 continue;
1180
1181 guid = mitr->guid;
1182 level = 1;
1183 Class = 0;
1184 race = 0;
1185 iLevel = 0.0f;
1186 talents[0] = 0;
1187 talents[1] = 0;
1188 talents[2] = 0;
1189 if (CharacterCacheEntry const* gpd = sCharacterCache->GetCharacterCacheByGuid(mitr->guid))
1190 {
1191 level = gpd->Level;
1192 Class = gpd->Class;
1193 race = gpd->Race;
1194 }
1196 if (mplr)
1197 {
1198 iLevel = mplr->GetAverageItemLevel();
1199 mplr->GetTalentTreePoints(talents);
1200 }
1201 currInternalInfoMap[mitr->guid] = RBInternalInfo(guid, emptyComment, false, groupGuid, 0, 0, ObjectGuid::Empty,
1202 (mplr ? 1 : 0), level, Class, race, iLevel,
1203 talents, 0, 0, 0, 0,
1204 0, 0, 0, 0, 0,
1205 0, 0, 0, 0, 0,
1206 0, 0, 0, 0, 0);
1207 }
1208 }
1209
1210 copy.clear();
1211 copy = currInternalInfoMap; // will be saved as prev at the end
1212
1213 // compare prev with curr to build difference packet
1214 deletedCounter = 0;
1215 groupCounter = 0;
1216 playerCounter = 0;
1217 buffer_deleted.clear();
1218 buffer_groups.clear();
1219 buffer_players.clear();
1220 deletedGroups.clear();
1221 deletedGroupsToErase.clear();
1222
1223 RBInternalInfoMap& prevInternalInfoMap = RBInternalInfoStorePrev[team][dungeonId];
1224 RBInternalInfoMap::iterator iter, iterTmp;
1225 for (RBInternalInfoMap::const_iterator sitr = prevInternalInfoMap.begin(); sitr != prevInternalInfoMap.end(); ++sitr)
1226 {
1227 iter = currInternalInfoMap.find(sitr->first);
1228 if (iter == currInternalInfoMap.end()) // was -> isn't
1229 {
1230 if (sitr->second.isGroupLeader)
1231 deletedGroups.insert(sitr->second.groupGuid);
1232 ++deletedCounter;
1233 buffer_deleted << sitr->second.guid;
1234 }
1235 else // was -> is
1236 {
1237 if (sitr->second.isGroupLeader) // was a leader
1238 {
1239 if (!iter->second.isGroupLeader) // leader -> no longer a leader
1240 deletedGroups.insert(sitr->second.groupGuid);
1241 else if (sitr->second.groupGuid != iter->second.groupGuid) // leader -> leader of another group
1242 {
1243 deletedGroups.insert(sitr->second.groupGuid);
1244 deletedGroupsToErase.insert(iter->second.groupGuid);
1245 ++groupCounter;
1246 RBPacketAppendGroup(iter->second, buffer_groups);
1247 }
1248 else if (sitr->second.comment != iter->second.comment || sitr->second.encounterMask != iter->second.encounterMask || sitr->second.instanceGuid != iter->second.instanceGuid) // leader -> nothing changed
1249 {
1250 ++groupCounter;
1251 RBPacketAppendGroup(iter->second, buffer_groups);
1252 }
1253 }
1254 else if (iter->second.isGroupLeader) // wasn't a leader -> is a leader
1255 {
1256 deletedGroupsToErase.insert(iter->second.groupGuid);
1257 ++groupCounter;
1258 RBPacketAppendGroup(iter->second, buffer_groups);
1259 }
1260
1261 if (!iter->second._online) // if offline, copy previous stats (itemLevel, talents, area, etc.)
1262 {
1263 iterTmp = copy.find(sitr->first); // copied container is for building a full packet, so modify it there (currInternalInfoMap is erased)
1264 iterTmp->second.CopyStats(sitr->second);
1265 if (!sitr->second.PlayerSameAs(iterTmp->second)) // player info changed
1266 {
1267 ++playerCounter;
1268 RBPacketAppendPlayer(iterTmp->second, buffer_players);
1269 }
1270 }
1271 else if (!sitr->second.PlayerSameAs(iter->second)) // player info changed
1272 {
1273 ++playerCounter;
1274 RBPacketAppendPlayer(iter->second, buffer_players);
1275 }
1276 currInternalInfoMap.erase(iter);
1277 }
1278 }
1279 // left entries (new)
1280 for (RBInternalInfoMap::const_iterator sitr = currInternalInfoMap.begin(); sitr != currInternalInfoMap.end(); ++sitr)
1281 {
1282 if (sitr->second.isGroupLeader)
1283 {
1284 deletedGroupsToErase.insert(sitr->second.groupGuid);
1285 ++groupCounter;
1286 RBPacketAppendGroup(sitr->second, buffer_groups);
1287 }
1288 ++playerCounter;
1289 RBPacketAppendPlayer(sitr->second, buffer_players);
1290 }
1291
1292 if (!deletedGroupsToErase.empty())
1293 {
1294 for (ObjectGuid const& toErase : deletedGroupsToErase)
1295 {
1296 deletedGroups.erase(toErase);
1297 }
1298 }
1299
1300 if (!deletedGroups.empty())
1301 {
1302 for (ObjectGuid const& deletedGroup : deletedGroups)
1303 {
1304 ++deletedCounter;
1305 buffer_deleted << deletedGroup;
1306 }
1307 }
1308
1309 WorldPacket differencePacket(SMSG_UPDATE_LFG_LIST, 1000);
1310 RBPacketBuildDifference(differencePacket, dungeonId, deletedCounter, buffer_deleted, groupCounter, buffer_groups, playerCounter, buffer_players);
1311 WorldPacket fullPacket(SMSG_UPDATE_LFG_LIST, 1000);
1312 RBPacketBuildFull(fullPacket, dungeonId, copy);
1313
1314 RBCacheStore[team][dungeonId] = fullPacket;
1315 prevInternalInfoMap = copy;
1316 currInternalInfoMap.clear();
1317
1318 if (entryInfoMap.empty())
1319 RBUsedDungeonsStore[team].erase(titr);
1320
1321 // send difference packet to browsing players
1322 for (RBSearchersMap::const_iterator sitr = RBSearchersStore[team].begin(); sitr != RBSearchersStore[team].end(); ++sitr)
1323 if (sitr->second == dungeonId)
1324 if (Player* p = ObjectAccessor::FindConnectedPlayer(sitr->first))
1325 p->SendDirectMessage(&differencePacket);
1326
1327 break; // one dungeon updated in one LFGMgr::UpdateRaidBrowser
1328 }
1329
1330 // already updated all in this time interval
1331 if (neitr == RBUsedDungeonsStore[team].end())
1333 }
1334 }
#define sCharacterCache
Definition CharacterCache.h:83
std::uint16_t uint16
Definition Define.h:108
std::set< ObjectGuid > GuidSet
Definition ObjectGuid.h:253
@ 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:215
@ RANGED_ATTACK
Definition Unit.h:217
@ CR_EXPERTISE
Definition Unit.h:246
@ CR_CRIT_MELEE
Definition Unit.h:231
@ CR_CRIT_RANGED
Definition Unit.h:232
@ CR_PARRY
Definition Unit.h:226
@ CR_DODGE
Definition Unit.h:225
@ CR_BLOCK
Definition Unit.h:227
@ CR_HASTE_SPELL
Definition Unit.h:242
@ CR_CRIT_SPELL
Definition Unit.h:233
@ 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:242
MemberSlotList::const_iterator member_citerator
Definition Group.h:180
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:294
float GetFloatValue(uint16 index) const
Definition Object.cpp:306
void GetTalentTreePoints(uint8(&specPoints)[3]) const
Definition Player.cpp:15440
float GetAverageItemLevel()
Definition Player.cpp:15881
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:9789
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition Unit.cpp:12291
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition Unit.cpp:3790
uint32 GetMaxHealth() const
Definition Unit.h:1109
uint8 getClass() const
Definition Unit.h:843
uint8 getRace(bool original=false) const
Definition Unit.cpp:17048
uint32 GetMaxPower(Powers power) const
Definition Unit.h:1136
uint32 GetArmor() const
Definition Unit.h:1157
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:9031
float GetStat(Stats stat) const
Definition Unit.h:1058
Powers getPowerType() const
Definition Unit.h:1131
uint32 GetAreaId() const
Definition Object.cpp:3119
std::unordered_map< ObjectGuid, RBInternalInfo > RBInternalInfoMap
Definition LFGMgr.h:433
void RBPacketBuildDifference(WorldPacket &differencePacket, uint32 dungeonId, uint32 deletedCounter, ByteBuffer &buffer_deleted, uint32 groupCounter, ByteBuffer &buffer_groups, uint32 playerCounter, ByteBuffer &buffer_players)
Definition LFGMgr.cpp:1406
RBInternalInfoMapMap RBInternalInfoStorePrev[2]
Definition LFGMgr.h:435
std::unordered_map< ObjectGuid, RBEntryInfo > RBEntryInfoMap
Definition LFGMgr.h:426
void RBPacketBuildFull(WorldPacket &fullPacket, uint32 dungeonId, RBInternalInfoMap &infoMap)
Definition LFGMgr.cpp:1421
RBInternalInfoMapMap RBInternalInfoStoreCurr[2]
Definition LFGMgr.h:436
Milliseconds GetGameTimeMS()
Definition GameTime.cpp:43
Definition CharacterCache.h:28

References 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
1503 {
1504 if (!gguid)
1505 return;
1506
1507 LfgRolesMap check_roles;
1508 LfgRoleCheckContainer::iterator itRoleCheck = RoleChecksStore.find(gguid);
1509 if (itRoleCheck == RoleChecksStore.end())
1510 return;
1511
1512 LfgRoleCheck& roleCheck = itRoleCheck->second;
1513 bool sendRoleChosen = roleCheck.state != LFG_ROLECHECK_DEFAULT && guid;
1514
1515 if (!guid)
1516 roleCheck.state = LFG_ROLECHECK_ABORTED;
1517 else if (roles < PLAYER_ROLE_TANK) // Player selected no role.
1518 roleCheck.state = LFG_ROLECHECK_NO_ROLE;
1519 else
1520 {
1521 roleCheck.roles[guid] = roles;
1522
1523 // Check if all players have selected a role
1524 LfgRolesMap::const_iterator itRoles = roleCheck.roles.begin();
1525 while (itRoles != roleCheck.roles.end() && itRoles->second != PLAYER_ROLE_NONE)
1526 ++itRoles;
1527
1528 if (itRoles == roleCheck.roles.end())
1529 {
1530 // use temporal var to check roles, CheckGroupRoles modifies the roles
1531 check_roles = roleCheck.roles;
1532 roleCheck.state = CheckGroupRoles(check_roles) ? LFG_ROLECHECK_FINISHED : LFG_ROLECHECK_WRONG_ROLES;
1533 }
1534 }
1535
1536 LfgDungeonSet dungeons;
1537 if (roleCheck.rDungeonId)
1538 dungeons.insert(roleCheck.rDungeonId);
1539 else
1540 dungeons = roleCheck.dungeons;
1541
1542 LfgJoinResultData joinData = LfgJoinResultData(LFG_JOIN_FAILED, roleCheck.state);
1543 for (LfgRolesMap::const_iterator it = roleCheck.roles.begin(); it != roleCheck.roles.end(); ++it)
1544 {
1545 ObjectGuid pguid = it->first;
1546
1547 if (sendRoleChosen)
1548 SendLfgRoleChosen(pguid, guid, roles);
1549
1550 SendLfgRoleCheckUpdate(pguid, roleCheck);
1551 switch (roleCheck.state)
1552 {
1554 continue;
1556 SetState(pguid, LFG_STATE_QUEUED);
1557 SetRoles(pguid, it->second);
1558 SendLfgUpdateParty(pguid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, dungeons, GetComment(pguid)));
1559 break;
1560 default:
1561 if (roleCheck.leader == pguid)
1562 SendLfgJoinResult(pguid, joinData);
1564 RestoreState(pguid, "Rolecheck Failed");
1565 break;
1566 }
1567 }
1568
1569 if (roleCheck.state == LFG_ROLECHECK_FINISHED)
1570 {
1571 SetState(gguid, LFG_STATE_QUEUED);
1572 LFGQueue& queue = GetQueue(gguid);
1573 queue.AddQueueData(gguid, time_t(GameTime::GetGameTime().count()), roleCheck.dungeons, roleCheck.roles);
1574 RoleChecksStore.erase(itRoleCheck);
1575 }
1576 else if (roleCheck.state != LFG_ROLECHECK_INITIALITING)
1577 {
1578 RestoreState(gguid, "Rolecheck Failed");
1579 RoleChecksStore.erase(itRoleCheck);
1580 }
1581 }
void SendLfgRoleChosen(ObjectGuid guid, ObjectGuid pguid, uint8 roles)
Definition LFGMgr.cpp:2759
@ LFG_UPDATETYPE_ROLECHECK_FAILED
Definition LFG.h:54
@ LFG_ROLECHECK_WRONG_ROLES
Definition LFGMgr.h:128
@ LFG_ROLECHECK_ABORTED
Definition LFGMgr.h:129
@ LFG_ROLECHECK_DEFAULT
Definition LFGMgr.h:124
@ LFG_ROLECHECK_FINISHED
Definition LFGMgr.h:125
@ LFG_ROLECHECK_NO_ROLE
Definition LFGMgr.h:130

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

◆ 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: