TrinityCore
Loading...
Searching...
No Matches
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 std::span<uint32 const> contentTuningReplacementConditionMask = GetPlayer()->m_playerData->CtrOptions->ConditionalFlags;
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 const& itr : group->GetMembers())
213 {
214 Player* plrg = itr.GetSource();
215 ObjectGuid pguid = plrg->GetGUID();
216 if (pguid == guid)
217 continue;
218
219 lfgPartyInfo.Player.emplace_back();
220 WorldPackets::LFG::LFGBlackList& lfgBlackList = lfgPartyInfo.Player.back();
221 lfgBlackList.PlayerGuid = pguid;
222 for (auto const& lock : sLFGMgr->GetLockedDungeons(pguid))
223 lfgBlackList.Slot.emplace_back(lock.first, lock.second.lockStatus, lock.second.requiredItemLevel, lock.second.currentItemLevel, 0);
224 }
225
226 TC_LOG_DEBUG("lfg", "SMSG_LFG_PARTY_INFO {}", GetPlayerInfo());
227 SendPacket(lfgPartyInfo.Write());;
228}
229
230void WorldSession::SendLfgUpdateStatus(lfg::LfgUpdateData const& updateData, bool party)
231{
232 bool join = false;
233 bool queued = false;
234
235 switch (updateData.updateType)
236 {
237 case lfg::LFG_UPDATETYPE_JOIN_QUEUE_INITIAL: // Joined queue outside the dungeon
238 join = true;
239 break;
241 case lfg::LFG_UPDATETYPE_ADDED_TO_QUEUE: // Rolecheck Success
242 join = true;
243 queued = true;
244 break;
246 join = true;
247 break;
249 join = updateData.state != lfg::LFG_STATE_ROLECHECK && updateData.state != lfg::LFG_STATE_NONE;
250 queued = updateData.state == lfg::LFG_STATE_QUEUED;
251 break;
252 default:
253 break;
254 }
255
256 TC_LOG_DEBUG("lfg", "SMSG_LFG_UPDATE_STATUS {} updatetype: {}, party {}",
257 GetPlayerInfo(), updateData.updateType, party ? "true" : "false");
258
260 if (WorldPackets::LFG::RideTicket const* ticket = sLFGMgr->GetTicket(_player->GetGUID()))
261 lfgUpdateStatus.Ticket = *ticket;
262
263 lfgUpdateStatus.SubType = lfg::LFG_QUEUE_DUNGEON; // other types not implemented
264 lfgUpdateStatus.Reason = updateData.updateType;
265 std::transform(updateData.dungeons.begin(), updateData.dungeons.end(), std::back_inserter(lfgUpdateStatus.Slots), [](uint32 dungeonId)
266 {
267 return sLFGMgr->GetLFGDungeonEntry(dungeonId);
268 });
269 lfgUpdateStatus.RequestedRoles = sLFGMgr->GetRoles(_player->GetGUID());
270 //lfgUpdateStatus.SuspendedPlayers;
271 lfgUpdateStatus.IsParty = party;
272 lfgUpdateStatus.NotifyUI = true;
273 lfgUpdateStatus.Joined = join;
274 lfgUpdateStatus.LfgJoined = updateData.updateType != lfg::LFG_UPDATETYPE_REMOVED_FROM_QUEUE;
275 lfgUpdateStatus.Queued = queued;
276 lfgUpdateStatus.QueueMapID = sLFGMgr->GetDungeonMapId(_player->GetGUID());
277
278 SendPacket(lfgUpdateStatus.Write());
279}
280
282{
283 TC_LOG_DEBUG("lfg", "SMSG_LFG_ROLE_CHOSEN {} guid: {} roles: {}",
284 GetPlayerInfo(), guid.ToString(), roles);
285
287 roleChosen.Player = guid;
288 roleChosen.RoleMask = roles;
289 roleChosen.Accepted = roles > 0;
290 SendPacket(roleChosen.Write());
291}
292
294{
295 lfg::LfgDungeonSet dungeons;
296 if (roleCheck.rDungeonId)
297 dungeons.insert(roleCheck.rDungeonId);
298 else
299 dungeons = roleCheck.dungeons;
300
301 TC_LOG_DEBUG("lfg", "SMSG_LFG_ROLE_CHECK_UPDATE {}", GetPlayerInfo());
302 WorldPackets::LFG::LFGRoleCheckUpdate lfgRoleCheckUpdate;
303 lfgRoleCheckUpdate.PartyIndex = 127;
304 lfgRoleCheckUpdate.RoleCheckStatus = roleCheck.state;
305 std::transform(dungeons.begin(), dungeons.end(), std::back_inserter(lfgRoleCheckUpdate.JoinSlots), [](uint32 dungeonId)
306 {
307 return sLFGMgr->GetLFGDungeonEntry(dungeonId);
308 });
309 lfgRoleCheckUpdate.GroupFinderActivityID = 0;
310 if (!roleCheck.roles.empty())
311 {
312 // Leader info MUST be sent 1st :S
313 uint8 roles = roleCheck.roles.find(roleCheck.leader)->second;
314 lfgRoleCheckUpdate.Members.emplace_back(roleCheck.leader, roles, ASSERT_NOTNULL(sCharacterCache->GetCharacterCacheByGuid(roleCheck.leader))->Level, roles > 0);
315
316 for (lfg::LfgRolesMap::const_iterator it = roleCheck.roles.begin(); it != roleCheck.roles.end(); ++it)
317 {
318 if (it->first == roleCheck.leader)
319 continue;
320
321 roles = it->second;
322 lfgRoleCheckUpdate.Members.emplace_back(it->first, roles, ASSERT_NOTNULL(sCharacterCache->GetCharacterCacheByGuid(it->first))->Level, roles > 0);
323 }
324 }
325
326 SendPacket(lfgRoleCheckUpdate.Write());
327}
328
330{
331 TC_LOG_DEBUG("lfg", "SMSG_LFG_JOIN_RESULT {} checkResult: {} checkValue: {}",
332 GetPlayerInfo(), joinData.result, joinData.state);
333
335 if (WorldPackets::LFG::RideTicket const* ticket = sLFGMgr->GetTicket(GetPlayer()->GetGUID()))
336 lfgJoinResult.Ticket = *ticket;
337 lfgJoinResult.Result = joinData.result;
339 lfgJoinResult.ResultDetail = joinData.state;
340 else if (joinData.result == lfg::LFG_JOIN_NO_SLOTS)
341 lfgJoinResult.BlackListNames = joinData.playersMissingRequirement;
342
343 for (lfg::LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it)
344 {
345 lfgJoinResult.BlackList.emplace_back();
346 WorldPackets::LFG::LFGBlackList& blackList = lfgJoinResult.BlackList.back();
347 blackList.PlayerGuid = it->first;
348
349 for (lfg::LfgLockMap::const_iterator itr = it->second.begin(); itr != it->second.end(); ++itr)
350 {
351 TC_LOG_TRACE("lfg", "SendLfgJoinResult:: {} DungeonID: {} Lock status: {} Required itemLevel: {} Current itemLevel: {}",
352 it->first.ToString(), (itr->first & 0x00FFFFFF), itr->second.lockStatus, itr->second.requiredItemLevel, itr->second.currentItemLevel);
353
354 blackList.Slot.emplace_back(itr->first, itr->second.lockStatus, itr->second.requiredItemLevel, itr->second.currentItemLevel, 0);
355 }
356 }
357
358 SendPacket(lfgJoinResult.Write());
359}
360
362{
363 TC_LOG_DEBUG("lfg", "SMSG_LFG_QUEUE_STATUS {} state: {}, dungeon: {}, waitTime: {}, "
364 "avgWaitTime: {}, waitTimeTanks: {}, waitTimeHealer: {}, waitTimeDps: {}, "
365 "queuedTime: {}, tanks: {}, healers: {}, dps: {}",
366 GetPlayerInfo(), lfg::GetStateString(sLFGMgr->GetState(GetPlayer()->GetGUID())), queueData.dungeonId, queueData.waitTime, queueData.waitTimeAvg,
367 queueData.waitTimeTank, queueData.waitTimeHealer, queueData.waitTimeDps,
368 queueData.queuedTime, queueData.tanks, queueData.healers, queueData.dps);
369
371 if (WorldPackets::LFG::RideTicket const* ticket = sLFGMgr->GetTicket(GetPlayer()->GetGUID()))
372 lfgQueueStatus.Ticket = *ticket;
373 lfgQueueStatus.Slot = sLFGMgr->GetLFGDungeonEntry(queueData.dungeonId);
374 lfgQueueStatus.AvgWaitTimeMe = queueData.waitTime;
375 lfgQueueStatus.AvgWaitTime = queueData.waitTimeAvg;
376 lfgQueueStatus.AvgWaitTimeByRole[0] = queueData.waitTimeTank;
377 lfgQueueStatus.AvgWaitTimeByRole[1] = queueData.waitTimeHealer;
378 lfgQueueStatus.AvgWaitTimeByRole[2] = queueData.waitTimeDps;
379 lfgQueueStatus.LastNeeded[0] = queueData.tanks;
380 lfgQueueStatus.LastNeeded[1] = queueData.healers;
381 lfgQueueStatus.LastNeeded[2] = queueData.dps;
382 lfgQueueStatus.QueuedTime = queueData.queuedTime;
383 SendPacket(lfgQueueStatus.Write());
384}
385
387{
388 if (!rewardData.rdungeonEntry || !rewardData.sdungeonEntry || !rewardData.quest)
389 return;
390
391 TC_LOG_DEBUG("lfg", "SMSG_LFG_PLAYER_REWARD {} rdungeonEntry: {}, sdungeonEntry: {}, done: {}",
392 GetPlayerInfo(), rewardData.rdungeonEntry, rewardData.sdungeonEntry, rewardData.done);
393
395 lfgPlayerReward.QueuedSlot = rewardData.rdungeonEntry;
396 lfgPlayerReward.ActualSlot = rewardData.sdungeonEntry;
397 lfgPlayerReward.RewardMoney = GetPlayer()->GetQuestMoneyReward(rewardData.quest);
398 lfgPlayerReward.AddedXP = GetPlayer()->GetQuestXPReward(rewardData.quest);
399
400 for (uint8 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i)
401 if (uint32 itemId = rewardData.quest->RewardItemId[i])
402 lfgPlayerReward.Rewards.emplace_back(itemId, rewardData.quest->RewardItemCount[i], 0, false);
403
404 for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
405 if (uint32 curencyId = rewardData.quest->RewardCurrencyId[i])
406 lfgPlayerReward.Rewards.emplace_back(curencyId, rewardData.quest->RewardCurrencyCount[i], 0, true);
407
408 SendPacket(lfgPlayerReward.Write());
409}
410
412{
413 lfg::LfgAnswer playerVote = boot.votes.find(GetPlayer()->GetGUID())->second;
414 uint8 votesNum = 0;
415 uint8 agreeNum = 0;
416 int32 secsleft = int32((boot.cancelTime - GameTime::GetGameTime()) / 1000);
417 for (const auto& vote : boot.votes)
418 {
419 if (vote.second != lfg::LFG_ANSWER_PENDING)
420 {
421 ++votesNum;
422 if (vote.second == lfg::LFG_ANSWER_AGREE)
423 ++agreeNum;
424 }
425 }
426 TC_LOG_DEBUG("lfg", "SMSG_LFG_BOOT_PROPOSAL_UPDATE {} inProgress: {} - "
427 "didVote: {} - agree: {} - victim: {} votes: {} - agrees: {} - left: {} - "
428 "needed: {} - reason {}",
430 uint8(playerVote == lfg::LFG_ANSWER_AGREE), boot.victim.ToString(), votesNum, agreeNum,
432
434 lfgBootPlayer.Info.VoteInProgress = boot.inProgress;
435 lfgBootPlayer.Info.VotePassed = agreeNum >= lfg::LFG_GROUP_KICK_VOTES_NEEDED;
436 lfgBootPlayer.Info.MyVoteCompleted = playerVote != lfg::LFG_ANSWER_PENDING;
437 lfgBootPlayer.Info.MyVote = playerVote == lfg::LFG_ANSWER_AGREE;
438 lfgBootPlayer.Info.Target = boot.victim;
439 lfgBootPlayer.Info.TotalVotes = votesNum;
440 lfgBootPlayer.Info.BootVotes = agreeNum;
441 lfgBootPlayer.Info.TimeLeft = secsleft;
443 lfgBootPlayer.Info.Reason = boot.reason;
444 SendPacket(lfgBootPlayer.Write());
445}
446
448{
449 ObjectGuid guid = GetPlayer()->GetGUID();
450 ObjectGuid gguid = proposal.players.find(guid)->second.group;
451 bool silent = !proposal.isNew && gguid == proposal.group;
452 uint32 dungeonEntry = proposal.dungeonId;
453
454 TC_LOG_DEBUG("lfg", "SMSG_LFG_PROPOSAL_UPDATE {} state: {}",
455 GetPlayerInfo(), proposal.state);
456
457 // show random dungeon if player selected random dungeon and it's not lfg group
458 if (!silent)
459 {
460 lfg::LfgDungeonSet const& playerDungeons = sLFGMgr->GetSelectedDungeons(guid);
461 if (playerDungeons.find(proposal.dungeonId) == playerDungeons.end())
462 dungeonEntry = (*playerDungeons.begin());
463 }
464
465 WorldPackets::LFG::LFGProposalUpdate lfgProposalUpdate;
466 if (WorldPackets::LFG::RideTicket const* ticket = sLFGMgr->GetTicket(GetPlayer()->GetGUID()))
467 lfgProposalUpdate.Ticket = *ticket;
468 lfgProposalUpdate.InstanceID = 0;
469 lfgProposalUpdate.ProposalID = proposal.id;
470 lfgProposalUpdate.Slot = sLFGMgr->GetLFGDungeonEntry(dungeonEntry);
471 lfgProposalUpdate.State = proposal.state;
472 lfgProposalUpdate.CompletedMask = proposal.encounters;
473 lfgProposalUpdate.ValidCompletedMask = true;
474 lfgProposalUpdate.ProposalSilent = silent;
475 lfgProposalUpdate.FailedByMyParty = !proposal.isNew;
476
477 for (auto const& player : proposal.players)
478 {
479 lfgProposalUpdate.Players.emplace_back();
480 auto& proposalPlayer = lfgProposalUpdate.Players.back();
481 proposalPlayer.Roles = player.second.role;
482 proposalPlayer.Me = player.first == guid;
483 proposalPlayer.MyParty = !player.second.group.IsEmpty() && player.second.group == proposal.group;
484 proposalPlayer.SameParty = !player.second.group.IsEmpty() && player.second.group == gguid;
485 proposalPlayer.Responded = player.second.accept != lfg::LFG_ANSWER_PENDING;
486 proposalPlayer.Accepted = player.second.accept == lfg::LFG_ANSWER_AGREE;
487 }
488
489 SendPacket(lfgProposalUpdate.Write());
490}
491
493{
494 TC_LOG_DEBUG("lfg", "SMSG_LFG_DISABLED {}", GetPlayerInfo());
496}
497
499{
500 TC_LOG_DEBUG("lfg", "SMSG_LFG_OFFER_CONTINUE {} dungeon entry: {}",
501 GetPlayerInfo(), dungeonEntry);
502 SendPacket(WorldPackets::LFG::LFGOfferContinue(sLFGMgr->GetLFGDungeonEntry(dungeonEntry)).Write());
503}
504
506{
507 TC_LOG_DEBUG("lfg", "SMSG_LFG_TELEPORT_DENIED {} reason: {}",
508 GetPlayerInfo(), err);
510}
#define sCharacterCache
DB2Storage< LFGDungeonsEntry > sLFGDungeonsStore("LFGDungeons.db2", &LfgDungeonsLoadInfo::Instance)
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
#define ASSERT_NOTNULL(pointer)
Definition Errors.h:82
#define MAX_GROUP_SIZE
Definition Group.h:50
#define sLFGMgr
Definition LFGMgr.h:515
#define TC_LOG_DEBUG(filterType__, message__,...)
Definition Log.h:181
#define TC_LOG_TRACE(filterType__, message__,...)
Definition Log.h:178
#define sObjectMgr
Definition ObjectMgr.h:1885
#define QUEST_REWARD_ITEM_COUNT
Definition QuestDef.h:50
#define QUEST_REWARD_CURRENCY_COUNT
Definition QuestDef.h:54
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
Definition Group.h:205
ObjectGuid GetGUID() const
Definition Group.cpp:1653
GroupRefManager & GetMembers()
Definition Group.h:332
ObjectGuid GetLeaderGUID() const
Definition Group.cpp:1648
bool IsEmpty() const
Definition ObjectGuid.h:362
std::string ToString() const
UF::UpdateField< UF::PlayerData, int32(WowCS::EntityFragment::CGObject), TYPEID_PLAYER > m_playerData
Definition Player.h:3061
uint32 GetQuestXPReward(Quest const *quest)
Definition Player.cpp:14981
bool CanRewardQuest(Quest const *quest, bool msg) const
Definition Player.cpp:14619
uint32 GetQuestMoneyReward(Quest const *quest) const
Definition Player.cpp:14976
Group * GetGroup(Optional< uint8 > partyIndex)
Definition Player.h:2796
std::array< uint32, QUEST_REWARD_CURRENCY_COUNT > RewardCurrencyId
Definition QuestDef.h:755
std::array< uint32, QUEST_REWARD_ITEM_COUNT > RewardItemId
Definition QuestDef.h:743
std::array< uint32, QUEST_REWARD_ITEM_COUNT > RewardItemCount
Definition QuestDef.h:744
std::array< uint32, QUEST_REWARD_CURRENCY_COUNT > RewardCurrencyCount
Definition QuestDef.h:756
uint8 GetLevel() const
Definition Unit.h:757
Array< uint32, 50 > Slots
Definition LFGPackets.h:47
std::vector< std::string_view > BlackListNames
Definition LFGPackets.h:292
WorldPacket const * Write() override
std::vector< LFGBlackList > BlackList
Definition LFGPackets.h:291
WorldPacket const * Write() override
std::vector< LFGPlayerRewards > Rewards
Definition LFGPackets.h:345
WorldPacket const * Write() override
std::vector< LFGProposalUpdatePlayer > Players
Definition LFGPackets.h:400
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< LFGRoleCheckUpdateMember > Members
Definition LFGPackets.h:276
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< LFGBlackList > Player
Definition LFGPackets.h:215
std::vector< LfgPlayerDungeonInfo > Dungeon
Definition LFGPackets.h:205
WorldPacket const * Write() override
WorldPacket const * Write() override
void SendLfgPartyLockInfo()
void HandleDFGetSystemInfo(WorldPackets::LFG::DFGetSystemInfo &dfGetSystemInfo)
void HandleLfgProposalResultOpcode(WorldPackets::LFG::DFProposalResponse &dfProposalResponse)
void SendLfgJoinResult(lfg::LfgJoinResultData const &joinData)
void HandleLfgSetBootVoteOpcode(WorldPackets::LFG::DFBootPlayerVote &dfBootPlayerVote)
void SendLfgQueueStatus(lfg::LfgQueueStatusData const &queueData)
void SendLfgTeleportError(lfg::LfgTeleportResult err)
void HandleLfgSetRolesOpcode(WorldPackets::LFG::DFSetRoles &dfSetRoles)
std::string GetPlayerInfo() const
void SendLfgPlayerReward(lfg::LfgPlayerRewardData const &lfgPlayerRewardData)
Player * GetPlayer() const
void SendLfgOfferContinue(uint32 dungeonEntry)
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
void HandleLfgJoinOpcode(WorldPackets::LFG::DFJoin &dfJoin)
void SendLfgRoleCheckUpdate(lfg::LfgRoleCheck const &pRoleCheck)
void SendLfgDisabled()
Player * _player
void HandleLfgLeaveOpcode(WorldPackets::LFG::DFLeave &dfLeave)
uint8 GetExpansion() const
void SendLfgRoleChosen(ObjectGuid guid, uint8 roles)
void SendLfgBootProposalUpdate(lfg::LfgPlayerBoot const &boot)
void SendLfgPlayerLockInfo()
void HandleDFGetJoinStatus(WorldPackets::LFG::DFGetJoinStatus &dfGetJoinStatus)
void HandleLfgTeleportOpcode(WorldPackets::LFG::DFTeleport &dfTeleport)
void SendLfgUpdateProposal(lfg::LfgProposal const &proposal)
void SendLfgUpdateStatus(lfg::LfgUpdateData const &updateData, bool party)
time_t GetGameTime()
Definition GameTime.cpp:52
@ LFG_OPTION_ENABLE_DUNGEON_FINDER
Definition LFGMgr.h:50
@ LFG_OPTION_ENABLE_RAID_BROWSER
Definition LFGMgr.h:51
@ 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:63
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:96
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:119
@ LFG_JOIN_ROLE_CHECK_FAILED
Definition LFGMgr.h:131
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_view > playersMissingRequirement
Definition LFGMgr.h:186
LfgRoleCheckState state
Definition LFGMgr.h:184
LfgJoinResult result
Definition LFGMgr.h:183
LfgLockPartyMap lockmap
Definition LFGMgr.h:185
Stores information of a current vote to kick someone from a group.
Definition LFGMgr.h:288
std::string reason
Player guid to be kicked (can't vote)
Definition LFGMgr.h:293
time_t cancelTime
Definition LFGMgr.h:289
LfgAnswerContainer votes
Vote in progress.
Definition LFGMgr.h:291
bool inProgress
Time left to vote.
Definition LFGMgr.h:290
ObjectGuid victim
Player votes (-1 not answer | 0 Not agree | 1 agree)
Definition LFGMgr.h:292
Quest const * quest
Definition LFGMgr.h:232
Stores group data related to proposal to join.
Definition LFGMgr.h:257
uint32 dungeonId
Proposal Id.
Definition LFGMgr.h:263
uint32 encounters
Time when we will cancel this proposal.
Definition LFGMgr.h:268
LfgProposalPlayerContainer players
Show order in update window.
Definition LFGMgr.h:272
bool isNew
Dungeon Encounters.
Definition LFGMgr.h:269
LfgProposalState state
Dungeon to join.
Definition LFGMgr.h:264
ObjectGuid group
State of the proposal.
Definition LFGMgr.h:265
Reward info.
Definition LFGMgr.h:237
Stores all rolecheck info of a group that wants to join.
Definition LFGMgr.h:277
LfgDungeonSet dungeons
State of the rolecheck.
Definition LFGMgr.h:281
LfgRolesMap roles
Time when the rolecheck will fail.
Definition LFGMgr.h:279
LfgRoleCheckState state
Player selected roles.
Definition LFGMgr.h:280
ObjectGuid leader
Random Dungeon Id.
Definition LFGMgr.h:283
uint32 rDungeonId
Dungeons group is applying for (expanded random dungeons)
Definition LFGMgr.h:282
LfgDungeonSet dungeons
Definition LFGMgr.h:200
LfgUpdateType updateType
Definition LFGMgr.h:198
LfgState state
Definition LFGMgr.h:199