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 return;
343
345 /********************/
346
347 // everything's fine, do it
348 if (grp)
349 {
352 }
353 else if (grpInvite && grpInvite->GetLeaderGUID() == GetPlayer()->GetGUID())
354 { // pending group creation being cancelled
356 grpInvite->Disband();
357 }
358}
359
361{
362 // not allowed to change
363 /*
364 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
365 if (!group)
366 return;
367
368 if (!group->IsLeader(GetPlayer()->GetGUID()))
369 return;
370
371 if (group->isLFGGroup())
372 return;
373
374 switch (packet.LootMethod)
375 {
376 case FREE_FOR_ALL:
377 case MASTER_LOOT:
378 case GROUP_LOOT:
379 case PERSONAL_LOOT:
380 break;
381 default:
382 return;
383 }
384
385 if (packet.LootThreshold < ITEM_QUALITY_UNCOMMON || packet.LootThreshold > ITEM_QUALITY_ARTIFACT)
386 return;
387
388 if (packet.LootMethod == MASTER_LOOT && !group->IsMember(packet.LootMasterGUID))
389 return;
390
391 // everything's fine, do it
392 group->SetLootMethod(static_cast<LootMethod>(packet.LootMethod));
393 group->SetMasterLooterGuid(packet.LootMasterGUID);
394 group->SetLootThreshold(static_cast<ItemQualities>(packet.LootThreshold));
395 group->SendUpdate();
396 */
397}
398
400{
401 Group const* group = GetPlayer()->GetGroup(packet.PartyIndex);
402 if (!group)
403 return;
404
406 minimapPing.Sender = GetPlayer()->GetGUID();
407 minimapPing.PositionX = packet.PositionX;
408 minimapPing.PositionY = packet.PositionY;
409 group->BroadcastPacket(minimapPing.Write(), true, -1, GetPlayer()->GetGUID());
410}
411
413{
415 if (packet.Min > packet.Max || packet.Max > 1000000)
416 return;
417 /********************/
418
419 GetPlayer()->DoRandomRoll(packet.Min, packet.Max);
420}
421
423{
424 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
425 if (!group)
426 return;
427
428 if (packet.Symbol == -1) // target icon request
429 group->SendTargetIconList(this);
430 else // target icon update
431 {
432 if (group->isRaidGroup() && !group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID()))
433 return;
434
435 if (packet.Target.IsPlayer())
436 {
438 if (!target || target->IsHostileTo(GetPlayer()))
439 return;
440 }
441
442 group->SetTargetIcon(packet.Symbol, packet.Target, GetPlayer()->GetGUID());
443 }
444}
445
447{
448 Group* group = GetPlayer()->GetGroup();
449 if (!group)
450 return;
451
452 if (_player->InBattleground())
453 return;
454
455 // error handling
456 if (!group->IsLeader(GetPlayer()->GetGUID()) || group->GetMembersCount() < 2)
457 return;
458
459 // everything's fine, do it (is it 0 (PARTY_OP_INVITE) correct code)
461
462 // New 4.x: it is now possible to convert a raid to a group if member count is 5 or less
463 if (packet.Raid)
464 group->ConvertToRaid();
465 else
466 group->ConvertToGroup();
467}
468
470{
471 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
472 if (!group)
473 return;
474
475 group->SendTargetIconList(this);
476 group->SendRaidMarkersChanged(this);
477}
478
480{
481 // we will get correct pointer for group here, so we don't have to check if group is BG raid
482 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
483 if (!group)
484 return;
485
486 if (packet.NewSubGroup >= MAX_RAID_SUBGROUPS)
487 return;
488
489 ObjectGuid senderGuid = GetPlayer()->GetGUID();
490 if (!group->IsLeader(senderGuid) && !group->IsAssistant(senderGuid))
491 return;
492
493 if (!group->HasFreeSlotSubGroup(packet.NewSubGroup))
494 return;
495
496 group->ChangeMembersGroup(packet.TargetGUID, packet.NewSubGroup);
497}
498
500{
501 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
502 if (!group)
503 return;
504
505 ObjectGuid senderGuid = GetPlayer()->GetGUID();
506 if (!group->IsLeader(senderGuid) && !group->IsAssistant(senderGuid))
507 return;
508
509 group->SwapMembersGroups(packet.FirstTarget, packet.SecondTarget);
510}
511
513{
514 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
515 if (!group)
516 return;
517
518 if (!group->IsLeader(GetPlayer()->GetGUID()))
519 return;
520
522}
523
525{
526 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
527 if (!group)
528 return;
529
530 ObjectGuid senderGuid = GetPlayer()->GetGUID();
531 if (!group->IsLeader(senderGuid) && !group->IsAssistant(senderGuid))
532 return;
533
534 switch (packet.Assignment)
535 {
538 group->SetGroupMemberFlag(packet.Target, packet.Set, MEMBER_FLAG_MAINASSIST);
539 break;
541 group->RemoveUniqueGroupMemberFlag(MEMBER_FLAG_MAINTANK); // Remove main assist flag from current if any.
542 group->SetGroupMemberFlag(packet.Target, packet.Set, MEMBER_FLAG_MAINTANK);
543 break;
544 default:
545 break;
546 }
547
548 group->SendUpdate();
549}
550
552{
553 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
554 if (!group)
555 return;
556
558 if (!group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID()))
559 return;
560 /********************/
561
562 // everything's fine, do it
563 group->StartReadyCheck(GetPlayer()->GetGUID());
564}
565
567{
568 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
569 if (!group)
570 return;
571
572 // everything's fine, do it
573 group->SetMemberReadyCheck(GetPlayer()->GetGUID(), packet.IsReady);
574}
575
577{
578 for (ObjectGuid const& target : packet.Targets)
579 {
582 if (!player || !GetPlayer()->IsInSameRaidWith(player))
583 {
584 partyMemberStats.MemberGuid = target;
585 partyMemberStats.MemberStats.Status = MEMBER_STATUS_OFFLINE;
586 }
587 else
588 {
589 partyMemberStats.Initialize(player);
590 }
591 SendPacket(partyMemberStats.Write());
592 }
593}
594
596{
597 // every time the player checks the character screen
599}
600
602{
603 // ignore if player not loaded
604 if (!GetPlayer()) // needed because STATUS_AUTHED
605 {
606 if (packet.PassOnLoot)
607 TC_LOG_ERROR("network", "CMSG_OPT_OUT_OF_LOOT value<>0 for not-loaded character!");
608 return;
609 }
610
612}
613
615{
616 Group const* group = GetPlayer()->GetGroup(packet.PartyIndex);
617 if (!group)
618 return;
619
620 ObjectGuid guid = GetPlayer()->GetGUID();
621 if (!group->IsLeader(guid) && !group->IsAssistant(guid))
622 return;
623
625 rolePollInform.From = GetPlayer()->GetGUID();
626 rolePollInform.PartyIndex = group->GetGroupCategory();
627 group->BroadcastPacket(rolePollInform.Write(), true);
628}
629
631{
632 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
633 if (!group)
634 return;
635
636 if (!group->IsLeader(GetPlayer()->GetGUID()))
637 return;
638
640}
641
643{
644 Group* group = GetPlayer()->GetGroup();
645 if (!group)
646 return;
647
648 if (group->isRaidGroup() && !group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID()))
649 return;
650
651 group->DeleteRaidMarker(packet.MarkerId);
652}
653
654namespace
655{
656bool CanSendPing(Player const& player, PingSubjectType type, Group const*& group)
657{
658 if (type >= PingSubjectType::Max)
659 return false;
660
661 if (!player.GetSession()->CanSpeak())
662 return false;
663
664 group = player.GetGroup();
665 if (!group)
666 return false;
667
668 if (group->IsLeader(player.GetGUID()))
669 return true;
670
671 switch (group->GetRestrictPings())
672 {
674 return true;
676 return false;
678 if (!group->IsAssistant(player.GetGUID()))
679 return false;
680 break;
683 return false;
684 break;
685 }
686
687 return true;
688}
689}
690
692{
693 Group* group = GetPlayer()->GetGroup(setRestrictPingsToAssistants.PartyIndex);
694 if (!group)
695 return;
696
697 if (!group->IsLeader(GetPlayer()->GetGUID()))
698 return;
699
700 group->SetRestrictPingsTo(setRestrictPingsToAssistants.RestrictTo);
701}
702
704{
705 Group const* group = nullptr;
706 if (!CanSendPing(*_player, pingUnit.Type, group))
707 return;
708
709 Unit const* target = ObjectAccessor::GetUnit(*_player, pingUnit.TargetGUID);
710 if (!target || !_player->HaveAtClient(target))
711 return;
712
713 WorldPackets::Party::ReceivePingUnit broadcastPingUnit;
714 broadcastPingUnit.SenderGUID = _player->GetGUID();
715 broadcastPingUnit.TargetGUID = pingUnit.TargetGUID;
716 broadcastPingUnit.Type = pingUnit.Type;
717 broadcastPingUnit.PinFrameID = pingUnit.PinFrameID;
718 broadcastPingUnit.PingDuration = pingUnit.PingDuration;
719 broadcastPingUnit.Health = pingUnit.Health;
720 broadcastPingUnit.Mana = pingUnit.Mana;
721 broadcastPingUnit.IsUnitFrameStatusTextPing = pingUnit.IsUnitFrameStatusTextPing;
722 broadcastPingUnit.CreatureID = pingUnit.CreatureID;
723 broadcastPingUnit.SpellOverrideNameID = pingUnit.SpellOverrideNameID;
724 broadcastPingUnit.Write();
725
726 for (GroupReference const& itr : group->GetMembers())
727 {
728 Player const* member = itr.GetSource();
729 if (_player == member || !_player->IsInMap(member))
730 continue;
731
732 member->SendDirectMessage(broadcastPingUnit.GetRawPacket());
733 }
734}
735
737{
738 Group const* group = nullptr;
739 if (!CanSendPing(*_player, pingWorldPoint.Type, group))
740 return;
741
742 if (_player->GetMapId() != pingWorldPoint.MapID)
743 return;
744
745 WorldPackets::Party::ReceivePingWorldPoint broadcastPingWorldPoint;
746 broadcastPingWorldPoint.SenderGUID = _player->GetGUID();
747 broadcastPingWorldPoint.MapID = pingWorldPoint.MapID;
748 broadcastPingWorldPoint.Point = pingWorldPoint.Point;
749 broadcastPingWorldPoint.Type = pingWorldPoint.Type;
750 broadcastPingWorldPoint.PinFrameID = pingWorldPoint.PinFrameID;
751 broadcastPingWorldPoint.Transport = pingWorldPoint.Transport;
752 broadcastPingWorldPoint.PingDuration = pingWorldPoint.PingDuration;
753 broadcastPingWorldPoint.Write();
754
755 for (GroupReference const& itr : group->GetMembers())
756 {
757 Player const* member = itr.GetSource();
758 if (_player == member || !_player->IsInMap(member))
759 continue;
760
761 member->SendDirectMessage(broadcastPingWorldPoint.GetRawPacket());
762 }
763}
764
766{
767 Group const* group = nullptr;
768 if (!CanSendPing(*_player, pingCooldown.Type, group))
769 return;
770
771 WorldPackets::Party::ReceivePingCooldown broadcastPingCooldown;
772 broadcastPingCooldown.SenderGUID = _player->GetGUID();
773 broadcastPingCooldown.PinFrameID = pingCooldown.PinFrameID;
774 broadcastPingCooldown.SpellID = pingCooldown.SpellID;
775 broadcastPingCooldown.ItemID = pingCooldown.ItemID;
776 broadcastPingCooldown.Duration = pingCooldown.Duration;
777 broadcastPingCooldown.Remaining = pingCooldown.Remaining;
778 broadcastPingCooldown.Type = pingCooldown.Type;
779 broadcastPingCooldown.SpellCategoryID = pingCooldown.SpellCategoryID;
780 broadcastPingCooldown.Write();
781
782 for (GroupReference const& itr : group->GetMembers())
783 {
784 Player const* member = itr.GetSource();
785 if (_player == member || !_player->IsInMap(member))
786 continue;
787
788 member->SendDirectMessage(broadcastPingCooldown.GetRawPacket());
789 }
790}
uint8_t uint8
Definition Define.h:156
uint32_t uint32
Definition Define.h:154
#define ASSERT
Definition Errors.h:72
#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:182
@ 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:209
void BroadcastGroupUpdate(void)
Definition Group.cpp:1371
void SwapMembersGroups(ObjectGuid firstGuid, ObjectGuid secondGuid)
Definition Group.cpp:1058
bool AddLeaderInvite(Player *player)
Definition Group.cpp:375
void DeleteRaidMarker(uint8 markerId)
Definition Group.cpp:1556
GroupCategory GetGroupCategory() const
Definition Group.h:307
bool IsCreated() const
Definition Group.cpp:1613
void SendUpdate() const
Definition Group.cpp:809
void ChangeMembersGroup(ObjectGuid guid, uint8 group)
Definition Group.cpp:1006
void SendTargetIconList(WorldSession *session) const
Definition Group.cpp:796
void SetEveryoneIsAssistant(bool apply)
Definition Group.cpp:1834
void RemoveAllInvites()
Definition Group.cpp:395
bool IsAssistant(ObjectGuid guid) const
Definition Group.h:323
void Disband(bool hideDestroy=false)
Definition Group.cpp:708
bool AddMember(Player *player)
Definition Group.cpp:424
bool IsLeader(ObjectGuid guid) const
Definition Group.cpp:1660
void SetMemberReadyCheck(ObjectGuid guid, bool ready)
Definition Group.cpp:1502
void SetRestrictPingsTo(RestrictPingsTo restrictTo)
Definition Group.cpp:1862
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:1454
void SendRaidMarkersChanged(WorldSession *session=nullptr) const
Definition Group.cpp:1571
uint32 GetMembersCount() const
Definition Group.h:339
void SetLfgRoles(ObjectGuid guid, uint8 roles)
Definition Group.cpp:1425
void SetGroupMemberFlag(ObjectGuid guid, bool apply, GroupMemberFlags flag)
Definition Group.cpp:1721
void ChangeLeader(ObjectGuid guid)
Definition Group.cpp:663
uint8 GetLfgRoles(ObjectGuid guid) const
Definition Group.cpp:1435
Player * GetInvited(ObjectGuid guid) const
Definition Group.cpp:404
bool HasFreeSlotSubGroup(uint8 subgroup) const
Definition Group.cpp:1698
bool IsMember(ObjectGuid guid) const
Definition Group.cpp:1655
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignoredPlayer=ObjectGuid::Empty) const
Definition Group.cpp:958
GroupRefManager & GetMembers()
Definition Group.h:336
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:775
bool Create(Player *leader)
Definition Group.cpp:141
RestrictPingsTo GetRestrictPings() const
Definition Group.cpp:1857
bool IsFull() const
Definition Group.cpp:1588
ObjectGuid GetLeaderGUID() const
Definition Group.cpp:1618
bool isRaidGroup() const
Definition Group.cpp:1598
void RemoveUniqueGroupMemberFlag(GroupMemberFlags flag)
Definition Group.cpp:1808
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:1274
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:6193
uint32 DoRandomRoll(uint32 minimum, uint32 maximum)
Definition Player.cpp:30750
PartyResult CanUninviteFromGroup(ObjectGuid guidMember, Optional< uint8 > partyIndex) const
Definition Player.cpp:26622
bool InBattleground() const
Definition Player.h:2570
bool HaveAtClient(BaseEntity const *u) const
Definition Player.cpp:24425
void SendRaidInfo()
Definition Player.cpp:20006
WorldSession * GetSession() const
Definition Player.h:2256
void SetPassOnGroupLoot(bool bPassOnGroupLoot)
Definition Player.h:2805
Difficulty GetDungeonDifficultyID() const
Definition Player.h:2166
bool IsGameMaster() const
Definition Player.h:1293
static void RemoveFromGroup(Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, char const *reason=nullptr)
Definition Player.cpp:2089
Group * GetGroup(Optional< uint8 > partyIndex)
Definition Player.h:2781
void UninviteFromGroup()
Definition Player.cpp:2066
Group * GetGroupInvite() const
Definition Player.h:2779
Team GetTeam() const
Definition Player.h:2406
Definition Unit.h:647
uint8 GetLevel() const
Definition Unit.h:769
constexpr uint32 GetMapId() const
Definition Position.h:216
bool IsHostileTo(WorldObject const *target) const
Definition Object.cpp:2186
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:467
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
WorldPackets::Duration< Milliseconds, int32 > Remaining
WorldPackets::Duration< Milliseconds, int32 > Duration
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
WorldPackets::Duration< Milliseconds, int32 > Remaining
WorldPackets::Duration< Milliseconds, int32 > Duration
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 HandleSendPingCooldown(WorldPackets::Party::SendPingCooldown const &pingCooldown)
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:919
@ 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