TrinityCore
LFGHandler.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "CharacterCache.h"
19#include "DB2Stores.h"
20#include "WorldSession.h"
21#include "GameTime.h"
22#include "Group.h"
23#include "LFGMgr.h"
24#include "LFGPackets.h"
25#include "Log.h"
26#include "ObjectAccessor.h"
27#include "ObjectMgr.h"
28#include "Player.h"
29
31{
33 (GetPlayer()->GetGroup() && GetPlayer()->GetGroup()->GetLeaderGUID() != GetPlayer()->GetGUID() &&
34 (GetPlayer()->GetGroup()->GetMembersCount() == MAX_GROUP_SIZE || !GetPlayer()->GetGroup()->isLFGGroup())))
35 return;
36
37 if (dfJoin.Slots.empty())
38 {
39 TC_LOG_DEBUG("lfg", "CMSG_DF_JOIN {} no dungeons selected", GetPlayerInfo());
40 return;
41 }
42
43 lfg::LfgDungeonSet newDungeons;
44 for (uint32 slot : dfJoin.Slots)
45 {
46 uint32 dungeon = slot & 0x00FFFFFF;
47 if (sLFGDungeonsStore.LookupEntry(dungeon))
48 newDungeons.insert(dungeon);
49 }
50
51 TC_LOG_DEBUG("lfg", "CMSG_DF_JOIN {} roles: {}, Dungeons: {}", GetPlayerInfo(), dfJoin.Roles, uint8(newDungeons.size()));
52
53 sLFGMgr->JoinLfg(GetPlayer(), uint8(dfJoin.Roles), newDungeons);
54}
55
57{
58 Group* group = GetPlayer()->GetGroup();
59
60 TC_LOG_DEBUG("lfg", "CMSG_DF_LEAVE {} in group: {} sent guid {}.",
61 GetPlayerInfo(), group ? 1 : 0, dfLeave.Ticket.RequesterGuid.ToString());
62
63 // Check cheating - only leader can leave the queue
64 if (!group || group->GetLeaderGUID() == dfLeave.Ticket.RequesterGuid)
65 sLFGMgr->LeaveLfg(dfLeave.Ticket.RequesterGuid);
66}
67
69{
70 TC_LOG_DEBUG("lfg", "CMSG_LFG_PROPOSAL_RESULT {} proposal: {} accept: {}",
71 GetPlayerInfo(), dfProposalResponse.ProposalID, dfProposalResponse.Accepted ? 1 : 0);
72 sLFGMgr->UpdateProposal(dfProposalResponse.ProposalID, GetPlayer()->GetGUID(), dfProposalResponse.Accepted);
73}
74
76{
77 ObjectGuid guid = GetPlayer()->GetGUID();
78 Group* group = GetPlayer()->GetGroup();
79 if (!group)
80 {
81 TC_LOG_DEBUG("lfg", "CMSG_DF_SET_ROLES {} Not in group",
83 return;
84 }
85 ObjectGuid gguid = group->GetGUID();
86 TC_LOG_DEBUG("lfg", "CMSG_DF_SET_ROLES: Group {}, Player {}, Roles: {}",
87 gguid.ToString(), GetPlayerInfo(), dfSetRoles.RolesDesired);
88 sLFGMgr->UpdateRoleCheck(gguid, guid, dfSetRoles.RolesDesired);
89}
90
92{
93 ObjectGuid guid = GetPlayer()->GetGUID();
94 TC_LOG_DEBUG("lfg", "CMSG_LFG_SET_BOOT_VOTE {} agree: {}",
95 GetPlayerInfo(), dfBootPlayerVote.Vote ? 1 : 0);
96 sLFGMgr->UpdateBoot(guid, dfBootPlayerVote.Vote);
97}
98
100{
101 TC_LOG_DEBUG("lfg", "CMSG_DF_TELEPORT {} out: {}",
102 GetPlayerInfo(), dfTeleport.TeleportOut ? 1 : 0);
103 sLFGMgr->TeleportPlayer(GetPlayer(), dfTeleport.TeleportOut, true);
104}
105
107{
108 TC_LOG_DEBUG("lfg", "CMSG_DF_GET_SYSTEM_INFO {} for {}", GetPlayerInfo(), (dfGetSystemInfo.Player ? "player" : "party"));
109
110 if (dfGetSystemInfo.Player)
112 else
114}
115
117{
118 TC_LOG_DEBUG("lfg", "CMSG_DF_GET_JOIN_STATUS {}", GetPlayerInfo());
119
120 if (!GetPlayer()->isUsingLfg())
121 return;
122
123 ObjectGuid guid = GetPlayer()->GetGUID();
124 lfg::LfgUpdateData updateData = sLFGMgr->GetLfgStatus(guid);
125
126 if (GetPlayer()->GetGroup())
127 {
128 SendLfgUpdateStatus(updateData, true);
129 updateData.dungeons.clear();
130 SendLfgUpdateStatus(updateData, false);
131 }
132 else
133 {
134 SendLfgUpdateStatus(updateData, false);
135 updateData.dungeons.clear();
136 SendLfgUpdateStatus(updateData, true);
137 }
138}
139
141{
142 TC_LOG_DEBUG("lfg", "SMSG_LFG_PLAYER_INFO {}", GetPlayerInfo());
143
144 // Get Random dungeons that can be done at a certain level and expansion
145 uint8 level = GetPlayer()->GetLevel();
146 uint32 contentTuningReplacementConditionMask = GetPlayer()->m_playerData->CtrOptions->ContentTuningConditionMask;
147 lfg::LfgDungeonSet const& randomDungeons = sLFGMgr->GetRandomAndSeasonalDungeons(level, GetExpansion(), contentTuningReplacementConditionMask);
148
150
151 // Get player locked Dungeons
152 for (auto const& lock : sLFGMgr->GetLockedDungeons(_player->GetGUID()))
153 lfgPlayerInfo.BlackList.Slot.emplace_back(lock.first, lock.second.lockStatus, lock.second.requiredItemLevel, lock.second.currentItemLevel, 0);
154
155 for (uint32 slot : randomDungeons)
156 {
157 lfgPlayerInfo.Dungeon.emplace_back();
158 WorldPackets::LFG::LfgPlayerDungeonInfo& playerDungeonInfo = lfgPlayerInfo.Dungeon.back();
159 playerDungeonInfo.Slot = slot;
160 playerDungeonInfo.CompletionQuantity = 1;
161 playerDungeonInfo.CompletionLimit = 1;
162 playerDungeonInfo.CompletionCurrencyID = 0;
163 playerDungeonInfo.SpecificQuantity = 0;
164 playerDungeonInfo.SpecificLimit = 1;
165 playerDungeonInfo.OverallQuantity = 0;
166 playerDungeonInfo.OverallLimit = 1;
167 playerDungeonInfo.PurseWeeklyQuantity = 0;
168 playerDungeonInfo.PurseWeeklyLimit = 0;
169 playerDungeonInfo.PurseQuantity = 0;
170 playerDungeonInfo.PurseLimit = 0;
171 playerDungeonInfo.Quantity = 1;
172 playerDungeonInfo.CompletedMask = 0;
173 playerDungeonInfo.EncounterMask = 0;
174
175 if (lfg::LfgReward const* reward = sLFGMgr->GetRandomDungeonReward(slot, level))
176 {
177 if (Quest const* quest = sObjectMgr->GetQuestTemplate(reward->firstQuest))
178 {
179 playerDungeonInfo.FirstReward = !GetPlayer()->CanRewardQuest(quest, false);
180 if (!playerDungeonInfo.FirstReward)
181 quest = sObjectMgr->GetQuestTemplate(reward->otherQuest);
182
183 if (quest)
184 {
185 playerDungeonInfo.Rewards.RewardMoney = _player->GetQuestMoneyReward(quest);
186 playerDungeonInfo.Rewards.RewardXP = _player->GetQuestXPReward(quest);
187 for (uint8 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i)
188 if (uint32 itemId = quest->RewardItemId[i])
189 playerDungeonInfo.Rewards.Item.emplace_back(itemId, quest->RewardItemCount[i]);
190
191 for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
192 if (uint32 curencyId = quest->RewardCurrencyId[i])
193 playerDungeonInfo.Rewards.Currency.emplace_back(curencyId, quest->RewardCurrencyCount[i]);
194 }
195 }
196 }
197 }
198
199 SendPacket(lfgPlayerInfo.Write());;
200}
201
203{
204 ObjectGuid guid = GetPlayer()->GetGUID();
205 Group* group = GetPlayer()->GetGroup();
206 if (!group)
207 return;
208
210
211 // Get the locked dungeons of the other party members
212 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
213 {
214 Player* plrg = itr->GetSource();
215 if (!plrg)
216 continue;
217
218 ObjectGuid pguid = plrg->GetGUID();
219 if (pguid == guid)
220 continue;
221
222 lfgPartyInfo.Player.emplace_back();
223 WorldPackets::LFG::LFGBlackList& lfgBlackList = lfgPartyInfo.Player.back();
224 lfgBlackList.PlayerGuid = pguid;
225 for (auto const& lock : sLFGMgr->GetLockedDungeons(pguid))
226 lfgBlackList.Slot.emplace_back(lock.first, lock.second.lockStatus, lock.second.requiredItemLevel, lock.second.currentItemLevel, 0);
227 }
228
229 TC_LOG_DEBUG("lfg", "SMSG_LFG_PARTY_INFO {}", GetPlayerInfo());
230 SendPacket(lfgPartyInfo.Write());;
231}
232
233void WorldSession::SendLfgUpdateStatus(lfg::LfgUpdateData const& updateData, bool party)
234{
235 bool join = false;
236 bool queued = false;
237
238 switch (updateData.updateType)
239 {
240 case lfg::LFG_UPDATETYPE_JOIN_QUEUE_INITIAL: // Joined queue outside the dungeon
241 join = true;
242 break;
244 case lfg::LFG_UPDATETYPE_ADDED_TO_QUEUE: // Rolecheck Success
245 join = true;
246 queued = true;
247 break;
249 join = true;
250 break;
252 join = updateData.state != lfg::LFG_STATE_ROLECHECK && updateData.state != lfg::LFG_STATE_NONE;
253 queued = updateData.state == lfg::LFG_STATE_QUEUED;
254 break;
255 default:
256 break;
257 }
258
259 TC_LOG_DEBUG("lfg", "SMSG_LFG_UPDATE_STATUS {} updatetype: {}, party {}",
260 GetPlayerInfo(), updateData.updateType, party ? "true" : "false");
261
263 if (WorldPackets::LFG::RideTicket const* ticket = sLFGMgr->GetTicket(_player->GetGUID()))
264 lfgUpdateStatus.Ticket = *ticket;
265
266 lfgUpdateStatus.SubType = lfg::LFG_QUEUE_DUNGEON; // other types not implemented
267 lfgUpdateStatus.Reason = updateData.updateType;
268 std::transform(updateData.dungeons.begin(), updateData.dungeons.end(), std::back_inserter(lfgUpdateStatus.Slots), [](uint32 dungeonId)
269 {
270 return sLFGMgr->GetLFGDungeonEntry(dungeonId);
271 });
272 lfgUpdateStatus.RequestedRoles = sLFGMgr->GetRoles(_player->GetGUID());
273 //lfgUpdateStatus.SuspendedPlayers;
274 lfgUpdateStatus.IsParty = party;
275 lfgUpdateStatus.NotifyUI = true;
276 lfgUpdateStatus.Joined = join;
277 lfgUpdateStatus.LfgJoined = updateData.updateType != lfg::LFG_UPDATETYPE_REMOVED_FROM_QUEUE;
278 lfgUpdateStatus.Queued = queued;
279 lfgUpdateStatus.QueueMapID = sLFGMgr->GetDungeonMapId(_player->GetGUID());
280
281 SendPacket(lfgUpdateStatus.Write());
282}
283
285{
286 TC_LOG_DEBUG("lfg", "SMSG_LFG_ROLE_CHOSEN {} guid: {} roles: {}",
287 GetPlayerInfo(), guid.ToString(), roles);
288
290 roleChosen.Player = guid;
291 roleChosen.RoleMask = roles;
292 roleChosen.Accepted = roles > 0;
293 SendPacket(roleChosen.Write());
294}
295
297{
298 lfg::LfgDungeonSet dungeons;
299 if (roleCheck.rDungeonId)
300 dungeons.insert(roleCheck.rDungeonId);
301 else
302 dungeons = roleCheck.dungeons;
303
304 TC_LOG_DEBUG("lfg", "SMSG_LFG_ROLE_CHECK_UPDATE {}", GetPlayerInfo());
305 WorldPackets::LFG::LFGRoleCheckUpdate lfgRoleCheckUpdate;
306 lfgRoleCheckUpdate.PartyIndex = 127;
307 lfgRoleCheckUpdate.RoleCheckStatus = roleCheck.state;
308 std::transform(dungeons.begin(), dungeons.end(), std::back_inserter(lfgRoleCheckUpdate.JoinSlots), [](uint32 dungeonId)
309 {
310 return sLFGMgr->GetLFGDungeonEntry(dungeonId);
311 });
312 lfgRoleCheckUpdate.GroupFinderActivityID = 0;
313 if (!roleCheck.roles.empty())
314 {
315 // Leader info MUST be sent 1st :S
316 uint8 roles = roleCheck.roles.find(roleCheck.leader)->second;
317 lfgRoleCheckUpdate.Members.emplace_back(roleCheck.leader, roles, ASSERT_NOTNULL(sCharacterCache->GetCharacterCacheByGuid(roleCheck.leader))->Level, roles > 0);
318
319 for (lfg::LfgRolesMap::const_iterator it = roleCheck.roles.begin(); it != roleCheck.roles.end(); ++it)
320 {
321 if (it->first == roleCheck.leader)
322 continue;
323
324 roles = it->second;
325 lfgRoleCheckUpdate.Members.emplace_back(it->first, roles, ASSERT_NOTNULL(sCharacterCache->GetCharacterCacheByGuid(it->first))->Level, roles > 0);
326 }
327 }
328
329 SendPacket(lfgRoleCheckUpdate.Write());
330}
331
333{
334 TC_LOG_DEBUG("lfg", "SMSG_LFG_JOIN_RESULT {} checkResult: {} checkValue: {}",
335 GetPlayerInfo(), joinData.result, joinData.state);
336
338 if (WorldPackets::LFG::RideTicket const* ticket = sLFGMgr->GetTicket(GetPlayer()->GetGUID()))
339 lfgJoinResult.Ticket = *ticket;
340 lfgJoinResult.Result = joinData.result;
342 lfgJoinResult.ResultDetail = joinData.state;
343 else if (joinData.result == lfg::LFG_JOIN_NO_SLOTS)
344 lfgJoinResult.BlackListNames = joinData.playersMissingRequirement;
345
346 for (lfg::LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it)
347 {
348 lfgJoinResult.BlackList.emplace_back();
349 WorldPackets::LFG::LFGBlackList& blackList = lfgJoinResult.BlackList.back();
350 blackList.PlayerGuid = it->first;
351
352 for (lfg::LfgLockMap::const_iterator itr = it->second.begin(); itr != it->second.end(); ++itr)
353 {
354 TC_LOG_TRACE("lfg", "SendLfgJoinResult:: {} DungeonID: {} Lock status: {} Required itemLevel: {} Current itemLevel: {}",
355 it->first.ToString(), (itr->first & 0x00FFFFFF), itr->second.lockStatus, itr->second.requiredItemLevel, itr->second.currentItemLevel);
356
357 blackList.Slot.emplace_back(itr->first, itr->second.lockStatus, itr->second.requiredItemLevel, itr->second.currentItemLevel, 0);
358 }
359 }
360
361 SendPacket(lfgJoinResult.Write());
362}
363
365{
366 TC_LOG_DEBUG("lfg", "SMSG_LFG_QUEUE_STATUS {} state: {}, dungeon: {}, waitTime: {}, "
367 "avgWaitTime: {}, waitTimeTanks: {}, waitTimeHealer: {}, waitTimeDps: {}, "
368 "queuedTime: {}, tanks: {}, healers: {}, dps: {}",
369 GetPlayerInfo(), lfg::GetStateString(sLFGMgr->GetState(GetPlayer()->GetGUID())), queueData.dungeonId, queueData.waitTime, queueData.waitTimeAvg,
370 queueData.waitTimeTank, queueData.waitTimeHealer, queueData.waitTimeDps,
371 queueData.queuedTime, queueData.tanks, queueData.healers, queueData.dps);
372
374 if (WorldPackets::LFG::RideTicket const* ticket = sLFGMgr->GetTicket(GetPlayer()->GetGUID()))
375 lfgQueueStatus.Ticket = *ticket;
376 lfgQueueStatus.Slot = sLFGMgr->GetLFGDungeonEntry(queueData.dungeonId);
377 lfgQueueStatus.AvgWaitTimeMe = queueData.waitTime;
378 lfgQueueStatus.AvgWaitTime = queueData.waitTimeAvg;
379 lfgQueueStatus.AvgWaitTimeByRole[0] = queueData.waitTimeTank;
380 lfgQueueStatus.AvgWaitTimeByRole[1] = queueData.waitTimeHealer;
381 lfgQueueStatus.AvgWaitTimeByRole[2] = queueData.waitTimeDps;
382 lfgQueueStatus.LastNeeded[0] = queueData.tanks;
383 lfgQueueStatus.LastNeeded[1] = queueData.healers;
384 lfgQueueStatus.LastNeeded[2] = queueData.dps;
385 lfgQueueStatus.QueuedTime = queueData.queuedTime;
386 SendPacket(lfgQueueStatus.Write());
387}
388
390{
391 if (!rewardData.rdungeonEntry || !rewardData.sdungeonEntry || !rewardData.quest)
392 return;
393
394 TC_LOG_DEBUG("lfg", "SMSG_LFG_PLAYER_REWARD {} rdungeonEntry: {}, sdungeonEntry: {}, done: {}",
395 GetPlayerInfo(), rewardData.rdungeonEntry, rewardData.sdungeonEntry, rewardData.done);
396
398 lfgPlayerReward.QueuedSlot = rewardData.rdungeonEntry;
399 lfgPlayerReward.ActualSlot = rewardData.sdungeonEntry;
400 lfgPlayerReward.RewardMoney = GetPlayer()->GetQuestMoneyReward(rewardData.quest);
401 lfgPlayerReward.AddedXP = GetPlayer()->GetQuestXPReward(rewardData.quest);
402
403 for (uint8 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i)
404 if (uint32 itemId = rewardData.quest->RewardItemId[i])
405 lfgPlayerReward.Rewards.emplace_back(itemId, rewardData.quest->RewardItemCount[i], 0, false);
406
407 for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
408 if (uint32 curencyId = rewardData.quest->RewardCurrencyId[i])
409 lfgPlayerReward.Rewards.emplace_back(curencyId, rewardData.quest->RewardCurrencyCount[i], 0, true);
410
411 SendPacket(lfgPlayerReward.Write());
412}
413
415{
416 lfg::LfgAnswer playerVote = boot.votes.find(GetPlayer()->GetGUID())->second;
417 uint8 votesNum = 0;
418 uint8 agreeNum = 0;
419 int32 secsleft = int32((boot.cancelTime - GameTime::GetGameTime()) / 1000);
420 for (const auto& vote : boot.votes)
421 {
422 if (vote.second != lfg::LFG_ANSWER_PENDING)
423 {
424 ++votesNum;
425 if (vote.second == lfg::LFG_ANSWER_AGREE)
426 ++agreeNum;
427 }
428 }
429 TC_LOG_DEBUG("lfg", "SMSG_LFG_BOOT_PROPOSAL_UPDATE {} inProgress: {} - "
430 "didVote: {} - agree: {} - victim: {} votes: {} - agrees: {} - left: {} - "
431 "needed: {} - reason {}",
433 uint8(playerVote == lfg::LFG_ANSWER_AGREE), boot.victim.ToString(), votesNum, agreeNum,
435
437 lfgBootPlayer.Info.VoteInProgress = boot.inProgress;
438 lfgBootPlayer.Info.VotePassed = agreeNum >= lfg::LFG_GROUP_KICK_VOTES_NEEDED;
439 lfgBootPlayer.Info.MyVoteCompleted = playerVote != lfg::LFG_ANSWER_PENDING;
440 lfgBootPlayer.Info.MyVote = playerVote == lfg::LFG_ANSWER_AGREE;
441 lfgBootPlayer.Info.Target = boot.victim;
442 lfgBootPlayer.Info.TotalVotes = votesNum;
443 lfgBootPlayer.Info.BootVotes = agreeNum;
444 lfgBootPlayer.Info.TimeLeft = secsleft;
446 lfgBootPlayer.Info.Reason = boot.reason;
447 SendPacket(lfgBootPlayer.Write());
448}
449
451{
452 ObjectGuid guid = GetPlayer()->GetGUID();
453 ObjectGuid gguid = proposal.players.find(guid)->second.group;
454 bool silent = !proposal.isNew && gguid == proposal.group;
455 uint32 dungeonEntry = proposal.dungeonId;
456
457 TC_LOG_DEBUG("lfg", "SMSG_LFG_PROPOSAL_UPDATE {} state: {}",
458 GetPlayerInfo(), proposal.state);
459
460 // show random dungeon if player selected random dungeon and it's not lfg group
461 if (!silent)
462 {
463 lfg::LfgDungeonSet const& playerDungeons = sLFGMgr->GetSelectedDungeons(guid);
464 if (playerDungeons.find(proposal.dungeonId) == playerDungeons.end())
465 dungeonEntry = (*playerDungeons.begin());
466 }
467
468 WorldPackets::LFG::LFGProposalUpdate lfgProposalUpdate;
469 if (WorldPackets::LFG::RideTicket const* ticket = sLFGMgr->GetTicket(GetPlayer()->GetGUID()))
470 lfgProposalUpdate.Ticket = *ticket;
471 lfgProposalUpdate.InstanceID = 0;
472 lfgProposalUpdate.ProposalID = proposal.id;
473 lfgProposalUpdate.Slot = sLFGMgr->GetLFGDungeonEntry(dungeonEntry);
474 lfgProposalUpdate.State = proposal.state;
475 lfgProposalUpdate.CompletedMask = proposal.encounters;
476 lfgProposalUpdate.ValidCompletedMask = true;
477 lfgProposalUpdate.ProposalSilent = silent;
478 lfgProposalUpdate.IsRequeue = !proposal.isNew;
479
480 for (auto const& player : proposal.players)
481 {
482 lfgProposalUpdate.Players.emplace_back();
483 auto& proposalPlayer = lfgProposalUpdate.Players.back();
484 proposalPlayer.Roles = player.second.role;
485 proposalPlayer.Me = player.first == guid;
486 proposalPlayer.MyParty = !player.second.group.IsEmpty() && player.second.group == proposal.group;
487 proposalPlayer.SameParty = !player.second.group.IsEmpty() && player.second.group == gguid;
488 proposalPlayer.Responded = player.second.accept != lfg::LFG_ANSWER_PENDING;
489 proposalPlayer.Accepted = player.second.accept == lfg::LFG_ANSWER_AGREE;
490 }
491
492 SendPacket(lfgProposalUpdate.Write());
493}
494
496{
497 TC_LOG_DEBUG("lfg", "SMSG_LFG_DISABLED {}", GetPlayerInfo());
499}
500
502{
503 TC_LOG_DEBUG("lfg", "SMSG_LFG_OFFER_CONTINUE {} dungeon entry: {}",
504 GetPlayerInfo(), dungeonEntry);
505 SendPacket(WorldPackets::LFG::LFGOfferContinue(sLFGMgr->GetLFGDungeonEntry(dungeonEntry)).Write());
506}
507
509{
510 TC_LOG_DEBUG("lfg", "SMSG_LFG_TELEPORT_DENIED {} reason: {}",
511 GetPlayerInfo(), err);
513}
#define sCharacterCache
DB2Storage< LFGDungeonsEntry > sLFGDungeonsStore("LFGDungeons.db2", &LfgDungeonsLoadInfo::Instance)
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
#define ASSERT_NOTNULL(pointer)
Definition: Errors.h:84
#define MAX_GROUP_SIZE
Definition: Group.h:50
#define sLFGMgr
Definition: LFGMgr.h:507
#define TC_LOG_DEBUG(filterType__,...)
Definition: Log.h:156
#define TC_LOG_TRACE(filterType__,...)
Definition: Log.h:153
#define sObjectMgr
Definition: ObjectMgr.h:1946
#define QUEST_REWARD_ITEM_COUNT
Definition: QuestDef.h:48
#define QUEST_REWARD_CURRENCY_COUNT
Definition: QuestDef.h:52
GroupReference * next()
Definition: Group.h:197
ObjectGuid GetGUID() const
Definition: Group.cpp:1663
GroupReference * GetFirstMember()
Definition: Group.h:325
ObjectGuid GetLeaderGUID() const
Definition: Group.cpp:1658
bool IsEmpty() const
Definition: ObjectGuid.h:319
std::string ToString() const
Definition: ObjectGuid.cpp:554
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
UF::UpdateField< UF::PlayerData, 0, TYPEID_PLAYER > m_playerData
Definition: Player.h:2863
uint32 GetQuestXPReward(Quest const *quest)
Definition: Player.cpp:15066
bool CanRewardQuest(Quest const *quest, bool msg) const
Definition: Player.cpp:14717
uint32 GetQuestMoneyReward(Quest const *quest) const
Definition: Player.cpp:15061
Group * GetGroup(Optional< uint8 > partyIndex)
Definition: Player.h:2606
std::array< uint32, QUEST_REWARD_CURRENCY_COUNT > RewardCurrencyId
Definition: QuestDef.h:700
std::array< uint32, QUEST_REWARD_ITEM_COUNT > RewardItemId
Definition: QuestDef.h:688
std::array< uint32, QUEST_REWARD_ITEM_COUNT > RewardItemCount
Definition: QuestDef.h:689
std::array< uint32, QUEST_REWARD_CURRENCY_COUNT > RewardCurrencyCount
Definition: QuestDef.h:701
uint8 GetLevel() const
Definition: Unit.h:746
Array< uint32, 50 > Slots
Definition: LFGPackets.h:47
std::vector< std::string const * > BlackListNames
Definition: LFGPackets.h:292
WorldPacket const * Write() override
Definition: LFGPackets.cpp:271
std::vector< LFGBlackList > BlackList
Definition: LFGPackets.h:291
WorldPacket const * Write() override
Definition: LFGPackets.cpp:397
std::vector< LFGPlayerRewards > Rewards
Definition: LFGPackets.h:345
WorldPacket const * Write() override
Definition: LFGPackets.cpp:324
std::vector< LFGProposalUpdatePlayer > Players
Definition: LFGPackets.h:400
WorldPacket const * Write() override
Definition: LFGPackets.cpp:375
WorldPacket const * Write() override
Definition: LFGPackets.cpp:292
std::vector< LFGRoleCheckUpdateMember > Members
Definition: LFGPackets.h:276
WorldPacket const * Write() override
Definition: LFGPackets.cpp:246
std::vector< uint32 > JoinSlots
Definition: LFGPackets.h:273
WorldPacket const * Write() override
Definition: LFGPackets.cpp:198
std::vector< uint32 > Slots
Definition: LFGPackets.h:228
WorldPacket const * Write() override
Definition: LFGPackets.cpp:355
WorldPacket const * Write() override
Definition: LFGPackets.cpp:189
std::vector< LFGBlackList > Player
Definition: LFGPackets.h:215
std::vector< LfgPlayerDungeonInfo > Dungeon
Definition: LFGPackets.h:205
WorldPacket const * Write() override
Definition: LFGPackets.cpp:179
WorldPacket const * Write() override
Definition: LFGPackets.cpp:225
void SendLfgPartyLockInfo()
Definition: LFGHandler.cpp:202
void HandleDFGetSystemInfo(WorldPackets::LFG::DFGetSystemInfo &dfGetSystemInfo)
Definition: LFGHandler.cpp:106
void HandleLfgProposalResultOpcode(WorldPackets::LFG::DFProposalResponse &dfProposalResponse)
Definition: LFGHandler.cpp:68
void SendLfgJoinResult(lfg::LfgJoinResultData const &joinData)
Definition: LFGHandler.cpp:332
void HandleLfgSetBootVoteOpcode(WorldPackets::LFG::DFBootPlayerVote &dfBootPlayerVote)
Definition: LFGHandler.cpp:91
void SendLfgQueueStatus(lfg::LfgQueueStatusData const &queueData)
Definition: LFGHandler.cpp:364
void SendLfgTeleportError(lfg::LfgTeleportResult err)
Definition: LFGHandler.cpp:508
void HandleLfgSetRolesOpcode(WorldPackets::LFG::DFSetRoles &dfSetRoles)
Definition: LFGHandler.cpp:75
std::string GetPlayerInfo() const
void SendLfgPlayerReward(lfg::LfgPlayerRewardData const &lfgPlayerRewardData)
Definition: LFGHandler.cpp:389
Player * GetPlayer() const
void SendLfgOfferContinue(uint32 dungeonEntry)
Definition: LFGHandler.cpp:501
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
void HandleLfgJoinOpcode(WorldPackets::LFG::DFJoin &dfJoin)
Definition: LFGHandler.cpp:30
void SendLfgRoleCheckUpdate(lfg::LfgRoleCheck const &pRoleCheck)
Definition: LFGHandler.cpp:296
void SendLfgDisabled()
Definition: LFGHandler.cpp:495
Player * _player
void HandleLfgLeaveOpcode(WorldPackets::LFG::DFLeave &dfLeave)
Definition: LFGHandler.cpp:56
uint8 GetExpansion() const
void SendLfgRoleChosen(ObjectGuid guid, uint8 roles)
Definition: LFGHandler.cpp:284
void SendLfgBootProposalUpdate(lfg::LfgPlayerBoot const &boot)
Definition: LFGHandler.cpp:414
void SendLfgPlayerLockInfo()
Definition: LFGHandler.cpp:140
void HandleDFGetJoinStatus(WorldPackets::LFG::DFGetJoinStatus &dfGetJoinStatus)
Definition: LFGHandler.cpp:116
void HandleLfgTeleportOpcode(WorldPackets::LFG::DFTeleport &dfTeleport)
Definition: LFGHandler.cpp:99
void SendLfgUpdateProposal(lfg::LfgProposal const &proposal)
Definition: LFGHandler.cpp:450
void SendLfgUpdateStatus(lfg::LfgUpdateData const &updateData, bool party)
Definition: LFGHandler.cpp:233
time_t GetGameTime()
Definition: GameTime.cpp:44
@ LFG_OPTION_ENABLE_DUNGEON_FINDER
Definition: LFGMgr.h:49
@ LFG_OPTION_ENABLE_RAID_BROWSER
Definition: LFGMgr.h:50
@ LFG_UPDATETYPE_ADDED_TO_QUEUE
Definition: LFG.h:58
@ LFG_UPDATETYPE_UPDATE_STATUS
Definition: LFG.h:61
@ LFG_UPDATETYPE_REMOVED_FROM_QUEUE
Definition: LFG.h:54
@ LFG_UPDATETYPE_PROPOSAL_BEGIN
Definition: LFG.h:60
@ LFG_UPDATETYPE_JOIN_QUEUE
Definition: LFG.h:52
@ LFG_UPDATETYPE_JOIN_QUEUE_INITIAL
Definition: LFG.h:64
@ LFG_GROUP_KICK_VOTES_NEEDED
Definition: LFGMgr.h:62
LfgAnswer
Answer state (Also used to check compatibilites)
Definition: LFG.h:116
@ LFG_ANSWER_AGREE
Definition: LFG.h:119
@ LFG_ANSWER_PENDING
Definition: LFG.h:117
std::string GetStateString(LfgState state)
Definition: LFG.cpp:75
LfgTeleportResult
Teleport errors.
Definition: LFGMgr.h:95
std::set< uint32 > LfgDungeonSet
Definition: LFG.h:132
@ LFG_STATE_ROLECHECK
Definition: LFG.h:76
@ LFG_STATE_NONE
Definition: LFG.h:75
@ LFG_STATE_QUEUED
Definition: LFG.h:77
@ LFG_QUEUE_DUNGEON
Definition: LFG.h:87
@ LFG_JOIN_NO_SLOTS
Definition: LFGMgr.h:118
@ LFG_JOIN_ROLE_CHECK_FAILED
Definition: LFGMgr.h:130
Optional< ObjectGuid > PlayerGuid
Definition: LFGPackets.h:138
std::vector< LFGBlackListSlot > Slot
Definition: LFGPackets.h:139
std::vector< LfgPlayerQuestRewardCurrency > Currency
Definition: LFGPackets.h:166
std::vector< LfgPlayerQuestRewardItem > Item
Definition: LFGPackets.h:165
std::vector< std::string const * > playersMissingRequirement
Definition: LFGMgr.h:183
LfgRoleCheckState state
Definition: LFGMgr.h:181
LfgJoinResult result
Definition: LFGMgr.h:180
LfgLockPartyMap lockmap
Definition: LFGMgr.h:182
Stores information of a current vote to kick someone from a group.
Definition: LFGMgr.h:285
std::string reason
Player guid to be kicked (can't vote)
Definition: LFGMgr.h:290
time_t cancelTime
Definition: LFGMgr.h:286
LfgAnswerContainer votes
Vote in progress.
Definition: LFGMgr.h:288
bool inProgress
Time left to vote.
Definition: LFGMgr.h:287
ObjectGuid victim
Player votes (-1 not answer | 0 Not agree | 1 agree)
Definition: LFGMgr.h:289
Quest const * quest
Definition: LFGMgr.h:229
Stores group data related to proposal to join.
Definition: LFGMgr.h:254
uint32 dungeonId
Proposal Id.
Definition: LFGMgr.h:260
uint32 encounters
Time when we will cancel this proposal.
Definition: LFGMgr.h:265
LfgProposalPlayerContainer players
Show order in update window.
Definition: LFGMgr.h:269
bool isNew
Dungeon Encounters.
Definition: LFGMgr.h:266
LfgProposalState state
Dungeon to join.
Definition: LFGMgr.h:261
ObjectGuid group
State of the proposal.
Definition: LFGMgr.h:262
Reward info.
Definition: LFGMgr.h:234
Stores all rolecheck info of a group that wants to join.
Definition: LFGMgr.h:274
LfgDungeonSet dungeons
State of the rolecheck.
Definition: LFGMgr.h:278
LfgRolesMap roles
Time when the rolecheck will fail.
Definition: LFGMgr.h:276
LfgRoleCheckState state
Player selected roles.
Definition: LFGMgr.h:277
ObjectGuid leader
Random Dungeon Id.
Definition: LFGMgr.h:280
uint32 rDungeonId
Dungeons group is applying for (expanded random dungeons)
Definition: LFGMgr.h:279
LfgDungeonSet dungeons
Definition: LFGMgr.h:197
LfgUpdateType updateType
Definition: LFGMgr.h:195
LfgState state
Definition: LFGMgr.h:196