TrinityCore
Loading...
Searching...
No Matches
GroupHandler.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 "WorldSession.h"
19#include "Common.h"
20#include "DatabaseEnv.h"
21#include "Group.h"
22#include "GroupMgr.h"
23#include "LFG.h"
24#include "Log.h"
25#include "Loot.h"
26#include "MiscPackets.h"
27#include "ObjectAccessor.h"
28#include "PartyPackets.h"
29#include "Player.h"
30#include "SocialMgr.h"
31#include "World.h"
32
33class Aura;
34
35/* differeces from off:
36 -you can uninvite yourself - is is useful
37 -you can accept invitation even if leader went offline
38*/
39/* todo:
40 -group_destroyed msg is sent but not shown
41 -reduce xp gaining when in raid group
42 -quest sharing has to be corrected
43 -FIX sending PartyMemberStats
44*/
45
46void WorldSession::SendPartyResult(PartyOperation operation, const std::string& member, PartyResult res, uint32 val /* = 0 */)
47{
49
50 packet.Name = member;
51 packet.Command = uint8(operation);
52 packet.Result = uint8(res);
53 packet.ResultData = val;
55
56 SendPacket(packet.Write());
57}
58
60{
61 Player* invitingPlayer = GetPlayer();
62 Player* invitedPlayer = ObjectAccessor::FindPlayerByName(packet.TargetName);
63
64 // no player
65 if (!invitedPlayer)
66 {
68 return;
69 }
70
71 // player trying to invite himself (most likely cheating)
72 if (invitedPlayer == invitingPlayer)
73 {
75 return;
76 }
77
78 // restrict invite to GMs
79 if (!sWorld->getBoolConfig(CONFIG_ALLOW_GM_GROUP) && !invitingPlayer->IsGameMaster() && invitedPlayer->IsGameMaster())
80 {
82 return;
83 }
84
85 // can't group with
86 if (!invitingPlayer->IsGameMaster() && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && invitingPlayer->GetTeam() != invitedPlayer->GetTeam())
87 {
89 return;
90 }
91 if (invitingPlayer->GetInstanceId() != 0 && invitedPlayer->GetInstanceId() != 0 && invitingPlayer->GetInstanceId() != invitedPlayer->GetInstanceId() && invitingPlayer->GetMapId() == invitedPlayer->GetMapId())
92 {
94 return;
95 }
96 // just ignore us
97 if (invitedPlayer->GetInstanceId() != 0 && invitedPlayer->GetDungeonDifficultyID() != invitingPlayer->GetDungeonDifficultyID())
98 {
100 return;
101 }
102
103 if (invitedPlayer->GetSocial()->HasIgnore(invitingPlayer->GetGUID(), invitingPlayer->GetSession()->GetAccountGUID()))
104 {
106 return;
107 }
108
109 if (!invitedPlayer->GetSocial()->HasFriend(invitingPlayer->GetGUID()) && invitingPlayer->GetLevel() < sWorld->getIntConfig(CONFIG_PARTY_LEVEL_REQ))
110 {
112 return;
113 }
114
115 Group* group = invitingPlayer->GetGroup(packet.PartyIndex);
116 if (!group)
117 group = invitingPlayer->GetGroupInvite();
118
119 Group* group2 = invitedPlayer->GetGroup(packet.PartyIndex);
120 // player already in another group or invited
121 if (group2 || invitedPlayer->GetGroupInvite())
122 {
124
125 if (group2)
126 {
127 // tell the player that they were invited but it failed as they were already in a group
129 partyInvite.Initialize(invitingPlayer, packet.ProposedRoles, false);
130 invitedPlayer->SendDirectMessage(partyInvite.Write());
131 }
132
133 return;
134 }
135
136 if (group)
137 {
138 // not have permissions for invite
139 if (!group->IsLeader(invitingPlayer->GetGUID()) && !group->IsAssistant(invitingPlayer->GetGUID()))
140 {
141 if (group->IsCreated())
143 return;
144 }
145 // not have place
146 if (group->IsFull())
147 {
149 return;
150 }
151 }
152
153 // ok, but group not exist, start a new group
154 // but don't create and save the group to the DB until
155 // at least one person joins
156 if (!group)
157 {
158 group = new Group();
159 // new group: if can't add then delete
160 if (!group->AddLeaderInvite(invitingPlayer))
161 {
162 delete group;
163 return;
164 }
165 if (!group->AddInvite(invitedPlayer))
166 {
167 group->RemoveAllInvites();
168 delete group;
169 return;
170 }
171 }
172 else
173 {
174 // already existed group: if can't add then just leave
175 if (!group->AddInvite(invitedPlayer))
176 {
177 return;
178 }
179 }
180
182 partyInvite.Initialize(invitingPlayer, packet.ProposedRoles, true);
183 invitedPlayer->SendDirectMessage(partyInvite.Write());
184
186}
187
189{
190 Group* group = GetPlayer()->GetGroupInvite();
191
192 if (!group)
193 return;
194
195 if (packet.PartyIndex && group->GetGroupCategory() != GroupCategory(*packet.PartyIndex))
196 return;
197
198 if (packet.Accept)
199 {
200 // Remove player from invitees in any case
201 group->RemoveInvite(GetPlayer());
202
203 if (group->GetLeaderGUID() == GetPlayer()->GetGUID())
204 {
205 TC_LOG_ERROR("network", "HandleGroupAcceptOpcode: player {} {} tried to accept an invite to his own group", GetPlayer()->GetName(), GetPlayer()->GetGUID().ToString());
206 return;
207 }
208
209 // Group is full
210 if (group->IsFull())
211 {
213 return;
214 }
215
217
218 // Forming a new group, create it
219 if (!group->IsCreated())
220 {
221 // This can happen if the leader is zoning. To be removed once delayed actions for zoning are implemented
222 if (!leader)
223 {
224 group->RemoveAllInvites();
225 return;
226 }
227
228 // If we're about to create a group there really should be a leader present
229 ASSERT(leader);
230 group->RemoveInvite(leader);
231 group->Create(leader);
232 sGroupMgr->AddGroup(group);
233 }
234
235 // Everything is fine, do it, PLAYER'S GROUP IS SET IN ADDMEMBER!!!
236 if (!group->AddMember(GetPlayer()))
237 return;
238
239 group->BroadcastGroupUpdate();
240 }
241 else
242 {
243 // Remember leader if online (group pointer will be invalid if group gets disbanded)
245
246 // uninvite, group can be deleted
248
249 if (!leader || !leader->GetSession())
250 return;
251
252 // report
253 WorldPackets::Party::GroupDecline decline(GetPlayer()->GetName());
254 leader->SendDirectMessage(decline.Write());
255 }
256}
257
259{
260 // can't uninvite yourself
261 if (packet.TargetGUID == GetPlayer()->GetGUID())
262 {
263 TC_LOG_ERROR("network", "WorldSession::HandleGroupUninviteGuidOpcode: leader {} {} tried to uninvite himself from the group.",
264 GetPlayer()->GetName(), GetPlayer()->GetGUID().ToString());
265 return;
266 }
267
269 if (res != ERR_PARTY_RESULT_OK)
270 {
272 return;
273 }
274
275 Group* grp = GetPlayer()->GetGroup(packet.PartyIndex);
276 // grp is checked already above in CanUninviteFromGroup()
277 ASSERT(grp);
278
279 if (grp->IsMember(packet.TargetGUID))
280 {
281 Player::RemoveFromGroup(grp, packet.TargetGUID, GROUP_REMOVEMETHOD_KICK, GetPlayer()->GetGUID(), packet.Reason.c_str());
282 return;
283 }
284
285 if (Player* player = grp->GetInvited(packet.TargetGUID))
286 {
287 player->UninviteFromGroup();
288 return;
289 }
290
292}
293
295{
297 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
298
299 if (!group || !player)
300 return;
301
302 if (!group->IsLeader(GetPlayer()->GetGUID()) || player->GetGroup() != group)
303 return;
304
305 // Everything's fine, accepted.
306 group->ChangeLeader(packet.TargetGUID);
307 group->SendUpdate();
308}
309
311{
313
314 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
315 uint8 oldRole = group ? group->GetLfgRoles(packet.TargetGUID) : 0;
316 if (oldRole == packet.Role)
317 return;
318
319 roleChangedInform.From = GetPlayer()->GetGUID();
320 roleChangedInform.ChangedUnit = packet.TargetGUID;
321 roleChangedInform.OldRole = oldRole;
322 roleChangedInform.NewRole = packet.Role;
323
324 if (group)
325 {
326 roleChangedInform.PartyIndex = group->GetGroupCategory();
327 group->BroadcastPacket(roleChangedInform.Write(), false);
328 group->SetLfgRoles(packet.TargetGUID, packet.Role);
329 }
330 else
331 SendPacket(roleChangedInform.Write());
332}
333
335{
336 Group* grp = GetPlayer()->GetGroup(packet.PartyIndex);
337 Group* grpInvite = GetPlayer()->GetGroupInvite();
338 if (!grp && !grpInvite)
339 return;
340
341 if (_player->InBattleground())
342 {
344 return;
345 }
346
348 /********************/
349
350 // everything's fine, do it
351 if (grp)
352 {
355 }
356 else if (grpInvite && grpInvite->GetLeaderGUID() == GetPlayer()->GetGUID())
357 { // pending group creation being cancelled
359 grpInvite->Disband();
360 }
361}
362
364{
365 // not allowed to change
366 /*
367 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
368 if (!group)
369 return;
370
371 if (!group->IsLeader(GetPlayer()->GetGUID()))
372 return;
373
374 if (group->isLFGGroup())
375 return;
376
377 switch (packet.LootMethod)
378 {
379 case FREE_FOR_ALL:
380 case MASTER_LOOT:
381 case GROUP_LOOT:
382 case PERSONAL_LOOT:
383 break;
384 default:
385 return;
386 }
387
388 if (packet.LootThreshold < ITEM_QUALITY_UNCOMMON || packet.LootThreshold > ITEM_QUALITY_ARTIFACT)
389 return;
390
391 if (packet.LootMethod == MASTER_LOOT && !group->IsMember(packet.LootMasterGUID))
392 return;
393
394 // everything's fine, do it
395 group->SetLootMethod(static_cast<LootMethod>(packet.LootMethod));
396 group->SetMasterLooterGuid(packet.LootMasterGUID);
397 group->SetLootThreshold(static_cast<ItemQualities>(packet.LootThreshold));
398 group->SendUpdate();
399 */
400}
401
403{
404 Group const* group = GetPlayer()->GetGroup(packet.PartyIndex);
405 if (!group)
406 return;
407
409 minimapPing.Sender = GetPlayer()->GetGUID();
410 minimapPing.PositionX = packet.PositionX;
411 minimapPing.PositionY = packet.PositionY;
412 group->BroadcastPacket(minimapPing.Write(), true, -1, GetPlayer()->GetGUID());
413}
414
416{
418 if (packet.Min > packet.Max || packet.Max > 1000000)
419 return;
420 /********************/
421
422 GetPlayer()->DoRandomRoll(packet.Min, packet.Max);
423}
424
426{
427 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
428 if (!group)
429 return;
430
431 if (packet.Symbol == -1) // target icon request
432 group->SendTargetIconList(this);
433 else // target icon update
434 {
435 if (group->isRaidGroup() && !group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID()))
436 return;
437
438 if (packet.Target.IsPlayer())
439 {
441 if (!target || target->IsHostileTo(GetPlayer()))
442 return;
443 }
444
445 group->SetTargetIcon(packet.Symbol, packet.Target, GetPlayer()->GetGUID());
446 }
447}
448
450{
451 Group* group = GetPlayer()->GetGroup();
452 if (!group)
453 return;
454
455 if (_player->InBattleground())
456 return;
457
458 // error handling
459 if (!group->IsLeader(GetPlayer()->GetGUID()) || group->GetMembersCount() < 2)
460 return;
461
462 // everything's fine, do it (is it 0 (PARTY_OP_INVITE) correct code)
464
465 // New 4.x: it is now possible to convert a raid to a group if member count is 5 or less
466 if (packet.Raid)
467 group->ConvertToRaid();
468 else
469 group->ConvertToGroup();
470}
471
473{
474 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
475 if (!group)
476 return;
477
478 group->SendTargetIconList(this);
479 group->SendRaidMarkersChanged(this);
480}
481
483{
484 // we will get correct pointer for group here, so we don't have to check if group is BG raid
485 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
486 if (!group)
487 return;
488
489 if (packet.NewSubGroup >= MAX_RAID_SUBGROUPS)
490 return;
491
492 ObjectGuid senderGuid = GetPlayer()->GetGUID();
493 if (!group->IsLeader(senderGuid) && !group->IsAssistant(senderGuid))
494 return;
495
496 if (!group->HasFreeSlotSubGroup(packet.NewSubGroup))
497 return;
498
499 group->ChangeMembersGroup(packet.TargetGUID, packet.NewSubGroup);
500}
501
503{
504 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
505 if (!group)
506 return;
507
508 ObjectGuid senderGuid = GetPlayer()->GetGUID();
509 if (!group->IsLeader(senderGuid) && !group->IsAssistant(senderGuid))
510 return;
511
512 group->SwapMembersGroups(packet.FirstTarget, packet.SecondTarget);
513}
514
516{
517 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
518 if (!group)
519 return;
520
521 if (!group->IsLeader(GetPlayer()->GetGUID()))
522 return;
523
525}
526
528{
529 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
530 if (!group)
531 return;
532
533 ObjectGuid senderGuid = GetPlayer()->GetGUID();
534 if (!group->IsLeader(senderGuid) && !group->IsAssistant(senderGuid))
535 return;
536
537 switch (packet.Assignment)
538 {
541 group->SetGroupMemberFlag(packet.Target, packet.Set, MEMBER_FLAG_MAINASSIST);
542 break;
544 group->RemoveUniqueGroupMemberFlag(MEMBER_FLAG_MAINTANK); // Remove main assist flag from current if any.
545 group->SetGroupMemberFlag(packet.Target, packet.Set, MEMBER_FLAG_MAINTANK);
546 break;
547 default:
548 break;
549 }
550
551 group->SendUpdate();
552}
553
555{
556 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
557 if (!group)
558 return;
559
561 if (!group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID()))
562 return;
563 /********************/
564
565 // everything's fine, do it
566 group->StartReadyCheck(GetPlayer()->GetGUID());
567}
568
570{
571 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
572 if (!group)
573 return;
574
575 // everything's fine, do it
576 group->SetMemberReadyCheck(GetPlayer()->GetGUID(), packet.IsReady);
577}
578
580{
581 for (ObjectGuid const& target : packet.Targets)
582 {
584 if (Player* player = ObjectAccessor::FindConnectedPlayer(target))
585 {
586 partyMemberStats.Initialize(player);
587 }
588 else
589 {
590 partyMemberStats.MemberGuid = target;
591 partyMemberStats.MemberStats.Status = MEMBER_STATUS_OFFLINE;
592 }
593 SendPacket(partyMemberStats.Write());
594 }
595}
596
598{
599 // every time the player checks the character screen
601}
602
604{
605 // ignore if player not loaded
606 if (!GetPlayer()) // needed because STATUS_AUTHED
607 {
608 if (packet.PassOnLoot)
609 TC_LOG_ERROR("network", "CMSG_OPT_OUT_OF_LOOT value<>0 for not-loaded character!");
610 return;
611 }
612
614}
615
617{
618 Group const* group = GetPlayer()->GetGroup(packet.PartyIndex);
619 if (!group)
620 return;
621
622 ObjectGuid guid = GetPlayer()->GetGUID();
623 if (!group->IsLeader(guid) && !group->IsAssistant(guid))
624 return;
625
627 rolePollInform.From = GetPlayer()->GetGUID();
628 rolePollInform.PartyIndex = group->GetGroupCategory();
629 group->BroadcastPacket(rolePollInform.Write(), true);
630}
631
633{
634 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
635 if (!group)
636 return;
637
638 if (!group->IsLeader(GetPlayer()->GetGUID()))
639 return;
640
642}
643
645{
646 Group* group = GetPlayer()->GetGroup();
647 if (!group)
648 return;
649
650 if (group->isRaidGroup() && !group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID()))
651 return;
652
653 group->DeleteRaidMarker(packet.MarkerId);
654}
655
656namespace
657{
658bool CanSendPing(Player const& player, PingSubjectType type, Group const*& group)
659{
660 if (type >= PingSubjectType::Max)
661 return false;
662
663 if (!player.GetSession()->CanSpeak())
664 return false;
665
666 group = player.GetGroup();
667 if (!group)
668 return false;
669
670 if (group->IsLeader(player.GetGUID()))
671 return true;
672
673 switch (group->GetRestrictPings())
674 {
676 return true;
678 return false;
680 if (!group->IsAssistant(player.GetGUID()))
681 return false;
682 break;
685 return false;
686 break;
687 }
688
689 return true;
690}
691}
692
694{
695 Group* group = GetPlayer()->GetGroup(setRestrictPingsToAssistants.PartyIndex);
696 if (!group)
697 return;
698
699 if (!group->IsLeader(GetPlayer()->GetGUID()))
700 return;
701
702 group->SetRestrictPingsTo(setRestrictPingsToAssistants.RestrictTo);
703}
704
706{
707 Group const* group = nullptr;
708 if (!CanSendPing(*_player, pingUnit.Type, group))
709 return;
710
711 Unit const* target = ObjectAccessor::GetUnit(*_player, pingUnit.TargetGUID);
712 if (!target || !_player->HaveAtClient(target))
713 return;
714
715 WorldPackets::Party::ReceivePingUnit broadcastPingUnit;
716 broadcastPingUnit.SenderGUID = _player->GetGUID();
717 broadcastPingUnit.TargetGUID = pingUnit.TargetGUID;
718 broadcastPingUnit.Type = pingUnit.Type;
719 broadcastPingUnit.PinFrameID = pingUnit.PinFrameID;
720 broadcastPingUnit.PingDuration = pingUnit.PingDuration;
721 broadcastPingUnit.CreatureID = pingUnit.CreatureID;
722 broadcastPingUnit.SpellOverrideNameID = pingUnit.SpellOverrideNameID;
723 broadcastPingUnit.Write();
724
725 for (GroupReference const& itr : group->GetMembers())
726 {
727 Player const* member = itr.GetSource();
728 if (_player == member || !_player->IsInMap(member))
729 continue;
730
731 member->SendDirectMessage(broadcastPingUnit.GetRawPacket());
732 }
733}
734
736{
737 Group const* group = nullptr;
738 if (!CanSendPing(*_player, pingWorldPoint.Type, group))
739 return;
740
741 if (_player->GetMapId() != pingWorldPoint.MapID)
742 return;
743
744 WorldPackets::Party::ReceivePingWorldPoint broadcastPingWorldPoint;
745 broadcastPingWorldPoint.SenderGUID = _player->GetGUID();
746 broadcastPingWorldPoint.MapID = pingWorldPoint.MapID;
747 broadcastPingWorldPoint.Point = pingWorldPoint.Point;
748 broadcastPingWorldPoint.Type = pingWorldPoint.Type;
749 broadcastPingWorldPoint.PinFrameID = pingWorldPoint.PinFrameID;
750 broadcastPingWorldPoint.Transport = pingWorldPoint.Transport;
751 broadcastPingWorldPoint.PingDuration = pingWorldPoint.PingDuration;
752 broadcastPingWorldPoint.Write();
753
754 for (GroupReference const& itr : group->GetMembers())
755 {
756 Player const* member = itr.GetSource();
757 if (_player == member || !_player->IsInMap(member))
758 continue;
759
760 member->SendDirectMessage(broadcastPingWorldPoint.GetRawPacket());
761 }
762}
uint8_t uint8
Definition Define.h:156
uint32_t uint32
Definition Define.h:154
#define ASSERT
Definition Errors.h:80
#define sGroupMgr
Definition GroupMgr.h:66
@ GROUP_ASSIGN_MAINASSIST
Definition Group.h:84
@ GROUP_ASSIGN_MAINTANK
Definition Group.h:83
@ MEMBER_STATUS_OFFLINE
Definition Group.h:61
PingSubjectType
Definition Group.h:183
@ MEMBER_FLAG_ASSISTANT
Definition Group.h:76
@ MEMBER_FLAG_MAINASSIST
Definition Group.h:78
@ MEMBER_FLAG_MAINTANK
Definition Group.h:77
GroupCategory
Definition Group.h:112
#define MAX_RAID_SUBGROUPS
Definition Group.h:52
#define TC_LOG_ERROR(filterType__, message__,...)
Definition Log.h:190
@ GROUP_REMOVEMETHOD_KICK
@ GROUP_REMOVEMETHOD_LEAVE
PartyResult
@ ERR_ALREADY_IN_GROUP_S
@ ERR_TARGET_NOT_IN_INSTANCE_S
@ ERR_IGNORING_YOU_S
@ ERR_NOT_LEADER
@ ERR_TARGET_NOT_IN_GROUP_S
@ ERR_PLAYER_WRONG_FACTION
@ ERR_INVITE_RESTRICTED
@ ERR_PARTY_RESULT_OK
@ ERR_GROUP_FULL
@ ERR_BAD_PLAYER_NAME_S
PartyOperation
@ PARTY_OP_INVITE
@ PARTY_OP_UNINVITE
@ PARTY_OP_LEAVE
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
Definition Group.h:205
void BroadcastGroupUpdate(void)
Definition Group.cpp:1401
void SwapMembersGroups(ObjectGuid firstGuid, ObjectGuid secondGuid)
Definition Group.cpp:1073
bool AddLeaderInvite(Player *player)
Definition Group.cpp:375
void DeleteRaidMarker(uint8 markerId)
Definition Group.cpp:1586
GroupCategory GetGroupCategory() const
Definition Group.h:303
bool IsCreated() const
Definition Group.cpp:1643
void SendUpdate() const
Definition Group.cpp:828
void ChangeMembersGroup(ObjectGuid guid, uint8 group)
Definition Group.cpp:1021
void SendTargetIconList(WorldSession *session) const
Definition Group.cpp:815
void SetEveryoneIsAssistant(bool apply)
Definition Group.cpp:1864
void RemoveAllInvites()
Definition Group.cpp:395
bool IsAssistant(ObjectGuid guid) const
Definition Group.h:319
void Disband(bool hideDestroy=false)
Definition Group.cpp:727
bool AddMember(Player *player)
Definition Group.cpp:424
bool IsLeader(ObjectGuid guid) const
Definition Group.cpp:1690
void SetMemberReadyCheck(ObjectGuid guid, bool ready)
Definition Group.cpp:1532
void SetRestrictPingsTo(RestrictPingsTo restrictTo)
Definition Group.cpp:1892
void RemoveInvite(Player *player)
Definition Group.cpp:386
void ConvertToRaid()
Definition Group.cpp:299
void StartReadyCheck(ObjectGuid starterGuid, Milliseconds duration=Milliseconds(READYCHECK_DURATION))
Definition Group.cpp:1484
void SendRaidMarkersChanged(WorldSession *session=nullptr) const
Definition Group.cpp:1601
uint32 GetMembersCount() const
Definition Group.h:335
void SetLfgRoles(ObjectGuid guid, uint8 roles)
Definition Group.cpp:1455
void SetGroupMemberFlag(ObjectGuid guid, bool apply, GroupMemberFlags flag)
Definition Group.cpp:1751
void ChangeLeader(ObjectGuid guid)
Definition Group.cpp:682
uint8 GetLfgRoles(ObjectGuid guid) const
Definition Group.cpp:1465
Player * GetInvited(ObjectGuid guid) const
Definition Group.cpp:404
bool HasFreeSlotSubGroup(uint8 subgroup) const
Definition Group.cpp:1728
bool IsMember(ObjectGuid guid) const
Definition Group.cpp:1685
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignoredPlayer=ObjectGuid::Empty) const
Definition Group.cpp:973
GroupRefManager & GetMembers()
Definition Group.h:332
bool AddInvite(Player *player)
Definition Group.cpp:354
void ConvertToGroup()
Definition Group.cpp:323
void SetTargetIcon(uint8 symbol, ObjectGuid target, ObjectGuid changedBy)
Definition Group.cpp:794
bool Create(Player *leader)
Definition Group.cpp:141
RestrictPingsTo GetRestrictPings() const
Definition Group.cpp:1887
bool IsFull() const
Definition Group.cpp:1618
ObjectGuid GetLeaderGUID() const
Definition Group.cpp:1648
bool isRaidGroup() const
Definition Group.cpp:1628
void RemoveUniqueGroupMemberFlag(GroupMemberFlags flag)
Definition Group.cpp:1838
static ObjectGuid const Empty
Definition ObjectGuid.h:314
bool IsPlayer() const
Definition ObjectGuid.h:369
bool HasIgnore(ObjectGuid const &ignoreGuid, ObjectGuid const &ignoreAccountGuid)
bool HasFriend(ObjectGuid const &friendGuid)
PlayerSocial * GetSocial() const
Definition Player.h:1290
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:6283
uint32 DoRandomRoll(uint32 minimum, uint32 maximum)
Definition Player.cpp:30833
PartyResult CanUninviteFromGroup(ObjectGuid guidMember, Optional< uint8 > partyIndex) const
Definition Player.cpp:26681
bool InBattleground() const
Definition Player.h:2584
bool HaveAtClient(BaseEntity const *u) const
Definition Player.cpp:24475
void SendRaidInfo()
Definition Player.cpp:20047
WorldSession * GetSession() const
Definition Player.h:2272
void SetPassOnGroupLoot(bool bPassOnGroupLoot)
Definition Player.h:2820
Difficulty GetDungeonDifficultyID() const
Definition Player.h:2183
bool IsGameMaster() const
Definition Player.h:1309
static void RemoveFromGroup(Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, char const *reason=nullptr)
Definition Player.cpp:2178
Group * GetGroup(Optional< uint8 > partyIndex)
Definition Player.h:2796
void UninviteFromGroup()
Definition Player.cpp:2155
Group * GetGroupInvite() const
Definition Player.h:2794
Team GetTeam() const
Definition Player.h:2423
Definition Unit.h:635
uint8 GetLevel() const
Definition Unit.h:757
constexpr uint32 GetMapId() const
Definition Position.h:216
bool IsHostileTo(WorldObject const *target) const
Definition Object.cpp:2181
uint32 GetInstanceId() const
Definition Object.h:308
std::string const & GetName() const
Definition Object.h:342
bool IsInMap(WorldObject const *obj) const
Definition Object.cpp:469
WorldPacket const * GetRawPacket() const
Definition Packet.h:38
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
void Initialize(Player const *inviter, int32 proposedRoles, bool canAccept)
WorldPacket const * Write() override
WorldPacket const * Write() override
Duration< Milliseconds, int32 > PingDuration
WorldPacket const * Write() override
Duration< Milliseconds, int32 > PingDuration
WorldPacket const * Write() override
TaggedPosition< Position::XYZ > Point
WorldPacket const * Write() override
WorldPacket const * Write() override
Optional< uint32 > SpellOverrideNameID
Duration< Milliseconds, int32 > PingDuration
TaggedPosition< Position::XYZ > Point
Duration< Milliseconds, int32 > PingDuration
Optional< uint8 > PartyIndex
void HandleSetPartyAssignment(WorldPackets::Party::SetPartyAssignment &packet)
void HandlePartyInviteOpcode(WorldPackets::Party::PartyInviteClient &packet)
void HandleChangeSubGroupOpcode(WorldPackets::Party::ChangeSubGroup &packet)
void HandleDoReadyCheckOpcode(WorldPackets::Party::DoReadyCheck &packet)
void HandleUpdateRaidTargetOpcode(WorldPackets::Party::UpdateRaidTarget &packet)
void HandleSetPartyLeaderOpcode(WorldPackets::Party::SetPartyLeader &packet)
void HandleConvertRaidOpcode(WorldPackets::Party::ConvertRaid &packet)
void HandleRequestRaidInfoOpcode(WorldPackets::Party::RequestRaidInfo &packet)
ObjectGuid GetAccountGUID() const
void HandleSetAssistantLeaderOpcode(WorldPackets::Party::SetAssistantLeader &packet)
Player * GetPlayer() const
void HandleOptOutOfLootOpcode(WorldPackets::Party::OptOutOfLoot &packet)
void HandleSetEveryoneIsAssistant(WorldPackets::Party::SetEveryoneIsAssistant &packet)
void HandleLeaveGroupOpcode(WorldPackets::Party::LeaveGroup &packet)
void HandleSendPingWorldPoint(WorldPackets::Party::SendPingWorldPoint const &pingWorldPoint)
bool CanSpeak() const
void HandleRandomRollOpcode(WorldPackets::Misc::RandomRollClient &packet)
void HandleRequestPartyJoinUpdates(WorldPackets::Party::RequestPartyJoinUpdates &packet)
void HandleSetLootMethodOpcode(WorldPackets::Party::SetLootMethod &packet)
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
Player * _player
void HandleSwapSubGroupsOpcode(WorldPackets::Party::SwapSubGroups &packet)
void HandlePartyInviteResponseOpcode(WorldPackets::Party::PartyInviteResponse &packet)
void HandleSetRoleOpcode(WorldPackets::Party::SetRole &packet)
void HandleRequestPartyMemberStatsOpcode(WorldPackets::Party::RequestPartyMemberStats &packet)
void SendPartyResult(PartyOperation operation, std::string const &member, PartyResult res, uint32 val=0)
void HandlePartyUninviteOpcode(WorldPackets::Party::PartyUninvite &packet)
void HandleSendPingUnit(WorldPackets::Party::SendPingUnit const &pingUnit)
void HandleSetRestrictPingsToAssistants(WorldPackets::Party::SetRestrictPingsToAssistants const &setRestrictPingsToAssistants)
void HandleClearRaidMarker(WorldPackets::Party::ClearRaidMarker &packet)
void HandleMinimapPingOpcode(WorldPackets::Party::MinimapPingClient &packet)
void HandleReadyCheckResponseOpcode(WorldPackets::Party::ReadyCheckResponseClient &packet)
void HandleInitiateRolePoll(WorldPackets::Party::InitiateRolePoll &packet)
#define sWorld
Definition World.h:916
@ CONFIG_PARTY_LEVEL_REQ
Definition World.h:324
@ CONFIG_ALLOW_GM_GROUP
Definition World.h:121
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition World.h:112
TC_GAME_API Player * FindPlayerByName(std::string_view name)
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
@ PLAYER_ROLE_TANK
Definition LFG.h:41
@ PLAYER_ROLE_HEALER
Definition LFG.h:42