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:323
@ 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:2619
void SetState(ObjectGuid guid, LfgState state)
Definition LFGMgr.cpp:2592
void SetLeader(ObjectGuid gguid, ObjectGuid leader)
Sets the leader of the group.
Definition LFGMgr.cpp:2718
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:2488
uint32 GetDungeon(ObjectGuid guid, bool asId=true)
Get current dungeon.
Definition LFGMgr.cpp:2512

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:324
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.

2707 {
2708 const LfgDungeonSet& dungeons = GetSelectedDungeons(guid);
2709 if (dungeons.empty())
2710 return;
2711
2712 uint32 dungeonId = *dungeons.begin();
2713 LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId);
2714 if (dungeon && (dungeon->type == LFG_TYPE_RANDOM))
2715 GroupsStore[gguid].AddRandomQueuedPlayer(guid);
2716 }
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:2544
@ 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.

2702 {
2703 GroupsStore[gguid].AddPlayer(guid);
2704 }

References GroupsStore.

Referenced by SetupGroupMember().

◆ AddProposal()

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

Add a new Proposal.

1921 {
1922 proposal.id = ++m_lfgProposalId;
1923 ProposalsStore[m_lfgProposalId] = proposal;
1924 return m_lfgProposalId;
1925 }
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.

2844 {
2845 bool ok = true;
2846
2847 if (check.empty())
2848 return false;
2849
2850 for (uint8 i = 0; i < 5 && check.guids[i]; ++i)
2851 {
2852 ObjectGuid guid = check.guids[i];
2853 if (GetState(guid) != LFG_STATE_QUEUED)
2854 {
2855 LFGQueue& queue = GetQueue(guid);
2856 queue.RemoveFromQueue(guid);
2857 ok = false;
2858 }
2859 }
2860
2861 return ok;
2862 }
Definition ObjectGuid.h:118
LFGQueue & GetQueue(ObjectGuid guid)
Definition LFGMgr.cpp:2826
@ 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.

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

2866 {
2867 QueuesStore.clear();
2868 }
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
2663 {
2664 LOG_DEBUG("lfg", "LFGMgr::DecreaseKicksLeft: [{}]", guid.ToString());
2665 GroupsStore[guid].DecreaseKicksLeft();
2666 }
#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
2332 {
2333 uint32 gDungeonId = GetDungeon(gguid);
2334 if (gDungeonId != dungeonId)
2335 {
2336 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] Finished dungeon {} but group queued for {}. Ignoring", gguid.ToString(), dungeonId, gDungeonId);
2337 return;
2338 }
2339
2340 if (GetState(gguid) == LFG_STATE_FINISHED_DUNGEON) // Shouldn't happen. Do not reward multiple times
2341 {
2342 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] Already rewarded group. Ignoring", gguid.ToString());
2343 return;
2344 }
2345
2347 _SaveToDB(gguid); // pussywizard
2348
2349 const LfgGuidSet& players = GetPlayers(gguid);
2350 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
2351 {
2352 ObjectGuid guid = (*it);
2354 {
2355 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] Already rewarded player. Ignoring", guid.ToString());
2356 continue;
2357 }
2358
2359 uint32 rDungeonId = 0;
2360 const LfgDungeonSet& dungeons = GetSelectedDungeons(guid);
2361 if (!dungeons.empty())
2362 rDungeonId = (*dungeons.begin());
2363
2365
2366 // Give rewards only if its a random dungeon
2367 LFGDungeonData const* dungeon = GetLFGDungeon(rDungeonId);
2368
2369 if (!dungeon || (dungeon->type != LFG_TYPE_RANDOM && !dungeon->seasonal))
2370 {
2371 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] dungeon {} is not random or seasonal", guid.ToString(), rDungeonId);
2372 continue;
2373 }
2374
2375 // Record dungeon cooldown for this player (the actual dungeon completed, not the random entry)
2376 AddDungeonCooldown(guid, dungeonId);
2377
2378 Player* player = ObjectAccessor::FindPlayer(guid);
2379 if (!player || player->FindMap() != currMap) // pussywizard: currMap - multithreading crash if on other map (map id check is not enough, binding system is not reliable)
2380 {
2381 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] not found in world", guid.ToString());
2382 continue;
2383 }
2384
2385 LFGDungeonData const* dungeonDone = GetLFGDungeon(dungeonId);
2386 uint32 mapId = dungeonDone ? uint32(dungeonDone->map) : 0;
2387
2388 if (player->GetMapId() != mapId)
2389 {
2390 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] is in map {} and should be in {} to get reward", guid.ToString(), player->GetMapId(), mapId);
2391 continue;
2392 }
2393
2394 // Remove Dungeon Finder Cooldown if still exists
2396 {
2398 }
2399
2400 // Xinef: Update achievements, set correct amount of randomly grouped players
2401 if (dungeon->difficulty == DUNGEON_DIFFICULTY_HEROIC)
2402 if (uint8 count = GetRandomPlayersCount(player->GetGUID()))
2404
2405 LfgReward const* reward = GetRandomDungeonReward(rDungeonId, player->GetLevel());
2406 if (!reward)
2407 continue;
2408
2409 bool done = false;
2410 Quest const* quest = sObjectMgr->GetQuestTemplate(reward->firstQuest);
2411 if (!quest)
2412 continue;
2413
2414 // if we can take the quest, means that we haven't done this kind of "run", IE: First Heroic Random of Day.
2415 if (player->CanRewardQuest(quest, false))
2416 player->RewardQuest(quest, 0, nullptr, false, true);
2417 else
2418 {
2419 done = true;
2420 quest = sObjectMgr->GetQuestTemplate(reward->otherQuest);
2421 if (!quest)
2422 continue;
2423 // we give reward without informing client (retail does this)
2424 player->RewardQuest(quest, 0, nullptr, false, true);
2425 }
2426
2427 // Give rewards
2428 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] done dungeon {}, {} previously done.", player->GetGUID().ToString(), GetDungeon(gguid), done ? " " : " not");
2429 LfgPlayerRewardData data = LfgPlayerRewardData(dungeon->Entry(), GetDungeon(gguid, false), done, quest);
2430 player->GetSession()->SendLfgPlayerReward(data);
2431 }
2432 }
@ 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:1732
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:2174
bool CanRewardQuest(Quest const *quest, bool msg)
Definition PlayerQuest.cpp:387
WorldSession * GetSession() const
Definition Player.h:2023
void RewardQuest(Quest const *quest, uint32 reward, Object *questGiver, bool announce=true, bool isLFGReward=false)
Definition PlayerQuest.cpp:662
Definition QuestDef.h:210
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:6017
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:5189
uint8 GetLevel() const
Definition Unit.h: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:2761
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:2458
LfgGuidSet const & GetPlayers(ObjectGuid guid)
Definition LFGMgr.cpp:2741
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)

2539 {
2540 LOG_DEBUG("lfg", "LFGMgr::GetComment: [{}] = {}", guid.ToString(), PlayersStore[guid].GetComment());
2541 return PlayersStore[guid].GetComment();
2542 }
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
1589 {
1590 lockMap.clear();
1591 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end() && !dungeons.empty(); ++it)
1592 {
1593 ObjectGuid guid = (*it);
1594 LfgLockMap const& cachedLockMap = GetLockedDungeons(guid);
1595 for (LfgLockMap::const_iterator it2 = cachedLockMap.begin(); it2 != cachedLockMap.end() && !dungeons.empty(); ++it2)
1596 {
1597 uint32 dungeonId = (it2->first & 0x00FFFFFF); // Compare dungeon ids
1598
1599 LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId);
1600
1601 uint8 difficultyFlag = (randomDungeonId == RANDOM_DUNGEON_NORMAL_TBC || randomDungeonId == RANDOM_DUNGEON_NORMAL_WOTLK) ? 0 : 1;
1602
1603 if (dungeon && !IsDungeonDisabled(dungeon->map, (Difficulty)difficultyFlag) && it2->second == LFG_LOCKSTATUS_RAID_LOCKED && randomDungeonId && sWorld->getBoolConfig(CONFIG_LFG_ALLOW_COMPLETED))
1604 continue;
1605
1606 LfgDungeonSet::iterator itDungeon = dungeons.find(dungeonId);
1607 if (itDungeon != dungeons.end())
1608 {
1609 dungeons.erase(itDungeon);
1610 lockMap[guid][dungeonId] = it2->second;
1611 }
1612 }
1613 }
1614 if (!dungeons.empty())
1615 lockMap.clear();
1616 }
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:2968
LfgLockMap const & GetLockedDungeons(ObjectGuid guid)
Get locked dungeons.
Definition LFGMgr.cpp:2550
@ 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.

2513 {
2514 uint32 dungeon = GroupsStore[guid].GetDungeon(asId);
2515 LOG_DEBUG("lfg", "LFGMgr::GetDungeon: [{}] asId: {} = {}", guid.ToString(), asId, dungeon);
2516 return dungeon;
2517 }

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.

2520 {
2521 uint32 dungeonId = GroupsStore[guid].GetDungeon(true);
2522 uint32 mapId = 0;
2523 if (dungeonId)
2524 if (LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId))
2525 mapId = dungeon->map;
2526
2527 LOG_DEBUG("lfg", "LFGMgr::GetDungeonMapId: [{}] = {} (DungeonId = {})", guid.ToString(), mapId, dungeonId);
2528 return mapId;
2529 }

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.
2445 {
2446 LFGDungeonData const* dungeon = GetLFGDungeon(randomdungeon);
2447 uint32 group = dungeon ? dungeon->group : 0;
2448 return CachedDungeonMapStore[group];
2449 }
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
2480 {
2481 LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId);
2482 if (!dungeon)
2483 return LFG_TYPE_NONE;
2484
2485 return LfgType(dungeon->type);
2486 }
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.

2732 {
2733 return PlayersStore[guid].GetGroup();
2734 }

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.

2557 {
2558 uint8 kicks = GroupsStore[guid].GetKicksLeft();
2559 LOG_DEBUG("lfg", "LFGMgr::GetKicksLeft: [{}] = {}", guid.ToString(), kicks);
2560 return kicks;
2561 }

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

◆ GetLeader()

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

Get leader of the group (using internal data)

2752 {
2753 return GroupsStore[guid].GetLeader();
2754 }

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.

2947 {
2948 if (id)
2949 if (LFGDungeonData const* dungeon = GetLFGDungeon(id))
2950 return dungeon->Entry();
2951
2952 return 0;
2953 }

References GetLFGDungeon().

Referenced by LoadRewards().

◆ GetLfgStatus()

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

Returns current lfg status.

2886 {
2887 LfgPlayerData& playerData = PlayersStore[guid];
2888 return LfgUpdateData(LFG_UPDATETYPE_UPDATE_STATUS, playerData.GetState(), playerData.GetSelectedDungeons());
2889 }
@ 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.

2551 {
2552 LOG_DEBUG("lfg", "LFGMgr::GetLockedDungeons: [{}]", guid.ToString());
2553 return PlayersStore[guid].GetLockedDungeons();
2554 }

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)

2501 {
2502 LfgState state;
2503 if (guid.IsGroup())
2504 state = GroupsStore[guid].GetOldState();
2505 else
2506 state = PlayersStore[guid].GetOldState();
2507
2508 LOG_DEBUG("lfg", "LFGMgr::GetOldState: [{}] = {}", guid.ToString(), state);
2509 return state;
2510 }

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

◆ GetOptions()

uint32 lfg::LFGMgr::GetOptions ( )

Gets current lfg options.

2876 {
2877 return m_options;
2878 }

References m_options.

◆ GetPlayerCount()

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

Gets the player count of given group.

2747 {
2748 return GroupsStore[guid].GetPlayerCount();
2749 }

References GroupsStore.

◆ GetPlayers()

LfgGuidSet const & lfg::LFGMgr::GetPlayers ( ObjectGuid  guid)
private
2742 {
2743 return GroupsStore[guid].GetPlayers();
2744 }

References GroupsStore.

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

◆ GetQueue()

LFGQueue & lfg::LFGMgr::GetQueue ( ObjectGuid  guid)
private
2827 {
2828 uint8 queueId = 0;
2829 if (guid.IsGroup())
2830 {
2831 LfgGuidSet const& players = GetPlayers(guid);
2832 ObjectGuid pguid = players.empty() ? ObjectGuid::Empty : (*players.begin());
2833 if (pguid)
2834 queueId = GetTeam(pguid);
2835 else
2836 queueId = GetTeam(GetLeader(guid));
2837 }
2838 else
2839 queueId = GetTeam(guid);
2840 return QueuesStore[queueId];
2841 }
static ObjectGuid const Empty
Definition ObjectGuid.h:120
ObjectGuid GetLeader(ObjectGuid guid)
Get leader of the group (using internal data)
Definition LFGMgr.cpp:2751
TeamId GetTeam(ObjectGuid guid)
Definition LFGMgr.cpp:2691

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.

2956 {
2957 LfgDungeonSet randomDungeons;
2958 for (lfg::LFGDungeonContainer::const_iterator itr = LfgDungeonStore.begin(); itr != LfgDungeonStore.end(); ++itr)
2959 {
2960 lfg::LFGDungeonData const& dungeon = itr->second;
2961 if ((dungeon.type == lfg::LFG_TYPE_RANDOM || (dungeon.seasonal && sLFGMgr->IsSeasonActive(dungeon.id)))
2962 && dungeon.expansion <= expansion && dungeon.minlevel <= level && level <= dungeon.maxlevel)
2963 randomDungeons.insert(dungeon.Entry());
2964 }
2965 return randomDungeons;
2966 }
#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
2459 {
2460 LfgReward const* rew = nullptr;
2461 LfgRewardContainerBounds bounds = RewardMapStore.equal_range(dungeon & 0x00FFFFFF);
2462 for (LfgRewardContainer::const_iterator itr = bounds.first; itr != bounds.second; ++itr)
2463 {
2464 rew = itr->second;
2465 // ordered properly at loading
2466 if (itr->second->maxLevel >= level)
2467 break;
2468 }
2469
2470 return rew;
2471 }
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.

2762 {
2763 return PlayersStore[guid].GetRandomPlayersCount();
2764 }

References PlayersStore.

Referenced by FinishDungeon().

◆ GetRoles()

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

Get current player roles.

2532 {
2533 uint8 roles = PlayersStore[guid].GetRoles();
2534 LOG_DEBUG("lfg", "LFGMgr::GetRoles: [{}] = {}", guid.ToString(), roles);
2535 return roles;
2536 }

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

Referenced by UpdateProposal().

◆ GetSelectedDungeons()

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

Get selected dungeons.

2545 {
2546 LOG_DEBUG("lfg", "LFGMgr::GetSelectedDungeons: [{}]", guid.ToString());
2547 return PlayersStore[guid].GetSelectedDungeons();
2548 }

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.

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

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
2692 {
2693 return PlayersStore[guid].GetTeam();
2694 }

References PlayersStore.

Referenced by GetQueue().

◆ HasIgnore()

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

Checks if given players are ignoring each other.

2767 {
2770 return plr1 && plr2 && (plr1->GetSocial()->HasIgnore(guid2) || plr2->GetSocial()->HasIgnore(guid1));
2771 }
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
2147 {
2148 SetState(gguid, LFG_STATE_BOOT);
2149
2150 LfgPlayerBoot& boot = BootsStore[gguid];
2151 boot.inProgress = true;
2152 boot.cancelTime = time_t(GameTime::GetGameTime().count()) + LFG_TIME_BOOT;
2153 boot.reason = reason;
2154 boot.victim = victim;
2155
2156 LfgGuidSet const& players = GetPlayers(gguid);
2157
2158 // Set votes
2159 for (LfgGuidSet::const_iterator itr = players.begin(); itr != players.end(); ++itr)
2160 {
2161 ObjectGuid guid = (*itr);
2162 SetState(guid, LFG_STATE_BOOT);
2163 boot.votes[guid] = LFG_ANSWER_PENDING;
2164 }
2165
2166 boot.votes[victim] = LFG_ANSWER_DENY; // Victim auto vote NO
2167 boot.votes[kicker] = LFG_ANSWER_AGREE; // Kicker auto vote YES
2168
2169 // Notify players
2170 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
2171 SendLfgBootProposalUpdate(*it, boot);
2172 }
void SendLfgBootProposalUpdate(ObjectGuid guid, LfgPlayerBoot const &boot)
Definition LFGMgr.cpp:2803
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:740
@ 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:15987
bool GetQuestRewardStatus(uint32 quest_id) const
Definition PlayerQuest.cpp:1451
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition PlayerStorage.cpp:658
TeamId GetTeamId(bool original=false) const
Definition Player.h:2131
bool HasAchieved(uint32 achievementId) const
Definition Player.cpp:14060
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:1648
uint8 Expansion() const
Definition WorldSession.h:475
bool HasPermission(uint32 permissionId)
Definition WorldSession.cpp:1551
void SetLockedDungeons(ObjectGuid guid, LfgLockMap const &lock)
Definition LFGMgr.cpp:2656
LfgDungeonSet const & GetDungeonsByRandom(uint32 randomdungeon)
Definition LFGMgr.cpp:2444
bool IsSeasonActive(uint32 dungeonId)
Checks if Seasonal dungeon is active.
Definition LFGMgr.cpp:2891
@ 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.

2934 {
2935 if (!guid.IsGroup())
2936 guid = GetGroup(guid);
2937
2938 if (uint32 dungeonId = GetDungeon(guid, true))
2939 if (LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId))
2940 if (uint32(dungeon->map) == map && dungeon->difficulty == difficulty)
2941 return true;
2942
2943 return false;
2944 }
ObjectGuid GetGroup(ObjectGuid guid)
Gets player group.
Definition LFGMgr.cpp:2731

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.

2969 {
2970 return sDisableMgr->IsDisabledFor(DISABLE_TYPE_MAP, mapId, nullptr, difficulty) ||
2971 sDisableMgr->IsDisabledFor(DISABLE_TYPE_LFG_MAP, mapId, nullptr);
2972 }
#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.

2822 {
2823 return guid && guid.IsGroup() && GroupsStore[guid].IsLfgGroup();
2824 }

References GroupsStore, and ObjectGuid::IsGroup().

◆ isOptionEnabled()

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

Checks if given lfg option is enabled.

2871 {
2872 return m_options & option;
2873 }

References m_options.

Referenced by Update().

◆ IsPlayerQueuedForRandomDungeon()

bool lfg::LFGMgr::IsPlayerQueuedForRandomDungeon ( ObjectGuid  guid)
2975 {
2976 auto gguid = GetGroup(guid);
2977 if (!gguid)
2978 return false;
2979
2980 return GroupsStore[gguid].IsRandomQueuedPlayer(guid);
2981 }

References GetGroup(), and GroupsStore.

◆ IsSeasonActive()

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

Checks if Seasonal dungeon is active.

2892 {
2893 switch (dungeonId)
2894 {
2903 }
2904 return false;
2905 }
bool IsHolidayActive(HolidayIds id)
Definition GameEventMgr.cpp:2021
@ 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:176
bool isLFGGroup(bool restricted=false) const
Definition Group.cpp:2340
ObjectGuid GetGUID() const
Definition Group.cpp:2381
bool isBGGroup() const
Definition Group.cpp:2351
uint32 GetMembersCount() const
Definition Group.h:252
bool isBFGroup() const
Definition Group.cpp:2356
GroupReference * GetFirstMember()
Definition Group.h:250
ObjectGuid GetLeaderGUID() const
Definition Group.cpp:2371
bool InBattleground() const
Definition Player.h:2291
bool InBattlegroundQueue(bool ignoreArena=false) const
Definition Player.cpp:12273
Group * GetGroup()
Definition Player.h:2509
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:2650
void SetComment(ObjectGuid guid, std::string const &comment)
Sets player lfr comment.
Definition LFGMgr.cpp:2631
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:1588
void SetRoles(ObjectGuid guid, uint8 roles)
Sets player lfg roles.
Definition LFGMgr.cpp:2625
LfgType GetDungeonType(uint32 dungeon)
Definition LFGMgr.cpp:2479
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:2791
void SendLfgUpdatePlayer(ObjectGuid guid, LfgUpdateData const &data)
Definition LFGMgr.cpp:2785
@ 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:2037
void SetCanOverrideRBState(ObjectGuid guid, bool val)
Definition LFGMgr.cpp:2614
@ 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 
)
2638 {
2639 // pussywizard: client limit for comment length is 64 @ 3.3.5a
2640 if (comment.size() > 64)
2641 comment = comment.substr(0, 64);
2642
2643 uint8 teamId = p->GetTeamId();
2644 RBEntryInfoMap::iterator iter;
2645 for (RBStoreMap::iterator itr = RaidBrowserStore[teamId].begin(); itr != RaidBrowserStore[teamId].end(); ++itr)
2646 if ((iter = itr->second.find(p->GetGUID())) != itr->second.end())
2647 iter->second.comment = comment;
2648 }

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

◆ LoadLFGDungeons()

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

Loads dungeons from dbc and adds teleport coords.

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

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

◆ LoadRewards()

void lfg::LFGMgr::LoadRewards ( )

Loads rewards for random dungeons.

Load rewards for completing dungeons.

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

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

Referenced by UpdateProposal().

◆ RBPacketAppendGroup()

void lfg::LFGMgr::RBPacketAppendGroup ( 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.

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

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.

2697 {
2698 return GroupsStore[gguid].RemovePlayer(guid);
2699 }

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)
2038 {
2039 LfgProposal& proposal = itProposal->second;
2040 proposal.state = LFG_PROPOSAL_FAILED;
2041
2042 LOG_DEBUG("lfg", "LFGMgr::RemoveProposal: Proposal {}, state FAILED, UpdateType {}", itProposal->first, type);
2043 // Mark all people that didn't answered as no accept
2045 for (LfgProposalPlayerContainer::iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
2046 if (it->second.accept == LFG_ANSWER_PENDING)
2047 it->second.accept = LFG_ANSWER_DENY;
2048
2049 // pussywizard: add cooldown for not accepting (after 40 secs) or declining
2050 for (LfgProposalPlayerContainer::iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
2051 if (it->second.accept == LFG_ANSWER_DENY)
2052 if (Player* plr = ObjectAccessor::FindPlayer(it->first))
2053 if (Aura* aura = plr->AddAura(LFG_SPELL_DUNGEON_COOLDOWN, plr))
2054 aura->SetDuration(150 * IN_MILLISECONDS);
2055
2056 // Mark players/groups to be removed
2057 LfgGuidSet toRemove;
2058 for (LfgProposalPlayerContainer::iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
2059 {
2060 if (it->second.accept == LFG_ANSWER_AGREE)
2061 continue;
2062
2063 ObjectGuid guid = it->second.group ? it->second.group : it->first;
2064 // Player didn't accept or still pending when no secs left
2065 if (it->second.accept == LFG_ANSWER_DENY || type == LFG_UPDATETYPE_PROPOSAL_FAILED)
2066 {
2067 it->second.accept = LFG_ANSWER_DENY;
2068 toRemove.insert(guid);
2069 }
2070 }
2071
2072 // Notify players
2073 for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
2074 {
2075 ObjectGuid guid = it->first;
2076 ObjectGuid gguid = it->second.group ? it->second.group : guid;
2077
2078 SendLfgUpdateProposal(guid, proposal);
2079
2080 if (toRemove.find(gguid) != toRemove.end()) // Didn't accept or in same group that someone that didn't accept
2081 {
2082 LfgUpdateData updateData;
2083 if (it->second.accept == LFG_ANSWER_DENY)
2084 {
2085 updateData.updateType = type;
2086 LOG_DEBUG("lfg", "LFGMgr::RemoveProposal: [{}] didn't accept. Removing from queue and compatible cache", guid.ToString());
2087 }
2088 else
2089 {
2090 updateData.updateType = LFG_UPDATETYPE_REMOVED_FROM_QUEUE;
2091 LOG_DEBUG("lfg", "LFGMgr::RemoveProposal: [{}] in same group that someone that didn't accept. Removing from queue and compatible cache", guid.ToString());
2092 }
2093
2094 RestoreState(guid, "Proposal Fail (didn't accepted or in group with someone that didn't accept");
2095 if (gguid != guid)
2096 {
2097 RestoreState(it->second.group, "Proposal Fail (someone in group didn't accepted)");
2098 SendLfgUpdateParty(guid, updateData);
2099 }
2100 else
2101 SendLfgUpdatePlayer(guid, updateData);
2102 }
2103 else
2104 {
2105 LOG_DEBUG("lfg", "LFGMgr::RemoveProposal: Readding [{}] to queue.", guid.ToString());
2107 if (gguid != guid)
2108 {
2109 SetState(gguid, LFG_STATE_QUEUED);
2111 }
2112 else
2114 }
2115 }
2116
2117 LFGQueue& queue = GetQueue(proposal.players.begin()->first);
2118 // Remove players/groups from queue
2119 for (LfgGuidSet::const_iterator it = toRemove.begin(); it != toRemove.end(); ++it)
2120 {
2121 ObjectGuid guid = *it;
2122 queue.RemoveFromQueue(guid);
2123 proposal.queues.remove(guid);
2124 }
2125
2126 // Readd to queue
2127 for (uint8 i = 0; i < 5 && proposal.queues.guids[i]; ++i)
2128 {
2129 // xinef: this will work as data is not deleted, only references to this data are cleared
2130 // xinef: when new proposal is created
2131 // xinef: successful proposal is also taken into account is similar manner
2132 queue.AddToQueue(proposal.queues.guids[i], true);
2133 }
2134
2135 ProposalsStore.erase(itProposal);
2136 }
constexpr auto IN_MILLISECONDS
Definition Common.h:53
Definition SpellAuras.h:87
void RestoreState(ObjectGuid guid, char const *debugMsg)
Definition LFGMgr.cpp:2563
std::string const & GetComment(ObjectGuid gguid)
Get current player comment (used for LFR)
Definition LFGMgr.cpp:2538
void SendLfgUpdateProposal(ObjectGuid guid, LfgProposal const &proposal)
Definition LFGMgr.cpp:2809
@ 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
2564 {
2565 if (guid.IsGroup())
2566 {
2567 LfgGroupData& data = GroupsStore[guid];
2568 /*if (sLog->ShouldLog(LOG_FILTER_LFG, LOG_LEVEL_DEBUG))
2569 {
2570 std::string const& ps = GetStateString(data.GetState());
2571 std::string const& os = GetStateString(data.GetOldState());
2572 LOG_TRACE("lfg", "LFGMgr::RestoreState: Group: [{}] ({}) State: {}, oldState: {}",
2573 guid.ToString(), debugMsg, ps, os);
2574 }*/
2575
2576 data.RestoreState();
2577 }
2578 else
2579 {
2580 LfgPlayerData& data = PlayersStore[guid];
2581 /*if (sLog->ShouldLog(LOG_FILTER_LFG, LOG_LEVEL_DEBUG))
2582 {
2583 std::string const& ps = GetStateString(data.GetState());
2584 std::string const& os = GetStateString(data.GetOldState());
2585 LOG_TRACE("lfg", "LFGMgr::RestoreState: Player: [{}] ({}) State: {}, oldState: {}",
2586 guid.ToString(), debugMsg, ps, os);
2587 }*/
2588 data.RestoreState();
2589 }
2590 }

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.

2918 {
2919 if (GetState(guid) != LFG_STATE_NONE)
2920 {
2921 LfgDungeonSet const& dungeons = GetSelectedDungeons(guid);
2922 if (!dungeons.empty())
2923 {
2924 LFGDungeonData const* dungeon = GetLFGDungeon(*dungeons.begin());
2925 if (dungeon && (dungeon->type == LFG_TYPE_RANDOM || dungeon->seasonal))
2926 return true;
2927 }
2928 }
2929
2930 return false;
2931 }

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
2804 {
2805 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2806 player->GetSession()->SendLfgBootProposalUpdate(boot);
2807 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendLfgJoinResult()

void lfg::LFGMgr::SendLfgJoinResult ( ObjectGuid  guid,
LfgJoinResultData const &  data 
)
private
2798 {
2799 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2800 player->GetSession()->SendLfgJoinResult(data);
2801 }

References ObjectAccessor::FindConnectedPlayer().

Referenced by Update(), and UpdateRoleCheck().

◆ SendLfgQueueStatus()

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

Sends queue status to player.

2816 {
2817 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2818 player->GetSession()->SendLfgQueueStatus(data);
2819 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendLfgRoleCheckUpdate()

void lfg::LFGMgr::SendLfgRoleCheckUpdate ( ObjectGuid  guid,
LfgRoleCheck const &  roleCheck 
)
private
2780 {
2781 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2782 player->GetSession()->SendLfgRoleCheckUpdate(roleCheck);
2783 }

References ObjectAccessor::FindConnectedPlayer().

Referenced by Update(), and UpdateRoleCheck().

◆ SendLfgRoleChosen()

void lfg::LFGMgr::SendLfgRoleChosen ( ObjectGuid  guid,
ObjectGuid  pguid,
uint8  roles 
)
private
2774 {
2775 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2776 player->GetSession()->SendLfgRoleChosen(pguid, roles);
2777 }

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

Referenced by UpdateRoleCheck().

◆ SendLfgUpdateParty()

void lfg::LFGMgr::SendLfgUpdateParty ( ObjectGuid  guid,
LfgUpdateData const &  data 
)
private
2792 {
2793 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2794 player->GetSession()->SendLfgUpdateParty(data);
2795 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendLfgUpdatePlayer()

void lfg::LFGMgr::SendLfgUpdatePlayer ( ObjectGuid  guid,
LfgUpdateData const &  data 
)
private
2786 {
2787 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2788 player->GetSession()->SendLfgUpdatePlayer(data);
2789 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendLfgUpdateProposal()

void lfg::LFGMgr::SendLfgUpdateProposal ( ObjectGuid  guid,
LfgProposal const &  proposal 
)
private
2810 {
2811 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2812 player->GetSession()->SendLfgUpdateProposal(proposal);
2813 }

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:5701
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
2615 {
2616 PlayersStore[guid].SetCanOverrideRBState(val);
2617 }

References PlayersStore.

Referenced by LeaveLfg().

◆ SetComment()

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

Sets player lfr comment.

2632 {
2633 LOG_DEBUG("lfg", "LFGMgr::SetComment: [{}] comment: {}", guid.ToString(), comment);
2634 PlayersStore[guid].SetComment(comment);
2635 }

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

Referenced by JoinLfg().

◆ SetDungeon()

void lfg::LFGMgr::SetDungeon ( ObjectGuid  guid,
uint32  dungeon 
)
2620 {
2621 LOG_DEBUG("lfg", "LFGMgr::SetDungeon: [{}] dungeon {}", guid.ToString(), dungeon);
2622 GroupsStore[guid].SetDungeon(dungeon);
2623 }

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.

2737 {
2738 PlayersStore[guid].SetGroup(group);
2739 }

References PlayersStore.

Referenced by RemoveGroupData(), and SetupGroupMember().

◆ SetLeader()

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

Sets the leader of the group.

2719 {
2720 GroupsStore[gguid].SetLeader(leader);
2721 }

References GroupsStore.

Referenced by _LoadFromDB().

◆ SetLockedDungeons()

void lfg::LFGMgr::SetLockedDungeons ( ObjectGuid  guid,
LfgLockMap const &  lock 
)
private
2657 {
2658 LOG_DEBUG("lfg", "LFGMgr::SetLockedDungeons: [{}]", guid.ToString());
2659 PlayersStore[guid].SetLockedDungeons(lock);
2660 }

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

Referenced by InitializeLockedDungeons().

◆ SetOptions()

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

Sets new lfg options.

2881 {
2882 m_options = options;
2883 }

References m_options.

◆ SetRandomPlayersCount()

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

Xinef: Set Random Players Count.

2757 {
2758 PlayersStore[guid].SetRandomPlayersCount(count);
2759 }

References PlayersStore.

Referenced by MakeNewGroup().

◆ SetRoles()

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

Sets player lfg roles.

2626 {
2627 LOG_DEBUG("lfg", "LFGMgr::SetRoles: [{}] roles: {}", guid.ToString(), roles);
2628 PlayersStore[guid].SetRoles(roles);
2629 }

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

Referenced by JoinLfg(), and UpdateRoleCheck().

◆ SetSelectedDungeons()

void lfg::LFGMgr::SetSelectedDungeons ( ObjectGuid  guid,
LfgDungeonSet const &  dungeons 
)
private
2651 {
2652 LOG_DEBUG("lfg", "LFGMgr::SetLockedDungeons: [{}]", guid.ToString());
2653 PlayersStore[guid].SetSelectedDungeons(dungeons);
2654 }

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

Referenced by JoinLfg(), and SetupGroupMember().

◆ SetState()

void lfg::LFGMgr::SetState ( ObjectGuid  guid,
LfgState  state 
)
private
2593 {
2594 if (guid.IsGroup())
2595 {
2596 LfgGroupData& data = GroupsStore[guid];
2597 std::string ns = GetStateString(state);
2598 std::string ps = GetStateString(data.GetState());
2599 std::string os = GetStateString(data.GetOldState());
2600 LOG_DEBUG("lfg", "LFGMgr::SetState: Group: [{}] newState: {}, previous: {}, oldState: {}", guid.ToString(), ns, ps, os);
2601 data.SetState(state);
2602 }
2603 else
2604 {
2605 LfgPlayerData& data = PlayersStore[guid];
2606 std::string ns = GetStateString(state);
2607 std::string ps = GetStateString(data.GetState());
2608 std::string os = GetStateString(data.GetOldState());
2609 LOG_DEBUG("lfg", "LFGMgr::SetState: Player: [{}] newState: {}, previous: {}, oldState: {}", guid.ToString(), ns, ps, os);
2610 data.SetState(state);
2611 }
2612 }
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.

2724 {
2726 teamId = TEAM_ALLIANCE; // @Not Sure About That TeamId is supposed to be uint8 Team = 0(@TrinityCore)
2727
2728 PlayersStore[guid].SetTeam(teamId);
2729 }
@ 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.

2908 {
2909 LfgDungeonSet dungeons;
2910 dungeons.insert(GetDungeon(gguid));
2911 SetSelectedDungeons(guid, dungeons);
2912 SetState(guid, GetState(gguid));
2913 SetGroup(guid, gguid);
2914 AddPlayerToGroup(gguid, guid);
2915 }
void AddPlayerToGroup(ObjectGuid gguid, ObjectGuid guid)
Adds player to group.
Definition LFGMgr.cpp:2701

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)
2244 {
2245 LFGDungeonData const* dungeon = nullptr;
2246 Group* group = player->GetGroup();
2247
2248 if (group && group->isLFGGroup())
2249 dungeon = GetLFGDungeon(GetDungeon(group->GetGUID()));
2250
2251 if (!dungeon)
2252 {
2254 return;
2255 }
2256
2258
2259 if (!player->IsAlive())
2260 {
2262 }
2263 else if (player->IsFalling() || player->HasUnitState(UNIT_STATE_JUMPING))
2264 {
2266 }
2267 else if (player->IsMirrorTimerActive(FATIGUE_TIMER))
2268 {
2270 }
2271 else if (player->GetVehicle())
2272 {
2274 }
2275 else if (player->GetCharmGUID() || player->IsInCombat())
2276 {
2278 }
2279 else if (out && error == LFG_TELEPORTERROR_OK)
2280 {
2281 if (player->GetMapId() == uint32(dungeon->map))
2282 player->TeleportToEntryPoint();
2283
2284 return;
2285 }
2286 else
2287 {
2288 uint32 mapid = dungeon->map;
2289 float x = dungeon->x;
2290 float y = dungeon->y;
2291 float z = dungeon->z;
2292 float orientation = dungeon->o;
2293
2294 if (teleportLocation)
2295 {
2296 teleportLocation->GetWorldLocation(mapid, x, y, z, orientation);
2297 }
2298
2299 if (!player->GetMap()->IsDungeon() || player->GetEntryPoint().GetMapId() == MAPID_INVALID)
2300 {
2301 player->SetEntryPoint();
2302 }
2303
2304 if (!player->TeleportTo(mapid, x, y, z, orientation, 0, nullptr, mapid == player->GetMapId()))
2305 {
2307 }
2308 }
2309
2310 if (error != LFG_TELEPORTERROR_OK)
2311 {
2312 player->GetSession()->SendLfgTeleportError(uint8(error));
2313
2314 LOG_DEBUG("lfg", "Player [{}] could NOT be teleported in to map [{}] (x: {}, y: {}, z: {}) Error: {}",
2315 player->GetName(), dungeon->map, dungeon->x, dungeon->y, dungeon->z, error);
2316 }
2317 else
2318 {
2319 LOG_DEBUG("lfg", "Player [{}] is being teleported in to map [{}] (x: {}, y: {}, z: {})",
2320 player->GetName(), dungeon->map, dungeon->x, dungeon->y, dungeon->z);
2321 }
2322
2323 }
@ 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:11292
bool IsMirrorTimerActive(MirrorTimerType type)
Definition Player.h:2085
bool TeleportToEntryPoint()
Definition Player.cpp:1600
WorldLocation const & GetEntryPoint() const
Definition Player.h:2419
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:1930
bool IsAlive() const
Definition Unit.h:1797
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:636
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:1423
@ LANG_DEBUG_LFG_OFF
Definition Language.h:1424
@ LANG_DEBUG_LFG_CONF
Definition Language.h:1425
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:2779
void SendLfgJoinResult(ObjectGuid guid, LfgJoinResultData const &data)
Definition LFGMgr.cpp:2797
bool isOptionEnabled(uint32 option)
Checks if given lfg option is enabled.
Definition LFGMgr.cpp:2870
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:1934
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
2181 {
2182 ObjectGuid gguid = GetGroup(guid);
2183 if (!gguid)
2184 return;
2185
2186 LfgPlayerBootContainer::iterator itBoot = BootsStore.find(gguid);
2187 if (itBoot == BootsStore.end())
2188 return;
2189
2190 LfgPlayerBoot& boot = itBoot->second;
2191
2192 if (boot.votes[guid] != LFG_ANSWER_PENDING) // Cheat check: Player can't vote twice
2193 return;
2194
2195 boot.votes[guid] = LfgAnswer(accept);
2196
2197 uint8 votesNum = 0;
2198 uint8 agreeNum = 0;
2199 for (LfgAnswerContainer::const_iterator itVotes = boot.votes.begin(); itVotes != boot.votes.end(); ++itVotes)
2200 {
2201 if (itVotes->second != LFG_ANSWER_PENDING)
2202 {
2203 ++votesNum;
2204 if (itVotes->second == LFG_ANSWER_AGREE)
2205 ++agreeNum;
2206 }
2207 }
2208
2209 // if we don't have enough votes (agree or deny) do nothing
2210 if (agreeNum < LFG_GROUP_KICK_VOTES_NEEDED && (votesNum - agreeNum) < LFG_GROUP_KICK_VOTES_NEEDED)
2211 return;
2212
2213 // Send update info to all players
2214 boot.inProgress = false;
2215 for (LfgAnswerContainer::const_iterator itVotes = boot.votes.begin(); itVotes != boot.votes.end(); ++itVotes)
2216 {
2217 ObjectGuid pguid = itVotes->first;
2218 if (pguid != boot.victim)
2219 {
2221 SendLfgBootProposalUpdate(pguid, boot);
2222 }
2223 }
2224
2226 if (agreeNum == LFG_GROUP_KICK_VOTES_NEEDED) // Vote passed - Kick player
2227 {
2228 if (Group* group = sGroupMgr->GetGroupByGUID(gguid.GetCounter()))
2230
2231 DecreaseKicksLeft(gguid);
2232 }
2233 BootsStore.erase(itBoot);
2234 }
@ 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:2662
@ 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
1935 {
1936 // Check if the proposal exists
1937 LfgProposalContainer::iterator itProposal = ProposalsStore.find(proposalId);
1938 if (itProposal == ProposalsStore.end())
1939 return;
1940
1941 LfgProposal& proposal = itProposal->second;
1942
1943 // Check if proposal have the current player
1944 LfgProposalPlayerContainer::iterator itProposalPlayer = proposal.players.find(guid);
1945 if (itProposalPlayer == proposal.players.end())
1946 return;
1947
1948 LfgProposalPlayer& player = itProposalPlayer->second;
1949 player.accept = LfgAnswer(accept);
1950
1951 LOG_DEBUG("lfg", "LFGMgr::UpdateProposal: Player [{}] of proposal {} selected: {}", guid.ToString(), proposalId, accept);
1952 if (!accept)
1953 {
1955 return;
1956 }
1957
1958 // check if all have answered and reorder players (leader first)
1959 bool allAnswered = true;
1960 for (LfgProposalPlayerContainer::const_iterator itPlayers = proposal.players.begin(); itPlayers != proposal.players.end(); ++itPlayers)
1961 if (itPlayers->second.accept != LFG_ANSWER_AGREE) // No answer (-1) or not accepted (0)
1962 allAnswered = false;
1963
1964 if (!m_Testing && !allAnswered)
1965 {
1966 for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
1967 SendLfgUpdateProposal(it->first, proposal);
1968
1969 return;
1970 }
1971
1972 bool sendUpdate = proposal.state != LFG_PROPOSAL_SUCCESS;
1973 proposal.state = LFG_PROPOSAL_SUCCESS;
1974 time_t joinTime = GameTime::GetGameTime().count();
1975
1976 LFGQueue& queue = GetQueue(guid);
1977 LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_GROUP_FOUND);
1978 for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
1979 {
1980 ObjectGuid pguid = it->first;
1981 ObjectGuid gguid = it->second.group;
1982 uint32 dungeonId = (*GetSelectedDungeons(pguid).begin());
1983 int32 waitTime = -1;
1984 if (sendUpdate)
1985 SendLfgUpdateProposal(pguid, proposal);
1986
1987 if (gguid)
1988 {
1989 waitTime = int32((joinTime - queue.GetJoinTime(gguid)) / IN_MILLISECONDS);
1990 SendLfgUpdateParty(pguid, updateData);
1991 }
1992 else
1993 {
1994 waitTime = int32((joinTime - queue.GetJoinTime(pguid)) / IN_MILLISECONDS);
1995 SendLfgUpdatePlayer(pguid, updateData);
1996 }
1997 updateData.updateType = LFG_UPDATETYPE_REMOVED_FROM_QUEUE;
1998 SendLfgUpdatePlayer(pguid, updateData);
1999 SendLfgUpdateParty(pguid, updateData);
2000
2001 // Update timers
2002 uint8 role = GetRoles(pguid);
2003 role &= ~PLAYER_ROLE_LEADER;
2004 switch (role)
2005 {
2006 case PLAYER_ROLE_DAMAGE:
2007 queue.UpdateWaitTimeDps(waitTime, dungeonId);
2008 break;
2009 case PLAYER_ROLE_HEALER:
2010 queue.UpdateWaitTimeHealer(waitTime, dungeonId);
2011 break;
2012 case PLAYER_ROLE_TANK:
2013 queue.UpdateWaitTimeTank(waitTime, dungeonId);
2014 break;
2015 default:
2016 queue.UpdateWaitTimeAvg(waitTime, dungeonId);
2017 break;
2018 }
2019
2021 }
2022
2023 // Remove players/groups from Queue
2024 for (uint8 i = 0; i < 5 && proposal.queues.guids[i]; ++i)
2025 queue.RemoveQueueData(proposal.queues.guids[i]);
2026
2027 MakeNewGroup(proposal);
2028 ProposalsStore.erase(itProposal);
2029 }
std::int32_t int32
Definition Define.h:103
uint8 GetRoles(ObjectGuid guid)
Get current player roles.
Definition LFGMgr.cpp:2531
void MakeNewGroup(LfgProposal const &proposal)
Definition LFGMgr.cpp:1687
@ 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:249
MemberSlotList::const_iterator member_citerator
Definition Group.h:187
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:15525
float GetAverageItemLevel()
Definition Player.cpp:15966
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:9806
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition Unit.cpp:12324
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition Unit.cpp:3808
uint32 GetMaxHealth() const
Definition Unit.h:1109
uint8 getClass() const
Definition Unit.h:843
uint8 getRace(bool original=false) const
Definition Unit.cpp:17078
uint32 GetMaxPower(Powers power) const
Definition Unit.h:1136
uint32 GetArmor() const
Definition Unit.h:1157
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:9049
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 LfgRoleCheckContainer::iterator itRoleCheck = RoleChecksStore.find(gguid);
1508 if (itRoleCheck == RoleChecksStore.end())
1509 return;
1510
1511 LfgRoleCheck& roleCheck = itRoleCheck->second;
1512 bool sendRoleChosen = roleCheck.state != LFG_ROLECHECK_DEFAULT && guid;
1513
1514 if (!guid)
1515 roleCheck.state = LFG_ROLECHECK_ABORTED;
1516 else if (roles < PLAYER_ROLE_TANK) // Player selected no role.
1517 roleCheck.state = LFG_ROLECHECK_NO_ROLE;
1518 else
1519 {
1520 roleCheck.roles[guid] = roles;
1521
1522 // Check if all players have selected a role
1523 LfgRolesMap::const_iterator itRoles = roleCheck.roles.begin();
1524 while (itRoles != roleCheck.roles.end() && itRoles->second != PLAYER_ROLE_NONE)
1525 ++itRoles;
1526
1527 if (itRoles == roleCheck.roles.end())
1528 {
1529 roleCheck.state = CheckGroupRoles(roleCheck.roles) ? LFG_ROLECHECK_FINISHED : LFG_ROLECHECK_WRONG_ROLES;
1530 }
1531 }
1532
1533 LfgDungeonSet dungeons;
1534 if (roleCheck.rDungeonId)
1535 dungeons.insert(roleCheck.rDungeonId);
1536 else
1537 dungeons = roleCheck.dungeons;
1538
1539 LfgJoinResultData joinData = LfgJoinResultData(LFG_JOIN_FAILED, roleCheck.state);
1540 for (LfgRolesMap::const_iterator it = roleCheck.roles.begin(); it != roleCheck.roles.end(); ++it)
1541 {
1542 ObjectGuid pguid = it->first;
1543
1544 if (sendRoleChosen)
1545 SendLfgRoleChosen(pguid, guid, roles);
1546
1547 SendLfgRoleCheckUpdate(pguid, roleCheck);
1548 switch (roleCheck.state)
1549 {
1551 continue;
1553 SetState(pguid, LFG_STATE_QUEUED);
1554 SetRoles(pguid, it->second);
1555 SendLfgUpdateParty(pguid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, dungeons, GetComment(pguid)));
1556 break;
1557 default:
1558 if (roleCheck.leader == pguid)
1559 SendLfgJoinResult(pguid, joinData);
1561 RestoreState(pguid, "Rolecheck Failed");
1562 break;
1563 }
1564 }
1565
1566 if (roleCheck.state == LFG_ROLECHECK_FINISHED)
1567 {
1568 SetState(gguid, LFG_STATE_QUEUED);
1569 LFGQueue& queue = GetQueue(gguid);
1570 queue.AddQueueData(gguid, time_t(GameTime::GetGameTime().count()), roleCheck.dungeons, roleCheck.roles);
1571 RoleChecksStore.erase(itRoleCheck);
1572 }
1573 else if (roleCheck.state != LFG_ROLECHECK_INITIALITING)
1574 {
1575 RestoreState(gguid, "Rolecheck Failed");
1576 RoleChecksStore.erase(itRoleCheck);
1577 }
1578 }
void SendLfgRoleChosen(ObjectGuid guid, ObjectGuid pguid, uint8 roles)
Definition LFGMgr.cpp:2773
@ 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: