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 "DBCStores.h"
19#include "LFGMgr.h"
20#include "LFGPackets.h"
21#include "Log.h"
22#include "GameTime.h"
23#include "Group.h"
24#include "ObjectAccessor.h"
25#include "ObjectMgr.h"
26#include "Opcodes.h"
27#include "Player.h"
28#include "WorldPacket.h"
29#include "WorldSession.h"
30
32{
33 data << uint32(lock.size()); // Size of lock dungeons
34 for (lfg::LfgLockMap::const_iterator it = lock.begin(); it != lock.end(); ++it)
35 {
36 data << uint32(it->first); // Dungeon entry (id + type)
37 data << uint32(it->second); // Lock status
38 }
39}
40
42{
43 data << uint8(lockMap.size());
44 for (lfg::LfgLockPartyMap::const_iterator it = lockMap.begin(); it != lockMap.end(); ++it)
45 {
46 data << it->first; // Player guid
47 BuildPlayerLockDungeonBlock(data, it->second);
48 }
49}
50
52{
54 (GetPlayer()->GetGroup() && GetPlayer()->GetGroup()->GetLeaderGUID() != GetPlayer()->GetGUID() &&
55 (GetPlayer()->GetGroup()->GetMembersCount() == MAX_GROUP_SIZE || !GetPlayer()->GetGroup()->isLFGGroup())))
56 return;
57
58 if (packet.Slots.empty())
59 {
60 TC_LOG_DEBUG("lfg", "CMSG_LFG_JOIN {} no dungeons selected", GetPlayerInfo());
61 return;
62 }
63
64 lfg::LfgDungeonSet newDungeons;
65 for (uint32 slot : packet.Slots)
66 {
67 uint32 dungeon = slot & 0x00FFFFFF; // remove the type from the dungeon entry
68 if (sLFGDungeonStore.LookupEntry(dungeon))
69 newDungeons.insert(dungeon);
70 }
71
72 TC_LOG_DEBUG("lfg", "CMSG_LFG_JOIN {} roles: {}, Dungeons: {}, Comment: {}",
73 GetPlayerInfo(), packet.Roles, newDungeons.size(), packet.Comment);
74
75 sLFGMgr->JoinLfg(GetPlayer(), uint8(packet.Roles), newDungeons, packet.Comment);
76}
77
79{
80 Group* group = GetPlayer()->GetGroup();
81 ObjectGuid guid = GetPlayer()->GetGUID();
82 ObjectGuid gguid = group ? group->GetGUID() : guid;
83
84 TC_LOG_DEBUG("lfg", "CMSG_LFG_LEAVE {} in group: {}",
85 GetPlayerInfo(), group ? 1 : 0);
86
87 // Check cheating - only leader can leave the queue
88 if (!group || group->GetLeaderGUID() == GetPlayer()->GetGUID())
89 sLFGMgr->LeaveLfg(gguid);
90}
91
93{
94 uint32 proposalID; // Proposal ID
95 bool accept;
96 recvData >> proposalID;
97 recvData >> accept;
98
99 TC_LOG_DEBUG("lfg", "CMSG_LFG_PROPOSAL_RESULT {} proposal: {} accept: {}",
100 GetPlayerInfo(), proposalID, accept ? 1 : 0);
101 sLFGMgr->UpdateProposal(proposalID, GetPlayer()->GetGUID(), accept);
102}
103
105{
106 uint8 roles;
107 recvData >> roles; // Player Group Roles
108 ObjectGuid guid = GetPlayer()->GetGUID();
109 Group* group = GetPlayer()->GetGroup();
110 if (!group)
111 {
112 TC_LOG_DEBUG("lfg", "CMSG_LFG_SET_ROLES {} Not in group",
113 GetPlayerInfo());
114 return;
115 }
116 ObjectGuid gguid = group->GetGUID();
117 TC_LOG_DEBUG("lfg", "CMSG_LFG_SET_ROLES: Group {}, Player {}, Roles: {}",
118 gguid.ToString(), GetPlayerInfo(), roles);
119 sLFGMgr->UpdateRoleCheck(gguid, guid, roles);
120}
121
123{
124 std::string comment;
125 recvData >> comment;
126
127 TC_LOG_DEBUG("lfg", "CMSG_LFG_SET_COMMENT {} comment: {}",
128 GetPlayerInfo(), comment);
129
130 sLFGMgr->SetComment(GetPlayer()->GetGUID(), comment);
131}
132
134{
135 bool agree; // Agree to kick player
136 recvData >> agree;
137
138 ObjectGuid guid = GetPlayer()->GetGUID();
139 TC_LOG_DEBUG("lfg", "CMSG_LFG_SET_BOOT_VOTE {} agree: {}",
140 GetPlayerInfo(), agree ? 1 : 0);
141 sLFGMgr->UpdateBoot(guid, agree);
142}
143
145{
146 bool out;
147 recvData >> out;
148
149 TC_LOG_DEBUG("lfg", "CMSG_LFG_TELEPORT {} out: {}",
150 GetPlayerInfo(), out ? 1 : 0);
151 sLFGMgr->TeleportPlayer(GetPlayer(), out, true);
152}
153
155{
156 TC_LOG_DEBUG("lfg", "CMSG_LFG_PLAYER_LOCK_INFO_REQUEST {}",
157 GetPlayerInfo());
158
160}
161
163{
164 ObjectGuid guid = GetPlayer()->GetGUID();
165
166 // Get Random dungeons that can be done at a certain level and expansion
167 uint8 level = GetPlayer()->GetLevel();
168 lfg::LfgDungeonSet const& randomDungeons =
169 sLFGMgr->GetRandomAndSeasonalDungeons(level, GetPlayer()->GetSession()->Expansion());
170
171 // Get player locked Dungeons
172 lfg::LfgLockMap const& lock = sLFGMgr->GetLockedDungeons(guid);
173 uint32 rsize = uint32(randomDungeons.size());
174 uint32 lsize = uint32(lock.size());
175
176 TC_LOG_DEBUG("lfg", "SMSG_LFG_PLAYER_INFO {}", GetPlayerInfo());
177 WorldPacket data(SMSG_LFG_PLAYER_INFO, 1 + rsize * (4 + 1 + 4 + 4 + 4 + 4 + 1 + 4 + 4 + 4) + 4 + lsize * (1 + 4 + 4 + 4 + 4 + 1 + 4 + 4 + 4));
178
179 data << uint8(randomDungeons.size()); // Random Dungeon count
180 for (lfg::LfgDungeonSet::const_iterator it = randomDungeons.begin(); it != randomDungeons.end(); ++it)
181 {
182 data << uint32(*it); // Dungeon Entry (id + type)
183 lfg::LfgReward const* reward = sLFGMgr->GetRandomDungeonReward(*it, level);
184 Quest const* quest = nullptr;
185 bool done = false;
186 if (reward)
187 {
188 quest = sObjectMgr->GetQuestTemplate(reward->firstQuest);
189 if (quest)
190 {
191 done = !GetPlayer()->CanRewardQuest(quest, false);
192 if (done)
193 quest = sObjectMgr->GetQuestTemplate(reward->otherQuest);
194 }
195 }
196
197 if (quest)
198 {
199 data << uint8(done);
200 data << uint32(quest->GetRewOrReqMoney(GetPlayer()));
201 data << uint32(quest->GetXPReward(GetPlayer()));
202 data << uint32(0);
203 data << uint32(0);
204 data << uint8(quest->GetRewItemsCount());
205 if (quest->GetRewItemsCount())
206 {
207 for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i)
208 if (uint32 itemId = quest->RewardItemId[i])
209 {
210 ItemTemplate const* item = sObjectMgr->GetItemTemplate(itemId);
211 data << uint32(itemId);
212 data << uint32(item ? item->DisplayInfoID : 0);
213 data << uint32(quest->RewardItemIdCount[i]);
214 }
215 }
216 }
217 else
218 {
219 data << uint8(0);
220 data << uint32(0);
221 data << uint32(0);
222 data << uint32(0);
223 data << uint32(0);
224 data << uint8(0);
225 }
226 }
227 BuildPlayerLockDungeonBlock(data, lock);
228 SendPacket(&data);
229}
230
232{
233 TC_LOG_DEBUG("lfg", "CMSG_LFG_PARTY_LOCK_INFO_REQUEST {}", GetPlayerInfo());
234
236}
237
239{
240 ObjectGuid guid = GetPlayer()->GetGUID();
241
242 Group* group = GetPlayer()->GetGroup();
243 if (!group)
244 return;
245
246 // Get the locked dungeons of the other party members
247 lfg::LfgLockPartyMap lockMap;
248 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
249 {
250 Player* plrg = itr->GetSource();
251 if (!plrg)
252 continue;
253
254 ObjectGuid pguid = plrg->GetGUID();
255 if (pguid == guid)
256 continue;
257
258 lockMap[pguid] = sLFGMgr->GetLockedDungeons(pguid);
259 }
260
261 uint32 size = 0;
262 for (lfg::LfgLockPartyMap::const_iterator it = lockMap.begin(); it != lockMap.end(); ++it)
263 size += 8 + 4 + uint32(it->second.size()) * (4 + 4);
264
265 TC_LOG_DEBUG("lfg", "SMSG_LFG_PARTY_INFO {}", GetPlayerInfo());
266 WorldPacket data(SMSG_LFG_PARTY_INFO, 1 + size);
267 BuildPartyLockDungeonBlock(data, lockMap);
268 SendPacket(&data);
269}
270
272{
273 uint32 entry; // Raid id to search
274 recvData >> entry;
275 TC_LOG_DEBUG("lfg", "CMSG_LFG_LFR_JOIN {} dungeon entry: {}",
276 GetPlayerInfo(), entry);
277 //SendLfrUpdateListOpcode(entry);
278}
279
281{
282 uint32 dungeonId; // Raid id queue to leave
283 recvData >> dungeonId;
284 TC_LOG_DEBUG("lfg", "CMSG_LFG_LFR_LEAVE {} dungeonId: {}",
285 GetPlayerInfo(), dungeonId);
286 //sLFGMgr->LeaveLfr(GetPlayer(), dungeonId);
287}
288
290{
291 TC_LOG_DEBUG("lfg", "CMSG_LFG_GET_STATUS {}", GetPlayerInfo());
292
293 ObjectGuid guid = GetPlayer()->GetGUID();
294 lfg::LfgUpdateData updateData = sLFGMgr->GetLfgStatus(guid);
295
296 if (GetPlayer()->GetGroup())
297 {
298 SendLfgUpdateParty(updateData);
299 updateData.dungeons.clear();
300 SendLfgUpdatePlayer(updateData);
301 }
302 else
303 {
304 SendLfgUpdatePlayer(updateData);
305 updateData.dungeons.clear();
306 SendLfgUpdateParty(updateData);
307 }
308}
309
311{
312 bool queued = false;
313 uint8 size = uint8(updateData.dungeons.size());
314
315 switch (updateData.updateType)
316 {
319 queued = true;
320 break;
322 queued = updateData.state == lfg::LFG_STATE_QUEUED;
323 break;
324 default:
325 break;
326 }
327
328 TC_LOG_DEBUG("lfg", "SMSG_LFG_UPDATE_PLAYER {} updatetype: {}",
329 GetPlayerInfo(), updateData.updateType);
330 WorldPacket data(SMSG_LFG_UPDATE_PLAYER, 1 + 1 + (size > 0 ? 1 : 0) * (1 + 1 + 1 + 1 + size * 4 + updateData.comment.length()));
331 data << uint8(updateData.updateType); // Lfg Update type
332 data << uint8(size > 0); // Is joined in LFG
333 if (size)
334 {
335 data << uint8(queued); // Join the queue
336 data << uint8(0); // NoPartialClear
337 data << uint8(0); // Achievements
338
339 data << uint8(size);
340 for (lfg::LfgDungeonSet::const_iterator it = updateData.dungeons.begin(); it != updateData.dungeons.end(); ++it)
341 data << uint32(*it);
342 data << updateData.comment;
343 }
344 SendPacket(&data);
345}
346
348{
349 bool join = false;
350 bool queued = false;
351 uint8 size = uint8(updateData.dungeons.size());
352
353 switch (updateData.updateType)
354 {
355 case lfg::LFG_UPDATETYPE_ADDED_TO_QUEUE: // Rolecheck Success
356 queued = true;
357 [[fallthrough]];
359 join = true;
360 break;
362 join = updateData.state != lfg::LFG_STATE_ROLECHECK && updateData.state != lfg::LFG_STATE_NONE;
363 queued = updateData.state == lfg::LFG_STATE_QUEUED;
364 break;
365 default:
366 break;
367 }
368
369 TC_LOG_DEBUG("lfg", "SMSG_LFG_UPDATE_PARTY {} updatetype: {}",
370 GetPlayerInfo(), updateData.updateType);
371 WorldPacket data(SMSG_LFG_UPDATE_PARTY, 1 + 1 + (size > 0 ? 1 : 0) * (1 + 1 + 1 + 1 + 1 + size * 4 + updateData.comment.length()));
372 data << uint8(updateData.updateType); // Lfg Update type
373 data << uint8(size > 0); // Is joined in LFG
374 if (size)
375 {
376 data << uint8(join); // LFG Join
377 data << uint8(queued); // Join the queue
378 data << uint8(0); // NoPartialClear
379 data << uint8(0); // Achievements
380 for (uint8 i = 0; i < 3; ++i)
381 data << uint8(0); // Needs
382
383 data << uint8(size);
384 for (lfg::LfgDungeonSet::const_iterator it = updateData.dungeons.begin(); it != updateData.dungeons.end(); ++it)
385 data << uint32(*it);
386 data << updateData.comment;
387 }
388 SendPacket(&data);
389}
390
392{
393 TC_LOG_DEBUG("lfg", "SMSG_LFG_ROLE_CHOSEN {} guid: {} roles: {}",
394 GetPlayerInfo(), guid.ToString(), roles);
395
396 WorldPacket data(SMSG_LFG_ROLE_CHOSEN, 8 + 1 + 4);
397 data << guid; // Guid
398 data << uint8(roles > 0); // Ready
399 data << uint32(roles); // Roles
400 SendPacket(&data);
401}
402
404{
405 lfg::LfgDungeonSet dungeons;
406 if (roleCheck.rDungeonId)
407 dungeons.insert(roleCheck.rDungeonId);
408 else
409 dungeons = roleCheck.dungeons;
410
411 TC_LOG_DEBUG("lfg", "SMSG_LFG_ROLE_CHECK_UPDATE {}", GetPlayerInfo());
412 WorldPacket data(SMSG_LFG_ROLE_CHECK_UPDATE, 4 + 1 + 1 + dungeons.size() * 4 + 1 + roleCheck.roles.size() * (8 + 1 + 4 + 1));
413
414 data << uint32(roleCheck.state); // Check result
415 data << uint8(roleCheck.state == lfg::LFG_ROLECHECK_INITIALITING);
416 data << uint8(dungeons.size()); // Number of dungeons
417 if (!dungeons.empty())
418 for (lfg::LfgDungeonSet::iterator it = dungeons.begin(); it != dungeons.end(); ++it)
419 data << uint32(sLFGMgr->GetLFGDungeonEntry(*it)); // Dungeon
420
421 data << uint8(roleCheck.roles.size()); // Players in group
422 if (!roleCheck.roles.empty())
423 {
424 // Leader info MUST be sent 1st :S
425 ObjectGuid guid = roleCheck.leader;
426 uint8 roles = roleCheck.roles.find(guid)->second;
427 data << guid; // Guid
428 data << uint8(roles > 0); // Ready
429 data << uint32(roles); // Roles
431 data << uint8(player ? player->GetLevel() : 0); // Level
432
433 for (lfg::LfgRolesMap::const_iterator it = roleCheck.roles.begin(); it != roleCheck.roles.end(); ++it)
434 {
435 if (it->first == roleCheck.leader)
436 continue;
437
438 guid = it->first;
439 roles = it->second;
440 data << guid; // Guid
441 data << uint8(roles > 0); // Ready
442 data << uint32(roles); // Roles
444 data << uint8(player ? player->GetLevel() : 0);// Level
445 }
446 }
447 SendPacket(&data);
448}
449
451{
452 uint32 size = 0;
453 for (lfg::LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it)
454 size += 8 + 4 + uint32(it->second.size()) * (4 + 4);
455
456 TC_LOG_DEBUG("lfg", "SMSG_LFG_JOIN_RESULT {} checkResult: {} checkValue: {}",
457 GetPlayerInfo(), joinData.result, joinData.state);
458
459 WorldPacket data(SMSG_LFG_JOIN_RESULT, 4 + 4 + size);
460 data << uint32(joinData.result); // Check Result
461 data << uint32(joinData.state); // Check Value
462 if (!joinData.lockmap.empty())
463 BuildPartyLockDungeonBlock(data, joinData.lockmap);
464 SendPacket(&data);
465}
466
468{
469 TC_LOG_DEBUG("lfg", "SMSG_LFG_QUEUE_STATUS {} state: {}, dungeon: {}, waitTime: {}, "
470 "avgWaitTime: {}, waitTimeTanks: {}, waitTimeHealer: {}, waitTimeDps: {}, "
471 "queuedTime: {}, tanks: {}, healers: {}, dps: {}",
472 GetPlayerInfo(), lfg::GetStateString(sLFGMgr->GetState(GetPlayer()->GetGUID())), queueData.dungeonId, queueData.waitTime, queueData.waitTimeAvg,
473 queueData.waitTimeTank, queueData.waitTimeHealer, queueData.waitTimeDps,
474 queueData.queuedTime, queueData.tanks, queueData.healers, queueData.dps);
475
476 WorldPacket data(SMSG_LFG_QUEUE_STATUS, 4 + 4 + 4 + 4 + 4 +4 + 1 + 1 + 1 + 4);
477 data << uint32(queueData.dungeonId); // Dungeon
478 data << int32(queueData.waitTimeAvg); // Average Wait time
479 data << int32(queueData.waitTime); // Wait Time
480 data << int32(queueData.waitTimeTank); // Wait Tanks
481 data << int32(queueData.waitTimeHealer); // Wait Healers
482 data << int32(queueData.waitTimeDps); // Wait Dps
483 data << uint8(queueData.tanks); // Tanks needed
484 data << uint8(queueData.healers); // Healers needed
485 data << uint8(queueData.dps); // Dps needed
486 data << uint32(queueData.queuedTime); // Player wait time in queue
487 SendPacket(&data);
488}
489
491{
492 if (!rewardData.rdungeonEntry || !rewardData.sdungeonEntry || !rewardData.quest)
493 return;
494
495 TC_LOG_DEBUG("lfg", "SMSG_LFG_PLAYER_REWARD {} rdungeonEntry: {}, sdungeonEntry: {}, done: {}",
496 GetPlayerInfo(), rewardData.rdungeonEntry, rewardData.sdungeonEntry, rewardData.done);
497
498 uint8 itemNum = rewardData.quest->GetRewItemsCount();
499
500 WorldPacket data(SMSG_LFG_PLAYER_REWARD, 4 + 4 + 1 + 4 + 4 + 4 + 4 + 4 + 1 + itemNum * (4 + 4 + 4));
501 data << uint32(rewardData.rdungeonEntry); // Random Dungeon Finished
502 data << uint32(rewardData.sdungeonEntry); // Dungeon Finished
503 data << uint8(rewardData.done);
504 data << uint32(1);
505 data << uint32(rewardData.quest->GetRewOrReqMoney(GetPlayer()));
506 data << uint32(rewardData.quest->GetXPReward(GetPlayer()));
507 data << uint32(0);
508 data << uint32(0);
509 data << uint8(itemNum);
510 if (itemNum)
511 {
512 for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i)
513 if (uint32 itemId = rewardData.quest->RewardItemId[i])
514 {
515 ItemTemplate const* item = sObjectMgr->GetItemTemplate(itemId);
516 data << uint32(itemId);
517 data << uint32(item ? item->DisplayInfoID : 0);
518 data << uint32(rewardData.quest->RewardItemIdCount[i]);
519 }
520 }
521 SendPacket(&data);
522}
523
525{
526 ObjectGuid guid = GetPlayer()->GetGUID();
527 lfg::LfgAnswer playerVote = boot.votes.find(guid)->second;
528 uint8 votesNum = 0;
529 uint8 agreeNum = 0;
530 uint32 secsleft = uint8((boot.cancelTime - GameTime::GetGameTime()) / 1000);
531 for (lfg::LfgAnswerContainer::const_iterator it = boot.votes.begin(); it != boot.votes.end(); ++it)
532 {
533 if (it->second != lfg::LFG_ANSWER_PENDING)
534 {
535 ++votesNum;
536 if (it->second == lfg::LFG_ANSWER_AGREE)
537 ++agreeNum;
538 }
539 }
540 TC_LOG_DEBUG("lfg", "SMSG_LFG_BOOT_PROPOSAL_UPDATE {} inProgress: {} - "
541 "didVote: {} - agree: {} - victim: {} votes: {} - agrees: {} - left: {} - "
542 "needed: {} - reason {}",
544 uint8(playerVote == lfg::LFG_ANSWER_AGREE), boot.victim.ToString(), votesNum, agreeNum,
546 WorldPacket data(SMSG_LFG_BOOT_PROPOSAL_UPDATE, 1 + 1 + 1 + 8 + 4 + 4 + 4 + 4 + boot.reason.length());
547 data << uint8(boot.inProgress); // Vote in progress
548 data << uint8(playerVote != lfg::LFG_ANSWER_PENDING); // Did Vote
549 data << uint8(playerVote == lfg::LFG_ANSWER_AGREE); // Agree
550 data << boot.victim; // Victim GUID
551 data << uint32(votesNum); // Total Votes
552 data << uint32(agreeNum); // Agree Count
553 data << uint32(secsleft); // Time Left
554 data << uint32(lfg::LFG_GROUP_KICK_VOTES_NEEDED); // Needed Votes
555 data << boot.reason.c_str(); // Kick reason
556 SendPacket(&data);
557}
558
560{
561 ObjectGuid guid = GetPlayer()->GetGUID();
562 ObjectGuid gguid = proposal.players.find(guid)->second.group;
563 bool silent = !proposal.isNew && gguid == proposal.group;
564 uint32 dungeonEntry = proposal.dungeonId;
565
566 TC_LOG_DEBUG("lfg", "SMSG_LFG_PROPOSAL_UPDATE {} state: {}",
567 GetPlayerInfo(), proposal.state);
568
569 // show random dungeon if player selected random dungeon and it's not lfg group
570 if (!silent)
571 {
572 lfg::LfgDungeonSet const& playerDungeons = sLFGMgr->GetSelectedDungeons(guid);
573 if (playerDungeons.find(proposal.dungeonId) == playerDungeons.end())
574 dungeonEntry = (*playerDungeons.begin());
575 }
576
577 dungeonEntry = sLFGMgr->GetLFGDungeonEntry(dungeonEntry);
578
579 WorldPacket data(SMSG_LFG_PROPOSAL_UPDATE, 4 + 1 + 4 + 4 + 1 + 1 + proposal.players.size() * (4 + 1 + 1 + 1 + 1 +1));
580 data << uint32(dungeonEntry); // Dungeon
581 data << uint8(proposal.state); // Proposal state
582 data << uint32(proposal.id); // Proposal ID
583 data << uint32(proposal.encounters); // encounters done
584 data << uint8(silent); // Show proposal window
585 data << uint8(proposal.players.size()); // Group size
586
587 for (lfg::LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
588 {
589 lfg::LfgProposalPlayer const& player = it->second;
590
591 data << uint32(player.role); // Role
592 data << uint8(it->first == guid); // Self player
593 if (!player.group) // Player not it a group
594 {
595 data << uint8(0); // Not in dungeon
596 data << uint8(0); // Not same group
597 }
598 else
599 {
600 data << uint8(player.group == proposal.group); // In dungeon (silent)
601 data << uint8(player.group == gguid); // Same Group than player
602 }
603
604 data << uint8(player.accept != lfg::LFG_ANSWER_PENDING);// Answered
605 data << uint8(player.accept == lfg::LFG_ANSWER_AGREE); // Accepted
606 }
607 SendPacket(&data);
608}
609
611{
612 TC_LOG_DEBUG("lfg", "SMSG_LFG_LFR_LIST {} update: {}",
613 GetPlayerInfo(), update ? 1 : 0);
615 data << uint8(update); // In Lfg Queue?
616 SendPacket(&data);
617}
618
620{
621 TC_LOG_DEBUG("lfg", "SMSG_LFG_DISABLED {}", GetPlayerInfo());
623 SendPacket(&data);
624}
625
627{
628 TC_LOG_DEBUG("lfg", "SMSG_LFG_OFFER_CONTINUE {} dungeon entry: {}",
629 GetPlayerInfo(), dungeonEntry);
631 data << uint32(dungeonEntry);
632 SendPacket(&data);
633}
634
636{
637 TC_LOG_DEBUG("lfg", "SMSG_LFG_TELEPORT_DENIED {} reason: {}",
638 GetPlayerInfo(), err);
640 data << uint32(err); // Error
641 SendPacket(&data);
642}
643
644/*
645void WorldSession::SendLfrUpdateListOpcode(uint32 dungeonEntry)
646{
647 TC_LOG_DEBUG("network", "SMSG_LFG_UPDATE_LIST {} dungeon entry: {}",
648 GetPlayerInfo(), dungeonEntry);
649 WorldPacket data(SMSG_LFG_UPDATE_LIST);
650 SendPacket(&data);
651}
652*/
DBCStorage< LFGDungeonEntry > sLFGDungeonStore(LFGDungeonEntryfmt)
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
#define MAX_GROUP_SIZE
Definition Group.h:43
void BuildPartyLockDungeonBlock(WorldPacket &data, lfg::LfgLockPartyMap const &lockMap)
void BuildPlayerLockDungeonBlock(WorldPacket &data, lfg::LfgLockMap const &lock)
#define sLFGMgr
Definition LFGMgr.h:492
#define TC_LOG_DEBUG(filterType__,...)
Definition Log.h:156
#define sObjectMgr
Definition ObjectMgr.h:1721
#define QUEST_REWARDS_COUNT
Definition QuestDef.h:42
Definition Group.h:165
ObjectGuid GetGUID() const
Definition Group.cpp:2473
GroupReference * GetFirstMember()
Definition Group.h:247
ObjectGuid GetLeaderGUID() const
Definition Group.cpp:2468
std::string ToString() const
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
bool CanRewardQuest(Quest const *quest, bool msg)
Definition Player.cpp:14580
Group * GetGroup()
Definition Player.h:2171
uint32 GetXPReward(Player const *player) const
Definition QuestDef.cpp:202
uint32 RewardItemIdCount[QUEST_REWARDS_COUNT]
Definition QuestDef.h:313
int32 GetRewOrReqMoney(Player const *player=nullptr) const
Definition QuestDef.cpp:287
uint32 GetRewItemsCount() const
Definition QuestDef.h:325
uint32 RewardItemId[QUEST_REWARDS_COUNT]
Definition QuestDef.h:312
uint8 GetLevel() const
Definition Unit.h:889
Array< uint32, 50 > Slots
Definition LFGPackets.h:34
void SendLfgPartyLockInfo()
void HandleLfgPartyLockInfoRequestOpcode(WorldPacket &recvData)
void SendLfgJoinResult(lfg::LfgJoinResultData const &joinData)
uint8 Expansion() const
void HandleLfgSetCommentOpcode(WorldPacket &recvData)
void SendLfgQueueStatus(lfg::LfgQueueStatusData const &queueData)
void HandleLfgSetBootVoteOpcode(WorldPacket &recvData)
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
void SendLfgTeleportError(uint8 err)
void SendLfgUpdatePlayer(lfg::LfgUpdateData const &updateData)
void SendLfgLfrList(bool update)
void SendLfgUpdateParty(lfg::LfgUpdateData const &updateData)
std::string GetPlayerInfo() const
void SendLfgPlayerReward(lfg::LfgPlayerRewardData const &lfgPlayerRewardData)
Player * GetPlayer() const
void HandleLfgGetStatus(WorldPacket &recvData)
void HandleLfgTeleportOpcode(WorldPacket &recvData)
void SendLfgOfferContinue(uint32 dungeonEntry)
void HandleLfrLeaveOpcode(WorldPacket &recvData)
void SendLfgRoleCheckUpdate(lfg::LfgRoleCheck const &pRoleCheck)
void HandleLfgLeaveOpcode(WorldPackets::LFG::LFGLeave &lfgleave)
void SendLfgDisabled()
void HandleLfgPlayerLockInfoRequestOpcode(WorldPacket &recvData)
void HandleLfgSetRolesOpcode(WorldPacket &recvData)
void HandleLfgJoinOpcode(WorldPackets::LFG::LFGJoin &lfgJoin)
void HandleLfgProposalResultOpcode(WorldPacket &recvData)
void SendLfgRoleChosen(ObjectGuid guid, uint8 roles)
void SendLfgBootProposalUpdate(lfg::LfgPlayerBoot const &boot)
void HandleLfrJoinOpcode(WorldPacket &recvData)
void SendLfgPlayerLockInfo()
void SendLfgUpdateProposal(lfg::LfgProposal const &proposal)
@ SMSG_LFG_TELEPORT_DENIED
Definition Opcodes.h:541
@ SMSG_LFG_PARTY_INFO
Definition Opcodes.h:911
@ SMSG_LFG_ROLE_CHECK_UPDATE
Definition Opcodes.h:896
@ SMSG_LFG_ROLE_CHOSEN
Definition Opcodes.h:728
@ SMSG_LFG_DISABLED
Definition Opcodes.h:949
@ SMSG_LFG_PLAYER_INFO
Definition Opcodes.h:908
@ SMSG_LFG_QUEUE_STATUS
Definition Opcodes.h:898
@ SMSG_LFG_UPDATE_PARTY
Definition Opcodes.h:901
@ SMSG_LFG_PROPOSAL_UPDATE
Definition Opcodes.h:894
@ SMSG_LFG_BOOT_PROPOSAL_UPDATE
Definition Opcodes.h:906
@ SMSG_LFG_JOIN_RESULT
Definition Opcodes.h:897
@ SMSG_LFG_UPDATE_PLAYER
Definition Opcodes.h:900
@ SMSG_LFG_PLAYER_REWARD
Definition Opcodes.h:540
@ SMSG_LFG_OFFER_CONTINUE
Definition Opcodes.h:688
@ SMSG_LFG_UPDATE_SEARCH
Definition Opcodes.h:902
time_t GetGameTime()
Definition GameTime.cpp:42
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
@ LFG_OPTION_ENABLE_DUNGEON_FINDER
Definition LFGMgr.h:42
@ LFG_OPTION_ENABLE_RAID_BROWSER
Definition LFGMgr.h:43
@ LFG_STATE_ROLECHECK
Definition LFG.h:68
@ LFG_STATE_NONE
Definition LFG.h:67
@ LFG_STATE_QUEUED
Definition LFG.h:69
@ LFG_UPDATETYPE_ADDED_TO_QUEUE
Definition LFG.h:58
@ LFG_UPDATETYPE_UPDATE_STATUS
Definition LFG.h:60
@ LFG_UPDATETYPE_PROPOSAL_BEGIN
Definition LFG.h:59
@ LFG_UPDATETYPE_JOIN_QUEUE
Definition LFG.h:52
@ LFG_GROUP_KICK_VOTES_NEEDED
Definition LFGMgr.h:55
LfgAnswer
Answer state (Also used to check compatibilites)
Definition LFG.h:96
@ LFG_ANSWER_AGREE
Definition LFG.h:99
@ LFG_ANSWER_PENDING
Definition LFG.h:97
std::string GetStateString(LfgState state)
Definition LFG.cpp:75
std::map< uint32, uint32 > LfgLockMap
Definition LFG.h:103
std::set< uint32 > LfgDungeonSet
Definition LFG.h:102
@ LFG_ROLECHECK_INITIALITING
Definition LFGMgr.h:125
std::map< ObjectGuid, LfgLockMap > LfgLockPartyMap
Definition LFG.h:104
uint32 DisplayInfoID
LfgRoleCheckState state
Definition LFGMgr.h:172
LfgJoinResult result
Definition LFGMgr.h:171
LfgLockPartyMap lockmap
Definition LFGMgr.h:173
Stores information of a current vote to kick someone from a group.
Definition LFGMgr.h:274
std::string reason
Player guid to be kicked (can't vote)
Definition LFGMgr.h:279
time_t cancelTime
Definition LFGMgr.h:275
LfgAnswerContainer votes
Vote in progress.
Definition LFGMgr.h:277
bool inProgress
Time left to vote.
Definition LFGMgr.h:276
ObjectGuid victim
Player votes (-1 not answer | 0 Not agree | 1 agree)
Definition LFGMgr.h:278
Quest const * quest
Definition LFGMgr.h:218
Stores player data related to proposal to join.
Definition LFGMgr.h:234
ObjectGuid group
Accept status (-1 not answer | 0 Not agree | 1 agree)
Definition LFGMgr.h:238
LfgAnswer accept
Proposed role.
Definition LFGMgr.h:237
Stores group data related to proposal to join.
Definition LFGMgr.h:243
uint32 dungeonId
Proposal Id.
Definition LFGMgr.h:249
uint32 encounters
Time when we will cancel this proposal.
Definition LFGMgr.h:254
LfgProposalPlayerContainer players
Show order in update window.
Definition LFGMgr.h:258
bool isNew
Dungeon Encounters.
Definition LFGMgr.h:255
LfgProposalState state
Dungeon to join.
Definition LFGMgr.h:250
ObjectGuid group
State of the proposal.
Definition LFGMgr.h:251
Reward info.
Definition LFGMgr.h:223
uint32 firstQuest
Definition LFGMgr.h:228
uint32 otherQuest
Definition LFGMgr.h:229
Stores all rolecheck info of a group that wants to join.
Definition LFGMgr.h:263
LfgDungeonSet dungeons
State of the rolecheck.
Definition LFGMgr.h:267
LfgRolesMap roles
Time when the rolecheck will fail.
Definition LFGMgr.h:265
LfgRoleCheckState state
Player selected roles.
Definition LFGMgr.h:266
ObjectGuid leader
Random Dungeon Id.
Definition LFGMgr.h:269
uint32 rDungeonId
Dungeons group is applying for (expanded random dungeons)
Definition LFGMgr.h:268
LfgDungeonSet dungeons
Definition LFGMgr.h:187
LfgUpdateType updateType
Definition LFGMgr.h:185
std::string comment
Definition LFGMgr.h:188
LfgState state
Definition LFGMgr.h:186