TrinityCore
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 "Log.h"
24#include "Loot.h"
25#include "MiscPackets.h"
26#include "ObjectAccessor.h"
27#include "PartyPackets.h"
28#include "Player.h"
29#include "SocialMgr.h"
30#include "World.h"
31
32class Aura;
33
34/* differeces from off:
35 -you can uninvite yourself - is is useful
36 -you can accept invitation even if leader went offline
37*/
38/* todo:
39 -group_destroyed msg is sent but not shown
40 -reduce xp gaining when in raid group
41 -quest sharing has to be corrected
42 -FIX sending PartyMemberStats
43*/
44
45void WorldSession::SendPartyResult(PartyOperation operation, const std::string& member, PartyResult res, uint32 val /* = 0 */)
46{
48
49 packet.Name = member;
50 packet.Command = uint8(operation);
51 packet.Result = uint8(res);
52 packet.ResultData = val;
54
55 SendPacket(packet.Write());
56}
57
59{
60 Player* invitingPlayer = GetPlayer();
61 Player* invitedPlayer = ObjectAccessor::FindPlayerByName(packet.TargetName);
62
63 // no player
64 if (!invitedPlayer)
65 {
67 return;
68 }
69
70 // player trying to invite himself (most likely cheating)
71 if (invitedPlayer == invitingPlayer)
72 {
74 return;
75 }
76
77 // restrict invite to GMs
78 if (!sWorld->getBoolConfig(CONFIG_ALLOW_GM_GROUP) && !invitingPlayer->IsGameMaster() && invitedPlayer->IsGameMaster())
79 {
81 return;
82 }
83
84 // can't group with
85 if (!invitingPlayer->IsGameMaster() && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && invitingPlayer->GetTeam() != invitedPlayer->GetTeam())
86 {
88 return;
89 }
90 if (invitingPlayer->GetInstanceId() != 0 && invitedPlayer->GetInstanceId() != 0 && invitingPlayer->GetInstanceId() != invitedPlayer->GetInstanceId() && invitingPlayer->GetMapId() == invitedPlayer->GetMapId())
91 {
93 return;
94 }
95 // just ignore us
96 if (invitedPlayer->GetInstanceId() != 0 && invitedPlayer->GetDungeonDifficultyID() != invitingPlayer->GetDungeonDifficultyID())
97 {
99 return;
100 }
101
102 if (invitedPlayer->GetSocial()->HasIgnore(invitingPlayer->GetGUID(), invitingPlayer->GetSession()->GetAccountGUID()))
103 {
105 return;
106 }
107
108 if (!invitedPlayer->GetSocial()->HasFriend(invitingPlayer->GetGUID()) && invitingPlayer->GetLevel() < sWorld->getIntConfig(CONFIG_PARTY_LEVEL_REQ))
109 {
111 return;
112 }
113
114 Group* group = invitingPlayer->GetGroup(packet.PartyIndex);
115 if (!group)
116 group = invitingPlayer->GetGroupInvite();
117
118 Group* group2 = invitedPlayer->GetGroup(packet.PartyIndex);
119 // player already in another group or invited
120 if (group2 || invitedPlayer->GetGroupInvite())
121 {
123
124 if (group2)
125 {
126 // tell the player that they were invited but it failed as they were already in a group
128 partyInvite.Initialize(invitingPlayer, packet.ProposedRoles, false);
129 invitedPlayer->SendDirectMessage(partyInvite.Write());
130 }
131
132 return;
133 }
134
135 if (group)
136 {
137 // not have permissions for invite
138 if (!group->IsLeader(invitingPlayer->GetGUID()) && !group->IsAssistant(invitingPlayer->GetGUID()))
139 {
140 if (group->IsCreated())
142 return;
143 }
144 // not have place
145 if (group->IsFull())
146 {
148 return;
149 }
150 }
151
152 // ok, but group not exist, start a new group
153 // but don't create and save the group to the DB until
154 // at least one person joins
155 if (!group)
156 {
157 group = new Group();
158 // new group: if can't add then delete
159 if (!group->AddLeaderInvite(invitingPlayer))
160 {
161 delete group;
162 return;
163 }
164 if (!group->AddInvite(invitedPlayer))
165 {
166 group->RemoveAllInvites();
167 delete group;
168 return;
169 }
170 }
171 else
172 {
173 // already existed group: if can't add then just leave
174 if (!group->AddInvite(invitedPlayer))
175 {
176 return;
177 }
178 }
179
181 partyInvite.Initialize(invitingPlayer, packet.ProposedRoles, true);
182 invitedPlayer->SendDirectMessage(partyInvite.Write());
183
185}
186
188{
189 Group* group = GetPlayer()->GetGroupInvite();
190
191 if (!group)
192 return;
193
194 if (packet.PartyIndex && group->GetGroupCategory() != GroupCategory(*packet.PartyIndex))
195 return;
196
197 if (packet.Accept)
198 {
199 // Remove player from invitees in any case
200 group->RemoveInvite(GetPlayer());
201
202 if (group->GetLeaderGUID() == GetPlayer()->GetGUID())
203 {
204 TC_LOG_ERROR("network", "HandleGroupAcceptOpcode: player {} {} tried to accept an invite to his own group", GetPlayer()->GetName(), GetPlayer()->GetGUID().ToString());
205 return;
206 }
207
208 // Group is full
209 if (group->IsFull())
210 {
212 return;
213 }
214
216
217 // Forming a new group, create it
218 if (!group->IsCreated())
219 {
220 // This can happen if the leader is zoning. To be removed once delayed actions for zoning are implemented
221 if (!leader)
222 {
223 group->RemoveAllInvites();
224 return;
225 }
226
227 // If we're about to create a group there really should be a leader present
228 ASSERT(leader);
229 group->RemoveInvite(leader);
230 group->Create(leader);
231 sGroupMgr->AddGroup(group);
232 }
233
234 // Everything is fine, do it, PLAYER'S GROUP IS SET IN ADDMEMBER!!!
235 if (!group->AddMember(GetPlayer()))
236 return;
237
238 group->BroadcastGroupUpdate();
239 }
240 else
241 {
242 // Remember leader if online (group pointer will be invalid if group gets disbanded)
244
245 // uninvite, group can be deleted
247
248 if (!leader || !leader->GetSession())
249 return;
250
251 // report
253 leader->SendDirectMessage(decline.Write());
254 }
255}
256
258{
259 // can't uninvite yourself
260 if (packet.TargetGUID == GetPlayer()->GetGUID())
261 {
262 TC_LOG_ERROR("network", "WorldSession::HandleGroupUninviteGuidOpcode: leader {} {} tried to uninvite himself from the group.",
263 GetPlayer()->GetName(), GetPlayer()->GetGUID().ToString());
264 return;
265 }
266
268 if (res != ERR_PARTY_RESULT_OK)
269 {
271 return;
272 }
273
274 Group* grp = GetPlayer()->GetGroup(packet.PartyIndex);
275 // grp is checked already above in CanUninviteFromGroup()
276 ASSERT(grp);
277
278 if (grp->IsMember(packet.TargetGUID))
279 {
280 Player::RemoveFromGroup(grp, packet.TargetGUID, GROUP_REMOVEMETHOD_KICK, GetPlayer()->GetGUID(), packet.Reason.c_str());
281 return;
282 }
283
284 if (Player* player = grp->GetInvited(packet.TargetGUID))
285 {
286 player->UninviteFromGroup();
287 return;
288 }
289
291}
292
294{
296 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
297
298 if (!group || !player)
299 return;
300
301 if (!group->IsLeader(GetPlayer()->GetGUID()) || player->GetGroup() != group)
302 return;
303
304 // Everything's fine, accepted.
305 group->ChangeLeader(packet.TargetGUID);
306 group->SendUpdate();
307}
308
310{
312
313 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
314 uint8 oldRole = group ? group->GetLfgRoles(packet.TargetGUID) : 0;
315 if (oldRole == packet.Role)
316 return;
317
318 roleChangedInform.From = GetPlayer()->GetGUID();
319 roleChangedInform.ChangedUnit = packet.TargetGUID;
320 roleChangedInform.OldRole = oldRole;
321 roleChangedInform.NewRole = packet.Role;
322
323 if (group)
324 {
325 roleChangedInform.PartyIndex = group->GetGroupCategory();
326 group->BroadcastPacket(roleChangedInform.Write(), false);
327 group->SetLfgRoles(packet.TargetGUID, packet.Role);
328 }
329 else
330 SendPacket(roleChangedInform.Write());
331}
332
334{
335 Group* grp = GetPlayer()->GetGroup(packet.PartyIndex);
336 Group* grpInvite = GetPlayer()->GetGroupInvite();
337 if (!grp && !grpInvite)
338 return;
339
340 if (_player->InBattleground())
341 {
343 return;
344 }
345
347 /********************/
348
349 // everything's fine, do it
350 if (grp)
351 {
354 }
355 else if (grpInvite && grpInvite->GetLeaderGUID() == GetPlayer()->GetGUID())
356 { // pending group creation being cancelled
358 grpInvite->Disband();
359 }
360}
361
363{
364 // not allowed to change
365 /*
366 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
367 if (!group)
368 return;
369
370 if (!group->IsLeader(GetPlayer()->GetGUID()))
371 return;
372
373 if (group->isLFGGroup())
374 return;
375
376 switch (packet.LootMethod)
377 {
378 case FREE_FOR_ALL:
379 case MASTER_LOOT:
380 case GROUP_LOOT:
381 case PERSONAL_LOOT:
382 break;
383 default:
384 return;
385 }
386
387 if (packet.LootThreshold < ITEM_QUALITY_UNCOMMON || packet.LootThreshold > ITEM_QUALITY_ARTIFACT)
388 return;
389
390 if (packet.LootMethod == MASTER_LOOT && !group->IsMember(packet.LootMasterGUID))
391 return;
392
393 // everything's fine, do it
394 group->SetLootMethod(static_cast<LootMethod>(packet.LootMethod));
395 group->SetMasterLooterGuid(packet.LootMasterGUID);
396 group->SetLootThreshold(static_cast<ItemQualities>(packet.LootThreshold));
397 group->SendUpdate();
398 */
399}
400
402{
403 Group const* group = GetPlayer()->GetGroup(packet.PartyIndex);
404 if (!group)
405 return;
406
408 minimapPing.Sender = GetPlayer()->GetGUID();
409 minimapPing.PositionX = packet.PositionX;
410 minimapPing.PositionY = packet.PositionY;
411 group->BroadcastPacket(minimapPing.Write(), true, -1, GetPlayer()->GetGUID());
412}
413
415{
417 if (packet.Min > packet.Max || packet.Max > 1000000)
418 return;
419 /********************/
420
421 GetPlayer()->DoRandomRoll(packet.Min, packet.Max);
422}
423
425{
426 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
427 if (!group)
428 return;
429
430 if (packet.Symbol == -1) // target icon request
431 group->SendTargetIconList(this);
432 else // target icon update
433 {
434 if (group->isRaidGroup() && !group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID()))
435 return;
436
437 if (packet.Target.IsPlayer())
438 {
440 if (!target || target->IsHostileTo(GetPlayer()))
441 return;
442 }
443
444 group->SetTargetIcon(packet.Symbol, packet.Target, GetPlayer()->GetGUID());
445 }
446}
447
449{
450 Group* group = GetPlayer()->GetGroup();
451 if (!group)
452 return;
453
454 if (_player->InBattleground())
455 return;
456
457 // error handling
458 if (!group->IsLeader(GetPlayer()->GetGUID()) || group->GetMembersCount() < 2)
459 return;
460
461 // everything's fine, do it (is it 0 (PARTY_OP_INVITE) correct code)
463
464 // New 4.x: it is now possible to convert a raid to a group if member count is 5 or less
465 if (packet.Raid)
466 group->ConvertToRaid();
467 else
468 group->ConvertToGroup();
469}
470
472{
473 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
474 if (!group)
475 return;
476
477 group->SendTargetIconList(this);
478 group->SendRaidMarkersChanged(this);
479}
480
482{
483 // we will get correct pointer for group here, so we don't have to check if group is BG raid
484 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
485 if (!group)
486 return;
487
488 if (packet.NewSubGroup >= MAX_RAID_SUBGROUPS)
489 return;
490
491 ObjectGuid senderGuid = GetPlayer()->GetGUID();
492 if (!group->IsLeader(senderGuid) && !group->IsAssistant(senderGuid))
493 return;
494
495 if (!group->HasFreeSlotSubGroup(packet.NewSubGroup))
496 return;
497
498 group->ChangeMembersGroup(packet.TargetGUID, packet.NewSubGroup);
499}
500
502{
503 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
504 if (!group)
505 return;
506
507 ObjectGuid senderGuid = GetPlayer()->GetGUID();
508 if (!group->IsLeader(senderGuid) && !group->IsAssistant(senderGuid))
509 return;
510
511 group->SwapMembersGroups(packet.FirstTarget, packet.SecondTarget);
512}
513
515{
516 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
517 if (!group)
518 return;
519
520 if (!group->IsLeader(GetPlayer()->GetGUID()))
521 return;
522
524}
525
527{
528 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
529 if (!group)
530 return;
531
532 ObjectGuid senderGuid = GetPlayer()->GetGUID();
533 if (!group->IsLeader(senderGuid) && !group->IsAssistant(senderGuid))
534 return;
535
536 switch (packet.Assignment)
537 {
540 group->SetGroupMemberFlag(packet.Target, packet.Set, MEMBER_FLAG_MAINASSIST);
541 break;
543 group->RemoveUniqueGroupMemberFlag(MEMBER_FLAG_MAINTANK); // Remove main assist flag from current if any.
544 group->SetGroupMemberFlag(packet.Target, packet.Set, MEMBER_FLAG_MAINTANK);
545 break;
546 default:
547 break;
548 }
549
550 group->SendUpdate();
551}
552
554{
555 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
556 if (!group)
557 return;
558
560 if (!group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID()))
561 return;
562 /********************/
563
564 // everything's fine, do it
565 group->StartReadyCheck(GetPlayer()->GetGUID());
566}
567
569{
570 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
571 if (!group)
572 return;
573
574 // everything's fine, do it
575 group->SetMemberReadyCheck(GetPlayer()->GetGUID(), packet.IsReady);
576}
577
579{
581
583 if (!player)
584 {
585 partyMemberStats.MemberGuid = packet.TargetGUID;
586 partyMemberStats.MemberStats.Status = MEMBER_STATUS_OFFLINE;
587 }
588 else
589 partyMemberStats.Initialize(player);
590
591 SendPacket(partyMemberStats.Write());
592}
593
595{
596 // every time the player checks the character screen
598}
599
601{
602 // ignore if player not loaded
603 if (!GetPlayer()) // needed because STATUS_AUTHED
604 {
605 if (packet.PassOnLoot)
606 TC_LOG_ERROR("network", "CMSG_OPT_OUT_OF_LOOT value<>0 for not-loaded character!");
607 return;
608 }
609
611}
612
614{
615 Group const* group = GetPlayer()->GetGroup(packet.PartyIndex);
616 if (!group)
617 return;
618
619 ObjectGuid guid = GetPlayer()->GetGUID();
620 if (!group->IsLeader(guid) && !group->IsAssistant(guid))
621 return;
622
624 rolePollInform.From = GetPlayer()->GetGUID();
625 rolePollInform.PartyIndex = group->GetGroupCategory();
626 group->BroadcastPacket(rolePollInform.Write(), true);
627}
628
630{
631 Group* group = GetPlayer()->GetGroup(packet.PartyIndex);
632 if (!group)
633 return;
634
635 if (!group->IsLeader(GetPlayer()->GetGUID()))
636 return;
637
639}
640
642{
643 Group* group = GetPlayer()->GetGroup();
644 if (!group)
645 return;
646
647 if (group->isRaidGroup() && !group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID()))
648 return;
649
650 group->DeleteRaidMarker(packet.MarkerId);
651}
652
653namespace
654{
655bool CanSendPing(Player const& player, PingSubjectType type, Group const*& group)
656{
657 if (type >= PingSubjectType::Max)
658 return false;
659
660 if (!player.GetSession()->CanSpeak())
661 return false;
662
663 group = player.GetGroup();
664 if (!group)
665 return false;
666
667 if (group->IsRestrictPingsToAssistants() && !group->IsLeader(player.GetGUID()) && !group->IsAssistant(player.GetGUID()))
668 return false;
669
670 return true;
671}
672}
673
675{
676 Group* group = GetPlayer()->GetGroup(setRestrictPingsToAssistants.PartyIndex);
677 if (!group)
678 return;
679
680 if (!group->IsLeader(GetPlayer()->GetGUID()))
681 return;
682
683 group->SetRestrictPingsToAssistants(setRestrictPingsToAssistants.RestrictPingsToAssistants);
684}
685
687{
688 Group const* group = nullptr;
689 if (!CanSendPing(*_player, pingUnit.Type, group))
690 return;
691
692 Unit const* target = ObjectAccessor::GetUnit(*_player, pingUnit.TargetGUID);
693 if (!target || !_player->HaveAtClient(target))
694 return;
695
696 WorldPackets::Party::ReceivePingUnit broadcastPingUnit;
697 broadcastPingUnit.SenderGUID = _player->GetGUID();
698 broadcastPingUnit.TargetGUID = pingUnit.TargetGUID;
699 broadcastPingUnit.Type = pingUnit.Type;
700 broadcastPingUnit.PinFrameID = pingUnit.PinFrameID;
701 broadcastPingUnit.Write();
702
703 for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
704 {
705 Player const* member = itr->GetSource();
706 if (_player == member || !_player->IsInMap(member))
707 continue;
708
709 member->SendDirectMessage(broadcastPingUnit.GetRawPacket());
710 }
711}
712
714{
715 Group const* group = nullptr;
716 if (!CanSendPing(*_player, pingWorldPoint.Type, group))
717 return;
718
719 if (_player->GetMapId() != pingWorldPoint.MapID)
720 return;
721
722 WorldPackets::Party::ReceivePingWorldPoint broadcastPingWorldPoint;
723 broadcastPingWorldPoint.SenderGUID = _player->GetGUID();
724 broadcastPingWorldPoint.MapID = pingWorldPoint.MapID;
725 broadcastPingWorldPoint.Point = pingWorldPoint.Point;
726 broadcastPingWorldPoint.Type = pingWorldPoint.Type;
727 broadcastPingWorldPoint.PinFrameID = pingWorldPoint.PinFrameID;
728 broadcastPingWorldPoint.Write();
729
730 for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
731 {
732 Player const* member = itr->GetSource();
733 if (_player == member || !_player->IsInMap(member))
734 continue;
735
736 member->SendDirectMessage(broadcastPingWorldPoint.GetRawPacket());
737 }
738}
uint8_t uint8
Definition: Define.h:144
uint32_t uint32
Definition: Define.h:142
#define ASSERT
Definition: Errors.h:68
#define sGroupMgr
Definition: GroupMgr.h:61
@ 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__,...)
Definition: Log.h:165
@ ERR_TARGET_NOT_IN_GROUP_S
@ ERR_IGNORING_YOU_S
@ ERR_ALREADY_IN_GROUP_S
@ ERR_BAD_PLAYER_NAME_S
@ ERR_TARGET_NOT_IN_INSTANCE_S
@ ERR_PLAYER_WRONG_FACTION
@ GROUP_REMOVEMETHOD_KICK
@ GROUP_REMOVEMETHOD_LEAVE
PartyResult
@ ERR_INVITE_RESTRICTED
@ ERR_PARTY_RESULT_OK
static Summons Group[]
Definition: boss_urom.cpp:83
GroupReference * next()
Definition: Group.h:197
void BroadcastGroupUpdate(void)
Definition: Group.cpp:1411
void SwapMembersGroups(ObjectGuid firstGuid, ObjectGuid secondGuid)
Definition: Group.cpp:1080
bool AddLeaderInvite(Player *player)
Definition: Group.cpp:377
void DeleteRaidMarker(uint8 markerId)
Definition: Group.cpp:1596
void SendTargetIconList(WorldSession *session)
Definition: Group.cpp:821
GroupCategory GetGroupCategory() const
Definition: Group.h:295
bool IsCreated() const
Definition: Group.cpp:1653
uint8 GetLfgRoles(ObjectGuid guid)
Definition: Group.cpp:1475
void ChangeMembersGroup(ObjectGuid guid, uint8 group)
Definition: Group.cpp:1028
void SetEveryoneIsAssistant(bool apply)
Definition: Group.cpp:1887
void RemoveAllInvites()
Definition: Group.cpp:397
bool IsAssistant(ObjectGuid guid) const
Definition: Group.h:311
void Disband(bool hideDestroy=false)
Definition: Group.cpp:733
bool AddMember(Player *player)
Definition: Group.cpp:426
bool IsLeader(ObjectGuid guid) const
Definition: Group.cpp:1700
bool IsRestrictPingsToAssistants() const
Definition: Group.cpp:1910
void SendUpdate()
Definition: Group.cpp:834
void SetMemberReadyCheck(ObjectGuid guid, bool ready)
Definition: Group.cpp:1542
void RemoveInvite(Player *player)
Definition: Group.cpp:388
void ConvertToRaid()
Definition: Group.cpp:301
void StartReadyCheck(ObjectGuid starterGuid, Milliseconds duration=Milliseconds(READYCHECK_DURATION))
Definition: Group.cpp:1494
uint32 GetMembersCount() const
Definition: Group.h:327
void SendRaidMarkersChanged(WorldSession *session=nullptr)
Definition: Group.cpp:1611
void SetLfgRoles(ObjectGuid guid, uint8 roles)
Definition: Group.cpp:1465
void SetGroupMemberFlag(ObjectGuid guid, bool apply, GroupMemberFlags flag)
Definition: Group.cpp:1760
void ChangeLeader(ObjectGuid guid)
Definition: Group.cpp:688
Player * GetInvited(ObjectGuid guid) const
Definition: Group.cpp:406
bool HasFreeSlotSubGroup(uint8 subgroup) const
Definition: Group.cpp:1737
bool IsMember(ObjectGuid guid) const
Definition: Group.cpp:1695
GroupReference * GetFirstMember()
Definition: Group.h:325
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignoredPlayer=ObjectGuid::Empty) const
Definition: Group.cpp:980
bool AddInvite(Player *player)
Definition: Group.cpp:356
void ConvertToGroup()
Definition: Group.cpp:325
void SetRestrictPingsToAssistants(bool restrictPingsToAssistants)
Definition: Group.cpp:1915
void SetTargetIcon(uint8 symbol, ObjectGuid target, ObjectGuid changedBy)
Definition: Group.cpp:800
bool Create(Player *leader)
Definition: Group.cpp:141
bool IsFull() const
Definition: Group.cpp:1628
ObjectGuid GetLeaderGUID() const
Definition: Group.cpp:1658
bool isRaidGroup() const
Definition: Group.cpp:1638
void RemoveUniqueGroupMemberFlag(GroupMemberFlags flag)
Definition: Group.cpp:1861
static ObjectGuid const Empty
Definition: ObjectGuid.h:274
bool IsPlayer() const
Definition: ObjectGuid.h:326
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
bool HasIgnore(ObjectGuid const &ignoreGuid, ObjectGuid const &ignoreAccountGuid)
Definition: SocialMgr.cpp:189
bool HasFriend(ObjectGuid const &friendGuid)
Definition: SocialMgr.cpp:184
bool HaveAtClient(Object const *u) const
Definition: Player.cpp:23726
PlayerSocial * GetSocial() const
Definition: Player.h:1163
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:6324
uint32 DoRandomRoll(uint32 minimum, uint32 maximum)
Definition: Player.cpp:29841
PartyResult CanUninviteFromGroup(ObjectGuid guidMember, Optional< uint8 > partyIndex) const
Definition: Player.cpp:25920
bool InBattleground() const
Definition: Player.h:2394
void SendRaidInfo()
Definition: Player.cpp:19688
WorldSession * GetSession() const
Definition: Player.h:2101
void SetPassOnGroupLoot(bool bPassOnGroupLoot)
Definition: Player.h:2630
Difficulty GetDungeonDifficultyID() const
Definition: Player.h:2012
bool IsGameMaster() const
Definition: Player.h:1178
static void RemoveFromGroup(Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, char const *reason=nullptr)
Definition: Player.cpp:2189
Group * GetGroup(Optional< uint8 > partyIndex)
Definition: Player.h:2606
void UninviteFromGroup()
Definition: Player.cpp:2166
Group * GetGroupInvite() const
Definition: Player.h:2604
Team GetTeam() const
Definition: Player.h:2235
Definition: Unit.h:627
uint8 GetLevel() const
Definition: Unit.h:746
constexpr uint32 GetMapId() const
Definition: Position.h:201
bool IsHostileTo(WorldObject const *target) const
Definition: Object.cpp:2860
uint32 GetInstanceId() const
Definition: Object.h:521
std::string const & GetName() const
Definition: Object.h:555
bool IsInMap(WorldObject const *obj) const
Definition: Object.cpp:1115
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
void Initialize(Player const *player)
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
TaggedPosition< Position::XYZ > Point
Definition: PartyPackets.h:729
WorldPacket const * Write() override
WorldPacket const * Write() override
TaggedPosition< Position::XYZ > Point
Definition: PartyPackets.h:715
Optional< uint8 > PartyIndex
Definition: PartyPackets.h:250
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)
PartyOperation
Definition: WorldSession.h:883
@ PARTY_OP_INVITE
Definition: WorldSession.h:884
@ PARTY_OP_UNINVITE
Definition: WorldSession.h:885
@ PARTY_OP_LEAVE
Definition: WorldSession.h:886
#define sWorld
Definition: World.h:931
@ CONFIG_PARTY_LEVEL_REQ
Definition: World.h:326
@ CONFIG_ALLOW_GM_GROUP
Definition: World.h:120
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition: World.h:111
TC_GAME_API bool GetName(uint32 accountId, std::string &name)
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 &)
std::string ToString(Type &&val, Params &&... params)