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
46 {
47 for (uint8 team = 0; team < 2; ++team)
48 {
49 m_raidBrowserUpdateTimer[team] = 10000;
51 }
52 }
std::uint8_t uint8
Definition Define.h:109
@ CONFIG_LFG_OPTIONSMASK
Definition WorldConfig.h:323
@ CONFIG_DEBUG_LFG
Definition WorldConfig.h:126
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:316

References m_raidBrowserLastUpdatedDungeonId, and m_raidBrowserUpdateTimer.

◆ ~LFGMgr()

lfg::LFGMgr::~LFGMgr ( )
private
55 {
56 for (LfgRewardContainer::iterator itr = RewardMapStore.begin(); itr != RewardMapStore.end(); ++itr)
57 delete itr->second;
58 }
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.

67 {
68 if (!fields)
69 return;
70
71 if (!guid.IsGroup())
72 return;
73
74 SetLeader(guid, ObjectGuid::Create<HighGuid::Player>(fields[0].Get<uint32>()));
75
76 uint32 dungeon = fields[17].Get<uint32>();
77 uint8 state = fields[18].Get<uint8>();
78
79 if (!dungeon || !state)
80 return;
81
82 SetDungeon(guid, dungeon);
83
84 switch (state)
85 {
88 SetState(guid, (LfgState)state);
89 break;
90 default:
91 break;
92 }
93 }
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:2594
void SetState(ObjectGuid guid, LfgState state)
Definition LFGMgr.cpp:2567
void SetLeader(ObjectGuid gguid, ObjectGuid leader)
Sets the leader of the group.
Definition LFGMgr.cpp:2693
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
96 {
97 if (!guid.IsGroup())
98 return;
99
101 stmt->SetData(0, guid.GetCounter());
102 stmt->SetData(1, GetDungeon(guid));
103 stmt->SetData(2, GetState(guid));
104 CharacterDatabase.Execute(stmt);
105 }
@ CHAR_REP_LFG_DATA
Definition CharacterDatabase.h:326
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:2463
uint32 GetDungeon(ObjectGuid guid, bool asId=true)
Get current dungeon.
Definition LFGMgr.cpp:2487

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
169 {
171 return;
172
173 DungeonCooldownStore[guid][dungeonId] = GameTime::Now();
174 }
@ 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.

2682 {
2683 const LfgDungeonSet& dungeons = GetSelectedDungeons(guid);
2684 if (dungeons.empty())
2685 return;
2686
2687 uint32 dungeonId = *dungeons.begin();
2688 LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId);
2689 if (dungeon && (dungeon->type == LFG_TYPE_RANDOM))
2690 GroupsStore[gguid].AddRandomQueuedPlayer(guid);
2691 }
LFGDungeonData const * GetLFGDungeon(uint32 id)
Definition LFGMgr.cpp:249
LfgGroupDataContainer GroupsStore
Group data.
Definition LFGMgr.h:641
LfgDungeonSet const & GetSelectedDungeons(ObjectGuid guid)
Get selected dungeons.
Definition LFGMgr.cpp:2519
@ 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.

2677 {
2678 GroupsStore[gguid].AddPlayer(guid);
2679 }

References GroupsStore.

Referenced by SetupGroupMember().

◆ AddProposal()

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

Add a new Proposal.

1896 {
1897 proposal.id = ++m_lfgProposalId;
1898 ProposalsStore[m_lfgProposalId] = proposal;
1899 return m_lfgProposalId;
1900 }
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.

2819 {
2820 bool ok = true;
2821
2822 if (check.empty())
2823 return false;
2824
2825 for (uint8 i = 0; i < 5 && check.guids[i]; ++i)
2826 {
2827 ObjectGuid guid = check.guids[i];
2828 if (GetState(guid) != LFG_STATE_QUEUED)
2829 {
2830 LFGQueue& queue = GetQueue(guid);
2831 queue.RemoveFromQueue(guid);
2832 ok = false;
2833 }
2834 }
2835
2836 return ok;
2837 }
Definition ObjectGuid.h:118
LFGQueue & GetQueue(ObjectGuid guid)
Definition LFGMgr.cpp:2801
@ 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.

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

2841 {
2842 QueuesStore.clear();
2843 }
LfgQueueContainer QueuesStore
Queues.
Definition LFGMgr.h:631

References QueuesStore.

◆ CleanupDungeonCooldowns()

void lfg::LFGMgr::CleanupDungeonCooldowns ( )
private
177 {
179 return;
180
181 Seconds cooldownDuration = GetDungeonCooldownDuration();
182
183 for (auto itPlayer = DungeonCooldownStore.begin(); itPlayer != DungeonCooldownStore.end(); )
184 {
185 for (auto itDungeon = itPlayer->second.begin(); itDungeon != itPlayer->second.end(); )
186 {
187 if (GameTime::HasElapsed(itDungeon->second, cooldownDuration))
188 itDungeon = itPlayer->second.erase(itDungeon);
189 else
190 ++itDungeon;
191 }
192
193 if (itPlayer->second.empty())
194 itPlayer = DungeonCooldownStore.erase(itPlayer);
195 else
196 ++itPlayer;
197 }
198 }
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition Duration.h:30
Seconds GetDungeonCooldownDuration() const
Definition LFGMgr.cpp:205
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.

201 {
202 DungeonCooldownStore.clear();
203 }

References DungeonCooldownStore.

◆ ClearState()

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

◆ DecreaseKicksLeft()

void lfg::LFGMgr::DecreaseKicksLeft ( ObjectGuid  guid)
private
2638 {
2639 LOG_DEBUG("lfg", "LFGMgr::DecreaseKicksLeft: [{}]", guid.ToString());
2640 GroupsStore[guid].DecreaseKicksLeft();
2641 }
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
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.

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

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

2514 {
2515 LOG_DEBUG("lfg", "LFGMgr::GetComment: [{}] = {}", guid.ToString(), PlayersStore[guid].GetComment());
2516 return PlayersStore[guid].GetComment();
2517 }
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
1581 {
1582 lockMap.clear();
1583 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end() && !dungeons.empty(); ++it)
1584 {
1585 ObjectGuid guid = (*it);
1586 LfgLockMap const& cachedLockMap = GetLockedDungeons(guid);
1587 for (LfgLockMap::const_iterator it2 = cachedLockMap.begin(); it2 != cachedLockMap.end() && !dungeons.empty(); ++it2)
1588 {
1589 uint32 dungeonId = (it2->first & 0x00FFFFFF); // Compare dungeon ids
1590
1591 LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId);
1592
1593 uint8 difficultyFlag = (randomDungeonId == RANDOM_DUNGEON_NORMAL_TBC || randomDungeonId == RANDOM_DUNGEON_NORMAL_WOTLK) ? 0 : 1;
1594
1595 if (dungeon && !IsDungeonDisabled(dungeon->map, (Difficulty)difficultyFlag) && it2->second == LFG_LOCKSTATUS_RAID_LOCKED && randomDungeonId && sWorld->getBoolConfig(CONFIG_LFG_ALLOW_COMPLETED))
1596 continue;
1597
1598 LfgDungeonSet::iterator itDungeon = dungeons.find(dungeonId);
1599 if (itDungeon != dungeons.end())
1600 {
1601 dungeons.erase(itDungeon);
1602 lockMap[guid][dungeonId] = it2->second;
1603 }
1604 }
1605 }
1606 if (!dungeons.empty())
1607 lockMap.clear();
1608 }
Difficulty
Definition DBCEnums.h:266
@ CONFIG_LFG_ALLOW_COMPLETED
Definition WorldConfig.h:99
bool IsDungeonDisabled(uint32 mapId, Difficulty difficulty) const
Checks if given dungeon map is disabled.
Definition LFGMgr.cpp:2943
LfgLockMap const & GetLockedDungeons(ObjectGuid guid)
Get locked dungeons.
Definition LFGMgr.cpp:2525
@ 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.

2488 {
2489 uint32 dungeon = GroupsStore[guid].GetDungeon(asId);
2490 LOG_DEBUG("lfg", "LFGMgr::GetDungeon: [{}] asId: {} = {}", guid.ToString(), asId, dungeon);
2491 return dungeon;
2492 }

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

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

◆ GetDungeonCooldownDuration()

Seconds lfg::LFGMgr::GetDungeonCooldownDuration ( ) const
private
206 {
208 }
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.

2495 {
2496 uint32 dungeonId = GroupsStore[guid].GetDungeon(true);
2497 uint32 mapId = 0;
2498 if (dungeonId)
2499 if (LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId))
2500 mapId = dungeon->map;
2501
2502 LOG_DEBUG("lfg", "LFGMgr::GetDungeonMapId: [{}] = {} (DungeonId = {})", guid.ToString(), mapId, dungeonId);
2503 return mapId;
2504 }

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.
2420 {
2421 LFGDungeonData const* dungeon = GetLFGDungeon(randomdungeon);
2422 uint32 group = dungeon ? dungeon->group : 0;
2423 return CachedDungeonMapStore[group];
2424 }
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
2455 {
2456 LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId);
2457 if (!dungeon)
2458 return LFG_TYPE_NONE;
2459
2460 return LfgType(dungeon->type);
2461 }
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.

2707 {
2708 return PlayersStore[guid].GetGroup();
2709 }

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.

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

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

◆ GetLeader()

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

Get leader of the group (using internal data)

2727 {
2728 return GroupsStore[guid].GetLeader();
2729 }

References GroupsStore.

Referenced by GetQueue(), and LeaveLfg().

◆ GetLFGDungeon()

LFGDungeonData const * lfg::LFGMgr::GetLFGDungeon ( uint32  id)
private
250 {
251 LFGDungeonContainer::const_iterator itr = LfgDungeonStore.find(id);
252 if (itr != LfgDungeonStore.end())
253 return &(itr->second);
254
255 return nullptr;
256 }
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.

2922 {
2923 if (id)
2924 if (LFGDungeonData const* dungeon = GetLFGDungeon(id))
2925 return dungeon->Entry();
2926
2927 return 0;
2928 }

References GetLFGDungeon().

Referenced by LoadRewards().

◆ GetLfgStatus()

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

Returns current lfg status.

2861 {
2862 LfgPlayerData& playerData = PlayersStore[guid];
2863 return LfgUpdateData(LFG_UPDATETYPE_UPDATE_STATUS, playerData.GetState(), playerData.GetSelectedDungeons());
2864 }
@ 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.

2526 {
2527 LOG_DEBUG("lfg", "LFGMgr::GetLockedDungeons: [{}]", guid.ToString());
2528 return PlayersStore[guid].GetLockedDungeons();
2529 }

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)

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

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

◆ GetOptions()

uint32 lfg::LFGMgr::GetOptions ( )

Gets current lfg options.

2851 {
2852 return m_options;
2853 }

References m_options.

◆ GetPlayerCount()

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

Gets the player count of given group.

2722 {
2723 return GroupsStore[guid].GetPlayerCount();
2724 }

References GroupsStore.

◆ GetPlayers()

LfgGuidSet const & lfg::LFGMgr::GetPlayers ( ObjectGuid  guid)
private
2717 {
2718 return GroupsStore[guid].GetPlayers();
2719 }

References GroupsStore.

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

◆ GetQueue()

LFGQueue & lfg::LFGMgr::GetQueue ( ObjectGuid  guid)
private
2802 {
2803 uint8 queueId = 0;
2804 if (guid.IsGroup())
2805 {
2806 LfgGuidSet const& players = GetPlayers(guid);
2807 ObjectGuid pguid = players.empty() ? ObjectGuid::Empty : (*players.begin());
2808 if (pguid)
2809 queueId = GetTeam(pguid);
2810 else
2811 queueId = GetTeam(GetLeader(guid));
2812 }
2813 else
2814 queueId = GetTeam(guid);
2815 return QueuesStore[queueId];
2816 }
static ObjectGuid const Empty
Definition ObjectGuid.h:120
ObjectGuid GetLeader(ObjectGuid guid)
Get leader of the group (using internal data)
Definition LFGMgr.cpp:2726
TeamId GetTeam(ObjectGuid guid)
Definition LFGMgr.cpp:2666

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.

2931 {
2932 LfgDungeonSet randomDungeons;
2933 for (lfg::LFGDungeonContainer::const_iterator itr = LfgDungeonStore.begin(); itr != LfgDungeonStore.end(); ++itr)
2934 {
2935 lfg::LFGDungeonData const& dungeon = itr->second;
2936 if ((dungeon.type == lfg::LFG_TYPE_RANDOM || (dungeon.seasonal && sLFGMgr->IsSeasonActive(dungeon.id)))
2937 && dungeon.expansion <= expansion && dungeon.minlevel <= level && level <= dungeon.maxlevel)
2938 randomDungeons.insert(dungeon.Entry());
2939 }
2940 return randomDungeons;
2941 }
#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
2434 {
2435 LfgReward const* rew = nullptr;
2436 LfgRewardContainerBounds bounds = RewardMapStore.equal_range(dungeon & 0x00FFFFFF);
2437 for (LfgRewardContainer::const_iterator itr = bounds.first; itr != bounds.second; ++itr)
2438 {
2439 rew = itr->second;
2440 // ordered properly at loading
2441 if (itr->second->maxLevel >= level)
2442 break;
2443 }
2444
2445 return rew;
2446 }
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.

2737 {
2738 return PlayersStore[guid].GetRandomPlayersCount();
2739 }

References PlayersStore.

Referenced by FinishDungeon().

◆ GetRoles()

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

Get current player roles.

2507 {
2508 uint8 roles = PlayersStore[guid].GetRoles();
2509 LOG_DEBUG("lfg", "LFGMgr::GetRoles: [{}] = {}", guid.ToString(), roles);
2510 return roles;
2511 }

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

Referenced by UpdateProposal().

◆ GetSelectedDungeons()

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

Get selected dungeons.

2520 {
2521 LOG_DEBUG("lfg", "LFGMgr::GetSelectedDungeons: [{}]", guid.ToString());
2522 return PlayersStore[guid].GetSelectedDungeons();
2523 }

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.

2464 {
2465 LfgState state;
2466 if (guid.IsGroup())
2467 state = GroupsStore[guid].GetState();
2468 else
2469 state = PlayersStore[guid].GetState();
2470
2471 LOG_DEBUG("lfg", "LFGMgr::GetState: [{}] = {}", guid.ToString(), state);
2472 return state;
2473 }

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
2667 {
2668 return PlayersStore[guid].GetTeam();
2669 }

References PlayersStore.

Referenced by GetQueue().

◆ HasIgnore()

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

Checks if given players are ignoring each other.

2742 {
2745 return plr1 && plr2 && (plr1->GetSocial()->HasIgnore(guid2) || plr2->GetSocial()->HasIgnore(guid1));
2746 }
bool HasIgnore(ObjectGuid const &ignore_guid) const
Definition SocialMgr.cpp:193
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
2122 {
2123 SetState(gguid, LFG_STATE_BOOT);
2124
2125 LfgPlayerBoot& boot = BootsStore[gguid];
2126 boot.inProgress = true;
2127 boot.cancelTime = time_t(GameTime::GetGameTime().count()) + LFG_TIME_BOOT;
2128 boot.reason = reason;
2129 boot.victim = victim;
2130
2131 LfgGuidSet const& players = GetPlayers(gguid);
2132
2133 // Set votes
2134 for (LfgGuidSet::const_iterator itr = players.begin(); itr != players.end(); ++itr)
2135 {
2136 ObjectGuid guid = (*itr);
2137 SetState(guid, LFG_STATE_BOOT);
2138 boot.votes[guid] = LFG_ANSWER_PENDING;
2139 }
2140
2141 boot.votes[victim] = LFG_ANSWER_DENY; // Victim auto vote NO
2142 boot.votes[kicker] = LFG_ANSWER_AGREE; // Kicker auto vote YES
2143
2144 // Notify players
2145 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
2146 SendLfgBootProposalUpdate(*it, boot);
2147 }
void SendLfgBootProposalUpdate(ObjectGuid guid, LfgPlayerBoot const &boot)
Definition LFGMgr.cpp:2778
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
474 {
475 ObjectGuid guid = player->GetGUID();
476
477 uint8 level = player->GetLevel();
478 uint8 expansion = player->GetSession()->Expansion();
479 LfgDungeonSet const& dungeons = GetDungeonsByRandom(0);
480 LfgLockMap lock;
481
482 bool onlySeasonalBosses = m_options == LFG_OPTION_ENABLE_SEASONAL_BOSSES;
483
484 float avgItemLevel = player->GetAverageItemLevelForDF();
485
486 for (LfgDungeonSet::const_iterator it = dungeons.begin(); it != dungeons.end(); ++it)
487 {
488 LFGDungeonData const* dungeon = GetLFGDungeon(*it);
489 if (!dungeon) // should never happen - We provide a list from sLFGDungeonStore
490 continue;
491 MapEntry const* mapEntry = sMapStore.LookupEntry(dungeon->map);
492 DungeonProgressionRequirements const* ar = sObjectMgr->GetAccessRequirement(dungeon->map, Difficulty(dungeon->difficulty));
493
494 uint32 lockData = 0;
495
496 if (dungeon->expansion > expansion || (onlySeasonalBosses && !dungeon->seasonal))
498 else if (IsDungeonDisabled(dungeon->map, dungeon->difficulty))
500 else if (dungeon->difficulty > DUNGEON_DIFFICULTY_NORMAL && (!mapEntry || !mapEntry->IsRaid()) && sInstanceSaveMgr->PlayerIsPermBoundToInstance(player->GetGUID(), dungeon->map, Difficulty(dungeon->difficulty)))
502 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))
504 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))
506 else if (dungeon->seasonal && !IsSeasonActive(dungeon->id))
508 else if (player->IsClass(CLASS_DEATH_KNIGHT) && !player->IsGameMaster() &&!(player->IsQuestRewarded(13188) || player->IsQuestRewarded(13189)))
510 else if (ar)
511 {
512 // Check required items
513 for (const ProgressionRequirement* itemRequirement : ar->items)
514 {
515 if (!itemRequirement->checkLeaderOnly || !group || group->GetLeaderGUID() == player->GetGUID())
516 {
517 if (itemRequirement->faction == TEAM_NEUTRAL || itemRequirement->faction == player->GetTeamId(true))
518 {
519 if (!player->HasItemCount(itemRequirement->id, 1))
520 {
522 break;
523 }
524 }
525 }
526 }
527
528 //Check for quests
529 for (const ProgressionRequirement* questRequirement : ar->quests)
530 {
531 if (!questRequirement->checkLeaderOnly || !group || group->GetLeaderGUID() == player->GetGUID())
532 {
533 if (questRequirement->faction == TEAM_NEUTRAL || questRequirement->faction == player->GetTeamId(true))
534 {
535 if (!player->GetQuestRewardStatus(questRequirement->id))
536 {
538 break;
539 }
540 }
541 }
542 }
543
544 //Check for ilvl
545 if (ar->reqItemLevel && (float)ar->reqItemLevel > avgItemLevel)
546 {
548 }
549
550 //Check if player has the required achievements
551 for (const ProgressionRequirement* achievementRequirement : ar->achievements)
552 {
553 if (!achievementRequirement->checkLeaderOnly || !group || group->GetLeaderGUID() == player->GetGUID())
554 {
555 if (achievementRequirement->faction == TEAM_NEUTRAL || achievementRequirement->faction == player->GetTeamId(true))
556 {
557 if (!player->HasAchieved(achievementRequirement->id))
558 {
560 break;
561 }
562 }
563 }
564 }
565 }
566
567 sScriptMgr->OnInitializeLockedDungeons(player, level, lockData, dungeon);
568
569 /* TODO VoA closed if WG is not under team control (LFG_LOCKSTATUS_RAID_LOCKED)
570 lockData = LFG_LOCKSTATUS_TOO_LOW_GEAR_SCORE;
571 lockData = LFG_LOCKSTATUS_TOO_HIGH_GEAR_SCORE;
572 lockData = LFG_LOCKSTATUS_ATTUNEMENT_TOO_LOW_LEVEL;
573 lockData = LFG_LOCKSTATUS_ATTUNEMENT_TOO_HIGH_LEVEL;
574 */
575
576 if (lockData)
577 lock[dungeon->Entry()] = lockData;
578 }
579
580 sScriptMgr->OnAfterInitializeLockedDungeons(player);
581
582 SetLockedDungeons(guid, lock);
583 }
@ DUNGEON_DIFFICULTY_NORMAL
Definition DBCEnums.h:269
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
#define sInstanceSaveMgr
Definition InstanceSaveMgr.h:202
#define sScriptMgr
Definition ScriptMgr.h:734
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:131
@ TEAM_NEUTRAL
Definition SharedDefines.h:750
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_LFG_DBC_LEVEL_OVERRIDE
Definition WorldConfig.h:128
float GetAverageItemLevelForDF()
Definition Player.cpp:15848
bool GetQuestRewardStatus(uint32 quest_id) const
Definition PlayerQuest.cpp:1447
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition PlayerStorage.cpp:657
TeamId GetTeamId(bool original=false) const
Definition Player.h:2127
bool HasAchieved(uint32 achievementId) const
Definition Player.cpp:13940
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition Player.cpp:1301
bool IsGameMaster() const
Definition Player.h:1174
bool IsQuestRewarded(uint32 quest_id) const
Definition Player.h:1645
uint8 Expansion() const
Definition WorldSession.h:455
void SetLockedDungeons(ObjectGuid guid, LfgLockMap const &lock)
Definition LFGMgr.cpp:2631
LfgDungeonSet const & GetDungeonsByRandom(uint32 randomdungeon)
Definition LFGMgr.cpp:2419
bool IsSeasonActive(uint32 dungeonId)
Checks if Seasonal dungeon is active.
Definition LFGMgr.cpp:2866
@ 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
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(), 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, 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.

2909 {
2910 if (!guid.IsGroup())
2911 guid = GetGroup(guid);
2912
2913 if (uint32 dungeonId = GetDungeon(guid, true))
2914 if (LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId))
2915 if (uint32(dungeon->map) == map && dungeon->difficulty == difficulty)
2916 return true;
2917
2918 return false;
2919 }
ObjectGuid GetGroup(ObjectGuid guid)
Gets player group.
Definition LFGMgr.cpp:2706

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

◆ instance()

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

References instance().

Referenced by instance().

◆ IsDungeonDisabled()

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

Checks if given dungeon map is disabled.

2944 {
2945 return sDisableMgr->IsDisabledFor(DISABLE_TYPE_MAP, mapId, nullptr, difficulty) ||
2946 sDisableMgr->IsDisabledFor(DISABLE_TYPE_LFG_MAP, mapId, nullptr);
2947 }
#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.

2797 {
2798 return guid && guid.IsGroup() && GroupsStore[guid].IsLfgGroup();
2799 }

References GroupsStore, and ObjectGuid::IsGroup().

◆ isOptionEnabled()

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

Checks if given lfg option is enabled.

2846 {
2847 return m_options & option;
2848 }

References m_options.

Referenced by Update().

◆ IsPlayerQueuedForRandomDungeon()

bool lfg::LFGMgr::IsPlayerQueuedForRandomDungeon ( ObjectGuid  guid)
2950 {
2951 auto gguid = GetGroup(guid);
2952 if (!gguid)
2953 return false;
2954
2955 return GroupsStore[gguid].IsRandomQueuedPlayer(guid);
2956 }

References GetGroup(), and GroupsStore.

◆ IsSeasonActive()

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

Checks if Seasonal dungeon is active.

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

992 {
993 // pussywizard: client limit for comment length is 64 @ 3.3.5a
994 if (comment.size() > 64)
995 comment = comment.substr(0, 64);
996
997 RBEntryInfo entry(roles, comment);
998 for (LfgDungeonSet::const_iterator itr = dungeons.begin(); itr != dungeons.end(); ++itr)
999 if (GetLFGDungeon(*itr)) // ensure dungeon data exists for such dungeon id
1000 {
1001 RaidBrowserStore[player->GetTeamId()][*itr][player->GetGUID()] = entry;
1002 RBUsedDungeonsStore[player->GetTeamId()].insert(*itr);
1003 }
1004 }
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

1437 {
1438 ObjectGuid pguid, gguid;
1439 if (guid.IsGroup())
1440 gguid = guid;
1441 else if (groupguid && groupguid.IsGroup())
1442 {
1443 pguid = guid;
1444 gguid = groupguid;
1445 }
1446 else
1447 {
1448 pguid = guid;
1449 gguid = GetGroup(guid);
1450 }
1451 if (!allowgroup)
1452 gguid.Clear();
1453
1454 if (pguid)
1455 for (lfg::LfgQueueContainer::iterator itr = QueuesStore.begin(); itr != QueuesStore.end(); ++itr)
1456 itr->second.RemoveFromQueue(pguid);
1457 if (gguid)
1458 for (lfg::LfgQueueContainer::iterator itr = QueuesStore.begin(); itr != QueuesStore.end(); ++itr)
1459 itr->second.RemoveFromQueue(gguid);
1460
1461 if (pguid && !gguid)
1462 {
1463 if (GetState(pguid) == LFG_STATE_QUEUED)
1464 {
1466 SetState(pguid, LFG_STATE_NONE);
1467 }
1468 }
1469 if (gguid)
1470 {
1471 if (GetState(gguid) == LFG_STATE_QUEUED)
1472 {
1473 SetState(gguid, LFG_STATE_NONE);
1474 const LfgGuidSet& players = GetPlayers(gguid);
1475 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
1476 {
1479 }
1480 }
1481 }
1482 }
void Clear()
Definition ObjectGuid.h:138
void SendLfgUpdateParty(ObjectGuid guid, LfgUpdateData const &data)
Definition LFGMgr.cpp:2766
void SendLfgUpdatePlayer(ObjectGuid guid, LfgUpdateData const &data)
Definition LFGMgr.cpp:2760
@ 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
911 {
912 LOG_DEBUG("lfg", "LFGMgr::Leave: [{}]", guid.ToString());
913 ObjectGuid gguid = guid.IsGroup() ? guid : GetGroup(guid);
914 LfgState state = GetState(guid);
915 switch (state)
916 {
917 case LFG_STATE_QUEUED:
918 if (gguid)
919 {
920 LFGQueue& queue = GetQueue(gguid);
921 queue.RemoveFromQueue(gguid);
922 uint32 dungeonId = GetDungeon(gguid);
923 SetState(gguid, LFG_STATE_NONE);
924 const LfgGuidSet& players = GetPlayers(gguid);
925 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
926 {
929 }
930 if (Group* group = sGroupMgr->GetGroupByGUID(gguid.GetCounter()))
931 {
932 if (group->isLFGGroup())
933 {
934 SetDungeon(gguid, dungeonId);
935 }
936 }
937 }
938 else
939 {
940 LFGQueue& queue = GetQueue(guid);
941 queue.RemoveFromQueue(guid);
944 }
945 break;
947 if (gguid)
948 UpdateRoleCheck(gguid); // No player to update role = LFG_ROLECHECK_ABORTED
949 break;
951 {
952 // Remove from Proposals
953 LfgProposalContainer::iterator it = ProposalsStore.begin();
954 ObjectGuid pguid = gguid == guid ? GetLeader(gguid) : guid;
955 while (it != ProposalsStore.end())
956 {
957 LfgProposalPlayerContainer::iterator itPlayer = it->second.players.find(pguid);
958 if (itPlayer != it->second.players.end())
959 {
960 // Mark the player/leader of group who left as didn't accept the proposal
961 itPlayer->second.accept = LFG_ANSWER_DENY;
962 break;
963 }
964 ++it;
965 }
966
967 // Remove from queue - if proposal is found, RemoveProposal will call RemoveFromQueue
968 if (it != ProposalsStore.end())
970 break;
971 }
972 case LFG_STATE_NONE:
973 break;
976 case LFG_STATE_BOOT:
977 if (guid != gguid) // Player
979 break;
981 LeaveRaidBrowser(guid);
982 SetCanOverrideRBState(guid, true);
984 SetCanOverrideRBState(guid, false);
987 break;
988 }
989 }
#define sGroupMgr
Definition GroupMgr.h:51
void LeaveRaidBrowser(ObjectGuid guid)
Definition LFGMgr.cpp:1006
void RemoveProposal(LfgProposalContainer::iterator itProposal, LfgUpdateType type)
Definition LFGMgr.cpp:2012
void SetCanOverrideRBState(ObjectGuid guid, bool val)
Definition LFGMgr.cpp:2589
@ 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)
1007 {
1008 for (uint8 team = 0; team < 2; ++team)
1009 for (RBStoreMap::iterator itr = RaidBrowserStore[team].begin(); itr != RaidBrowserStore[team].end(); ++itr)
1010 itr->second.erase(guid);
1011 }

References RaidBrowserStore.

Referenced by LeaveLfg().

◆ LfrSearchAdd()

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

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

◆ LfrSearchRemove()

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

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

◆ LfrSetComment()

void lfg::LFGMgr::LfrSetComment ( Player p,
std::string  comment 
)
2613 {
2614 // pussywizard: client limit for comment length is 64 @ 3.3.5a
2615 if (comment.size() > 64)
2616 comment = comment.substr(0, 64);
2617
2618 uint8 teamId = p->GetTeamId();
2619 RBEntryInfoMap::iterator iter;
2620 for (RBStoreMap::iterator itr = RaidBrowserStore[teamId].begin(); itr != RaidBrowserStore[teamId].end(); ++itr)
2621 if ((iter = itr->second.find(p->GetGUID())) != itr->second.end())
2622 iter->second.comment = comment;
2623 }

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

◆ LoadLFGDungeons()

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

Loads dungeons from dbc and adds teleport coords.

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

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

◆ LoadRewards()

void lfg::LFGMgr::LoadRewards ( )

Loads rewards for random dungeons.

Load rewards for completing dungeons.

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

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

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

Referenced by UpdateProposal().

◆ RBPacketAppendGroup()

void lfg::LFGMgr::RBPacketAppendGroup ( const RBInternalInfo info,
ByteBuffer buffer 
)
1326 {
1327 buffer << info.groupGuid;
1329 buffer << (uint32)flags;
1330 if (flags & LFG_UPDATE_FLAG_COMMENT)
1331 buffer << info.comment;
1332 if (flags & LFG_UPDATE_FLAG_ROLES)
1333 for (uint8 j = 0; j < 3; ++j)
1334 buffer << (uint8)0;
1335 if (!(flags & LFG_UPDATE_FLAG_BINDED))
1336 return;
1337 buffer << info.instanceGuid;
1338 buffer << (uint32)info.encounterMask;
1339 }
@ 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 
)
1342 {
1343 buffer << info.guid;
1344 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);
1345 buffer << (uint32)flags;
1346
1348 {
1349 buffer << (uint8)info._level;
1350 buffer << (uint8)info._class;
1351 buffer << (uint8)info._race;
1352 buffer << (uint8)info._talents0;
1353 buffer << (uint8)info._talents1;
1354 buffer << (uint8)info._talents2;
1355 buffer << (uint32)info._armor;
1356 buffer << (uint32)info._spellDamage;
1357 buffer << (uint32)info._spellHeal;
1358 buffer << (uint32)info._critRatingMelee;
1359 buffer << (uint32)info._critRatingRanged;
1360 buffer << (uint32)info._critRatingSpell;
1361 buffer << (float)info._mp5;
1362 buffer << (float)info._mp5combat;
1363 buffer << (uint32)info._attackPower;
1364 buffer << (uint32)info._agility;
1365 buffer << (uint32)info._health;
1366 buffer << (uint32)info._mana;
1367 buffer << (uint32)info._online; // talentpoints, used as online/offline marker :D
1368 buffer << (float)info._avgItemLevel; // avgitemlevel
1369 buffer << (uint32)info._defenseSkill;
1370 buffer << (uint32)info._dodgeRating;
1371 buffer << (uint32)info._blockRating;
1372 buffer << (uint32)info._parryRating;
1373 buffer << (uint32)info._hasteRating;
1374 buffer << (uint32)info._expertiseRating;
1375 }
1376
1377 if (flags & LFG_UPDATE_FLAG_COMMENT)
1378 buffer << (info.groupGuid ? std::string("") : info.comment);
1379 if (flags & LFG_UPDATE_FLAG_GROUPLEADER)
1380 buffer << (uint8)1; // isLFM
1381 if (flags & LFG_UPDATE_FLAG_GROUPGUID)
1382 buffer << info.groupGuid;
1383 if (flags & LFG_UPDATE_FLAG_ROLES)
1384 buffer << (uint8)(info.groupGuid ? (info.isGroupLeader ? PLAYER_ROLE_LEADER : 0) : info.roles);
1385 if (flags & LFG_UPDATE_FLAG_AREA)
1386 buffer << (uint32)info._area;
1387 if (flags & LFG_UPDATE_FLAG_STATUS)
1388 buffer << (uint8)0;
1389 if (!(flags & LFG_UPDATE_FLAG_BINDED))
1390 return;
1391 buffer << info.instanceGuid;
1392 buffer << (uint32)info.encounterMask;
1393 }
@ 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 
)
1396 {
1397 differencePacket << (uint32)LFG_TYPE_RAID;
1398 differencePacket << (uint32)dungeonId;
1399 differencePacket << (uint8)1;
1400 differencePacket << (uint32)deletedCounter;
1401 differencePacket.append(buffer_deleted);
1402 differencePacket << (uint32)groupCounter;
1403 differencePacket << (uint32)0;
1404 differencePacket.append(buffer_groups);
1405 differencePacket << (uint32)playerCounter;
1406 differencePacket << (uint32)0;
1407 differencePacket.append(buffer_players);
1408 }
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 
)
1411 {
1412 fullPacket << (uint32)LFG_TYPE_RAID;
1413 fullPacket << (uint32)dungeonId;
1414 fullPacket << (uint8)0;
1415 uint32 groupCounter = 0, playerCounter = 0;
1416 ByteBuffer buffer_groups, buffer_players;
1417 for (RBInternalInfoMap::const_iterator itr = infoMap.begin(); itr != infoMap.end(); ++itr)
1418 {
1419 if (itr->second.isGroupLeader)
1420 {
1421 ++groupCounter;
1422 RBPacketAppendGroup(itr->second, buffer_groups);
1423 }
1424 ++playerCounter;
1425 RBPacketAppendPlayer(itr->second, buffer_players);
1426 }
1427 fullPacket << (uint32)groupCounter;
1428 fullPacket << (uint32)0;
1429 fullPacket.append(buffer_groups);
1430 fullPacket << (uint32)playerCounter;
1431 fullPacket << (uint32)0;
1432 fullPacket.append(buffer_players);
1433 }
Definition ByteBuffer.h:70
void RBPacketAppendGroup(const RBInternalInfo &info, ByteBuffer &buffer)
Definition LFGMgr.cpp:1325
void RBPacketAppendPlayer(const RBInternalInfo &info, ByteBuffer &buffer)
Definition LFGMgr.cpp:1341

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

Referenced by UpdateRaidBrowser().

◆ RemoveGroupData()

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

Removes saved group data.

2644 {
2645 LOG_DEBUG("lfg", "LFGMgr::RemoveGroupData: [{}]", guid.ToString());
2646 LfgGroupDataContainer::iterator it = GroupsStore.find(guid);
2647 if (it == GroupsStore.end())
2648 return;
2649
2650 LfgState state = GetState(guid);
2651 // If group is being formed after proposal success do nothing more
2652 LfgGuidSet const& players = it->second.GetPlayers();
2653 for (auto iterator = players.begin(); iterator != players.end(); ++iterator)
2654 {
2655 ObjectGuid objectGuid = (*iterator);
2656 SetGroup(*iterator, ObjectGuid::Empty);
2657 if (state != LFG_STATE_PROPOSAL)
2658 {
2659 SetState(*iterator, LFG_STATE_NONE);
2660 SendLfgUpdateParty(objectGuid, LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE));
2661 }
2662 }
2663 GroupsStore.erase(it);
2664 }
void SetGroup(ObjectGuid guid, ObjectGuid group)
Sets player group.
Definition LFGMgr.cpp:2711

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.

2672 {
2673 return GroupsStore[gguid].RemovePlayer(guid);
2674 }

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)
2013 {
2014 LfgProposal& proposal = itProposal->second;
2015 proposal.state = LFG_PROPOSAL_FAILED;
2016
2017 LOG_DEBUG("lfg", "LFGMgr::RemoveProposal: Proposal {}, state FAILED, UpdateType {}", itProposal->first, type);
2018 // Mark all people that didn't answered as no accept
2020 for (LfgProposalPlayerContainer::iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
2021 if (it->second.accept == LFG_ANSWER_PENDING)
2022 it->second.accept = LFG_ANSWER_DENY;
2023
2024 // pussywizard: add cooldown for not accepting (after 40 secs) or declining
2025 for (LfgProposalPlayerContainer::iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
2026 if (it->second.accept == LFG_ANSWER_DENY)
2027 if (Player* plr = ObjectAccessor::FindPlayer(it->first))
2028 if (Aura* aura = plr->AddAura(LFG_SPELL_DUNGEON_COOLDOWN, plr))
2029 aura->SetDuration(150 * IN_MILLISECONDS);
2030
2031 // Mark players/groups to be removed
2032 LfgGuidSet toRemove;
2033 for (LfgProposalPlayerContainer::iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
2034 {
2035 if (it->second.accept == LFG_ANSWER_AGREE)
2036 continue;
2037
2038 ObjectGuid guid = it->second.group ? it->second.group : it->first;
2039 // Player didn't accept or still pending when no secs left
2040 if (it->second.accept == LFG_ANSWER_DENY || type == LFG_UPDATETYPE_PROPOSAL_FAILED)
2041 {
2042 it->second.accept = LFG_ANSWER_DENY;
2043 toRemove.insert(guid);
2044 }
2045 }
2046
2047 // Notify players
2048 for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
2049 {
2050 ObjectGuid guid = it->first;
2051 ObjectGuid gguid = it->second.group ? it->second.group : guid;
2052
2053 SendLfgUpdateProposal(guid, proposal);
2054
2055 if (toRemove.find(gguid) != toRemove.end()) // Didn't accept or in same group that someone that didn't accept
2056 {
2057 LfgUpdateData updateData;
2058 if (it->second.accept == LFG_ANSWER_DENY)
2059 {
2060 updateData.updateType = type;
2061 LOG_DEBUG("lfg", "LFGMgr::RemoveProposal: [{}] didn't accept. Removing from queue and compatible cache", guid.ToString());
2062 }
2063 else
2064 {
2065 updateData.updateType = LFG_UPDATETYPE_REMOVED_FROM_QUEUE;
2066 LOG_DEBUG("lfg", "LFGMgr::RemoveProposal: [{}] in same group that someone that didn't accept. Removing from queue and compatible cache", guid.ToString());
2067 }
2068
2069 RestoreState(guid, "Proposal Fail (didn't accepted or in group with someone that didn't accept");
2070 if (gguid != guid)
2071 {
2072 RestoreState(it->second.group, "Proposal Fail (someone in group didn't accepted)");
2073 SendLfgUpdateParty(guid, updateData);
2074 }
2075 else
2076 SendLfgUpdatePlayer(guid, updateData);
2077 }
2078 else
2079 {
2080 LOG_DEBUG("lfg", "LFGMgr::RemoveProposal: Readding [{}] to queue.", guid.ToString());
2082 if (gguid != guid)
2083 {
2084 SetState(gguid, LFG_STATE_QUEUED);
2086 }
2087 else
2089 }
2090 }
2091
2092 LFGQueue& queue = GetQueue(proposal.players.begin()->first);
2093 // Remove players/groups from queue
2094 for (LfgGuidSet::const_iterator it = toRemove.begin(); it != toRemove.end(); ++it)
2095 {
2096 ObjectGuid guid = *it;
2097 queue.RemoveFromQueue(guid);
2098 proposal.queues.remove(guid);
2099 }
2100
2101 // Readd to queue
2102 for (uint8 i = 0; i < 5 && proposal.queues.guids[i]; ++i)
2103 {
2104 // xinef: this will work as data is not deleted, only references to this data are cleared
2105 // xinef: when new proposal is created
2106 // xinef: successful proposal is also taken into account is similar manner
2107 queue.AddToQueue(proposal.queues.guids[i], true);
2108 }
2109
2110 ProposalsStore.erase(itProposal);
2111 }
constexpr auto IN_MILLISECONDS
Definition Common.h:53
Definition SpellAuras.h:87
void RestoreState(ObjectGuid guid, char const *debugMsg)
Definition LFGMgr.cpp:2538
std::string const & GetComment(ObjectGuid gguid)
Get current player comment (used for LFR)
Definition LFGMgr.cpp:2513
void SendLfgUpdateProposal(ObjectGuid guid, LfgProposal const &proposal)
Definition LFGMgr.cpp:2784
@ 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
2539 {
2540 if (guid.IsGroup())
2541 {
2542 LfgGroupData& data = GroupsStore[guid];
2543 /*if (sLog->ShouldLog(LOG_FILTER_LFG, LOG_LEVEL_DEBUG))
2544 {
2545 std::string const& ps = GetStateString(data.GetState());
2546 std::string const& os = GetStateString(data.GetOldState());
2547 LOG_TRACE("lfg", "LFGMgr::RestoreState: Group: [{}] ({}) State: {}, oldState: {}",
2548 guid.ToString(), debugMsg, ps, os);
2549 }*/
2550
2551 data.RestoreState();
2552 }
2553 else
2554 {
2555 LfgPlayerData& data = PlayersStore[guid];
2556 /*if (sLog->ShouldLog(LOG_FILTER_LFG, LOG_LEVEL_DEBUG))
2557 {
2558 std::string const& ps = GetStateString(data.GetState());
2559 std::string const& os = GetStateString(data.GetOldState());
2560 LOG_TRACE("lfg", "LFGMgr::RestoreState: Player: [{}] ({}) State: {}, oldState: {}",
2561 guid.ToString(), debugMsg, ps, os);
2562 }*/
2563 data.RestoreState();
2564 }
2565 }

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.

2893 {
2894 if (GetState(guid) != LFG_STATE_NONE)
2895 {
2896 LfgDungeonSet const& dungeons = GetSelectedDungeons(guid);
2897 if (!dungeons.empty())
2898 {
2899 LFGDungeonData const* dungeon = GetLFGDungeon(*dungeons.begin());
2900 if (dungeon && (dungeon->type == LFG_TYPE_RANDOM || dungeon->seasonal))
2901 return true;
2902 }
2903 }
2904
2905 return false;
2906 }

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
2779 {
2780 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2781 player->GetSession()->SendLfgBootProposalUpdate(boot);
2782 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendLfgJoinResult()

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

References ObjectAccessor::FindConnectedPlayer().

Referenced by Update(), and UpdateRoleCheck().

◆ SendLfgQueueStatus()

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

Sends queue status to player.

2791 {
2792 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2793 player->GetSession()->SendLfgQueueStatus(data);
2794 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendLfgRoleCheckUpdate()

void lfg::LFGMgr::SendLfgRoleCheckUpdate ( ObjectGuid  guid,
LfgRoleCheck const &  roleCheck 
)
private
2755 {
2756 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2757 player->GetSession()->SendLfgRoleCheckUpdate(roleCheck);
2758 }

References ObjectAccessor::FindConnectedPlayer().

Referenced by Update(), and UpdateRoleCheck().

◆ SendLfgRoleChosen()

void lfg::LFGMgr::SendLfgRoleChosen ( ObjectGuid  guid,
ObjectGuid  pguid,
uint8  roles 
)
private
2749 {
2750 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2751 player->GetSession()->SendLfgRoleChosen(pguid, roles);
2752 }

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

Referenced by UpdateRoleCheck().

◆ SendLfgUpdateParty()

void lfg::LFGMgr::SendLfgUpdateParty ( ObjectGuid  guid,
LfgUpdateData const &  data 
)
private
2767 {
2768 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2769 player->GetSession()->SendLfgUpdateParty(data);
2770 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendLfgUpdatePlayer()

void lfg::LFGMgr::SendLfgUpdatePlayer ( ObjectGuid  guid,
LfgUpdateData const &  data 
)
private
2761 {
2762 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2763 player->GetSession()->SendLfgUpdatePlayer(data);
2764 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendLfgUpdateProposal()

void lfg::LFGMgr::SendLfgUpdateProposal ( ObjectGuid  guid,
LfgProposal const &  proposal 
)
private
2785 {
2786 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2787 player->GetSession()->SendLfgUpdateProposal(proposal);
2788 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendRaidBrowserCachedList()

void lfg::LFGMgr::SendRaidBrowserCachedList ( Player player,
uint32  dungeonId 
)
1051 {
1052 RBCacheMap::iterator itr = RBCacheStore[player->GetTeamId()].find(dungeonId);
1053 if (itr != RBCacheStore[player->GetTeamId()].end())
1054 {
1055 player->SendDirectMessage(&(itr->second));
1056 return;
1057 }
1058 // send empty packet if cache not found
1060 data << (uint32)LFG_TYPE_RAID;
1061 data << (uint32)dungeonId;
1062 data << (uint8)0;
1063 data << (uint32)0;
1064 data << (uint32)0;
1065 data << (uint32)0;
1066 data << (uint32)0;
1067 player->SendDirectMessage(&data);
1068 }
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5680
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 
)
1014 {
1015 if (dungeons.empty())
1016 {
1017 RBEntryInfoMap::iterator iter;
1018 uint8 team = p->GetTeamId();
1019 bool setComment = true;
1020 for (RBStoreMap::iterator itr = RaidBrowserStore[team].begin(); itr != RaidBrowserStore[team].end(); ++itr)
1021 if ((iter = itr->second.find(p->GetGUID())) != itr->second.end())
1022 {
1023 dungeons.insert(itr->first);
1024 if (setComment)
1025 {
1026 comment = iter->second.comment;
1027 setComment = false;
1028 }
1029 }
1030 }
1031 LfgJoinResultData joinData;
1032 p->GetSession()->SendLfgJoinResult(joinData);
1033 LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_JOIN_RAIDBROWSER, dungeons, comment);
1034 if (p->GetGroup())
1035 p->GetSession()->SendLfgUpdateParty(updateData);
1036 else
1037 p->GetSession()->SendLfgUpdatePlayer(updateData);
1038 }
void SendLfgUpdateParty(lfg::LfgUpdateData const &updateData)
Definition LFGHandler.cpp:335
@ 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
2590 {
2591 PlayersStore[guid].SetCanOverrideRBState(val);
2592 }

References PlayersStore.

Referenced by LeaveLfg().

◆ SetComment()

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

Sets player lfr comment.

2607 {
2608 LOG_DEBUG("lfg", "LFGMgr::SetComment: [{}] comment: {}", guid.ToString(), comment);
2609 PlayersStore[guid].SetComment(comment);
2610 }

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

Referenced by JoinLfg().

◆ SetDungeon()

void lfg::LFGMgr::SetDungeon ( ObjectGuid  guid,
uint32  dungeon 
)
2595 {
2596 LOG_DEBUG("lfg", "LFGMgr::SetDungeon: [{}] dungeon {}", guid.ToString(), dungeon);
2597 GroupsStore[guid].SetDungeon(dungeon);
2598 }

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.

2712 {
2713 PlayersStore[guid].SetGroup(group);
2714 }

References PlayersStore.

Referenced by RemoveGroupData(), and SetupGroupMember().

◆ SetLeader()

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

Sets the leader of the group.

2694 {
2695 GroupsStore[gguid].SetLeader(leader);
2696 }

References GroupsStore.

Referenced by _LoadFromDB().

◆ SetLockedDungeons()

void lfg::LFGMgr::SetLockedDungeons ( ObjectGuid  guid,
LfgLockMap const &  lock 
)
private
2632 {
2633 LOG_DEBUG("lfg", "LFGMgr::SetLockedDungeons: [{}]", guid.ToString());
2634 PlayersStore[guid].SetLockedDungeons(lock);
2635 }

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

Referenced by InitializeLockedDungeons().

◆ SetOptions()

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

Sets new lfg options.

2856 {
2857 m_options = options;
2858 }

References m_options.

◆ SetRandomPlayersCount()

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

Xinef: Set Random Players Count.

2732 {
2733 PlayersStore[guid].SetRandomPlayersCount(count);
2734 }

References PlayersStore.

Referenced by MakeNewGroup().

◆ SetRoles()

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

Sets player lfg roles.

2601 {
2602 LOG_DEBUG("lfg", "LFGMgr::SetRoles: [{}] roles: {}", guid.ToString(), roles);
2603 PlayersStore[guid].SetRoles(roles);
2604 }

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

Referenced by JoinLfg(), and UpdateRoleCheck().

◆ SetSelectedDungeons()

void lfg::LFGMgr::SetSelectedDungeons ( ObjectGuid  guid,
LfgDungeonSet const &  dungeons 
)
private
2626 {
2627 LOG_DEBUG("lfg", "LFGMgr::SetLockedDungeons: [{}]", guid.ToString());
2628 PlayersStore[guid].SetSelectedDungeons(dungeons);
2629 }

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

Referenced by JoinLfg(), and SetupGroupMember().

◆ SetState()

void lfg::LFGMgr::SetState ( ObjectGuid  guid,
LfgState  state 
)
private
2568 {
2569 if (guid.IsGroup())
2570 {
2571 LfgGroupData& data = GroupsStore[guid];
2572 std::string ns = GetStateString(state);
2573 std::string ps = GetStateString(data.GetState());
2574 std::string os = GetStateString(data.GetOldState());
2575 LOG_DEBUG("lfg", "LFGMgr::SetState: Group: [{}] newState: {}, previous: {}, oldState: {}", guid.ToString(), ns, ps, os);
2576 data.SetState(state);
2577 }
2578 else
2579 {
2580 LfgPlayerData& data = PlayersStore[guid];
2581 std::string ns = GetStateString(state);
2582 std::string ps = GetStateString(data.GetState());
2583 std::string os = GetStateString(data.GetOldState());
2584 LOG_DEBUG("lfg", "LFGMgr::SetState: Player: [{}] newState: {}, previous: {}, oldState: {}", guid.ToString(), ns, ps, os);
2585 data.SetState(state);
2586 }
2587 }
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.

2699 {
2701 teamId = TEAM_ALLIANCE; // @Not Sure About That TeamId is supposed to be uint8 Team = 0(@TrinityCore)
2702
2703 PlayersStore[guid].SetTeam(teamId);
2704 }
@ 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.

2883 {
2884 LfgDungeonSet dungeons;
2885 dungeons.insert(GetDungeon(gguid));
2886 SetSelectedDungeons(guid, dungeons);
2887 SetState(guid, GetState(gguid));
2888 SetGroup(guid, gguid);
2889 AddPlayerToGroup(gguid, guid);
2890 }
void AddPlayerToGroup(ObjectGuid gguid, ObjectGuid guid)
Adds player to group.
Definition LFGMgr.cpp:2676

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)
2219 {
2220 LFGDungeonData const* dungeon = nullptr;
2221 Group* group = player->GetGroup();
2222
2223 if (group && group->isLFGGroup())
2224 dungeon = GetLFGDungeon(GetDungeon(group->GetGUID()));
2225
2226 if (!dungeon)
2227 {
2229 return;
2230 }
2231
2233
2234 if (!player->IsAlive())
2235 {
2237 }
2238 else if (player->IsFalling() || player->HasUnitState(UNIT_STATE_JUMPING))
2239 {
2241 }
2242 else if (player->IsMirrorTimerActive(FATIGUE_TIMER))
2243 {
2245 }
2246 else if (player->GetVehicle())
2247 {
2249 }
2250 else if (player->GetCharmGUID() || player->IsInCombat())
2251 {
2253 }
2254 else if (out && error == LFG_TELEPORTERROR_OK)
2255 {
2256 if (player->GetMapId() == uint32(dungeon->map))
2257 player->TeleportToEntryPoint();
2258
2259 return;
2260 }
2261 else
2262 {
2263 uint32 mapid = dungeon->map;
2264 float x = dungeon->x;
2265 float y = dungeon->y;
2266 float z = dungeon->z;
2267 float orientation = dungeon->o;
2268
2269 if (teleportLocation)
2270 {
2271 teleportLocation->GetWorldLocation(mapid, x, y, z, orientation);
2272 }
2273
2274 if (!player->GetMap()->IsDungeon() || player->GetEntryPoint().GetMapId() == MAPID_INVALID)
2275 {
2276 player->SetEntryPoint();
2277 }
2278
2279 if (!player->TeleportTo(mapid, x, y, z, orientation, 0, nullptr, mapid == player->GetMapId()))
2280 {
2282 }
2283 }
2284
2285 if (error != LFG_TELEPORTERROR_OK)
2286 {
2287 player->GetSession()->SendLfgTeleportError(uint8(error));
2288
2289 LOG_DEBUG("lfg", "Player [{}] could NOT be teleported in to map [{}] (x: {}, y: {}, z: {}) Error: {}",
2290 player->GetName(), dungeon->map, dungeon->x, dungeon->y, dungeon->z, error);
2291 }
2292 else
2293 {
2294 LOG_DEBUG("lfg", "Player [{}] is being teleported in to map [{}] (x: {}, y: {}, z: {})",
2295 player->GetName(), dungeon->map, dungeon->x, dungeon->y, dungeon->z);
2296 }
2297
2298 }
@ 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:295
void SetEntryPoint()
Definition Player.cpp:11202
bool IsMirrorTimerActive(MirrorTimerType type)
Definition Player.h:2081
bool TeleportToEntryPoint()
Definition Player.cpp:1599
WorldLocation const & GetEntryPoint() const
Definition Player.h:2414
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1352
bool IsFalling() const
Definition Player.cpp:2142
Vehicle * GetVehicle() const
Definition Unit.h:1926
bool IsAlive() const
Definition Unit.h:1793
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:610
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 ( )
891 {
892 if (sWorld->getBoolConfig(CONFIG_DEBUG_LFG))
893 {
894 m_Testing = true;
896 }
897 else
898 {
901 }
902 }
@ LANG_DEBUG_LFG_ON
Definition Language.h:1415
@ LANG_DEBUG_LFG_OFF
Definition Language.h:1416
@ LANG_DEBUG_LFG_CONF
Definition Language.h:1417
Definition Chat.h:37
void SendWorldText(std::string_view str)
Definition Chat.cpp:131

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 
)
356 {
358 return;
359
360 if (task == 0)
361 {
362 time_t currTime = GameTime::GetGameTime().count();
363
364 // Remove obsolete role checks
365 for (LfgRoleCheckContainer::iterator it = RoleChecksStore.begin(); it != RoleChecksStore.end();)
366 {
367 LfgRoleCheckContainer::iterator itRoleCheck = it++;
368 LfgRoleCheck& roleCheck = itRoleCheck->second;
369 if (currTime < roleCheck.cancelTime)
370 continue;
371 roleCheck.state = LFG_ROLECHECK_MISSING_ROLE;
372
373 for (LfgRolesMap::const_iterator itRoles = roleCheck.roles.begin(); itRoles != roleCheck.roles.end(); ++itRoles)
374 {
375 ObjectGuid guid = itRoles->first;
376 RestoreState(guid, "Remove Obsolete RoleCheck");
377 SendLfgRoleCheckUpdate(guid, roleCheck);
378 if (guid == roleCheck.leader)
380 }
381
382 RestoreState(itRoleCheck->first, "Remove Obsolete RoleCheck");
383 RoleChecksStore.erase(itRoleCheck);
384 }
385
386 // Remove obsolete proposals
387 for (LfgProposalContainer::iterator it = ProposalsStore.begin(); it != ProposalsStore.end();)
388 {
389 LfgProposalContainer::iterator itRemove = it++;
390 if (itRemove->second.cancelTime < currTime)
392 }
393
394 // Remove obsolete kicks
395 for (LfgPlayerBootContainer::iterator it = BootsStore.begin(); it != BootsStore.end();)
396 {
397 LfgPlayerBootContainer::iterator itBoot = it++;
398 LfgPlayerBoot& boot = itBoot->second;
399 if (boot.cancelTime < currTime)
400 {
401 boot.inProgress = false;
402 for (LfgAnswerContainer::const_iterator itVotes = boot.votes.begin(); itVotes != boot.votes.end(); ++itVotes)
403 {
404 ObjectGuid pguid = itVotes->first;
405 if (pguid != boot.victim)
406 SendLfgBootProposalUpdate(pguid, boot);
408 }
409 SetState(itBoot->first, LFG_STATE_DUNGEON);
410 BootsStore.erase(itBoot);
411 }
412 }
413
414 // Cleanup expired dungeon cooldowns
416 }
417 else if (task == 1)
418 {
419 this->lastProposalId = m_lfgProposalId; // pussywizard: task 2 is done independantly, store previous value in LFGMgr for future use
420 uint8 newGroupsProcessed = 0;
421 // Check if a proposal can be formed with the new groups being added
422 for (LfgQueueContainer::iterator it = QueuesStore.begin(); it != QueuesStore.end(); ++it)
423 {
424 newGroupsProcessed += it->second.FindGroups();
425 if (newGroupsProcessed)
426 break;
427 }
428
429 // Update all players status queue info
430 if (!newGroupsProcessed) // don't do this on updates that precessed groups (performance)
431 for (LfgQueueContainer::iterator it = QueuesStore.begin(); it != QueuesStore.end(); ++it)
432 it->second.UpdateQueueTimers(tdiff);
433 }
434 else if (task == 2)
435 {
437 {
438 // 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
439 for (LfgProposalContainer::const_iterator itProposal = ProposalsStore.find(m_lfgProposalId); itProposal != ProposalsStore.end(); ++itProposal)
440 {
441 uint32 proposalId = itProposal->first;
442 LfgProposal& proposal = ProposalsStore[proposalId];
443
444 ObjectGuid guid;
445 for (LfgProposalPlayerContainer::const_iterator itPlayers = proposal.players.begin(); itPlayers != proposal.players.end(); ++itPlayers)
446 {
447 guid = itPlayers->first;
449 if (ObjectGuid gguid = GetGroup(guid))
450 {
453 }
454 else
456 SendLfgUpdateProposal(guid, proposal);
457 }
458
459 if (proposal.state == LFG_PROPOSAL_SUCCESS) // pussywizard: no idea what's the purpose of this xD
460 UpdateProposal(proposalId, guid, true);
461 }
462 }
463
464 UpdateRaidBrowser(tdiff);
465 }
466 }
void SendLfgRoleCheckUpdate(ObjectGuid guid, LfgRoleCheck const &roleCheck)
Definition LFGMgr.cpp:2754
void SendLfgJoinResult(ObjectGuid guid, LfgJoinResultData const &data)
Definition LFGMgr.cpp:2772
bool isOptionEnabled(uint32 option)
Checks if given lfg option is enabled.
Definition LFGMgr.cpp:2845
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:1909
void CleanupDungeonCooldowns()
Definition LFGMgr.cpp:176
void UpdateRaidBrowser(uint32 diff)
Definition LFGMgr.cpp:1070
@ 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
2156 {
2157 ObjectGuid gguid = GetGroup(guid);
2158 if (!gguid)
2159 return;
2160
2161 LfgPlayerBootContainer::iterator itBoot = BootsStore.find(gguid);
2162 if (itBoot == BootsStore.end())
2163 return;
2164
2165 LfgPlayerBoot& boot = itBoot->second;
2166
2167 if (boot.votes[guid] != LFG_ANSWER_PENDING) // Cheat check: Player can't vote twice
2168 return;
2169
2170 boot.votes[guid] = LfgAnswer(accept);
2171
2172 uint8 votesNum = 0;
2173 uint8 agreeNum = 0;
2174 for (LfgAnswerContainer::const_iterator itVotes = boot.votes.begin(); itVotes != boot.votes.end(); ++itVotes)
2175 {
2176 if (itVotes->second != LFG_ANSWER_PENDING)
2177 {
2178 ++votesNum;
2179 if (itVotes->second == LFG_ANSWER_AGREE)
2180 ++agreeNum;
2181 }
2182 }
2183
2184 // if we don't have enough votes (agree or deny) do nothing
2185 if (agreeNum < LFG_GROUP_KICK_VOTES_NEEDED && (votesNum - agreeNum) < LFG_GROUP_KICK_VOTES_NEEDED)
2186 return;
2187
2188 // Send update info to all players
2189 boot.inProgress = false;
2190 for (LfgAnswerContainer::const_iterator itVotes = boot.votes.begin(); itVotes != boot.votes.end(); ++itVotes)
2191 {
2192 ObjectGuid pguid = itVotes->first;
2193 if (pguid != boot.victim)
2194 {
2196 SendLfgBootProposalUpdate(pguid, boot);
2197 }
2198 }
2199
2201 if (agreeNum == LFG_GROUP_KICK_VOTES_NEEDED) // Vote passed - Kick player
2202 {
2203 if (Group* group = sGroupMgr->GetGroupByGUID(gguid.GetCounter()))
2205
2206 DecreaseKicksLeft(gguid);
2207 }
2208 BootsStore.erase(itBoot);
2209 }
@ GROUP_REMOVEMETHOD_KICK_LFG
Definition SharedDefines.h:3848
static void RemoveFromGroup(Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
Definition Player.cpp:2322
void DecreaseKicksLeft(ObjectGuid guid)
Definition LFGMgr.cpp:2637
@ 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
1910 {
1911 // Check if the proposal exists
1912 LfgProposalContainer::iterator itProposal = ProposalsStore.find(proposalId);
1913 if (itProposal == ProposalsStore.end())
1914 return;
1915
1916 LfgProposal& proposal = itProposal->second;
1917
1918 // Check if proposal have the current player
1919 LfgProposalPlayerContainer::iterator itProposalPlayer = proposal.players.find(guid);
1920 if (itProposalPlayer == proposal.players.end())
1921 return;
1922
1923 LfgProposalPlayer& player = itProposalPlayer->second;
1924 player.accept = LfgAnswer(accept);
1925
1926 LOG_DEBUG("lfg", "LFGMgr::UpdateProposal: Player [{}] of proposal {} selected: {}", guid.ToString(), proposalId, accept);
1927 if (!accept)
1928 {
1930 return;
1931 }
1932
1933 // check if all have answered and reorder players (leader first)
1934 bool allAnswered = true;
1935 for (LfgProposalPlayerContainer::const_iterator itPlayers = proposal.players.begin(); itPlayers != proposal.players.end(); ++itPlayers)
1936 if (itPlayers->second.accept != LFG_ANSWER_AGREE) // No answer (-1) or not accepted (0)
1937 allAnswered = false;
1938
1939 if (!m_Testing && !allAnswered)
1940 {
1941 for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
1942 SendLfgUpdateProposal(it->first, proposal);
1943
1944 return;
1945 }
1946
1947 bool sendUpdate = proposal.state != LFG_PROPOSAL_SUCCESS;
1948 proposal.state = LFG_PROPOSAL_SUCCESS;
1949 time_t joinTime = GameTime::GetGameTime().count();
1950
1951 LFGQueue& queue = GetQueue(guid);
1952 LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_GROUP_FOUND);
1953 for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
1954 {
1955 ObjectGuid pguid = it->first;
1956 ObjectGuid gguid = it->second.group;
1957 uint32 dungeonId = (*GetSelectedDungeons(pguid).begin());
1958 int32 waitTime = -1;
1959 if (sendUpdate)
1960 SendLfgUpdateProposal(pguid, proposal);
1961
1962 if (gguid)
1963 {
1964 waitTime = int32((joinTime - queue.GetJoinTime(gguid)) / IN_MILLISECONDS);
1965 SendLfgUpdateParty(pguid, updateData);
1966 }
1967 else
1968 {
1969 waitTime = int32((joinTime - queue.GetJoinTime(pguid)) / IN_MILLISECONDS);
1970 SendLfgUpdatePlayer(pguid, updateData);
1971 }
1972 updateData.updateType = LFG_UPDATETYPE_REMOVED_FROM_QUEUE;
1973 SendLfgUpdatePlayer(pguid, updateData);
1974 SendLfgUpdateParty(pguid, updateData);
1975
1976 // Update timers
1977 uint8 role = GetRoles(pguid);
1978 role &= ~PLAYER_ROLE_LEADER;
1979 switch (role)
1980 {
1981 case PLAYER_ROLE_DAMAGE:
1982 queue.UpdateWaitTimeDps(waitTime, dungeonId);
1983 break;
1984 case PLAYER_ROLE_HEALER:
1985 queue.UpdateWaitTimeHealer(waitTime, dungeonId);
1986 break;
1987 case PLAYER_ROLE_TANK:
1988 queue.UpdateWaitTimeTank(waitTime, dungeonId);
1989 break;
1990 default:
1991 queue.UpdateWaitTimeAvg(waitTime, dungeonId);
1992 break;
1993 }
1994
1996 }
1997
1998 // Remove players/groups from Queue
1999 for (uint8 i = 0; i < 5 && proposal.queues.guids[i]; ++i)
2000 queue.RemoveQueueData(proposal.queues.guids[i]);
2001
2002 MakeNewGroup(proposal);
2003 ProposalsStore.erase(itProposal);
2004 }
std::int32_t int32
Definition Define.h:103
uint8 GetRoles(ObjectGuid guid)
Get current player roles.
Definition LFGMgr.cpp:2506
void MakeNewGroup(LfgProposal const &proposal)
Definition LFGMgr.cpp:1679
@ 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)
1071 {
1072 for (uint8 team = 0; team < 2; ++team)
1073 {
1074 if (m_raidBrowserUpdateTimer[team] > diff)
1075 m_raidBrowserUpdateTimer[team] -= diff;
1076 else
1077 m_raidBrowserUpdateTimer[team] = 0;
1078 }
1079
1080 if (GetMSTimeDiff(GameTime::GetGameTimeMS(), GetTimeMS()) > 98ms) // prevent lagging
1081 {
1082 return;
1083 }
1084
1085 ObjectGuid guid, groupGuid, instanceGuid;
1086 uint8 level, Class, race, talents[3];
1087 float iLevel, mp5, mp5combat, baseAP, rangedAP;
1088 int32 spellDamage, spellHeal;
1089 uint32 dungeonId, encounterMask, maxPower;
1090 uint32 deletedCounter, groupCounter, playerCounter;
1091 ByteBuffer buffer_deleted, buffer_groups, buffer_players;
1092 std::string emptyComment;
1093 GuidSet deletedGroups, deletedGroupsToErase;
1094 RBInternalInfoMap copy;
1095
1096 for (uint8 team = 0; team < 2; ++team)
1097 {
1098 if (m_raidBrowserLastUpdatedDungeonId[team] == 0) // new loop
1099 {
1100 if (m_raidBrowserUpdateTimer[team] > 0) // allowed only with some time interval
1101 continue;
1102 else // reset timer
1103 m_raidBrowserUpdateTimer[team] = 5000;
1104 }
1105
1106 RBUsedDungeonsSet::const_iterator neitr, titr;
1107 for (neitr = RBUsedDungeonsStore[team].begin(); neitr != RBUsedDungeonsStore[team].end(); )
1108 {
1109 titr = neitr++;
1110 dungeonId = (*titr);
1111
1112 // go to next dungeon than previously (one dungeon updated in one LFGMgr::UpdateRaidBrowser)
1113 if (dungeonId <= m_raidBrowserLastUpdatedDungeonId[team])
1114 continue;
1115 m_raidBrowserLastUpdatedDungeonId[team] = dungeonId;
1116
1117 RBEntryInfoMap& entryInfoMap = RaidBrowserStore[team][dungeonId];
1118 LFGDungeonData const* dungeonData = GetLFGDungeon(dungeonId); // checked if exists before inserting to the container
1119 RBInternalInfoMap& currInternalInfoMap = RBInternalInfoStoreCurr[team][dungeonId];
1120 for (RBEntryInfoMap::const_iterator sitr = entryInfoMap.begin(); sitr != entryInfoMap.end(); ++sitr)
1121 {
1122 guid = sitr->first;
1123 groupGuid.Clear();
1125 ASSERT(p);
1126 if (sitr->second.roles == PLAYER_ROLE_LEADER)
1127 {
1128 ASSERT(p->GetGroup());
1129 groupGuid = p->GetGroup()->GetGUID();
1130 }
1131 encounterMask = 0;
1132 instanceGuid.Clear();
1133 if (InstancePlayerBind* bind = sInstanceSaveMgr->PlayerGetBoundInstance(guid, dungeonData->map, dungeonData->difficulty))
1134 if (bind->perm)
1135 {
1136 instanceGuid = ObjectGuid::Create<HighGuid::Instance>(bind->save->GetInstanceId());
1137 encounterMask = bind->save->GetCompletedEncounterMask();
1138 }
1139
1140 talents[0] = 0;
1141 talents[1] = 0;
1142 talents[2] = 0;
1143 p->GetTalentTreePoints(talents);
1150 maxPower = 0;
1151 if (p->IsClass(CLASS_DRUID))
1152 maxPower = p->GetMaxPower(POWER_MANA);
1153 else
1154 maxPower = (p->getPowerType() == POWER_RAGE || p->getPowerType() == POWER_RUNIC_POWER) ? p->GetMaxPower(p->getPowerType()) / 10 : p->GetMaxPower(p->getPowerType());
1155
1156 currInternalInfoMap[sitr->first] = RBInternalInfo(guid, sitr->second.comment, !groupGuid.IsEmpty(), groupGuid, sitr->second.roles, encounterMask, instanceGuid,
1157 1, p->GetLevel(), p->getClass(), p->getRace(), p->GetAverageItemLevel(),
1158 talents, p->GetAreaId(), p->GetArmor(), (uint32)std::max<int32>(0, spellDamage), (uint32)std::max<int32>(0, spellHeal),
1159 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),
1160 std::max<uint32>(baseAP, rangedAP), (uint32)p->GetStat(STAT_AGILITY), p->GetMaxHealth(), maxPower, p->GetDefenseSkillValue(),
1162
1163 if (!groupGuid)
1164 continue;
1165 for (Group::member_citerator mitr = p->GetGroup()->GetMemberSlots().begin(); mitr != p->GetGroup()->GetMemberSlots().end(); ++mitr)
1166 {
1167 if (mitr->guid == sitr->first) // leader already added
1168 continue;
1169
1170 guid = mitr->guid;
1171 level = 1;
1172 Class = 0;
1173 race = 0;
1174 iLevel = 0.0f;
1175 talents[0] = 0;
1176 talents[1] = 0;
1177 talents[2] = 0;
1178 if (CharacterCacheEntry const* gpd = sCharacterCache->GetCharacterCacheByGuid(mitr->guid))
1179 {
1180 level = gpd->Level;
1181 Class = gpd->Class;
1182 race = gpd->Race;
1183 }
1185 if (mplr)
1186 {
1187 iLevel = mplr->GetAverageItemLevel();
1188 mplr->GetTalentTreePoints(talents);
1189 }
1190 currInternalInfoMap[mitr->guid] = RBInternalInfo(guid, emptyComment, false, groupGuid, 0, 0, ObjectGuid::Empty,
1191 (mplr ? 1 : 0), level, Class, race, iLevel,
1192 talents, 0, 0, 0, 0,
1193 0, 0, 0, 0, 0,
1194 0, 0, 0, 0, 0,
1195 0, 0, 0, 0, 0);
1196 }
1197 }
1198
1199 copy.clear();
1200 copy = currInternalInfoMap; // will be saved as prev at the end
1201
1202 // compare prev with curr to build difference packet
1203 deletedCounter = 0;
1204 groupCounter = 0;
1205 playerCounter = 0;
1206 buffer_deleted.clear();
1207 buffer_groups.clear();
1208 buffer_players.clear();
1209 deletedGroups.clear();
1210 deletedGroupsToErase.clear();
1211
1212 RBInternalInfoMap& prevInternalInfoMap = RBInternalInfoStorePrev[team][dungeonId];
1213 RBInternalInfoMap::iterator iter, iterTmp;
1214 for (RBInternalInfoMap::const_iterator sitr = prevInternalInfoMap.begin(); sitr != prevInternalInfoMap.end(); ++sitr)
1215 {
1216 iter = currInternalInfoMap.find(sitr->first);
1217 if (iter == currInternalInfoMap.end()) // was -> isn't
1218 {
1219 if (sitr->second.isGroupLeader)
1220 deletedGroups.insert(sitr->second.groupGuid);
1221 ++deletedCounter;
1222 buffer_deleted << sitr->second.guid;
1223 }
1224 else // was -> is
1225 {
1226 if (sitr->second.isGroupLeader) // was a leader
1227 {
1228 if (!iter->second.isGroupLeader) // leader -> no longer a leader
1229 deletedGroups.insert(sitr->second.groupGuid);
1230 else if (sitr->second.groupGuid != iter->second.groupGuid) // leader -> leader of another group
1231 {
1232 deletedGroups.insert(sitr->second.groupGuid);
1233 deletedGroupsToErase.insert(iter->second.groupGuid);
1234 ++groupCounter;
1235 RBPacketAppendGroup(iter->second, buffer_groups);
1236 }
1237 else if (sitr->second.comment != iter->second.comment || sitr->second.encounterMask != iter->second.encounterMask || sitr->second.instanceGuid != iter->second.instanceGuid) // leader -> nothing changed
1238 {
1239 ++groupCounter;
1240 RBPacketAppendGroup(iter->second, buffer_groups);
1241 }
1242 }
1243 else if (iter->second.isGroupLeader) // wasn't a leader -> is a leader
1244 {
1245 deletedGroupsToErase.insert(iter->second.groupGuid);
1246 ++groupCounter;
1247 RBPacketAppendGroup(iter->second, buffer_groups);
1248 }
1249
1250 if (!iter->second._online) // if offline, copy previous stats (itemLevel, talents, area, etc.)
1251 {
1252 iterTmp = copy.find(sitr->first); // copied container is for building a full packet, so modify it there (currInternalInfoMap is erased)
1253 iterTmp->second.CopyStats(sitr->second);
1254 if (!sitr->second.PlayerSameAs(iterTmp->second)) // player info changed
1255 {
1256 ++playerCounter;
1257 RBPacketAppendPlayer(iterTmp->second, buffer_players);
1258 }
1259 }
1260 else if (!sitr->second.PlayerSameAs(iter->second)) // player info changed
1261 {
1262 ++playerCounter;
1263 RBPacketAppendPlayer(iter->second, buffer_players);
1264 }
1265 currInternalInfoMap.erase(iter);
1266 }
1267 }
1268 // left entries (new)
1269 for (RBInternalInfoMap::const_iterator sitr = currInternalInfoMap.begin(); sitr != currInternalInfoMap.end(); ++sitr)
1270 {
1271 if (sitr->second.isGroupLeader)
1272 {
1273 deletedGroupsToErase.insert(sitr->second.groupGuid);
1274 ++groupCounter;
1275 RBPacketAppendGroup(sitr->second, buffer_groups);
1276 }
1277 ++playerCounter;
1278 RBPacketAppendPlayer(sitr->second, buffer_players);
1279 }
1280
1281 if (!deletedGroupsToErase.empty())
1282 {
1283 for (ObjectGuid const& toErase : deletedGroupsToErase)
1284 {
1285 deletedGroups.erase(toErase);
1286 }
1287 }
1288
1289 if (!deletedGroups.empty())
1290 {
1291 for (ObjectGuid const& deletedGroup : deletedGroups)
1292 {
1293 ++deletedCounter;
1294 buffer_deleted << deletedGroup;
1295 }
1296 }
1297
1298 WorldPacket differencePacket(SMSG_UPDATE_LFG_LIST, 1000);
1299 RBPacketBuildDifference(differencePacket, dungeonId, deletedCounter, buffer_deleted, groupCounter, buffer_groups, playerCounter, buffer_players);
1300 WorldPacket fullPacket(SMSG_UPDATE_LFG_LIST, 1000);
1301 RBPacketBuildFull(fullPacket, dungeonId, copy);
1302
1303 RBCacheStore[team][dungeonId] = fullPacket;
1304 prevInternalInfoMap = copy;
1305 currInternalInfoMap.clear();
1306
1307 if (entryInfoMap.empty())
1308 RBUsedDungeonsStore[team].erase(titr);
1309
1310 // send difference packet to browsing players
1311 for (RBSearchersMap::const_iterator sitr = RBSearchersStore[team].begin(); sitr != RBSearchersStore[team].end(); ++sitr)
1312 if (sitr->second == dungeonId)
1313 if (Player* p = ObjectAccessor::FindConnectedPlayer(sitr->first))
1314 p->SendDirectMessage(&differencePacket);
1315
1316 break; // one dungeon updated in one LFGMgr::UpdateRaidBrowser
1317 }
1318
1319 // already updated all in this time interval
1320 if (neitr == RBUsedDungeonsStore[team].end())
1322 }
1323 }
#define sCharacterCache
Definition CharacterCache.h:83
std::uint16_t uint16
Definition Define.h:108
std::set< ObjectGuid > GuidSet
Definition ObjectGuid.h:253
@ Class
Requires the player to be a specific class.
@ POWER_RAGE
Definition SharedDefines.h:258
@ POWER_RUNIC_POWER
Definition SharedDefines.h:263
@ POWER_MANA
Definition SharedDefines.h:257
@ CLASS_DRUID
Definition SharedDefines.h:136
@ STAT_AGILITY
Definition SharedDefines.h:247
@ SPELL_SCHOOL_MASK_ALL
Definition SharedDefines.h:303
Milliseconds GetTimeMS()
Definition Timer.h:84
Milliseconds GetMSTimeDiff(Milliseconds oldMSTime, Milliseconds newMSTime)
Definition Timer.h:91
@ BASE_ATTACK
Definition Unit.h:215
@ RANGED_ATTACK
Definition Unit.h:217
@ CR_EXPERTISE
Definition Unit.h:246
@ CR_CRIT_MELEE
Definition Unit.h:231
@ CR_CRIT_RANGED
Definition Unit.h:232
@ CR_PARRY
Definition Unit.h:226
@ CR_DODGE
Definition Unit.h:225
@ CR_BLOCK
Definition Unit.h:227
@ CR_HASTE_SPELL
Definition Unit.h:242
@ CR_CRIT_SPELL
Definition Unit.h:233
@ PLAYER_FIELD_COMBAT_RATING_1
Definition UpdateFields.h:380
@ UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER
Definition UpdateFields.h:113
@ UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER
Definition UpdateFields.h:112
void clear()
Definition ByteBuffer.h:122
MemberSlotList const & GetMemberSlots() const
Definition Group.h:242
MemberSlotList::const_iterator member_citerator
Definition Group.h:180
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:294
float GetFloatValue(uint16 index) const
Definition Object.cpp:306
void GetTalentTreePoints(uint8(&specPoints)[3]) const
Definition Player.cpp:15386
float GetAverageItemLevel()
Definition Player.cpp:15827
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:9769
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition Unit.cpp:12265
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition Unit.cpp:3776
uint32 GetMaxHealth() const
Definition Unit.h:1109
uint8 getClass() const
Definition Unit.h:843
uint8 getRace(bool original=false) const
Definition Unit.cpp:17013
uint32 GetMaxPower(Powers power) const
Definition Unit.h:1136
uint32 GetArmor() const
Definition Unit.h:1157
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:9012
float GetStat(Stats stat) const
Definition Unit.h:1058
Powers getPowerType() const
Definition Unit.h:1131
uint32 GetAreaId() const
Definition Object.cpp:3120
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:1395
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:1410
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
1492 {
1493 if (!gguid)
1494 return;
1495
1496 LfgRolesMap check_roles;
1497 LfgRoleCheckContainer::iterator itRoleCheck = RoleChecksStore.find(gguid);
1498 if (itRoleCheck == RoleChecksStore.end())
1499 return;
1500
1501 LfgRoleCheck& roleCheck = itRoleCheck->second;
1502 bool sendRoleChosen = roleCheck.state != LFG_ROLECHECK_DEFAULT && guid;
1503
1504 if (!guid)
1505 roleCheck.state = LFG_ROLECHECK_ABORTED;
1506 else if (roles < PLAYER_ROLE_TANK) // Player selected no role.
1507 roleCheck.state = LFG_ROLECHECK_NO_ROLE;
1508 else
1509 {
1510 roleCheck.roles[guid] = roles;
1511
1512 // Check if all players have selected a role
1513 LfgRolesMap::const_iterator itRoles = roleCheck.roles.begin();
1514 while (itRoles != roleCheck.roles.end() && itRoles->second != PLAYER_ROLE_NONE)
1515 ++itRoles;
1516
1517 if (itRoles == roleCheck.roles.end())
1518 {
1519 // use temporal var to check roles, CheckGroupRoles modifies the roles
1520 check_roles = roleCheck.roles;
1521 roleCheck.state = CheckGroupRoles(check_roles) ? LFG_ROLECHECK_FINISHED : LFG_ROLECHECK_WRONG_ROLES;
1522 }
1523 }
1524
1525 LfgDungeonSet dungeons;
1526 if (roleCheck.rDungeonId)
1527 dungeons.insert(roleCheck.rDungeonId);
1528 else
1529 dungeons = roleCheck.dungeons;
1530
1531 LfgJoinResultData joinData = LfgJoinResultData(LFG_JOIN_FAILED, roleCheck.state);
1532 for (LfgRolesMap::const_iterator it = roleCheck.roles.begin(); it != roleCheck.roles.end(); ++it)
1533 {
1534 ObjectGuid pguid = it->first;
1535
1536 if (sendRoleChosen)
1537 SendLfgRoleChosen(pguid, guid, roles);
1538
1539 SendLfgRoleCheckUpdate(pguid, roleCheck);
1540 switch (roleCheck.state)
1541 {
1543 continue;
1545 SetState(pguid, LFG_STATE_QUEUED);
1546 SetRoles(pguid, it->second);
1547 SendLfgUpdateParty(pguid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, dungeons, GetComment(pguid)));
1548 break;
1549 default:
1550 if (roleCheck.leader == pguid)
1551 SendLfgJoinResult(pguid, joinData);
1553 RestoreState(pguid, "Rolecheck Failed");
1554 break;
1555 }
1556 }
1557
1558 if (roleCheck.state == LFG_ROLECHECK_FINISHED)
1559 {
1560 SetState(gguid, LFG_STATE_QUEUED);
1561 LFGQueue& queue = GetQueue(gguid);
1562 queue.AddQueueData(gguid, time_t(GameTime::GetGameTime().count()), roleCheck.dungeons, roleCheck.roles);
1563 RoleChecksStore.erase(itRoleCheck);
1564 }
1565 else if (roleCheck.state != LFG_ROLECHECK_INITIALITING)
1566 {
1567 RestoreState(gguid, "Rolecheck Failed");
1568 RoleChecksStore.erase(itRoleCheck);
1569 }
1570 }
void SendLfgRoleChosen(ObjectGuid guid, ObjectGuid pguid, uint8 roles)
Definition LFGMgr.cpp:2748
@ 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: