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

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)
 

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
 

Detailed Description

Member Typedef Documentation

◆ 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:322
bool m_Testing
Definition LFGMgr.h:635
uint32 m_lfgProposalId
used as internal counter for proposals
Definition LFGMgr.h:618
uint32 m_raidBrowserLastUpdatedDungeonId[2]
pussywizard: for 2 factions
Definition LFGMgr.h:622
uint32 m_options
Stores config options.
Definition LFGMgr.h:619
uint32 m_raidBrowserUpdateTimer[2]
pussywizard
Definition LFGMgr.h:621
#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:627

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:2499
void SetState(ObjectGuid guid, LfgState state)
Definition LFGMgr.cpp:2472
void SetLeader(ObjectGuid gguid, ObjectGuid leader)
Sets the leader of the group.
Definition LFGMgr.cpp:2586
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:2368
uint32 GetDungeon(ObjectGuid guid, bool asId=true)
Get current dungeon.
Definition LFGMgr.cpp:2392

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

Referenced by FinishDungeon(), and MakeNewGroup().

◆ AddPlayerToGroup()

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

Adds player to group.

2582 {
2583 GroupsStore[gguid].AddPlayer(guid);
2584 }
LfgGroupDataContainer GroupsStore
Group data.
Definition LFGMgr.h:634

References GroupsStore.

Referenced by SetupGroupMember().

◆ AddProposal()

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

Add a new Proposal.

1804 {
1805 proposal.id = ++m_lfgProposalId;
1806 ProposalsStore[m_lfgProposalId] = proposal;
1807 return m_lfgProposalId;
1808 }
LfgProposalContainer ProposalsStore
Current Proposals.
Definition LFGMgr.h:631

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

◆ AllQueued()

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

Checks if all players are queued.

2712 {
2713 bool ok = true;
2714
2715 if (check.empty())
2716 return false;
2717
2718 for (uint8 i = 0; i < 5 && check.guids[i]; ++i)
2719 {
2720 ObjectGuid guid = check.guids[i];
2721 if (GetState(guid) != LFG_STATE_QUEUED)
2722 {
2723 LFGQueue& queue = GetQueue(guid);
2724 queue.RemoveFromQueue(guid);
2725 ok = false;
2726 }
2727 }
2728
2729 return ok;
2730 }
Definition ObjectGuid.h:118
LFGQueue & GetQueue(ObjectGuid guid)
Definition LFGMgr.cpp:2694
@ 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.

1519 {
1520 if (groles.empty())
1521 return 0;
1522
1523 uint8 damage = 0;
1524 uint8 tank = 0;
1525 uint8 healer = 0;
1526
1527 for (LfgRolesMap::iterator it = groles.begin(); it != groles.end(); ++it)
1528 {
1529 uint8 const role = it->second & ~PLAYER_ROLE_LEADER;
1530 if (role == PLAYER_ROLE_NONE)
1531 return 0;
1532
1533 if (role & PLAYER_ROLE_DAMAGE)
1534 {
1535 if (role != PLAYER_ROLE_DAMAGE)
1536 {
1537 it->second -= PLAYER_ROLE_DAMAGE;
1538 if (uint8 x = CheckGroupRoles(groles))
1539 return x;
1540 it->second += PLAYER_ROLE_DAMAGE;
1541 }
1542 else if (damage == LFG_DPS_NEEDED)
1543 return 0;
1544 else
1545 damage++;
1546 }
1547
1548 if (role & PLAYER_ROLE_HEALER)
1549 {
1550 if (role != PLAYER_ROLE_HEALER)
1551 {
1552 it->second -= PLAYER_ROLE_HEALER;
1553 if (uint8 x = CheckGroupRoles(groles))
1554 return x;
1555 it->second += PLAYER_ROLE_HEALER;
1556 }
1557 else if (healer == LFG_HEALERS_NEEDED)
1558 return 0;
1559 else
1560 healer++;
1561 }
1562
1563 if (role & PLAYER_ROLE_TANK)
1564 {
1565 if (role != PLAYER_ROLE_TANK)
1566 {
1567 it->second -= PLAYER_ROLE_TANK;
1568 if (uint8 x = CheckGroupRoles(groles))
1569 return x;
1570 it->second += PLAYER_ROLE_TANK;
1571 }
1572 else if (tank == LFG_TANKS_NEEDED)
1573 return 0;
1574 else
1575 tank++;
1576 }
1577 }
1578 if ((tank + healer + damage) == uint8(groles.size()))
1579 return (8 * tank + 4 * healer + damage);
1580 return 0;
1581 }
static uint8 CheckGroupRoles(LfgRolesMap &groles)
Checks if given roles match, modifies given roles map with new roles.
Definition LFGMgr.cpp:1518
@ 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.

2734 {
2735 QueuesStore.clear();
2736 }
LfgQueueContainer QueuesStore
Queues.
Definition LFGMgr.h:624

References QueuesStore.

◆ ClearState()

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

◆ DecreaseKicksLeft()

void lfg::LFGMgr::DecreaseKicksLeft ( ObjectGuid  guid)
private
2543 {
2544 LOG_DEBUG("lfg", "LFGMgr::DecreaseKicksLeft: [{}]", guid.ToString());
2545 GroupsStore[guid].DecreaseKicksLeft();
2546 }
#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().

◆ 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
2215 {
2216 uint32 gDungeonId = GetDungeon(gguid);
2217 if (gDungeonId != dungeonId)
2218 {
2219 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] Finished dungeon {} but group queued for {}. Ignoring", gguid.ToString(), dungeonId, gDungeonId);
2220 return;
2221 }
2222
2223 if (GetState(gguid) == LFG_STATE_FINISHED_DUNGEON) // Shouldn't happen. Do not reward multiple times
2224 {
2225 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] Already rewarded group. Ignoring", gguid.ToString());
2226 return;
2227 }
2228
2230 _SaveToDB(gguid); // pussywizard
2231
2232 const LfgGuidSet& players = GetPlayers(gguid);
2233 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
2234 {
2235 ObjectGuid guid = (*it);
2237 {
2238 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] Already rewarded player. Ignoring", guid.ToString());
2239 continue;
2240 }
2241
2242 uint32 rDungeonId = 0;
2243 const LfgDungeonSet& dungeons = GetSelectedDungeons(guid);
2244 if (!dungeons.empty())
2245 rDungeonId = (*dungeons.begin());
2246
2248
2249 // Give rewards only if its a random dungeon
2250 LFGDungeonData const* dungeon = GetLFGDungeon(rDungeonId);
2251
2252 if (!dungeon || (dungeon->type != LFG_TYPE_RANDOM && !dungeon->seasonal))
2253 {
2254 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] dungeon {} is not random or seasonal", guid.ToString(), rDungeonId);
2255 continue;
2256 }
2257
2258 Player* player = ObjectAccessor::FindPlayer(guid);
2259 if (!player || player->FindMap() != currMap) // pussywizard: currMap - multithreading crash if on other map (map id check is not enough, binding system is not reliable)
2260 {
2261 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] not found in world", guid.ToString());
2262 continue;
2263 }
2264
2265 LFGDungeonData const* dungeonDone = GetLFGDungeon(dungeonId);
2266 uint32 mapId = dungeonDone ? uint32(dungeonDone->map) : 0;
2267
2268 if (player->GetMapId() != mapId)
2269 {
2270 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] is in map {} and should be in {} to get reward", guid.ToString(), player->GetMapId(), mapId);
2271 continue;
2272 }
2273
2274 // Remove Dungeon Finder Cooldown if still exists
2276 {
2278 }
2279
2280 // Xinef: Update achievements, set correct amount of randomly grouped players
2281 if (dungeon->difficulty == DUNGEON_DIFFICULTY_HEROIC)
2282 if (uint8 count = GetRandomPlayersCount(player->GetGUID()))
2284
2285 LfgReward const* reward = GetRandomDungeonReward(rDungeonId, player->GetLevel());
2286 if (!reward)
2287 continue;
2288
2289 bool done = false;
2290 Quest const* quest = sObjectMgr->GetQuestTemplate(reward->firstQuest);
2291 if (!quest)
2292 continue;
2293
2294 // if we can take the quest, means that we haven't done this kind of "run", IE: First Heroic Random of Day.
2295 if (player->CanRewardQuest(quest, false))
2296 player->RewardQuest(quest, 0, nullptr, false, true);
2297 else
2298 {
2299 done = true;
2300 quest = sObjectMgr->GetQuestTemplate(reward->otherQuest);
2301 if (!quest)
2302 continue;
2303 // we give reward without informing client (retail does this)
2304 player->RewardQuest(quest, 0, nullptr, false, true);
2305 }
2306
2307 // Give rewards
2308 LOG_DEBUG("lfg", "LFGMgr::FinishDungeon: [{}] done dungeon {}, {} previously done.", player->GetGUID().ToString(), GetDungeon(gguid), done ? " " : " not");
2309 LfgPlayerRewardData data = LfgPlayerRewardData(dungeon->Entry(), GetDungeon(gguid, false), done, quest);
2310 player->GetSession()->SendLfgPlayerReward(data);
2311 }
2312 }
@ 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:1650
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:113
Definition Player.h:1071
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition PlayerUpdates.cpp:2163
bool CanRewardQuest(Quest const *quest, bool msg)
Definition PlayerQuest.cpp:385
WorldSession * GetSession() const
Definition Player.h:1998
void RewardQuest(Quest const *quest, uint32 reward, Object *questGiver, bool announce=true, bool isLFGReward=false)
Definition PlayerQuest.cpp:659
Definition QuestDef.h:210
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5840
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:5028
uint8 GetLevel() const
Definition Unit.h:1088
uint32 GetMapId() const
Definition Position.h:281
Map * FindMap() const
Definition Object.h:621
void SendLfgPlayerReward(lfg::LfgPlayerRewardData const &lfgPlayerRewardData)
Definition LFGHandler.cpp:471
uint8 GetRandomPlayersCount(ObjectGuid guid)
Xinef: Get Random Players Count.
Definition LFGMgr.cpp:2629
void _SaveToDB(ObjectGuid guid)
Definition LFGMgr.cpp:95
LFGDungeonData const * GetLFGDungeon(uint32 id)
Definition LFGMgr.cpp:168
LfgDungeonSet const & GetSelectedDungeons(ObjectGuid guid)
Get selected dungeons.
Definition LFGMgr.cpp:2424
LfgReward const * GetRandomDungeonReward(uint32 dungeon, uint8 level)
Gets the random dungeon reward corresponding to given dungeon and player level.
Definition LFGMgr.cpp:2338
LfgGuidSet const & GetPlayers(ObjectGuid guid)
Definition LFGMgr.cpp:2609
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245
GuidSet LfgGuidSet
Definition LFG.h:117
@ LFG_SPELL_DUNGEON_COOLDOWN
Definition LFGMgr.h:52
@ LFG_TYPE_RANDOM
Definition LFGMgr.h:74
std::set< uint32 > LfgDungeonSet
Definition LFG.h:114

References _SaveToDB(), ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS, 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)

2419 {
2420 LOG_DEBUG("lfg", "LFGMgr::GetComment: [{}] = {}", guid.ToString(), PlayersStore[guid].GetComment());
2421 return PlayersStore[guid].GetComment();
2422 }
LfgPlayerDataContainer PlayersStore
Player data.
Definition LFGMgr.h:633

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
1489 {
1490 lockMap.clear();
1491 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end() && !dungeons.empty(); ++it)
1492 {
1493 ObjectGuid guid = (*it);
1494 LfgLockMap const& cachedLockMap = GetLockedDungeons(guid);
1495 for (LfgLockMap::const_iterator it2 = cachedLockMap.begin(); it2 != cachedLockMap.end() && !dungeons.empty(); ++it2)
1496 {
1497 uint32 dungeonId = (it2->first & 0x00FFFFFF); // Compare dungeon ids
1498
1499 LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId);
1500
1501 uint8 difficultyFlag = (randomDungeonId == RANDOM_DUNGEON_NORMAL_TBC || randomDungeonId == RANDOM_DUNGEON_NORMAL_WOTLK) ? 0 : 1;
1502
1503 if (dungeon && !IsDungeonDisabled(dungeon->map, (Difficulty)difficultyFlag) && it2->second == LFG_LOCKSTATUS_RAID_LOCKED && randomDungeonId && sWorld->getBoolConfig(CONFIG_LFG_ALLOW_COMPLETED))
1504 continue;
1505
1506 LfgDungeonSet::iterator itDungeon = dungeons.find(dungeonId);
1507 if (itDungeon != dungeons.end())
1508 {
1509 dungeons.erase(itDungeon);
1510 lockMap[guid][dungeonId] = it2->second;
1511 }
1512 }
1513 }
1514 if (!dungeons.empty())
1515 lockMap.clear();
1516 }
Difficulty
Definition DBCEnums.h:266
@ CONFIG_LFG_ALLOW_COMPLETED
Definition WorldConfig.h:97
bool IsDungeonDisabled(uint32 mapId, Difficulty difficulty) const
Checks if given dungeon map is disabled.
Definition LFGMgr.cpp:2836
LfgLockMap const & GetLockedDungeons(ObjectGuid guid)
Get locked dungeons.
Definition LFGMgr.cpp:2430
@ 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.

2393 {
2394 uint32 dungeon = GroupsStore[guid].GetDungeon(asId);
2395 LOG_DEBUG("lfg", "LFGMgr::GetDungeon: [{}] asId: {} = {}", guid.ToString(), asId, dungeon);
2396 return dungeon;
2397 }

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

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

◆ GetDungeonMapId()

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

Get the map id of the current dungeon.

2400 {
2401 uint32 dungeonId = GroupsStore[guid].GetDungeon(true);
2402 uint32 mapId = 0;
2403 if (dungeonId)
2404 if (LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId))
2405 mapId = dungeon->map;
2406
2407 LOG_DEBUG("lfg", "LFGMgr::GetDungeonMapId: [{}] = {} (DungeonId = {})", guid.ToString(), mapId, dungeonId);
2408 return mapId;
2409 }

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.
2325 {
2326 LFGDungeonData const* dungeon = GetLFGDungeon(randomdungeon);
2327 uint32 group = dungeon ? dungeon->group : 0;
2328 return CachedDungeonMapStore[group];
2329 }
LfgCachedDungeonContainer CachedDungeonMapStore
Stores all dungeons by groupType.
Definition LFGMgr.h:625

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
2360 {
2361 LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId);
2362 if (!dungeon)
2363 return LFG_TYPE_NONE;
2364
2365 return LfgType(dungeon->type);
2366 }
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.

2600 {
2601 return PlayersStore[guid].GetGroup();
2602 }

References PlayersStore.

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

◆ GetKicksLeft()

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

Get kicks left in current group.

2437 {
2438 uint8 kicks = GroupsStore[guid].GetKicksLeft();
2439 LOG_DEBUG("lfg", "LFGMgr::GetKicksLeft: [{}] = {}", guid.ToString(), kicks);
2440 return kicks;
2441 }

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

◆ GetLeader()

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

Get leader of the group (using internal data)

2620 {
2621 return GroupsStore[guid].GetLeader();
2622 }

References GroupsStore.

Referenced by GetQueue(), and LeaveLfg().

◆ GetLFGDungeon()

LFGDungeonData const * lfg::LFGMgr::GetLFGDungeon ( uint32  id)
private
169 {
170 LFGDungeonContainer::const_iterator itr = LfgDungeonStore.find(id);
171 if (itr != LfgDungeonStore.end())
172 return &(itr->second);
173
174 return nullptr;
175 }
LFGDungeonContainer LfgDungeonStore
Definition LFGMgr.h:628

References LfgDungeonStore.

Referenced by 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.

2815 {
2816 if (id)
2817 if (LFGDungeonData const* dungeon = GetLFGDungeon(id))
2818 return dungeon->Entry();
2819
2820 return 0;
2821 }

References GetLFGDungeon().

Referenced by LoadRewards().

◆ GetLfgStatus()

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

Returns current lfg status.

2754 {
2755 LfgPlayerData& playerData = PlayersStore[guid];
2756 return LfgUpdateData(LFG_UPDATETYPE_UPDATE_STATUS, playerData.GetState(), playerData.GetSelectedDungeons());
2757 }
@ 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.

2431 {
2432 LOG_DEBUG("lfg", "LFGMgr::GetLockedDungeons: [{}]", guid.ToString());
2433 return PlayersStore[guid].GetLockedDungeons();
2434 }

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)

2381 {
2382 LfgState state;
2383 if (guid.IsGroup())
2384 state = GroupsStore[guid].GetOldState();
2385 else
2386 state = PlayersStore[guid].GetOldState();
2387
2388 LOG_DEBUG("lfg", "LFGMgr::GetOldState: [{}] = {}", guid.ToString(), state);
2389 return state;
2390 }

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

◆ GetOptions()

uint32 lfg::LFGMgr::GetOptions ( )

Gets current lfg options.

2744 {
2745 return m_options;
2746 }

References m_options.

◆ GetPlayerCount()

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

Gets the player count of given group.

2615 {
2616 return GroupsStore[guid].GetPlayerCount();
2617 }

References GroupsStore.

◆ GetPlayers()

LfgGuidSet const & lfg::LFGMgr::GetPlayers ( ObjectGuid  guid)
private
2610 {
2611 return GroupsStore[guid].GetPlayers();
2612 }

References GroupsStore.

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

◆ GetQueue()

LFGQueue & lfg::LFGMgr::GetQueue ( ObjectGuid  guid)
private
2695 {
2696 uint8 queueId = 0;
2697 if (guid.IsGroup())
2698 {
2699 LfgGuidSet const& players = GetPlayers(guid);
2700 ObjectGuid pguid = players.empty() ? ObjectGuid::Empty : (*players.begin());
2701 if (pguid)
2702 queueId = GetTeam(pguid);
2703 else
2704 queueId = GetTeam(GetLeader(guid));
2705 }
2706 else
2707 queueId = GetTeam(guid);
2708 return QueuesStore[queueId];
2709 }
static ObjectGuid const Empty
Definition ObjectGuid.h:120
ObjectGuid GetLeader(ObjectGuid guid)
Get leader of the group (using internal data)
Definition LFGMgr.cpp:2619
TeamId GetTeam(ObjectGuid guid)
Definition LFGMgr.cpp:2571

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.

2824 {
2825 LfgDungeonSet randomDungeons;
2826 for (lfg::LFGDungeonContainer::const_iterator itr = LfgDungeonStore.begin(); itr != LfgDungeonStore.end(); ++itr)
2827 {
2828 lfg::LFGDungeonData const& dungeon = itr->second;
2829 if ((dungeon.type == lfg::LFG_TYPE_RANDOM || (dungeon.seasonal && sLFGMgr->IsSeasonActive(dungeon.id)))
2830 && dungeon.expansion <= expansion && dungeon.minlevel <= level && level <= dungeon.maxlevel)
2831 randomDungeons.insert(dungeon.Entry());
2832 }
2833 return randomDungeons;
2834 }
#define sLFGMgr
Definition LFGMgr.h:643
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
2339 {
2340 LfgReward const* rew = nullptr;
2341 LfgRewardContainerBounds bounds = RewardMapStore.equal_range(dungeon & 0x00FFFFFF);
2342 for (LfgRewardContainer::const_iterator itr = bounds.first; itr != bounds.second; ++itr)
2343 {
2344 rew = itr->second;
2345 // ordered properly at loading
2346 if (itr->second->maxLevel >= level)
2347 break;
2348 }
2349
2350 return rew;
2351 }
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.

2630 {
2631 return PlayersStore[guid].GetRandomPlayersCount();
2632 }

References PlayersStore.

Referenced by FinishDungeon().

◆ GetRoles()

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

Get current player roles.

2412 {
2413 uint8 roles = PlayersStore[guid].GetRoles();
2414 LOG_DEBUG("lfg", "LFGMgr::GetRoles: [{}] = {}", guid.ToString(), roles);
2415 return roles;
2416 }

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

Referenced by UpdateProposal().

◆ GetSelectedDungeons()

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

Get selected dungeons.

2425 {
2426 LOG_DEBUG("lfg", "LFGMgr::GetSelectedDungeons: [{}]", guid.ToString());
2427 return PlayersStore[guid].GetSelectedDungeons();
2428 }

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

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

◆ GetState()

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

Get current lfg state.

2369 {
2370 LfgState state;
2371 if (guid.IsGroup())
2372 state = GroupsStore[guid].GetState();
2373 else
2374 state = PlayersStore[guid].GetState();
2375
2376 LOG_DEBUG("lfg", "LFGMgr::GetState: [{}] = {}", guid.ToString(), state);
2377 return state;
2378 }

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
2572 {
2573 return PlayersStore[guid].GetTeam();
2574 }

References PlayersStore.

Referenced by GetQueue().

◆ HasIgnore()

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

Checks if given players are ignoring each other.

2635 {
2638 return plr1 && plr2 && (plr1->GetSocial()->HasIgnore(guid2) || plr2->GetSocial()->HasIgnore(guid1));
2639 }
bool HasIgnore(ObjectGuid const &ignore_guid) const
Definition SocialMgr.cpp:193
PlayerSocial * GetSocial()
Definition Player.h:1143
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
2030 {
2031 SetState(gguid, LFG_STATE_BOOT);
2032
2033 LfgPlayerBoot& boot = BootsStore[gguid];
2034 boot.inProgress = true;
2035 boot.cancelTime = time_t(GameTime::GetGameTime().count()) + LFG_TIME_BOOT;
2036 boot.reason = reason;
2037 boot.victim = victim;
2038
2039 LfgGuidSet const& players = GetPlayers(gguid);
2040
2041 // Set votes
2042 for (LfgGuidSet::const_iterator itr = players.begin(); itr != players.end(); ++itr)
2043 {
2044 ObjectGuid guid = (*itr);
2045 SetState(guid, LFG_STATE_BOOT);
2046 boot.votes[guid] = LFG_ANSWER_PENDING;
2047 }
2048
2049 boot.votes[victim] = LFG_ANSWER_DENY; // Victim auto vote NO
2050 boot.votes[kicker] = LFG_ANSWER_AGREE; // Kicker auto vote YES
2051
2052 // Notify players
2053 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
2054 SendLfgBootProposalUpdate(*it, boot);
2055 }
void SendLfgBootProposalUpdate(ObjectGuid guid, LfgPlayerBoot const &boot)
Definition LFGMgr.cpp:2671
LfgPlayerBootContainer BootsStore
Current player kicks.
Definition LFGMgr.h:632
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
390 {
391 ObjectGuid guid = player->GetGUID();
392
393 uint8 level = player->GetLevel();
394 uint8 expansion = player->GetSession()->Expansion();
395 LfgDungeonSet const& dungeons = GetDungeonsByRandom(0);
396 LfgLockMap lock;
397
398 bool onlySeasonalBosses = m_options == LFG_OPTION_ENABLE_SEASONAL_BOSSES;
399
400 float avgItemLevel = player->GetAverageItemLevelForDF();
401
402 for (LfgDungeonSet::const_iterator it = dungeons.begin(); it != dungeons.end(); ++it)
403 {
404 LFGDungeonData const* dungeon = GetLFGDungeon(*it);
405 if (!dungeon) // should never happen - We provide a list from sLFGDungeonStore
406 continue;
407 MapEntry const* mapEntry = sMapStore.LookupEntry(dungeon->map);
408 DungeonProgressionRequirements const* ar = sObjectMgr->GetAccessRequirement(dungeon->map, Difficulty(dungeon->difficulty));
409
410 uint32 lockData = 0;
411
412 if (dungeon->expansion > expansion || (onlySeasonalBosses && !dungeon->seasonal))
414 else if (IsDungeonDisabled(dungeon->map, dungeon->difficulty))
416 else if (dungeon->difficulty > DUNGEON_DIFFICULTY_NORMAL && (!mapEntry || !mapEntry->IsRaid()) && sInstanceSaveMgr->PlayerIsPermBoundToInstance(player->GetGUID(), dungeon->map, Difficulty(dungeon->difficulty)))
418 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))
420 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))
422 else if (dungeon->seasonal && !IsSeasonActive(dungeon->id))
424 else if (player->IsClass(CLASS_DEATH_KNIGHT) && !player->IsGameMaster() &&!(player->IsQuestRewarded(13188) || player->IsQuestRewarded(13189)))
426 else if (ar)
427 {
428 // Check required items
429 for (const ProgressionRequirement* itemRequirement : ar->items)
430 {
431 if (!itemRequirement->checkLeaderOnly || !group || group->GetLeaderGUID() == player->GetGUID())
432 {
433 if (itemRequirement->faction == TEAM_NEUTRAL || itemRequirement->faction == player->GetTeamId(true))
434 {
435 if (!player->HasItemCount(itemRequirement->id, 1))
436 {
438 break;
439 }
440 }
441 }
442 }
443
444 //Check for quests
445 for (const ProgressionRequirement* questRequirement : ar->quests)
446 {
447 if (!questRequirement->checkLeaderOnly || !group || group->GetLeaderGUID() == player->GetGUID())
448 {
449 if (questRequirement->faction == TEAM_NEUTRAL || questRequirement->faction == player->GetTeamId(true))
450 {
451 if (!player->GetQuestRewardStatus(questRequirement->id))
452 {
454 break;
455 }
456 }
457 }
458 }
459
460 //Check for ilvl
461 if (ar->reqItemLevel && (float)ar->reqItemLevel > avgItemLevel)
462 {
464 }
465
466 //Check if player has the required achievements
467 for (const ProgressionRequirement* achievementRequirement : ar->achievements)
468 {
469 if (!achievementRequirement->checkLeaderOnly || !group || group->GetLeaderGUID() == player->GetGUID())
470 {
471 if (achievementRequirement->faction == TEAM_NEUTRAL || achievementRequirement->faction == player->GetTeamId(true))
472 {
473 if (!player->HasAchieved(achievementRequirement->id))
474 {
476 break;
477 }
478 }
479 }
480 }
481 }
482
483 sScriptMgr->OnInitializeLockedDungeons(player, level, lockData, dungeon);
484
485 /* TODO VoA closed if WG is not under team control (LFG_LOCKSTATUS_RAID_LOCKED)
486 lockData = LFG_LOCKSTATUS_TOO_LOW_GEAR_SCORE;
487 lockData = LFG_LOCKSTATUS_TOO_HIGH_GEAR_SCORE;
488 lockData = LFG_LOCKSTATUS_ATTUNEMENT_TOO_LOW_LEVEL;
489 lockData = LFG_LOCKSTATUS_ATTUNEMENT_TOO_HIGH_LEVEL;
490 */
491
492 if (lockData)
493 lock[dungeon->Entry()] = lockData;
494 }
495
496 sScriptMgr->OnAfterInitializeLockedDungeons(player);
497
498 SetLockedDungeons(guid, lock);
499 }
@ DUNGEON_DIFFICULTY_NORMAL
Definition DBCEnums.h:269
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
#define sInstanceSaveMgr
Definition InstanceSaveMgr.h:202
#define sScriptMgr
Definition ScriptMgr.h:719
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:146
@ TEAM_NEUTRAL
Definition SharedDefines.h:773
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_LFG_DBC_LEVEL_OVERRIDE
Definition WorldConfig.h:125
float GetAverageItemLevelForDF()
Definition Player.cpp:15853
bool GetQuestRewardStatus(uint32 quest_id) const
Definition PlayerQuest.cpp:1413
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition PlayerStorage.cpp:657
TeamId GetTeamId(bool original=false) const
Definition Player.h:2106
bool HasAchieved(uint32 achievementId) const
Definition Player.cpp:13960
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition Player.cpp:1301
bool IsGameMaster() const
Definition Player.h:1161
bool IsQuestRewarded(uint32 quest_id) const
Definition Player.h:1625
uint8 Expansion() const
Definition WorldSession.h:435
void SetLockedDungeons(ObjectGuid guid, LfgLockMap const &lock)
Definition LFGMgr.cpp:2536
LfgDungeonSet const & GetDungeonsByRandom(uint32 randomdungeon)
Definition LFGMgr.cpp:2324
bool IsSeasonActive(uint32 dungeonId)
Checks if Seasonal dungeon is active.
Definition LFGMgr.cpp:2759
@ 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:937
uint8 levelMax
Definition Player.h:939
uint8 levelMin
Definition Player.h:938
uint16 reqItemLevel
Definition Player.h:940
Definition DBCStructure.h:1323
bool IsRaid() const
Definition DBCStructure.h:1352
Definition Player.h:928

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.

2802 {
2803 if (!guid.IsGroup())
2804 guid = GetGroup(guid);
2805
2806 if (uint32 dungeonId = GetDungeon(guid, true))
2807 if (LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId))
2808 if (uint32(dungeon->map) == map && dungeon->difficulty == difficulty)
2809 return true;
2810
2811 return false;
2812 }
ObjectGuid GetGroup(ObjectGuid guid)
Gets player group.
Definition LFGMgr.cpp:2599

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.

2837 {
2838 return sDisableMgr->IsDisabledFor(DISABLE_TYPE_MAP, mapId, nullptr, difficulty) ||
2839 sDisableMgr->IsDisabledFor(DISABLE_TYPE_LFG_MAP, mapId, nullptr);
2840 }
#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.

2690 {
2691 return guid && guid.IsGroup() && GroupsStore[guid].IsLfgGroup();
2692 }

References GroupsStore, and ObjectGuid::IsGroup().

◆ isOptionEnabled()

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

Checks if given lfg option is enabled.

2739 {
2740 return m_options & option;
2741 }

References m_options.

Referenced by Update().

◆ IsSeasonActive()

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

Checks if Seasonal dungeon is active.

2760 {
2761 switch (dungeonId)
2762 {
2771 }
2772 return false;
2773 }
bool IsHolidayActive(HolidayIds id)
Definition GameEventMgr.cpp:1950
@ HOLIDAY_HALLOWS_END
Definition SharedDefines.h:3003
@ HOLIDAY_FIRE_FESTIVAL
Definition SharedDefines.h:3006
@ HOLIDAY_LOVE_IS_IN_THE_AIR
Definition SharedDefines.h:3018
@ HOLIDAY_BREWFEST
Definition SharedDefines.h:3008
@ 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.

581{ 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
512 {
513 if (!player || dungeons.empty())
514 return;
515
516 Group* grp = player->GetGroup();
517 ObjectGuid guid = player->GetGUID();
518 ObjectGuid gguid = grp ? grp->GetGUID() : guid;
519 LfgJoinResultData joinData;
520 LfgGuidSet players;
521 uint32 rDungeonId = 0;
522 bool isContinue = grp && grp->isLFGGroup() && GetState(gguid) != LFG_STATE_FINISHED_DUNGEON;
523
524 if (grp && (grp->isBGGroup() || grp->isBFGroup()))
525 return;
526
527 if (!sScriptMgr->OnPlayerCanJoinLfg(player, roles, dungeons, comment))
528 return;
529
530 // pussywizard: can't join LFG/LFR while using LFR
531 if (GetState(player->GetGUID()) == LFG_STATE_RAIDBROWSER)
532 {
533 LfgDungeonSet tmp;
534 SendRaidBrowserJoinedPacket(player, tmp, ""); // the df "eye" can disappear in various case, resend if needed
535 return;
536 }
537
538 // Do not allow to change dungeon in the middle of a current dungeon
539 if (isContinue)
540 {
541 dungeons.clear();
542 dungeons.insert(GetDungeon(gguid));
543 }
544
545 LfgState state = GetState(gguid);
546 switch (state)
547 {
548 case LFG_STATE_ROLECHECK: // if joining again during rolecheck (eg. many players clicked continue inside instance)
549 if (gguid.IsGroup())
550 UpdateRoleCheck(gguid); // abort role check and remove from RoleChecksStore
551 break;
552 case LFG_STATE_QUEUED: // joining again while in a queue
553 {
554 LFGQueue& queue = GetQueue(gguid);
555 queue.RemoveFromQueue(gguid);
556 }
557 break;
558 case LFG_STATE_PROPOSAL: // if joining again during proposal
559 joinData.result = LFG_JOIN_INTERNAL_ERROR;
560 break;
561 /*case LFG_STATE_FINISHED_DUNGEON:
562 if (grp && grp->isLFGGroup())
563 joinData.result = LFG_JOIN_PARTY_NOT_MEET_REQS;
564 break;
565 */
566 default:
567 break;
568 }
569
570 // Check if all dungeons are valid
571 bool isRaid = false;
572 if (joinData.result == LFG_JOIN_OK)
573 {
574 bool isDungeon = false;
575 for (LfgDungeonSet::const_iterator it = dungeons.begin(); it != dungeons.end() && joinData.result == LFG_JOIN_OK; ++it)
576 {
577 LfgType type = GetDungeonType(*it);
578 switch (type)
579 {
580 case LFG_TYPE_RANDOM:
581 if (dungeons.size() > 1) // Only allow 1 random dungeon
582 {
583 joinData.result = LFG_JOIN_DUNGEON_INVALID;
584 }
585 else
586 {
587 rDungeonId = (*dungeons.begin());
588 sScriptMgr->OnPlayerQueueRandomDungeon(player, rDungeonId);
589 }
590 [[fallthrough]]; // On purpose (Random can only be dungeon or heroic dungeon)
591 case LFG_TYPE_HEROIC:
592 case LFG_TYPE_DUNGEON:
593 if (isRaid)
594 {
595 joinData.result = LFG_JOIN_MIXED_RAID_DUNGEON;
596 }
597 isDungeon = true;
598 break;
599 case LFG_TYPE_RAID:
600 if (isDungeon)
601 {
602 joinData.result = LFG_JOIN_MIXED_RAID_DUNGEON;
603 }
604 isRaid = true;
605 break;
606 default:
607 LOG_ERROR("lfg", "Wrong dungeon type {} for dungeon {}", type, *it);
608 joinData.result = LFG_JOIN_DUNGEON_INVALID;
609 break;
610 }
611 }
612 }
613
614 if (!isRaid && joinData.result == LFG_JOIN_OK)
615 {
616 // Check player or group member restrictions
617 if (player->InBattleground() || (player->InBattlegroundQueue() && !sWorld->getBoolConfig(CONFIG_ALLOW_JOIN_BG_AND_LFG)))
618 {
619 joinData.result = LFG_JOIN_USING_BG_SYSTEM;
620 }
621 else if (player->HasAura(LFG_SPELL_DUNGEON_DESERTER))
622 {
623 joinData.result = LFG_JOIN_DESERTER;
624 }
625 else if (dungeons.empty())
626 {
627 joinData.result = LFG_JOIN_NOT_MEET_REQS;
628 }
629 else if (grp)
630 {
631 if (grp->GetMembersCount() > MAXGROUPSIZE)
632 joinData.result = LFG_JOIN_TOO_MUCH_MEMBERS;
633 else
634 {
635 uint8 memberCount = 0;
636 for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr && joinData.result == LFG_JOIN_OK; itr = itr->next())
637 {
638 if (Player* plrg = itr->GetSource())
639 {
640 if (plrg->HasAura(LFG_SPELL_DUNGEON_DESERTER))
641 {
642 joinData.result = LFG_JOIN_PARTY_DESERTER;
643 }
644 else if (plrg->InBattleground() || (plrg->InBattlegroundQueue() && !sWorld->getBoolConfig(CONFIG_ALLOW_JOIN_BG_AND_LFG)))
645 {
646 joinData.result = LFG_JOIN_USING_BG_SYSTEM;
647 }
648
649 ++memberCount;
650 players.insert(plrg->GetGUID());
651 }
652 }
653
654 if (joinData.result == LFG_JOIN_OK && memberCount != grp->GetMembersCount())
655 joinData.result = LFG_JOIN_DISCONNECTED;
656 }
657 }
658 else
659 players.insert(player->GetGUID());
660
661 // Xinef: Check dungeon cooldown only for random dungeons
662 // Xinef: Moreover check this only if dungeon is not started, afterwards its obvious that players will have the cooldown
663 if (joinData.result == LFG_JOIN_OK && !isContinue && rDungeonId)
664 {
665 if (player->HasAura(LFG_SPELL_DUNGEON_COOLDOWN)) // xinef: added !isContinue
666 joinData.result = LFG_JOIN_RANDOM_COOLDOWN;
667 else if (grp)
668 {
669 for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr && joinData.result == LFG_JOIN_OK; itr = itr->next())
670 if (Player* plrg = itr->GetSource())
671 if (plrg->HasAura(LFG_SPELL_DUNGEON_COOLDOWN)) // xinef: added !isContinue
672 joinData.result = LFG_JOIN_PARTY_RANDOM_COOLDOWN;
673 }
674 }
675 }
676
677 if (isRaid)
678 players.insert(player->GetGUID());
679
680 if (joinData.result == LFG_JOIN_OK)
681 {
682 // Expand random dungeons and check restrictions
683 if (rDungeonId)
684 dungeons = GetDungeonsByRandom(rDungeonId);
685
686 // if we have lockmap then there are no compatible dungeons
687 // xinef: dont check compatibile dungeons for already running group (bind problems)
688 if (!isContinue)
689 {
690 GetCompatibleDungeons(dungeons, players, joinData.lockmap, rDungeonId);
691 if (dungeons.empty())
693 }
694 }
695
696 // pussywizard:
697 if (isRaid && grp && (grp->isLFGGroup() || guid != grp->GetLeaderGUID()))
698 return;
699
700 // Do not allow to change dungeon in the middle of a current dungeon
701 if (!isRaid && isContinue && grp->GetMembersCount() == 5)
702 {
703 dungeons.clear();
704 dungeons.insert(GetDungeon(gguid));
705 joinData.result = LFG_JOIN_PARTY_NOT_MEET_REQS;
706 }
707
708 // Can't join. Send result
709 if (joinData.result != LFG_JOIN_OK)
710 {
711 LOG_DEBUG("lfg", "LFGMgr::Join: [{}] joining with {} members. result: {}", guid.ToString(), grp ? grp->GetMembersCount() : 1, joinData.result);
712 if (!dungeons.empty()) // Only should show lockmap when have no dungeons available
713 joinData.lockmap.clear();
714 player->GetSession()->SendLfgJoinResult(joinData);
715 return;
716 }
717
718 SetComment(guid, comment);
719
720 if (isRaid)
721 {
722 if (grp)
723 roles = PLAYER_ROLE_LEADER;
724 else
726 if (!roles)
727 return;
728 JoinRaidBrowser(player, roles, dungeons, comment);
730 SendRaidBrowserJoinedPacket(player, dungeons, comment);
731 return;
732 }
733
734 std::string debugNames = "";
735 if (grp) // Begin rolecheck
736 {
737 // Create new rolecheck
738 LfgRoleCheck& roleCheck = RoleChecksStore[gguid];
739 roleCheck.roles.clear(); // pussywizard: NEW rolecheck, not old one with trash data >_>
740 roleCheck.cancelTime = time_t(GameTime::GetGameTime().count()) + LFG_TIME_ROLECHECK;
741 roleCheck.state = LFG_ROLECHECK_INITIALITING;
742 roleCheck.leader = guid;
743 roleCheck.dungeons = dungeons;
744 roleCheck.rDungeonId = rDungeonId;
745
746 if (rDungeonId)
747 {
748 dungeons.clear();
749 dungeons.insert(rDungeonId);
750 }
751
753 // Send update to player
754 LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_JOIN_QUEUE, dungeons, comment);
755 for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next())
756 {
757 if (Player* plrg = itr->GetSource())
758 {
759 ObjectGuid pguid = plrg->GetGUID();
760 plrg->GetSession()->SendLfgUpdateParty(updateData);
762 if (!isContinue)
763 SetSelectedDungeons(pguid, dungeons);
764 roleCheck.roles[pguid] = 0;
765 if (!debugNames.empty())
766 debugNames.append(", ");
767 debugNames.append(plrg->GetName());
768 }
769 }
770 // Update leader role
771 UpdateRoleCheck(gguid, guid, roles);
772 }
773 else // Add player to queue
774 {
775 LfgRolesMap rolesMap;
776 rolesMap[guid] = roles;
777 LFGQueue& queue = GetQueue(guid);
778 queue.AddQueueData(guid, GameTime::GetGameTime().count(), dungeons, rolesMap);
779
780 if (!isContinue)
781 {
782 if (rDungeonId)
783 {
784 dungeons.clear();
785 dungeons.insert(rDungeonId);
786 }
787 SetSelectedDungeons(guid, dungeons);
788 }
789 // Send update to player
790 player->GetSession()->SendLfgJoinResult(joinData);
791 player->GetSession()->SendLfgUpdatePlayer(LfgUpdateData(LFG_UPDATETYPE_JOIN_QUEUE, dungeons, comment));
793 SetRoles(guid, roles);
794 debugNames.append(player->GetName());
795 }
796
797 /*if (sLog->ShouldLog(LOG_FILTER_LFG, LOG_LEVEL_DEBUG))
798 {
799 std::ostringstream o;
800 o << "LFGMgr::Join: [" << guid << "] joined (" << (grp ? "group" : "player") << ") Members: " << debugNames.c_str()
801 << ". Dungeons (" << uint32(dungeons.size()) << "): " << ConcatenateDungeons(dungeons);
802 LOG_DEBUG("lfg", "{}", o.str());
803 }*/
804 }
#define MAXGROUPSIZE
Definition Group.h:43
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
@ CONFIG_ALLOW_JOIN_BG_AND_LFG
Definition WorldConfig.h:131
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:2266
bool InBattlegroundQueue(bool ignoreArena=false) const
Definition Player.cpp:12247
Group * GetGroup()
Definition Player.h:2482
std::string const & GetName() const
Definition Object.h:524
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:2530
void SetComment(ObjectGuid guid, std::string const &comment)
Sets player lfr comment.
Definition LFGMgr.cpp:2511
void JoinRaidBrowser(Player *player, uint8 roles, LfgDungeonSet &dungeons, std::string comment)
pussywizard: Raid Browser
Definition LFGMgr.cpp:899
void SendRaidBrowserJoinedPacket(Player *p, LfgDungeonSet &dungeons, std::string comment)
Definition LFGMgr.cpp:921
void UpdateRoleCheck(ObjectGuid gguid, ObjectGuid guid=ObjectGuid::Empty, uint8 roles=PLAYER_ROLE_NONE)
Updates the role check with player answer.
Definition LFGMgr.cpp:1399
LfgRoleCheckContainer RoleChecksStore
Current Role checks.
Definition LFGMgr.h:630
void GetCompatibleDungeons(LfgDungeonSet &dungeons, LfgGuidSet const &players, LfgLockPartyMap &lockMap, uint32 randomDungeonId=0)
Definition LFGMgr.cpp:1488
void SetRoles(ObjectGuid guid, uint8 roles)
Sets player lfg roles.
Definition LFGMgr.cpp:2505
LfgType GetDungeonType(uint32 dungeon)
Definition LFGMgr.cpp:2359
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

900 {
901 // pussywizard: client limit for comment length is 64 @ 3.3.5a
902 if (comment.size() > 64)
903 comment = comment.substr(0, 64);
904
905 RBEntryInfo entry(roles, comment);
906 for (LfgDungeonSet::const_iterator itr = dungeons.begin(); itr != dungeons.end(); ++itr)
907 if (GetLFGDungeon(*itr)) // ensure dungeon data exists for such dungeon id
908 {
909 RaidBrowserStore[player->GetTeamId()][*itr][player->GetGUID()] = entry;
910 RBUsedDungeonsStore[player->GetTeamId()].insert(*itr);
911 }
912 }
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

1345 {
1346 ObjectGuid pguid, gguid;
1347 if (guid.IsGroup())
1348 gguid = guid;
1349 else if (groupguid && groupguid.IsGroup())
1350 {
1351 pguid = guid;
1352 gguid = groupguid;
1353 }
1354 else
1355 {
1356 pguid = guid;
1357 gguid = GetGroup(guid);
1358 }
1359 if (!allowgroup)
1360 gguid.Clear();
1361
1362 if (pguid)
1363 for (lfg::LfgQueueContainer::iterator itr = QueuesStore.begin(); itr != QueuesStore.end(); ++itr)
1364 itr->second.RemoveFromQueue(pguid);
1365 if (gguid)
1366 for (lfg::LfgQueueContainer::iterator itr = QueuesStore.begin(); itr != QueuesStore.end(); ++itr)
1367 itr->second.RemoveFromQueue(gguid);
1368
1369 if (pguid && !gguid)
1370 {
1371 if (GetState(pguid) == LFG_STATE_QUEUED)
1372 {
1374 SetState(pguid, LFG_STATE_NONE);
1375 }
1376 }
1377 if (gguid)
1378 {
1379 if (GetState(gguid) == LFG_STATE_QUEUED)
1380 {
1381 SetState(gguid, LFG_STATE_NONE);
1382 const LfgGuidSet& players = GetPlayers(gguid);
1383 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
1384 {
1387 }
1388 }
1389 }
1390 }
void Clear()
Definition ObjectGuid.h:138
void SendLfgUpdateParty(ObjectGuid guid, LfgUpdateData const &data)
Definition LFGMgr.cpp:2659
void SendLfgUpdatePlayer(ObjectGuid guid, LfgUpdateData const &data)
Definition LFGMgr.cpp:2653
@ 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
819 {
820 LOG_DEBUG("lfg", "LFGMgr::Leave: [{}]", guid.ToString());
821 ObjectGuid gguid = guid.IsGroup() ? guid : GetGroup(guid);
822 LfgState state = GetState(guid);
823 switch (state)
824 {
825 case LFG_STATE_QUEUED:
826 if (gguid)
827 {
828 LFGQueue& queue = GetQueue(gguid);
829 queue.RemoveFromQueue(gguid);
830 uint32 dungeonId = GetDungeon(gguid);
831 SetState(gguid, LFG_STATE_NONE);
832 const LfgGuidSet& players = GetPlayers(gguid);
833 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
834 {
837 }
838 if (Group* group = sGroupMgr->GetGroupByGUID(gguid.GetCounter()))
839 {
840 if (group->isLFGGroup())
841 {
842 SetDungeon(gguid, dungeonId);
843 }
844 }
845 }
846 else
847 {
848 LFGQueue& queue = GetQueue(guid);
849 queue.RemoveFromQueue(guid);
852 }
853 break;
855 if (gguid)
856 UpdateRoleCheck(gguid); // No player to update role = LFG_ROLECHECK_ABORTED
857 break;
859 {
860 // Remove from Proposals
861 LfgProposalContainer::iterator it = ProposalsStore.begin();
862 ObjectGuid pguid = gguid == guid ? GetLeader(gguid) : guid;
863 while (it != ProposalsStore.end())
864 {
865 LfgProposalPlayerContainer::iterator itPlayer = it->second.players.find(pguid);
866 if (itPlayer != it->second.players.end())
867 {
868 // Mark the player/leader of group who left as didn't accept the proposal
869 itPlayer->second.accept = LFG_ANSWER_DENY;
870 break;
871 }
872 ++it;
873 }
874
875 // Remove from queue - if proposal is found, RemoveProposal will call RemoveFromQueue
876 if (it != ProposalsStore.end())
878 break;
879 }
880 case LFG_STATE_NONE:
881 break;
884 case LFG_STATE_BOOT:
885 if (guid != gguid) // Player
887 break;
889 LeaveRaidBrowser(guid);
890 SetCanOverrideRBState(guid, true);
892 SetCanOverrideRBState(guid, false);
895 break;
896 }
897 }
#define sGroupMgr
Definition GroupMgr.h:51
void LeaveRaidBrowser(ObjectGuid guid)
Definition LFGMgr.cpp:914
void RemoveProposal(LfgProposalContainer::iterator itProposal, LfgUpdateType type)
Definition LFGMgr.cpp:1920
void SetCanOverrideRBState(ObjectGuid guid, bool val)
Definition LFGMgr.cpp:2494
@ 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)
915 {
916 for (uint8 team = 0; team < 2; ++team)
917 for (RBStoreMap::iterator itr = RaidBrowserStore[team].begin(); itr != RaidBrowserStore[team].end(); ++itr)
918 itr->second.erase(guid);
919 }

References RaidBrowserStore.

Referenced by LeaveLfg().

◆ LfrSearchAdd()

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

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

◆ LfrSearchRemove()

void lfg::LFGMgr::LfrSearchRemove ( Player p)
954 {
955 RBSearchersStore[p->GetTeamId()].erase(p->GetGUID());
956 }

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

◆ LfrSetComment()

void lfg::LFGMgr::LfrSetComment ( Player p,
std::string  comment 
)
2518 {
2519 // pussywizard: client limit for comment length is 64 @ 3.3.5a
2520 if (comment.size() > 64)
2521 comment = comment.substr(0, 64);
2522
2523 uint8 teamId = p->GetTeamId();
2524 RBEntryInfoMap::iterator iter;
2525 for (RBStoreMap::iterator itr = RaidBrowserStore[teamId].begin(); itr != RaidBrowserStore[teamId].end(); ++itr)
2526 if ((iter = itr->second.find(p->GetGUID())) != itr->second.end())
2527 iter->second.comment = comment;
2528 }

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

◆ LoadLFGDungeons()

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

Loads dungeons from dbc and adds teleport coords.

178 {
179 uint32 oldMSTime = getMSTime();
180
181 LfgDungeonStore.clear();
182
183 // Initialize Dungeon map with data from dbcs
184 for (uint32 i = 0; i < sLFGDungeonStore.GetNumRows(); ++i)
185 {
186 LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(i);
187 if (!dungeon)
188 continue;
189
190 switch (dungeon->TypeID)
191 {
192 case LFG_TYPE_DUNGEON:
193 case LFG_TYPE_HEROIC:
194 case LFG_TYPE_RAID:
195 case LFG_TYPE_RANDOM:
196 LfgDungeonStore[dungeon->ID] = LFGDungeonData(dungeon);
197 break;
198 }
199 }
200
201 // Fill teleport locations from DB
202 // 0 1 2 3 4
203 QueryResult result = WorldDatabase.Query("SELECT dungeonId, position_x, position_y, position_z, orientation FROM lfg_dungeon_template");
204
205 if (!result)
206 {
207 LOG_ERROR("lfg", ">> Loaded 0 LFG Entrance Positions. DB Table `lfg_dungeon_template` Is Empty!");
208 LOG_INFO("server.loading", " ");
209 return;
210 }
211
212 uint32 count = 0;
213
214 do
215 {
216 Field* fields = result->Fetch();
217 uint32 dungeonId = fields[0].Get<uint32>();
218 LFGDungeonContainer::iterator dungeonItr = LfgDungeonStore.find(dungeonId);
219 if (dungeonItr == LfgDungeonStore.end())
220 {
221 LOG_ERROR("lfg", "table `lfg_dungeon_template` contains coordinates for wrong dungeon {}", dungeonId);
222 continue;
223 }
224
225 LFGDungeonData& data = dungeonItr->second;
226 data.x = fields[1].Get<float>();
227 data.y = fields[2].Get<float>();
228 data.z = fields[3].Get<float>();
229 data.o = fields[4].Get<float>();
230
231 ++count;
232 } while (result->NextRow());
233
234 LOG_INFO("server.loading", ">> Loaded {} LFG Entrance Positions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
235 LOG_INFO("server.loading", " ");
236
237 // Fill all other teleport coords from areatriggers
238 for (LFGDungeonContainer::iterator itr = LfgDungeonStore.begin(); itr != LfgDungeonStore.end(); ++itr)
239 {
240 LFGDungeonData& dungeon = itr->second;
241
242 // No teleport coords in database, load from areatriggers
243 if (dungeon.type != LFG_TYPE_RANDOM && dungeon.x == 0.0f && dungeon.y == 0.0f && dungeon.z == 0.0f)
244 {
245 AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(dungeon.map);
246 if (!at)
247 {
248 LOG_ERROR("lfg", "LFGMgr::LoadLFGDungeons: Failed to load dungeon {}, cant find areatrigger for map {}", dungeon.name, dungeon.map);
249 continue;
250 }
251
252 dungeon.map = at->target_mapId;
253 dungeon.x = at->target_X;
254 dungeon.y = at->target_Y;
255 dungeon.z = at->target_Z;
256 dungeon.o = at->target_Orientation;
257 }
258
259 if (dungeon.type != LFG_TYPE_RANDOM)
260 CachedDungeonMapStore[dungeon.group].insert(dungeon.id);
261 CachedDungeonMapStore[0].insert(dungeon.id);
262 }
263
264 if (reload)
265 {
266 CachedDungeonMapStore.clear();
267 // Recalculate locked dungeons
268 for (LfgPlayerDataContainer::const_iterator it = PlayersStore.begin(); it != PlayersStore.end(); ++it)
269 if (Player* player = ObjectAccessor::FindConnectedPlayer(it->first))
270 InitializeLockedDungeons(player, nullptr);
271 }
272 }
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:389
Definition ObjectMgr.h:411
float target_Z
Definition ObjectMgr.h:415
float target_X
Definition ObjectMgr.h:413
float target_Orientation
Definition ObjectMgr.h:416
float target_Y
Definition ObjectMgr.h:414
uint32 target_mapId
Definition ObjectMgr.h:412
Definition DBCStructure.h:1243
uint32 TypeID
Definition DBCStructure.h:1255
uint32 ID
Definition DBCStructure.h:1244

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:190
uint32 GetLFGDungeonEntry(uint32 id)
Return Lfg dungeon entry for given dungeon id.
Definition LFGMgr.cpp:2814

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
1588 {
1589 LfgGuidList players;
1590 GuidUnorderedSet playersToTeleport;
1591
1592 for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
1593 {
1594 ObjectGuid guid = it->first;
1595 if (guid == proposal.leader)
1596 players.push_front(guid);
1597 else
1598 players.push_back(guid);
1599
1600 if (proposal.isNew || GetGroup(guid) != proposal.group)
1601 playersToTeleport.insert(guid);
1602 }
1603
1604 // Set the dungeon difficulty
1605 LFGDungeonData const* dungeon = GetLFGDungeon(proposal.dungeonId);
1606 ASSERT(dungeon);
1607
1608 bool isPremadeGroup = false;
1609 Group* grp = proposal.group ? sGroupMgr->GetGroupByGUID(proposal.group.GetCounter()) : nullptr;
1610 if (!grp)
1611 {
1612 ObjectGuid groupGUID;
1613 for (ObjectGuid const& guid : players)
1614 {
1615 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
1616 {
1617 Group* group = player->GetGroup();
1618 if (!group || (groupGUID && groupGUID != group->GetGUID()))
1619 {
1620 isPremadeGroup = false;
1621 break;
1622 }
1623
1624 groupGUID = group->GetGUID();
1625 isPremadeGroup = true;
1626 }
1627 }
1628 }
1629
1630 ObjectGuid oldGroupGUID;
1631 bool hasRandomLfgMember = proposal.group.IsEmpty();
1632 for (LfgGuidList::const_iterator it = players.begin(); it != players.end(); ++it)
1633 {
1634 ObjectGuid pguid = (*it);
1636 if (!player)
1637 continue;
1638
1639 Group* group = player->GetGroup();
1640 if (isPremadeGroup && !grp)
1641 {
1642 oldGroupGUID = group->GetGUID();
1643 grp = group;
1644 grp->ConvertToLFG(false);
1646 }
1647
1648 if (auto const proposalPlayer = proposal.players.find(pguid); proposalPlayer != proposal.players.end())
1649 {
1650 if (!hasRandomLfgMember && (proposalPlayer->second.group.IsEmpty() || proposalPlayer->second.group != proposal.group))
1651 hasRandomLfgMember = true;
1652 }
1653 else
1654 hasRandomLfgMember = true;
1655
1656 // Xinef: Apply Random Buff
1657 if (grp && !grp->IsLfgWithBuff() && hasRandomLfgMember)
1658 {
1659 if (!group || group->GetGUID() != oldGroupGUID)
1660 grp->AddLfgBuffFlag();
1661 else
1662 oldGroupGUID = group->GetGUID();
1663 }
1664
1665 // Xinef: Store amount of random players player grouped with
1666 if (group)
1667 {
1668 SetRandomPlayersCount(pguid, group->GetMembersCount() >= MAXGROUPSIZE ? 0 : MAXGROUPSIZE - group->GetMembersCount());
1669 oldGroupGUID = group->GetGUID();
1670 if (group != grp)
1671 group->RemoveMember(player->GetGUID());
1672 }
1673 else
1675
1676 if (!grp)
1677 {
1678 grp = new Group();
1679 grp->ConvertToLFG();
1680 grp->Create(player);
1681 ObjectGuid gguid = grp->GetGUID();
1683 sGroupMgr->AddGroup(grp);
1684 }
1685 else if (group != grp)
1686 {
1687 if (!grp->IsFull())
1688 grp->AddMember(player);
1689 }
1690
1691 grp->SetLfgRoles(pguid, proposal.players.find(pguid)->second.role);
1692 }
1693
1694 // pussywizard: crashfix, group wasn't created when iterating players (no player found by guid), proposal is deleted by the calling function
1695 if (!grp)
1696 return;
1697
1698 grp->SetDungeonDifficulty(Difficulty(dungeon->difficulty));
1699 ObjectGuid gguid = grp->GetGUID();
1700 SetDungeon(gguid, dungeon->Entry());
1702
1703 _SaveToDB(gguid);
1704
1705 // Select a player inside to be teleported to
1706 WorldLocation const* teleportLocation = nullptr;
1707 bool leaderTeleportIncluded = false;
1708 for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next())
1709 {
1710 if (Player* plr = itr->GetSource())
1711 {
1712 if (grp->IsLeader(plr->GetGUID()) && playersToTeleport.find(plr->GetGUID()) != playersToTeleport.end())
1713 {
1714 leaderTeleportIncluded = true;
1715 }
1716
1717 if (plr->GetMapId() == uint32(dungeon->map) && !proposal.isNew)
1718 {
1719 teleportLocation = plr;
1720 break;
1721 }
1722
1723 // Remove from battleground queues
1724 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
1725 {
1726 if (BattlegroundQueueTypeId bgQueueTypeId = plr->GetBattlegroundQueueTypeId(i))
1727 {
1728 if (bgQueueTypeId != BATTLEGROUND_QUEUE_NONE)
1729 {
1730 plr->RemoveBattlegroundQueueId(bgQueueTypeId);
1731 sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId).RemovePlayer(plr->GetGUID(), true);
1732 }
1733 }
1734 }
1735 }
1736 }
1737
1738 bool randomDungeon = false;
1739 std::vector<Player*> playersTeleported;
1740 // Teleport Player
1741 for (GuidUnorderedSet::const_iterator it = playersToTeleport.begin(); it != playersToTeleport.end(); ++it)
1742 {
1743 if (Player* player = ObjectAccessor::FindPlayer(*it))
1744 {
1745 if (player->GetGroup() != grp) // pussywizard: could not add because group was full
1746 continue;
1747
1748 // Add the cooldown spell if queued for a random dungeon
1749 // xinef: add aura
1750 if ((randomDungeon || selectedRandomLfgDungeon(player->GetGUID())) && !player->HasAura(LFG_SPELL_DUNGEON_COOLDOWN))
1751 {
1752 randomDungeon = true;
1753 // if player is debugging, don't add dungeon cooldown
1754 if (!m_Testing)
1755 {
1756 player->AddAura(LFG_SPELL_DUNGEON_COOLDOWN, player);
1757 }
1758 }
1759
1760 if (player->GetMapId() == uint32(dungeon->map))
1761 {
1762 // check instance id with leader
1763 if (!leaderTeleportIncluded)
1764 {
1765 if (InstancePlayerBind* ilb = sInstanceSaveMgr->PlayerGetBoundInstance(grp->GetLeaderGUID(), dungeon->map, player->GetDungeonDifficulty()))
1766 {
1767 if (player->GetInstanceId() == ilb->save->GetInstanceId())
1768 {
1769 // Do not teleport if in the same map and instance as leader
1770 continue;
1771 }
1772 }
1773 }
1774
1775 // Remove bind to that map
1776 sInstanceSaveMgr->PlayerUnbindInstance(player->GetGUID(), dungeon->map, player->GetDungeonDifficulty(), true);
1777 }
1778 else
1779 {
1780 // RDF removes all binds to that map
1781 if (randomDungeon)
1782 sInstanceSaveMgr->PlayerUnbindInstance(player->GetGUID(), dungeon->map, player->GetDungeonDifficulty(), true);
1783 }
1784
1785 playersTeleported.push_back(player);
1786 }
1787 }
1788
1789 for (Player* player : playersTeleported)
1790 {
1791 TeleportPlayer(player, false, teleportLocation);
1792 }
1793
1794 if (randomDungeon)
1796 if (Difficulty(dungeon->difficulty) == DUNGEON_DIFFICULTY_HEROIC)
1797 grp->AddLfgHeroicFlag();
1798
1799 // Update group info
1800 grp->SendUpdate();
1801 }
#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:3885
@ BATTLEGROUND_QUEUE_NONE
Definition SharedDefines.h:3886
#define PLAYER_MAX_BATTLEGROUND_QUEUES
Definition SharedDefines.h:176
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:1916
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:19110
Definition Position.h:256
uint32 GetInstanceId() const
Definition Object.h:509
void TeleportPlayer(Player *player, bool out, WorldLocation const *teleportLocation=nullptr)
Teleport a player to/from selected dungeon.
Definition LFGMgr.cpp:2126
bool selectedRandomLfgDungeon(ObjectGuid guid)
Check if given guid applied for random dungeon.
Definition LFGMgr.cpp:2785
void SetRandomPlayersCount(ObjectGuid guid, uint8 count)
Xinef: Set Random Players Count.
Definition LFGMgr.cpp:2624
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 
)
1234 {
1235 buffer << info.groupGuid;
1237 buffer << (uint32)flags;
1238 if (flags & LFG_UPDATE_FLAG_COMMENT)
1239 buffer << info.comment;
1240 if (flags & LFG_UPDATE_FLAG_ROLES)
1241 for (uint8 j = 0; j < 3; ++j)
1242 buffer << (uint8)0;
1243 if (!(flags & LFG_UPDATE_FLAG_BINDED))
1244 return;
1245 buffer << info.instanceGuid;
1246 buffer << (uint32)info.encounterMask;
1247 }
@ 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 
)
1250 {
1251 buffer << info.guid;
1252 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);
1253 buffer << (uint32)flags;
1254
1256 {
1257 buffer << (uint8)info._level;
1258 buffer << (uint8)info._class;
1259 buffer << (uint8)info._race;
1260 buffer << (uint8)info._talents0;
1261 buffer << (uint8)info._talents1;
1262 buffer << (uint8)info._talents2;
1263 buffer << (uint32)info._armor;
1264 buffer << (uint32)info._spellDamage;
1265 buffer << (uint32)info._spellHeal;
1266 buffer << (uint32)info._critRatingMelee;
1267 buffer << (uint32)info._critRatingRanged;
1268 buffer << (uint32)info._critRatingSpell;
1269 buffer << (float)info._mp5;
1270 buffer << (float)info._mp5combat;
1271 buffer << (uint32)info._attackPower;
1272 buffer << (uint32)info._agility;
1273 buffer << (uint32)info._health;
1274 buffer << (uint32)info._mana;
1275 buffer << (uint32)info._online; // talentpoints, used as online/offline marker :D
1276 buffer << (float)info._avgItemLevel; // avgitemlevel
1277 buffer << (uint32)info._defenseSkill;
1278 buffer << (uint32)info._dodgeRating;
1279 buffer << (uint32)info._blockRating;
1280 buffer << (uint32)info._parryRating;
1281 buffer << (uint32)info._hasteRating;
1282 buffer << (uint32)info._expertiseRating;
1283 }
1284
1285 if (flags & LFG_UPDATE_FLAG_COMMENT)
1286 buffer << (info.groupGuid ? std::string("") : info.comment);
1287 if (flags & LFG_UPDATE_FLAG_GROUPLEADER)
1288 buffer << (uint8)1; // isLFM
1289 if (flags & LFG_UPDATE_FLAG_GROUPGUID)
1290 buffer << info.groupGuid;
1291 if (flags & LFG_UPDATE_FLAG_ROLES)
1292 buffer << (uint8)(info.groupGuid ? (info.isGroupLeader ? PLAYER_ROLE_LEADER : 0) : info.roles);
1293 if (flags & LFG_UPDATE_FLAG_AREA)
1294 buffer << (uint32)info._area;
1295 if (flags & LFG_UPDATE_FLAG_STATUS)
1296 buffer << (uint8)0;
1297 if (!(flags & LFG_UPDATE_FLAG_BINDED))
1298 return;
1299 buffer << info.instanceGuid;
1300 buffer << (uint32)info.encounterMask;
1301 }
@ 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 
)
1304 {
1305 differencePacket << (uint32)LFG_TYPE_RAID;
1306 differencePacket << (uint32)dungeonId;
1307 differencePacket << (uint8)1;
1308 differencePacket << (uint32)deletedCounter;
1309 differencePacket.append(buffer_deleted);
1310 differencePacket << (uint32)groupCounter;
1311 differencePacket << (uint32)0;
1312 differencePacket.append(buffer_groups);
1313 differencePacket << (uint32)playerCounter;
1314 differencePacket << (uint32)0;
1315 differencePacket.append(buffer_players);
1316 }
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 
)
1319 {
1320 fullPacket << (uint32)LFG_TYPE_RAID;
1321 fullPacket << (uint32)dungeonId;
1322 fullPacket << (uint8)0;
1323 uint32 groupCounter = 0, playerCounter = 0;
1324 ByteBuffer buffer_groups, buffer_players;
1325 for (RBInternalInfoMap::const_iterator itr = infoMap.begin(); itr != infoMap.end(); ++itr)
1326 {
1327 if (itr->second.isGroupLeader)
1328 {
1329 ++groupCounter;
1330 RBPacketAppendGroup(itr->second, buffer_groups);
1331 }
1332 ++playerCounter;
1333 RBPacketAppendPlayer(itr->second, buffer_players);
1334 }
1335 fullPacket << (uint32)groupCounter;
1336 fullPacket << (uint32)0;
1337 fullPacket.append(buffer_groups);
1338 fullPacket << (uint32)playerCounter;
1339 fullPacket << (uint32)0;
1340 fullPacket.append(buffer_players);
1341 }
Definition ByteBuffer.h:70
void RBPacketAppendGroup(const RBInternalInfo &info, ByteBuffer &buffer)
Definition LFGMgr.cpp:1233
void RBPacketAppendPlayer(const RBInternalInfo &info, ByteBuffer &buffer)
Definition LFGMgr.cpp:1249

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

Referenced by UpdateRaidBrowser().

◆ RemoveGroupData()

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

Removes saved group data.

2549 {
2550 LOG_DEBUG("lfg", "LFGMgr::RemoveGroupData: [{}]", guid.ToString());
2551 LfgGroupDataContainer::iterator it = GroupsStore.find(guid);
2552 if (it == GroupsStore.end())
2553 return;
2554
2555 LfgState state = GetState(guid);
2556 // If group is being formed after proposal success do nothing more
2557 LfgGuidSet const& players = it->second.GetPlayers();
2558 for (auto iterator = players.begin(); iterator != players.end(); ++iterator)
2559 {
2560 ObjectGuid objectGuid = (*iterator);
2561 SetGroup(*iterator, ObjectGuid::Empty);
2562 if (state != LFG_STATE_PROPOSAL)
2563 {
2564 SetState(*iterator, LFG_STATE_NONE);
2565 SendLfgUpdateParty(objectGuid, LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE));
2566 }
2567 }
2568 GroupsStore.erase(it);
2569 }
void SetGroup(ObjectGuid guid, ObjectGuid group)
Sets player group.
Definition LFGMgr.cpp:2604

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.

2577 {
2578 return GroupsStore[gguid].RemovePlayer(guid);
2579 }

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)
1921 {
1922 LfgProposal& proposal = itProposal->second;
1923 proposal.state = LFG_PROPOSAL_FAILED;
1924
1925 LOG_DEBUG("lfg", "LFGMgr::RemoveProposal: Proposal {}, state FAILED, UpdateType {}", itProposal->first, type);
1926 // Mark all people that didn't answered as no accept
1928 for (LfgProposalPlayerContainer::iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
1929 if (it->second.accept == LFG_ANSWER_PENDING)
1930 it->second.accept = LFG_ANSWER_DENY;
1931
1932 // pussywizard: add cooldown for not accepting (after 40 secs) or declining
1933 for (LfgProposalPlayerContainer::iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
1934 if (it->second.accept == LFG_ANSWER_DENY)
1935 if (Player* plr = ObjectAccessor::FindPlayer(it->first))
1936 if (Aura* aura = plr->AddAura(LFG_SPELL_DUNGEON_COOLDOWN, plr))
1937 aura->SetDuration(150 * IN_MILLISECONDS);
1938
1939 // Mark players/groups to be removed
1940 LfgGuidSet toRemove;
1941 for (LfgProposalPlayerContainer::iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
1942 {
1943 if (it->second.accept == LFG_ANSWER_AGREE)
1944 continue;
1945
1946 ObjectGuid guid = it->second.group ? it->second.group : it->first;
1947 // Player didn't accept or still pending when no secs left
1948 if (it->second.accept == LFG_ANSWER_DENY || type == LFG_UPDATETYPE_PROPOSAL_FAILED)
1949 {
1950 it->second.accept = LFG_ANSWER_DENY;
1951 toRemove.insert(guid);
1952 }
1953 }
1954
1955 // Notify players
1956 for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
1957 {
1958 ObjectGuid guid = it->first;
1959 ObjectGuid gguid = it->second.group ? it->second.group : guid;
1960
1961 SendLfgUpdateProposal(guid, proposal);
1962
1963 if (toRemove.find(gguid) != toRemove.end()) // Didn't accept or in same group that someone that didn't accept
1964 {
1965 LfgUpdateData updateData;
1966 if (it->second.accept == LFG_ANSWER_DENY)
1967 {
1968 updateData.updateType = type;
1969 LOG_DEBUG("lfg", "LFGMgr::RemoveProposal: [{}] didn't accept. Removing from queue and compatible cache", guid.ToString());
1970 }
1971 else
1972 {
1973 updateData.updateType = LFG_UPDATETYPE_REMOVED_FROM_QUEUE;
1974 LOG_DEBUG("lfg", "LFGMgr::RemoveProposal: [{}] in same group that someone that didn't accept. Removing from queue and compatible cache", guid.ToString());
1975 }
1976
1977 RestoreState(guid, "Proposal Fail (didn't accepted or in group with someone that didn't accept");
1978 if (gguid != guid)
1979 {
1980 RestoreState(it->second.group, "Proposal Fail (someone in group didn't accepted)");
1981 SendLfgUpdateParty(guid, updateData);
1982 }
1983 else
1984 SendLfgUpdatePlayer(guid, updateData);
1985 }
1986 else
1987 {
1988 LOG_DEBUG("lfg", "LFGMgr::RemoveProposal: Readding [{}] to queue.", guid.ToString());
1990 if (gguid != guid)
1991 {
1992 SetState(gguid, LFG_STATE_QUEUED);
1994 }
1995 else
1997 }
1998 }
1999
2000 LFGQueue& queue = GetQueue(proposal.players.begin()->first);
2001 // Remove players/groups from queue
2002 for (LfgGuidSet::const_iterator it = toRemove.begin(); it != toRemove.end(); ++it)
2003 {
2004 ObjectGuid guid = *it;
2005 queue.RemoveFromQueue(guid);
2006 proposal.queues.remove(guid);
2007 }
2008
2009 // Readd to queue
2010 for (uint8 i = 0; i < 5 && proposal.queues.guids[i]; ++i)
2011 {
2012 // xinef: this will work as data is not deleted, only references to this data are cleared
2013 // xinef: when new proposal is created
2014 // xinef: successful proposal is also taken into account is similar manner
2015 queue.AddToQueue(proposal.queues.guids[i], true);
2016 }
2017
2018 ProposalsStore.erase(itProposal);
2019 }
constexpr auto IN_MILLISECONDS
Definition Common.h:53
Definition SpellAuras.h:87
void RestoreState(ObjectGuid guid, char const *debugMsg)
Definition LFGMgr.cpp:2443
std::string const & GetComment(ObjectGuid gguid)
Get current player comment (used for LFR)
Definition LFGMgr.cpp:2418
void SendLfgUpdateProposal(ObjectGuid guid, LfgProposal const &proposal)
Definition LFGMgr.cpp:2677
@ 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
2444 {
2445 if (guid.IsGroup())
2446 {
2447 LfgGroupData& data = GroupsStore[guid];
2448 /*if (sLog->ShouldLog(LOG_FILTER_LFG, LOG_LEVEL_DEBUG))
2449 {
2450 std::string const& ps = GetStateString(data.GetState());
2451 std::string const& os = GetStateString(data.GetOldState());
2452 LOG_TRACE("lfg", "LFGMgr::RestoreState: Group: [{}] ({}) State: {}, oldState: {}",
2453 guid.ToString(), debugMsg, ps, os);
2454 }*/
2455
2456 data.RestoreState();
2457 }
2458 else
2459 {
2460 LfgPlayerData& data = PlayersStore[guid];
2461 /*if (sLog->ShouldLog(LOG_FILTER_LFG, LOG_LEVEL_DEBUG))
2462 {
2463 std::string const& ps = GetStateString(data.GetState());
2464 std::string const& os = GetStateString(data.GetOldState());
2465 LOG_TRACE("lfg", "LFGMgr::RestoreState: Player: [{}] ({}) State: {}, oldState: {}",
2466 guid.ToString(), debugMsg, ps, os);
2467 }*/
2468 data.RestoreState();
2469 }
2470 }

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.

2786 {
2787 if (GetState(guid) != LFG_STATE_NONE)
2788 {
2789 LfgDungeonSet const& dungeons = GetSelectedDungeons(guid);
2790 if (!dungeons.empty())
2791 {
2792 LFGDungeonData const* dungeon = GetLFGDungeon(*dungeons.begin());
2793 if (dungeon && (dungeon->type == LFG_TYPE_RANDOM || dungeon->seasonal))
2794 return true;
2795 }
2796 }
2797
2798 return false;
2799 }

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
2672 {
2673 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2674 player->GetSession()->SendLfgBootProposalUpdate(boot);
2675 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendLfgJoinResult()

void lfg::LFGMgr::SendLfgJoinResult ( ObjectGuid  guid,
LfgJoinResultData const &  data 
)
private
2666 {
2667 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2668 player->GetSession()->SendLfgJoinResult(data);
2669 }

References ObjectAccessor::FindConnectedPlayer().

Referenced by Update(), and UpdateRoleCheck().

◆ SendLfgQueueStatus()

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

Sends queue status to player.

2684 {
2685 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2686 player->GetSession()->SendLfgQueueStatus(data);
2687 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendLfgRoleCheckUpdate()

void lfg::LFGMgr::SendLfgRoleCheckUpdate ( ObjectGuid  guid,
LfgRoleCheck const &  roleCheck 
)
private
2648 {
2649 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2650 player->GetSession()->SendLfgRoleCheckUpdate(roleCheck);
2651 }

References ObjectAccessor::FindConnectedPlayer().

Referenced by Update(), and UpdateRoleCheck().

◆ SendLfgRoleChosen()

void lfg::LFGMgr::SendLfgRoleChosen ( ObjectGuid  guid,
ObjectGuid  pguid,
uint8  roles 
)
private
2642 {
2643 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2644 player->GetSession()->SendLfgRoleChosen(pguid, roles);
2645 }

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

Referenced by UpdateRoleCheck().

◆ SendLfgUpdateParty()

void lfg::LFGMgr::SendLfgUpdateParty ( ObjectGuid  guid,
LfgUpdateData const &  data 
)
private
2660 {
2661 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2662 player->GetSession()->SendLfgUpdateParty(data);
2663 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendLfgUpdatePlayer()

void lfg::LFGMgr::SendLfgUpdatePlayer ( ObjectGuid  guid,
LfgUpdateData const &  data 
)
private
2654 {
2655 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2656 player->GetSession()->SendLfgUpdatePlayer(data);
2657 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendLfgUpdateProposal()

void lfg::LFGMgr::SendLfgUpdateProposal ( ObjectGuid  guid,
LfgProposal const &  proposal 
)
private
2678 {
2679 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
2680 player->GetSession()->SendLfgUpdateProposal(proposal);
2681 }

References ObjectAccessor::FindConnectedPlayer().

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

◆ SendRaidBrowserCachedList()

void lfg::LFGMgr::SendRaidBrowserCachedList ( Player player,
uint32  dungeonId 
)
959 {
960 RBCacheMap::iterator itr = RBCacheStore[player->GetTeamId()].find(dungeonId);
961 if (itr != RBCacheStore[player->GetTeamId()].end())
962 {
963 player->SendDirectMessage(&(itr->second));
964 return;
965 }
966 // send empty packet if cache not found
968 data << (uint32)LFG_TYPE_RAID;
969 data << (uint32)dungeonId;
970 data << (uint8)0;
971 data << (uint32)0;
972 data << (uint32)0;
973 data << (uint32)0;
974 data << (uint32)0;
975 player->SendDirectMessage(&data);
976 }
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5762
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 
)
922 {
923 if (dungeons.empty())
924 {
925 RBEntryInfoMap::iterator iter;
926 uint8 team = p->GetTeamId();
927 bool setComment = true;
928 for (RBStoreMap::iterator itr = RaidBrowserStore[team].begin(); itr != RaidBrowserStore[team].end(); ++itr)
929 if ((iter = itr->second.find(p->GetGUID())) != itr->second.end())
930 {
931 dungeons.insert(itr->first);
932 if (setComment)
933 {
934 comment = iter->second.comment;
935 setComment = false;
936 }
937 }
938 }
939 LfgJoinResultData joinData;
940 p->GetSession()->SendLfgJoinResult(joinData);
941 LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_JOIN_RAIDBROWSER, dungeons, comment);
942 if (p->GetGroup())
943 p->GetSession()->SendLfgUpdateParty(updateData);
944 else
945 p->GetSession()->SendLfgUpdatePlayer(updateData);
946 }
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
2495 {
2496 PlayersStore[guid].SetCanOverrideRBState(val);
2497 }

References PlayersStore.

Referenced by LeaveLfg().

◆ SetComment()

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

Sets player lfr comment.

2512 {
2513 LOG_DEBUG("lfg", "LFGMgr::SetComment: [{}] comment: {}", guid.ToString(), comment);
2514 PlayersStore[guid].SetComment(comment);
2515 }

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

Referenced by JoinLfg().

◆ SetDungeon()

void lfg::LFGMgr::SetDungeon ( ObjectGuid  guid,
uint32  dungeon 
)
2500 {
2501 LOG_DEBUG("lfg", "LFGMgr::SetDungeon: [{}] dungeon {}", guid.ToString(), dungeon);
2502 GroupsStore[guid].SetDungeon(dungeon);
2503 }

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.

2605 {
2606 PlayersStore[guid].SetGroup(group);
2607 }

References PlayersStore.

Referenced by RemoveGroupData(), and SetupGroupMember().

◆ SetLeader()

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

Sets the leader of the group.

2587 {
2588 GroupsStore[gguid].SetLeader(leader);
2589 }

References GroupsStore.

Referenced by _LoadFromDB().

◆ SetLockedDungeons()

void lfg::LFGMgr::SetLockedDungeons ( ObjectGuid  guid,
LfgLockMap const &  lock 
)
private
2537 {
2538 LOG_DEBUG("lfg", "LFGMgr::SetLockedDungeons: [{}]", guid.ToString());
2539 PlayersStore[guid].SetLockedDungeons(lock);
2540 }

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

Referenced by InitializeLockedDungeons().

◆ SetOptions()

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

Sets new lfg options.

2749 {
2750 m_options = options;
2751 }

References m_options.

◆ SetRandomPlayersCount()

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

Xinef: Set Random Players Count.

2625 {
2626 PlayersStore[guid].SetRandomPlayersCount(count);
2627 }

References PlayersStore.

Referenced by MakeNewGroup().

◆ SetRoles()

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

Sets player lfg roles.

2506 {
2507 LOG_DEBUG("lfg", "LFGMgr::SetRoles: [{}] roles: {}", guid.ToString(), roles);
2508 PlayersStore[guid].SetRoles(roles);
2509 }

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

Referenced by JoinLfg(), and UpdateRoleCheck().

◆ SetSelectedDungeons()

void lfg::LFGMgr::SetSelectedDungeons ( ObjectGuid  guid,
LfgDungeonSet const &  dungeons 
)
private
2531 {
2532 LOG_DEBUG("lfg", "LFGMgr::SetLockedDungeons: [{}]", guid.ToString());
2533 PlayersStore[guid].SetSelectedDungeons(dungeons);
2534 }

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

Referenced by JoinLfg(), and SetupGroupMember().

◆ SetState()

void lfg::LFGMgr::SetState ( ObjectGuid  guid,
LfgState  state 
)
private
2473 {
2474 if (guid.IsGroup())
2475 {
2476 LfgGroupData& data = GroupsStore[guid];
2477 std::string ns = GetStateString(state);
2478 std::string ps = GetStateString(data.GetState());
2479 std::string os = GetStateString(data.GetOldState());
2480 LOG_DEBUG("lfg", "LFGMgr::SetState: Group: [{}] newState: {}, previous: {}, oldState: {}", guid.ToString(), ns, ps, os);
2481 data.SetState(state);
2482 }
2483 else
2484 {
2485 LfgPlayerData& data = PlayersStore[guid];
2486 std::string ns = GetStateString(state);
2487 std::string ps = GetStateString(data.GetState());
2488 std::string os = GetStateString(data.GetOldState());
2489 LOG_DEBUG("lfg", "LFGMgr::SetState: Player: [{}] newState: {}, previous: {}, oldState: {}", guid.ToString(), ns, ps, os);
2490 data.SetState(state);
2491 }
2492 }
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.

2592 {
2594 teamId = TEAM_ALLIANCE; // @Not Sure About That TeamId is supposed to be uint8 Team = 0(@TrinityCore)
2595
2596 PlayersStore[guid].SetTeam(teamId);
2597 }
@ TEAM_ALLIANCE
Definition SharedDefines.h:771
@ 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.

2776 {
2777 LfgDungeonSet dungeons;
2778 dungeons.insert(GetDungeon(gguid));
2779 SetSelectedDungeons(guid, dungeons);
2780 SetState(guid, GetState(gguid));
2781 SetGroup(guid, gguid);
2782 AddPlayerToGroup(gguid, guid);
2783 }
void AddPlayerToGroup(ObjectGuid gguid, ObjectGuid guid)
Adds player to group.
Definition LFGMgr.cpp:2581

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)
2127 {
2128 LFGDungeonData const* dungeon = nullptr;
2129 Group* group = player->GetGroup();
2130
2131 if (group && group->isLFGGroup())
2132 dungeon = GetLFGDungeon(GetDungeon(group->GetGUID()));
2133
2134 if (!dungeon)
2135 {
2137 return;
2138 }
2139
2141
2142 if (!player->IsAlive())
2143 {
2145 }
2146 else if (player->IsFalling() || player->HasUnitState(UNIT_STATE_JUMPING))
2147 {
2149 }
2150 else if (player->IsMirrorTimerActive(FATIGUE_TIMER))
2151 {
2153 }
2154 else if (player->GetVehicle())
2155 {
2157 }
2158 else if (player->GetCharmGUID() || player->IsInCombat())
2159 {
2161 }
2162 else if (out && error == LFG_TELEPORTERROR_OK)
2163 {
2164 if (player->GetMapId() == uint32(dungeon->map))
2165 player->TeleportToEntryPoint();
2166
2167 return;
2168 }
2169 else
2170 {
2171 uint32 mapid = dungeon->map;
2172 float x = dungeon->x;
2173 float y = dungeon->y;
2174 float z = dungeon->z;
2175 float orientation = dungeon->o;
2176
2177 if (teleportLocation)
2178 {
2179 teleportLocation->GetWorldLocation(mapid, x, y, z, orientation);
2180 }
2181
2182 if (!player->GetMap()->IsDungeon() || player->GetEntryPoint().GetMapId() == MAPID_INVALID)
2183 {
2184 player->SetEntryPoint();
2185 }
2186
2187 if (!player->TeleportTo(mapid, x, y, z, orientation, 0, nullptr, mapid == player->GetMapId()))
2188 {
2190 }
2191 }
2192
2193 if (error != LFG_TELEPORTERROR_OK)
2194 {
2195 player->GetSession()->SendLfgTeleportError(uint8(error));
2196
2197 LOG_DEBUG("lfg", "Player [{}] could NOT be teleported in to map [{}] (x: {}, y: {}, z: {}) Error: {}",
2198 player->GetName(), dungeon->map, dungeon->x, dungeon->y, dungeon->z, error);
2199 }
2200 else
2201 {
2202 LOG_DEBUG("lfg", "Player [{}] is being teleported in to map [{}] (x: {}, y: {}, z: {})",
2203 player->GetName(), dungeon->map, dungeon->x, dungeon->y, dungeon->z);
2204 }
2205
2206 }
@ FATIGUE_TIMER
Definition Player.h:568
#define MAPID_INVALID
Definition Position.h:253
@ UNIT_STATE_JUMPING
Definition UnitDefines.h:188
bool IsDungeon() const
Definition Map.h:295
void SetEntryPoint()
Definition Player.cpp:11307
bool IsMirrorTimerActive(MirrorTimerType type)
Definition Player.h:2060
bool TeleportToEntryPoint()
Definition Player.cpp:1599
WorldLocation const & GetEntryPoint() const
Definition Player.h:2392
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:2150
Vehicle * GetVehicle() const
Definition Unit.h:1905
bool IsAlive() const
Definition Unit.h:1773
ObjectGuid GetCharmGUID() const
Definition Unit.h:711
bool HasUnitState(const uint32 f) const
Definition Unit.h:726
bool IsInCombat() const
Definition Unit.h:924
Map * GetMap() const
Definition Object.h:620
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 ( )
807 {
810 }
@ LANG_DEBUG_LFG_ON
Definition Language.h:1347
@ LANG_DEBUG_LFG_OFF
Definition Language.h:1348
Definition Chat.h:37
void SendWorldText(std::string_view str)
Definition Chat.cpp:131

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

◆ Update()

void lfg::LFGMgr::Update ( uint32  diff,
uint8  task 
)
275 {
277 return;
278
279 if (task == 0)
280 {
281 time_t currTime = GameTime::GetGameTime().count();
282
283 // Remove obsolete role checks
284 for (LfgRoleCheckContainer::iterator it = RoleChecksStore.begin(); it != RoleChecksStore.end();)
285 {
286 LfgRoleCheckContainer::iterator itRoleCheck = it++;
287 LfgRoleCheck& roleCheck = itRoleCheck->second;
288 if (currTime < roleCheck.cancelTime)
289 continue;
290 roleCheck.state = LFG_ROLECHECK_MISSING_ROLE;
291
292 for (LfgRolesMap::const_iterator itRoles = roleCheck.roles.begin(); itRoles != roleCheck.roles.end(); ++itRoles)
293 {
294 ObjectGuid guid = itRoles->first;
295 RestoreState(guid, "Remove Obsolete RoleCheck");
296 SendLfgRoleCheckUpdate(guid, roleCheck);
297 if (guid == roleCheck.leader)
299 }
300
301 RestoreState(itRoleCheck->first, "Remove Obsolete RoleCheck");
302 RoleChecksStore.erase(itRoleCheck);
303 }
304
305 // Remove obsolete proposals
306 for (LfgProposalContainer::iterator it = ProposalsStore.begin(); it != ProposalsStore.end();)
307 {
308 LfgProposalContainer::iterator itRemove = it++;
309 if (itRemove->second.cancelTime < currTime)
311 }
312
313 // Remove obsolete kicks
314 for (LfgPlayerBootContainer::iterator it = BootsStore.begin(); it != BootsStore.end();)
315 {
316 LfgPlayerBootContainer::iterator itBoot = it++;
317 LfgPlayerBoot& boot = itBoot->second;
318 if (boot.cancelTime < currTime)
319 {
320 boot.inProgress = false;
321 for (LfgAnswerContainer::const_iterator itVotes = boot.votes.begin(); itVotes != boot.votes.end(); ++itVotes)
322 {
323 ObjectGuid pguid = itVotes->first;
324 if (pguid != boot.victim)
325 SendLfgBootProposalUpdate(pguid, boot);
327 }
328 SetState(itBoot->first, LFG_STATE_DUNGEON);
329 BootsStore.erase(itBoot);
330 }
331 }
332 }
333 else if (task == 1)
334 {
335 this->lastProposalId = m_lfgProposalId; // pussywizard: task 2 is done independantly, store previous value in LFGMgr for future use
336 uint8 newGroupsProcessed = 0;
337 // Check if a proposal can be formed with the new groups being added
338 for (LfgQueueContainer::iterator it = QueuesStore.begin(); it != QueuesStore.end(); ++it)
339 {
340 newGroupsProcessed += it->second.FindGroups();
341 if (newGroupsProcessed)
342 break;
343 }
344
345 // Update all players status queue info
346 if (!newGroupsProcessed) // don't do this on updates that precessed groups (performance)
347 for (LfgQueueContainer::iterator it = QueuesStore.begin(); it != QueuesStore.end(); ++it)
348 it->second.UpdateQueueTimers(tdiff);
349 }
350 else if (task == 2)
351 {
353 {
354 // 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
355 for (LfgProposalContainer::const_iterator itProposal = ProposalsStore.find(m_lfgProposalId); itProposal != ProposalsStore.end(); ++itProposal)
356 {
357 uint32 proposalId = itProposal->first;
358 LfgProposal& proposal = ProposalsStore[proposalId];
359
360 ObjectGuid guid;
361 for (LfgProposalPlayerContainer::const_iterator itPlayers = proposal.players.begin(); itPlayers != proposal.players.end(); ++itPlayers)
362 {
363 guid = itPlayers->first;
365 if (ObjectGuid gguid = GetGroup(guid))
366 {
369 }
370 else
372 SendLfgUpdateProposal(guid, proposal);
373 }
374
375 if (proposal.state == LFG_PROPOSAL_SUCCESS) // pussywizard: no idea what's the purpose of this xD
376 UpdateProposal(proposalId, guid, true);
377 }
378 }
379
380 UpdateRaidBrowser(tdiff);
381 }
382 }
void SendLfgRoleCheckUpdate(ObjectGuid guid, LfgRoleCheck const &roleCheck)
Definition LFGMgr.cpp:2647
void SendLfgJoinResult(ObjectGuid guid, LfgJoinResultData const &data)
Definition LFGMgr.cpp:2665
bool isOptionEnabled(uint32 option)
Checks if given lfg option is enabled.
Definition LFGMgr.cpp:2738
uint32 lastProposalId
pussywizard, store it here because of splitting LFGMgr update into tasks
Definition LFGMgr.h:620
void UpdateProposal(uint32 proposalId, ObjectGuid guid, bool accept)
Updates proposal to join dungeon with player answer.
Definition LFGMgr.cpp:1817
void UpdateRaidBrowser(uint32 diff)
Definition LFGMgr.cpp:978
@ 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, 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
2064 {
2065 ObjectGuid gguid = GetGroup(guid);
2066 if (!gguid)
2067 return;
2068
2069 LfgPlayerBootContainer::iterator itBoot = BootsStore.find(gguid);
2070 if (itBoot == BootsStore.end())
2071 return;
2072
2073 LfgPlayerBoot& boot = itBoot->second;
2074
2075 if (boot.votes[guid] != LFG_ANSWER_PENDING) // Cheat check: Player can't vote twice
2076 return;
2077
2078 boot.votes[guid] = LfgAnswer(accept);
2079
2080 uint8 votesNum = 0;
2081 uint8 agreeNum = 0;
2082 for (LfgAnswerContainer::const_iterator itVotes = boot.votes.begin(); itVotes != boot.votes.end(); ++itVotes)
2083 {
2084 if (itVotes->second != LFG_ANSWER_PENDING)
2085 {
2086 ++votesNum;
2087 if (itVotes->second == LFG_ANSWER_AGREE)
2088 ++agreeNum;
2089 }
2090 }
2091
2092 // if we don't have enough votes (agree or deny) do nothing
2093 if (agreeNum < LFG_GROUP_KICK_VOTES_NEEDED && (votesNum - agreeNum) < LFG_GROUP_KICK_VOTES_NEEDED)
2094 return;
2095
2096 // Send update info to all players
2097 boot.inProgress = false;
2098 for (LfgAnswerContainer::const_iterator itVotes = boot.votes.begin(); itVotes != boot.votes.end(); ++itVotes)
2099 {
2100 ObjectGuid pguid = itVotes->first;
2101 if (pguid != boot.victim)
2102 {
2104 SendLfgBootProposalUpdate(pguid, boot);
2105 }
2106 }
2107
2109 if (agreeNum == LFG_GROUP_KICK_VOTES_NEEDED) // Vote passed - Kick player
2110 {
2111 if (Group* group = sGroupMgr->GetGroupByGUID(gguid.GetCounter()))
2113
2114 DecreaseKicksLeft(gguid);
2115 }
2116 BootsStore.erase(itBoot);
2117 }
@ GROUP_REMOVEMETHOD_KICK_LFG
Definition SharedDefines.h:3856
static void RemoveFromGroup(Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
Definition Player.cpp:2337
void DecreaseKicksLeft(ObjectGuid guid)
Definition LFGMgr.cpp:2542
@ 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
1818 {
1819 // Check if the proposal exists
1820 LfgProposalContainer::iterator itProposal = ProposalsStore.find(proposalId);
1821 if (itProposal == ProposalsStore.end())
1822 return;
1823
1824 LfgProposal& proposal = itProposal->second;
1825
1826 // Check if proposal have the current player
1827 LfgProposalPlayerContainer::iterator itProposalPlayer = proposal.players.find(guid);
1828 if (itProposalPlayer == proposal.players.end())
1829 return;
1830
1831 LfgProposalPlayer& player = itProposalPlayer->second;
1832 player.accept = LfgAnswer(accept);
1833
1834 LOG_DEBUG("lfg", "LFGMgr::UpdateProposal: Player [{}] of proposal {} selected: {}", guid.ToString(), proposalId, accept);
1835 if (!accept)
1836 {
1838 return;
1839 }
1840
1841 // check if all have answered and reorder players (leader first)
1842 bool allAnswered = true;
1843 for (LfgProposalPlayerContainer::const_iterator itPlayers = proposal.players.begin(); itPlayers != proposal.players.end(); ++itPlayers)
1844 if (itPlayers->second.accept != LFG_ANSWER_AGREE) // No answer (-1) or not accepted (0)
1845 allAnswered = false;
1846
1847 if (!m_Testing && !allAnswered)
1848 {
1849 for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
1850 SendLfgUpdateProposal(it->first, proposal);
1851
1852 return;
1853 }
1854
1855 bool sendUpdate = proposal.state != LFG_PROPOSAL_SUCCESS;
1856 proposal.state = LFG_PROPOSAL_SUCCESS;
1857 time_t joinTime = GameTime::GetGameTime().count();
1858
1859 LFGQueue& queue = GetQueue(guid);
1860 LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_GROUP_FOUND);
1861 for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
1862 {
1863 ObjectGuid pguid = it->first;
1864 ObjectGuid gguid = it->second.group;
1865 uint32 dungeonId = (*GetSelectedDungeons(pguid).begin());
1866 int32 waitTime = -1;
1867 if (sendUpdate)
1868 SendLfgUpdateProposal(pguid, proposal);
1869
1870 if (gguid)
1871 {
1872 waitTime = int32((joinTime - queue.GetJoinTime(gguid)) / IN_MILLISECONDS);
1873 SendLfgUpdateParty(pguid, updateData);
1874 }
1875 else
1876 {
1877 waitTime = int32((joinTime - queue.GetJoinTime(pguid)) / IN_MILLISECONDS);
1878 SendLfgUpdatePlayer(pguid, updateData);
1879 }
1880 updateData.updateType = LFG_UPDATETYPE_REMOVED_FROM_QUEUE;
1881 SendLfgUpdatePlayer(pguid, updateData);
1882 SendLfgUpdateParty(pguid, updateData);
1883
1884 // Update timers
1885 uint8 role = GetRoles(pguid);
1886 role &= ~PLAYER_ROLE_LEADER;
1887 switch (role)
1888 {
1889 case PLAYER_ROLE_DAMAGE:
1890 queue.UpdateWaitTimeDps(waitTime, dungeonId);
1891 break;
1892 case PLAYER_ROLE_HEALER:
1893 queue.UpdateWaitTimeHealer(waitTime, dungeonId);
1894 break;
1895 case PLAYER_ROLE_TANK:
1896 queue.UpdateWaitTimeTank(waitTime, dungeonId);
1897 break;
1898 default:
1899 queue.UpdateWaitTimeAvg(waitTime, dungeonId);
1900 break;
1901 }
1902
1904 }
1905
1906 // Remove players/groups from Queue
1907 for (uint8 i = 0; i < 5 && proposal.queues.guids[i]; ++i)
1908 queue.RemoveQueueData(proposal.queues.guids[i]);
1909
1910 MakeNewGroup(proposal);
1911 ProposalsStore.erase(itProposal);
1912 }
std::int32_t int32
Definition Define.h:103
uint8 GetRoles(ObjectGuid guid)
Get current player roles.
Definition LFGMgr.cpp:2411
void MakeNewGroup(LfgProposal const &proposal)
Definition LFGMgr.cpp:1587
@ 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)
979 {
980 for (uint8 team = 0; team < 2; ++team)
981 {
982 if (m_raidBrowserUpdateTimer[team] > diff)
983 m_raidBrowserUpdateTimer[team] -= diff;
984 else
985 m_raidBrowserUpdateTimer[team] = 0;
986 }
987
988 if (GetMSTimeDiff(GameTime::GetGameTimeMS(), GetTimeMS()) > 98ms) // prevent lagging
989 {
990 return;
991 }
992
993 ObjectGuid guid, groupGuid, instanceGuid;
994 uint8 level, Class, race, talents[3];
995 float iLevel, mp5, mp5combat, baseAP, rangedAP;
996 int32 spellDamage, spellHeal;
997 uint32 dungeonId, encounterMask, maxPower;
998 uint32 deletedCounter, groupCounter, playerCounter;
999 ByteBuffer buffer_deleted, buffer_groups, buffer_players;
1000 std::string emptyComment;
1001 GuidSet deletedGroups, deletedGroupsToErase;
1002 RBInternalInfoMap copy;
1003
1004 for (uint8 team = 0; team < 2; ++team)
1005 {
1006 if (m_raidBrowserLastUpdatedDungeonId[team] == 0) // new loop
1007 {
1008 if (m_raidBrowserUpdateTimer[team] > 0) // allowed only with some time interval
1009 continue;
1010 else // reset timer
1011 m_raidBrowserUpdateTimer[team] = 5000;
1012 }
1013
1014 RBUsedDungeonsSet::const_iterator neitr, titr;
1015 for (neitr = RBUsedDungeonsStore[team].begin(); neitr != RBUsedDungeonsStore[team].end(); )
1016 {
1017 titr = neitr++;
1018 dungeonId = (*titr);
1019
1020 // go to next dungeon than previously (one dungeon updated in one LFGMgr::UpdateRaidBrowser)
1021 if (dungeonId <= m_raidBrowserLastUpdatedDungeonId[team])
1022 continue;
1023 m_raidBrowserLastUpdatedDungeonId[team] = dungeonId;
1024
1025 RBEntryInfoMap& entryInfoMap = RaidBrowserStore[team][dungeonId];
1026 LFGDungeonData const* dungeonData = GetLFGDungeon(dungeonId); // checked if exists before inserting to the container
1027 RBInternalInfoMap& currInternalInfoMap = RBInternalInfoStoreCurr[team][dungeonId];
1028 for (RBEntryInfoMap::const_iterator sitr = entryInfoMap.begin(); sitr != entryInfoMap.end(); ++sitr)
1029 {
1030 guid = sitr->first;
1031 groupGuid.Clear();
1033 ASSERT(p);
1034 if (sitr->second.roles == PLAYER_ROLE_LEADER)
1035 {
1036 ASSERT(p->GetGroup());
1037 groupGuid = p->GetGroup()->GetGUID();
1038 }
1039 encounterMask = 0;
1040 instanceGuid.Clear();
1041 if (InstancePlayerBind* bind = sInstanceSaveMgr->PlayerGetBoundInstance(guid, dungeonData->map, dungeonData->difficulty))
1042 if (bind->perm)
1043 {
1044 instanceGuid = ObjectGuid::Create<HighGuid::Instance>(bind->save->GetInstanceId());
1045 encounterMask = bind->save->GetCompletedEncounterMask();
1046 }
1047
1048 talents[0] = 0;
1049 talents[1] = 0;
1050 talents[2] = 0;
1051 p->GetTalentTreePoints(talents);
1058 maxPower = 0;
1059 if (p->IsClass(CLASS_DRUID))
1060 maxPower = p->GetMaxPower(POWER_MANA);
1061 else
1062 maxPower = (p->getPowerType() == POWER_RAGE || p->getPowerType() == POWER_RUNIC_POWER) ? p->GetMaxPower(p->getPowerType()) / 10 : p->GetMaxPower(p->getPowerType());
1063
1064 currInternalInfoMap[sitr->first] = RBInternalInfo(guid, sitr->second.comment, !groupGuid.IsEmpty(), groupGuid, sitr->second.roles, encounterMask, instanceGuid,
1065 1, p->GetLevel(), p->getClass(), p->getRace(), p->GetAverageItemLevel(),
1066 talents, p->GetAreaId(), p->GetArmor(), (uint32)std::max<int32>(0, spellDamage), (uint32)std::max<int32>(0, spellHeal),
1067 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),
1068 std::max<uint32>(baseAP, rangedAP), (uint32)p->GetStat(STAT_AGILITY), p->GetMaxHealth(), maxPower, p->GetDefenseSkillValue(),
1070
1071 if (!groupGuid)
1072 continue;
1073 for (Group::member_citerator mitr = p->GetGroup()->GetMemberSlots().begin(); mitr != p->GetGroup()->GetMemberSlots().end(); ++mitr)
1074 {
1075 if (mitr->guid == sitr->first) // leader already added
1076 continue;
1077
1078 guid = mitr->guid;
1079 level = 1;
1080 Class = 0;
1081 race = 0;
1082 iLevel = 0.0f;
1083 talents[0] = 0;
1084 talents[1] = 0;
1085 talents[2] = 0;
1086 if (CharacterCacheEntry const* gpd = sCharacterCache->GetCharacterCacheByGuid(mitr->guid))
1087 {
1088 level = gpd->Level;
1089 Class = gpd->Class;
1090 race = gpd->Race;
1091 }
1093 if (mplr)
1094 {
1095 iLevel = mplr->GetAverageItemLevel();
1096 mplr->GetTalentTreePoints(talents);
1097 }
1098 currInternalInfoMap[mitr->guid] = RBInternalInfo(guid, emptyComment, false, groupGuid, 0, 0, ObjectGuid::Empty,
1099 (mplr ? 1 : 0), level, Class, race, iLevel,
1100 talents, 0, 0, 0, 0,
1101 0, 0, 0, 0, 0,
1102 0, 0, 0, 0, 0,
1103 0, 0, 0, 0, 0);
1104 }
1105 }
1106
1107 copy.clear();
1108 copy = currInternalInfoMap; // will be saved as prev at the end
1109
1110 // compare prev with curr to build difference packet
1111 deletedCounter = 0;
1112 groupCounter = 0;
1113 playerCounter = 0;
1114 buffer_deleted.clear();
1115 buffer_groups.clear();
1116 buffer_players.clear();
1117 deletedGroups.clear();
1118 deletedGroupsToErase.clear();
1119
1120 RBInternalInfoMap& prevInternalInfoMap = RBInternalInfoStorePrev[team][dungeonId];
1121 RBInternalInfoMap::iterator iter, iterTmp;
1122 for (RBInternalInfoMap::const_iterator sitr = prevInternalInfoMap.begin(); sitr != prevInternalInfoMap.end(); ++sitr)
1123 {
1124 iter = currInternalInfoMap.find(sitr->first);
1125 if (iter == currInternalInfoMap.end()) // was -> isn't
1126 {
1127 if (sitr->second.isGroupLeader)
1128 deletedGroups.insert(sitr->second.groupGuid);
1129 ++deletedCounter;
1130 buffer_deleted << sitr->second.guid;
1131 }
1132 else // was -> is
1133 {
1134 if (sitr->second.isGroupLeader) // was a leader
1135 {
1136 if (!iter->second.isGroupLeader) // leader -> no longer a leader
1137 deletedGroups.insert(sitr->second.groupGuid);
1138 else if (sitr->second.groupGuid != iter->second.groupGuid) // leader -> leader of another group
1139 {
1140 deletedGroups.insert(sitr->second.groupGuid);
1141 deletedGroupsToErase.insert(iter->second.groupGuid);
1142 ++groupCounter;
1143 RBPacketAppendGroup(iter->second, buffer_groups);
1144 }
1145 else if (sitr->second.comment != iter->second.comment || sitr->second.encounterMask != iter->second.encounterMask || sitr->second.instanceGuid != iter->second.instanceGuid) // leader -> nothing changed
1146 {
1147 ++groupCounter;
1148 RBPacketAppendGroup(iter->second, buffer_groups);
1149 }
1150 }
1151 else if (iter->second.isGroupLeader) // wasn't a leader -> is a leader
1152 {
1153 deletedGroupsToErase.insert(iter->second.groupGuid);
1154 ++groupCounter;
1155 RBPacketAppendGroup(iter->second, buffer_groups);
1156 }
1157
1158 if (!iter->second._online) // if offline, copy previous stats (itemLevel, talents, area, etc.)
1159 {
1160 iterTmp = copy.find(sitr->first); // copied container is for building a full packet, so modify it there (currInternalInfoMap is erased)
1161 iterTmp->second.CopyStats(sitr->second);
1162 if (!sitr->second.PlayerSameAs(iterTmp->second)) // player info changed
1163 {
1164 ++playerCounter;
1165 RBPacketAppendPlayer(iterTmp->second, buffer_players);
1166 }
1167 }
1168 else if (!sitr->second.PlayerSameAs(iter->second)) // player info changed
1169 {
1170 ++playerCounter;
1171 RBPacketAppendPlayer(iter->second, buffer_players);
1172 }
1173 currInternalInfoMap.erase(iter);
1174 }
1175 }
1176 // left entries (new)
1177 for (RBInternalInfoMap::const_iterator sitr = currInternalInfoMap.begin(); sitr != currInternalInfoMap.end(); ++sitr)
1178 {
1179 if (sitr->second.isGroupLeader)
1180 {
1181 deletedGroupsToErase.insert(sitr->second.groupGuid);
1182 ++groupCounter;
1183 RBPacketAppendGroup(sitr->second, buffer_groups);
1184 }
1185 ++playerCounter;
1186 RBPacketAppendPlayer(sitr->second, buffer_players);
1187 }
1188
1189 if (!deletedGroupsToErase.empty())
1190 {
1191 for (ObjectGuid const& toErase : deletedGroupsToErase)
1192 {
1193 deletedGroups.erase(toErase);
1194 }
1195 }
1196
1197 if (!deletedGroups.empty())
1198 {
1199 for (ObjectGuid const& deletedGroup : deletedGroups)
1200 {
1201 ++deletedCounter;
1202 buffer_deleted << deletedGroup;
1203 }
1204 }
1205
1206 WorldPacket differencePacket(SMSG_UPDATE_LFG_LIST, 1000);
1207 RBPacketBuildDifference(differencePacket, dungeonId, deletedCounter, buffer_deleted, groupCounter, buffer_groups, playerCounter, buffer_players);
1208 WorldPacket fullPacket(SMSG_UPDATE_LFG_LIST, 1000);
1209 RBPacketBuildFull(fullPacket, dungeonId, copy);
1210
1211 RBCacheStore[team][dungeonId] = fullPacket;
1212 prevInternalInfoMap = copy;
1213 currInternalInfoMap.clear();
1214
1215 if (entryInfoMap.empty())
1216 RBUsedDungeonsStore[team].erase(titr);
1217
1218 // send difference packet to browsing players
1219 for (RBSearchersMap::const_iterator sitr = RBSearchersStore[team].begin(); sitr != RBSearchersStore[team].end(); ++sitr)
1220 if (sitr->second == dungeonId)
1221 if (Player* p = ObjectAccessor::FindConnectedPlayer(sitr->first))
1222 p->SendDirectMessage(&differencePacket);
1223
1224 break; // one dungeon updated in one LFGMgr::UpdateRaidBrowser
1225 }
1226
1227 // already updated all in this time interval
1228 if (neitr == RBUsedDungeonsStore[team].end())
1230 }
1231 }
#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:281
@ POWER_RUNIC_POWER
Definition SharedDefines.h:286
@ POWER_MANA
Definition SharedDefines.h:280
@ CLASS_DRUID
Definition SharedDefines.h:151
@ STAT_AGILITY
Definition SharedDefines.h:270
@ SPELL_SCHOOL_MASK_ALL
Definition SharedDefines.h:326
Milliseconds GetTimeMS()
Definition Timer.h:84
Milliseconds GetMSTimeDiff(Milliseconds oldMSTime, Milliseconds newMSTime)
Definition Timer.h:91
@ BASE_ATTACK
Definition Unit.h:216
@ RANGED_ATTACK
Definition Unit.h:218
@ CR_EXPERTISE
Definition Unit.h:247
@ CR_CRIT_MELEE
Definition Unit.h:232
@ CR_CRIT_RANGED
Definition Unit.h:233
@ CR_PARRY
Definition Unit.h:227
@ CR_DODGE
Definition Unit.h:226
@ CR_BLOCK
Definition Unit.h:228
@ CR_HASTE_SPELL
Definition Unit.h:243
@ CR_CRIT_SPELL
Definition Unit.h:234
@ PLAYER_FIELD_COMBAT_RATING_1
Definition UpdateFields.h:380
@ UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER
Definition UpdateFields.h:113
@ UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER
Definition UpdateFields.h:112
void clear()
Definition ByteBuffer.h:122
MemberSlotList const & GetMemberSlots() const
Definition Group.h: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:15391
float GetAverageItemLevel()
Definition Player.cpp:15832
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:12882
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition Unit.cpp:15663
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition Unit.cpp:3654
uint32 GetMaxHealth() const
Definition Unit.h:1094
uint8 getClass() const
Definition Unit.h:833
uint8 getRace(bool original=false) const
Definition Unit.cpp:21098
uint32 GetMaxPower(Powers power) const
Definition Unit.h:1121
uint32 GetArmor() const
Definition Unit.h:1142
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:12136
float GetStat(Stats stat) const
Definition Unit.h:1043
Powers getPowerType() const
Definition Unit.h:1116
uint32 GetAreaId() const
Definition Object.cpp:3064
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:1303
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:1318
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
1400 {
1401 if (!gguid)
1402 return;
1403
1404 LfgRolesMap check_roles;
1405 LfgRoleCheckContainer::iterator itRoleCheck = RoleChecksStore.find(gguid);
1406 if (itRoleCheck == RoleChecksStore.end())
1407 return;
1408
1409 LfgRoleCheck& roleCheck = itRoleCheck->second;
1410 bool sendRoleChosen = roleCheck.state != LFG_ROLECHECK_DEFAULT && guid;
1411
1412 if (!guid)
1413 roleCheck.state = LFG_ROLECHECK_ABORTED;
1414 else if (roles < PLAYER_ROLE_TANK) // Player selected no role.
1415 roleCheck.state = LFG_ROLECHECK_NO_ROLE;
1416 else
1417 {
1418 roleCheck.roles[guid] = roles;
1419
1420 // Check if all players have selected a role
1421 LfgRolesMap::const_iterator itRoles = roleCheck.roles.begin();
1422 while (itRoles != roleCheck.roles.end() && itRoles->second != PLAYER_ROLE_NONE)
1423 ++itRoles;
1424
1425 if (itRoles == roleCheck.roles.end())
1426 {
1427 // use temporal var to check roles, CheckGroupRoles modifies the roles
1428 check_roles = roleCheck.roles;
1429 roleCheck.state = CheckGroupRoles(check_roles) ? LFG_ROLECHECK_FINISHED : LFG_ROLECHECK_WRONG_ROLES;
1430 }
1431 }
1432
1433 LfgDungeonSet dungeons;
1434 if (roleCheck.rDungeonId)
1435 dungeons.insert(roleCheck.rDungeonId);
1436 else
1437 dungeons = roleCheck.dungeons;
1438
1439 LfgJoinResultData joinData = LfgJoinResultData(LFG_JOIN_FAILED, roleCheck.state);
1440 for (LfgRolesMap::const_iterator it = roleCheck.roles.begin(); it != roleCheck.roles.end(); ++it)
1441 {
1442 ObjectGuid pguid = it->first;
1443
1444 if (sendRoleChosen)
1445 SendLfgRoleChosen(pguid, guid, roles);
1446
1447 SendLfgRoleCheckUpdate(pguid, roleCheck);
1448 switch (roleCheck.state)
1449 {
1451 continue;
1453 SetState(pguid, LFG_STATE_QUEUED);
1454 SetRoles(pguid, it->second);
1455 SendLfgUpdateParty(pguid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, dungeons, GetComment(pguid)));
1456 break;
1457 default:
1458 if (roleCheck.leader == pguid)
1459 SendLfgJoinResult(pguid, joinData);
1461 RestoreState(pguid, "Rolecheck Failed");
1462 break;
1463 }
1464 }
1465
1466 if (roleCheck.state == LFG_ROLECHECK_FINISHED)
1467 {
1468 SetState(gguid, LFG_STATE_QUEUED);
1469 LFGQueue& queue = GetQueue(gguid);
1470 queue.AddQueueData(gguid, time_t(GameTime::GetGameTime().count()), roleCheck.dungeons, roleCheck.roles);
1471 RoleChecksStore.erase(itRoleCheck);
1472 }
1473 else if (roleCheck.state != LFG_ROLECHECK_INITIALITING)
1474 {
1475 RestoreState(gguid, "Rolecheck Failed");
1476 RoleChecksStore.erase(itRoleCheck);
1477 }
1478 }
void SendLfgRoleChosen(ObjectGuid guid, ObjectGuid pguid, uint8 roles)
Definition LFGMgr.cpp:2641
@ 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().

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