AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Group Class Reference

#include "Group.h"

Classes

struct  MemberSlot
 

Public Types

typedef std::list< MemberSlotMemberSlotList
 
typedef MemberSlotList::const_iterator member_citerator
 

Public Member Functions

 Group ()
 
 ~Group ()
 
bool Create (Player *leader)
 
bool LoadGroupFromDB (Field *field)
 
void LoadMemberFromDB (ObjectGuid::LowType guidLow, uint8 memberFlags, uint8 subgroup, uint8 roles)
 
bool AddInvite (Player *player)
 
void RemoveInvite (Player *player)
 
void RemoveAllInvites ()
 
bool AddLeaderInvite (Player *player)
 
bool AddMember (Player *player)
 
bool RemoveMember (ObjectGuid guid, const RemoveMethod &method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
 
void ChangeLeader (ObjectGuid guid)
 
void SetLootMethod (LootMethod method)
 
void SetLooterGuid (ObjectGuid guid)
 
void SetMasterLooterGuid (ObjectGuid guid)
 
void UpdateLooterGuid (WorldObject *pLootedObject, bool ifneed=false)
 
void SetLootThreshold (ItemQualities threshold)
 
void Disband (bool hideDestroy=false)
 
void SetLfgRoles (ObjectGuid guid, const uint8 roles)
 
bool IsFull () const
 
bool isLFGGroup (bool restricted=false) const
 
bool isRaidGroup () const
 
bool isBFGroup () const
 
bool isBGGroup () const
 
bool IsCreated () const
 
GroupType GetGroupType () const
 
ObjectGuid GetLeaderGUID () const
 
PlayerGetLeader ()
 
ObjectGuid GetGUID () const
 
const char * GetLeaderName () const
 
LootMethod GetLootMethod () const
 
ObjectGuid GetLooterGuid () const
 
ObjectGuid GetMasterLooterGuid () const
 
ItemQualities GetLootThreshold () const
 
bool IsMember (ObjectGuid guid) const
 
bool IsLeader (ObjectGuid guid) const
 
ObjectGuid GetMemberGUID (const std::string &name)
 
bool IsAssistant (ObjectGuid guid) const
 
PlayerGetInvited (ObjectGuid guid) const
 
PlayerGetInvited (const std::string &name) const
 
bool SameSubGroup (ObjectGuid guid1, ObjectGuid guid2) const
 
bool SameSubGroup (ObjectGuid guid1, MemberSlot const *slot2) const
 
bool SameSubGroup (Player const *member1, Player const *member2) const
 
bool HasFreeSlotSubGroup (uint8 subgroup) const
 
MemberSlotList const & GetMemberSlots () const
 
GroupReferenceGetFirstMember ()
 
GroupReference const * GetFirstMember () const
 
uint32 GetMembersCount () const
 
uint32 GetInviteeCount () const
 
uint8 GetMemberGroup (ObjectGuid guid) const
 
void ConvertToLFG (bool restricted=true)
 
bool CheckLevelForRaid ()
 
void ConvertToRaid ()
 
void SetBattlegroundGroup (Battleground *bg)
 
void SetBattlefieldGroup (Battlefield *bf)
 
GroupJoinBattlegroundResult CanJoinBattlegroundQueue (Battleground const *bgTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot)
 
void DoMinimapPing (ObjectGuid sourceGuid, float mapX, float mapY)
 
void ChangeMembersGroup (ObjectGuid guid, uint8 group)
 
void SetTargetIcon (uint8 id, ObjectGuid whoGuid, ObjectGuid targetGuid)
 
void SetGroupMemberFlag (ObjectGuid guid, bool apply, GroupMemberFlags flag)
 
void RemoveUniqueGroupMemberFlag (GroupMemberFlags flag)
 
Difficulty GetDifficulty (bool isRaid) const
 
Difficulty GetDungeonDifficulty () const
 
Difficulty GetRaidDifficulty () const
 
void SetDungeonDifficulty (Difficulty difficulty)
 
void SetRaidDifficulty (Difficulty difficulty)
 
uint16 InInstance ()
 
void ResetInstances (uint8 method, bool isRaid, Player *leader)
 
void SendTargetIconList (WorldSession *session)
 
void SendUpdate ()
 
void SendUpdateToPlayer (ObjectGuid playerGUID, MemberSlot *slot=nullptr)
 
void UpdatePlayerOutOfRange (Player *player)
 
void BroadcastPacket (WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
 
void BroadcastReadyCheck (WorldPacket const *packet)
 
void OfflineReadyCheck ()
 
bool isRollLootActive () const
 
void SendLootStartRoll (uint32 CountDown, uint32 mapid, const Roll &r)
 
void SendLootStartRollToPlayer (uint32 countDown, uint32 mapId, Player *p, bool canNeed, Roll const &r)
 
void SendLootRoll (ObjectGuid SourceGuid, ObjectGuid TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r, bool autoPass=false)
 
void SendLootRollWon (ObjectGuid SourceGuid, ObjectGuid TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r)
 
void SendLootAllPassed (Roll const &roll)
 
void SendLooter (Creature *creature, Player *pLooter)
 
void GroupLoot (Loot *loot, WorldObject *pLootedObject)
 
void NeedBeforeGreed (Loot *loot, WorldObject *pLootedObject)
 
void MasterLoot (Loot *loot, WorldObject *pLootedObject)
 
Rolls::iterator GetRoll (ObjectGuid Guid)
 
void CountTheRoll (Rolls::iterator roll, Map *allowedMap)
 
bool CountRollVote (ObjectGuid playerGUID, ObjectGuid Guid, uint8 Choise)
 
void EndRoll (Loot *loot, Map *allowedMap)
 
void ResetMaxEnchantingLevel ()
 
void LinkMember (GroupReference *pRef)
 
void BroadcastGroupUpdate (void)
 
void AddLfgBuffFlag ()
 
void AddLfgRandomInstanceFlag ()
 
void AddLfgHeroicFlag ()
 
bool IsLfgWithBuff () const
 
bool IsLfgRandomInstance () const
 
bool IsLfgHeroic () const
 
uint32 GetDifficultyChangePreventionTime () const
 
DifficultyPreventionChangeType GetDifficultyChangePreventionReason () const
 
void SetDifficultyChangePrevention (DifficultyPreventionChangeType type)
 
void DoForAllMembers (std::function< void(Player *)> const &worker)
 

Public Attributes

DataMap CustomData
 

Protected Types

typedef MemberSlotList::iterator member_witerator
 
typedef std::set< Player * > InvitesList
 
typedef std::vector< Roll * > Rolls
 

Protected Member Functions

void _homebindIfInstance (Player *player)
 
void _cancelHomebindIfInstance (Player *player)
 
void _initRaidSubGroupsCounter ()
 
member_citerator _getMemberCSlot (ObjectGuid Guid) const
 
member_witerator _getMemberWSlot (ObjectGuid Guid)
 
void SubGroupCounterIncrease (uint8 subgroup)
 
void SubGroupCounterDecrease (uint8 subgroup)
 
void ToggleGroupMemberFlag (member_witerator slot, uint8 flag, bool apply)
 

Protected Attributes

MemberSlotList m_memberSlots
 
GroupRefMgr m_memberMgr
 
InvitesList m_invitees
 
ObjectGuid m_leaderGuid
 
std::string m_leaderName
 
GroupType m_groupType
 
Difficulty m_dungeonDifficulty
 
Difficulty m_raidDifficulty
 
Battlefieldm_bfGroup
 
Battlegroundm_bgGroup
 
ObjectGuid m_targetIcons [TARGETICONCOUNT]
 
LootMethod m_lootMethod
 
ItemQualities m_lootThreshold
 
ObjectGuid m_looterGuid
 
ObjectGuid m_masterLooterGuid
 
Rolls RollId
 
uint8m_subGroupsCounts
 
ObjectGuid m_guid
 
uint32 m_counter
 
uint32 m_maxEnchantingLevel
 
uint8 m_lfgGroupFlags
 
uint32 _difficultyChangePreventionTime
 
DifficultyPreventionChangeType _difficultyChangePreventionType
 

Detailed Description

request member stats checken todo: uninvite people that not accepted invite

Member Typedef Documentation

◆ InvitesList

typedef std::set<Player*> Group::InvitesList
protected

◆ member_citerator

typedef MemberSlotList::const_iterator Group::member_citerator

◆ member_witerator

typedef MemberSlotList::iterator Group::member_witerator
protected

◆ MemberSlotList

typedef std::list<MemberSlot> Group::MemberSlotList

◆ Rolls

typedef std::vector<Roll*> Group::Rolls
protected

Constructor & Destructor Documentation

◆ Group()

Group::Group ( )
71{
72 sScriptMgr->OnConstructGroup(this);
73}
@ RAID_DIFFICULTY_10MAN_NORMAL
Definition DBCEnums.h:273
@ DUNGEON_DIFFICULTY_NORMAL
Definition DBCEnums.h:269
@ GROUPTYPE_NORMAL
Definition Group.h:86
@ DIFFICULTY_PREVENTION_CHANGE_NONE
Definition Group.h:133
@ FREE_FOR_ALL
Definition LootMgr.h:58
#define sScriptMgr
Definition ScriptMgr.h:728
@ ITEM_QUALITY_UNCOMMON
Definition SharedDefines.h:342
uint32 m_counter
Definition Group.h:356
Battlefield * m_bfGroup
Definition Group.h:346
uint32 m_maxEnchantingLevel
Definition Group.h:357
DifficultyPreventionChangeType _difficultyChangePreventionType
Definition Group.h:362
std::string m_leaderName
Definition Group.h:342
Battleground * m_bgGroup
Definition Group.h:347
Difficulty m_raidDifficulty
Definition Group.h:345
LootMethod m_lootMethod
Definition Group.h:349
uint8 * m_subGroupsCounts
Definition Group.h:354
Difficulty m_dungeonDifficulty
Definition Group.h:344
ItemQualities m_lootThreshold
Definition Group.h:350
GroupType m_groupType
Definition Group.h:343
uint32 _difficultyChangePreventionTime
Definition Group.h:361

References sScriptMgr.

◆ ~Group()

Group::~Group ( )
76{
77 sScriptMgr->OnDestructGroup(this);
78
79 if (m_bgGroup)
80 {
81 LOG_DEBUG("bg.battleground", "Group::~Group: battleground group being deleted.");
82
83 if (m_bgGroup->GetBgRaid(TEAM_ALLIANCE) == this)
84 {
86 }
87 else if (m_bgGroup->GetBgRaid(TEAM_HORDE) == this)
88 {
90 }
91 else
92 LOG_ERROR("bg.battleground", "Group::~Group: battleground group is not linked to the correct battleground.");
93 }
94
95 Rolls::iterator itr;
96 while (!RollId.empty())
97 {
98 itr = RollId.begin();
99 Roll* r = *itr;
100 RollId.erase(itr);
101 delete(r);
102 }
103
104 // Sub group counters clean up
105 delete[] m_subGroupsCounts;
106}
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
@ TEAM_ALLIANCE
Definition SharedDefines.h:771
@ TEAM_HORDE
Definition SharedDefines.h:772
Group * GetBgRaid(TeamId teamId) const
Definition Battleground.h:482
void SetBgRaid(TeamId teamId, Group *bg_raid)
Definition Battleground.cpp:1846
Rolls RollId
Definition Group.h:353
Definition Group.h:143

References Battleground::GetBgRaid(), LOG_DEBUG, LOG_ERROR, m_bgGroup, m_subGroupsCounts, RollId, Battleground::SetBgRaid(), sScriptMgr, TEAM_ALLIANCE, and TEAM_HORDE.

Member Function Documentation

◆ _cancelHomebindIfInstance()

void Group::_cancelHomebindIfInstance ( Player player)
protected
2200{
2201 // if player is reinvited to group and in the instance - cancel homebind timer
2202 if (!player->FindMap() || !player->FindMap()->IsDungeon())
2203 return;
2204 InstancePlayerBind* bind = sInstanceSaveMgr->PlayerGetBoundInstance(player->GetGUID(), player->FindMap()->GetId(), player->GetDifficulty(player->FindMap()->IsRaid()));
2205 if (bind && bind->save->GetInstanceId() == player->GetInstanceId())
2206 player->m_InstanceValid = true;
2207}
#define sInstanceSaveMgr
Definition InstanceSaveMgr.h:202
uint32 GetInstanceId() const
Definition InstanceSaveMgr.h:61
bool IsDungeon() const
Definition Map.h:292
bool IsRaid() const
Definition Map.h:294
uint32 GetId() const
Definition Map.h:226
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:113
bool m_InstanceValid
Definition Player.h:2446
Difficulty GetDifficulty(bool isRaid) const
Definition Player.h:1922
Map * FindMap() const
Definition Object.h:622
uint32 GetInstanceId() const
Definition Object.h:510
Definition InstanceSaveMgr.h:39
InstanceSave * save
Definition InstanceSaveMgr.h:40

References WorldObject::FindMap(), Player::GetDifficulty(), Object::GetGUID(), Map::GetId(), WorldObject::GetInstanceId(), InstanceSave::GetInstanceId(), Map::IsDungeon(), Map::IsRaid(), Player::m_InstanceValid, InstancePlayerBind::save, and sInstanceSaveMgr.

Referenced by AddMember().

◆ _getMemberCSlot()

Group::member_citerator Group::_getMemberCSlot ( ObjectGuid  Guid) const
protected
2500{
2501 for (member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr)
2502 if (itr->guid == Guid)
2503 return itr;
2504 return m_memberSlots.end();
2505}
MemberSlotList m_memberSlots
Definition Group.h:338
MemberSlotList::const_iterator member_citerator
Definition Group.h:180

References m_memberSlots.

Referenced by GetMemberGroup(), IsAssistant(), IsMember(), SameSubGroup(), SameSubGroup(), and UpdateLooterGuid().

◆ _getMemberWSlot()

Group::member_witerator Group::_getMemberWSlot ( ObjectGuid  Guid)
protected
2508{
2509 for (member_witerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr)
2510 if (itr->guid == Guid)
2511 return itr;
2512 return m_memberSlots.end();
2513}
MemberSlotList::iterator member_witerator
Definition Group.h:183

References m_memberSlots.

Referenced by ChangeLeader(), ChangeMembersGroup(), RemoveMember(), SendUpdateToPlayer(), SetGroupMemberFlag(), and SetLfgRoles().

◆ _homebindIfInstance()

void Group::_homebindIfInstance ( Player player)
protected
2194{
2195 if (player && !player->IsGameMaster() && player->FindMap() && sMapStore.LookupEntry(player->GetMapId())->IsDungeon())
2196 player->m_InstanceValid = false;
2197}
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
bool IsGameMaster() const
Definition Player.h:1166
uint32 GetMapId() const
Definition Position.h:280

References WorldObject::FindMap(), WorldLocation::GetMapId(), Map::IsDungeon(), Player::IsGameMaster(), Player::m_InstanceValid, and sMapStore.

Referenced by Disband(), and RemoveMember().

◆ _initRaidSubGroupsCounter()

void Group::_initRaidSubGroupsCounter ( )
protected
2488{
2489 // Sub group counters initialization
2490 if (!m_subGroupsCounts)
2492
2493 memset((void*)m_subGroupsCounts, 0, (MAX_RAID_SUBGROUPS)*sizeof(uint8));
2494
2495 for (member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr)
2496 ++m_subGroupsCounts[itr->group];
2497}
std::uint8_t uint8
Definition Define.h:109
#define MAX_RAID_SUBGROUPS
Definition Group.h:45

References m_memberSlots, m_subGroupsCounts, and MAX_RAID_SUBGROUPS.

Referenced by ConvertToRaid(), Create(), and LoadGroupFromDB().

◆ AddInvite()

bool Group::AddInvite ( Player player)
321{
322 if (!player || player->GetGroupInvite())
323 return false;
324 Group* group = player->GetGroup();
325 if (group && (group->isBGGroup() || group->isBFGroup()))
326 group = player->GetOriginalGroup();
327 if (group)
328 return false;
329
330 RemoveInvite(player);
331
332 m_invitees.insert(player);
333
334 player->SetGroupInvite(this);
335
336 sScriptMgr->OnGroupInviteMember(this, player->GetGUID());
337
338 return true;
339}
Definition Group.h:169
InvitesList m_invitees
Definition Group.h:340
void RemoveInvite(Player *player)
Definition Group.cpp:351
bool isBGGroup() const
Definition Group.cpp:2286
bool isBFGroup() const
Definition Group.cpp:2291
void SetGroupInvite(Group *group)
Definition Player.h:2477
Group * GetGroup()
Definition Player.h:2478
Group * GetGroupInvite()
Definition Player.h:2476
Group * GetOriginalGroup()
Definition Player.h:2493

References Player::GetGroup(), Player::GetGroupInvite(), Object::GetGUID(), Player::GetOriginalGroup(), isBFGroup(), isBGGroup(), m_invitees, RemoveInvite(), Player::SetGroupInvite(), and sScriptMgr.

Referenced by AddLeaderInvite(), and WorldSession::HandleGroupInviteOpcode().

◆ AddLeaderInvite()

bool Group::AddLeaderInvite ( Player player)
342{
343 if (!AddInvite(player))
344 return false;
345
346 m_leaderGuid = player->GetGUID();
347 m_leaderName = player->GetName();
348 return true;
349}
ObjectGuid m_leaderGuid
Definition Group.h:341
bool AddInvite(Player *player)
Definition Group.cpp:320
std::string const & GetName() const
Definition Object.h:525

References AddInvite(), Object::GetGUID(), WorldObject::GetName(), m_leaderGuid, and m_leaderName.

Referenced by WorldSession::HandleGroupInviteOpcode().

◆ AddLfgBuffFlag()

void Group::AddLfgBuffFlag ( )
inline
@ GROUP_LFG_FLAG_APPLY_RANDOM_BUFF
Definition Group.h:126
uint8 m_lfgGroupFlags
Definition Group.h:358

References GROUP_LFG_FLAG_APPLY_RANDOM_BUFF, and m_lfgGroupFlags.

Referenced by lfg::LFGMgr::MakeNewGroup().

◆ AddLfgHeroicFlag()

void Group::AddLfgHeroicFlag ( )
inline
@ GROUP_LFG_FLAG_IS_HEROIC
Definition Group.h:128

References GROUP_LFG_FLAG_IS_HEROIC, and m_lfgGroupFlags.

Referenced by lfg::LFGMgr::MakeNewGroup().

◆ AddLfgRandomInstanceFlag()

void Group::AddLfgRandomInstanceFlag ( )
inline
@ GROUP_LFG_FLAG_IS_RANDOM_INSTANCE
Definition Group.h:127

References GROUP_LFG_FLAG_IS_RANDOM_INSTANCE, and m_lfgGroupFlags.

Referenced by lfg::LFGMgr::MakeNewGroup().

◆ AddMember()

bool Group::AddMember ( Player player)
391{
392 if (!player)
393 return false;
394
395 // Get first not-full group
396 uint8 subGroup = 0;
398 {
399 bool groupFound = false;
400 for (; subGroup < MAX_RAID_SUBGROUPS; ++subGroup)
401 {
402 if (m_subGroupsCounts[subGroup] < MAXGROUPSIZE)
403 {
404 groupFound = true;
405 break;
406 }
407 }
408 // We are raid group and no one slot is free
409 if (!groupFound)
410 return false;
411 }
412
413 MemberSlot member;
414 member.guid = player->GetGUID();
415 member.name = player->GetName();
416 member.group = subGroup;
417 member.flags = 0;
418 member.roles = 0;
419 m_memberSlots.push_back(member);
420
421 if (!isBGGroup() && !isBFGroup())
422 {
423 sCharacterCache->UpdateCharacterGroup(player->GetGUID(), GetGUID());
424 }
425
426 SubGroupCounterIncrease(subGroup);
427
428 player->SetGroupInvite(nullptr);
429 if (player->GetGroup())
430 {
431 if (isBGGroup() || isBFGroup()) // if player is in group and he is being added to BG raid group, then call SetBattlegroundRaid()
432 player->SetBattlegroundOrBattlefieldRaid(this, subGroup);
433 else //if player is in bg raid and we are adding him to normal group, then call SetOriginalGroup()
434 player->SetOriginalGroup(this, subGroup);
435 }
436 else //if player is not in group, then call set group
437 player->SetGroup(this, subGroup);
438
439 // if the same group invites the player back, cancel the homebind timer
441
442 if (!isRaidGroup()) // reset targetIcons for non-raid-groups
443 {
444 for (uint8 i = 0; i < TARGETICONCOUNT; ++i)
445 m_targetIcons[i].Clear();
446 }
447
448 if (!isBGGroup() && !isBFGroup())
449 {
451 stmt->SetData(0, GetGUID().GetCounter());
452 stmt->SetData(1, member.guid.GetCounter());
453 stmt->SetData(2, member.flags);
454 stmt->SetData(3, member.group);
455 stmt->SetData(4, member.roles);
456 CharacterDatabase.Execute(stmt);
457 }
458
459 SendUpdate();
460
461 if (player)
462 {
463 sScriptMgr->OnGroupAddMember(this, player->GetGUID());
464
465 if (!IsLeader(player->GetGUID()) && !isBGGroup() && !isBFGroup())
466 {
468
470 {
472 player->SendDungeonDifficulty(true);
473 }
474 if (player->GetRaidDifficulty() != GetRaidDifficulty())
475 {
477 player->SendRaidDifficulty(true);
478 }
479 }
480 else if (IsLeader(player->GetGUID()) && isLFGGroup()) // pussywizard
481 {
483 }
484
487
488 // quest related GO state dependent from raid membership
489 if (isRaidGroup())
491
492 {
493 // Broadcast new player group member fields to rest of the group
495
496 UpdateData groupData;
497 WorldPacket groupDataPacket;
498
499 // Broadcast group members' fields to player
500 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
501 {
502 if (itr->GetSource() == player) // pussywizard: no check same map, adding members is single threaded
503 {
504 continue;
505 }
506
507 if (Player* itrMember = itr->GetSource())
508 {
509 if (player->HaveAtClient(itrMember))
510 {
511 itrMember->SetFieldNotifyFlag(UF_FLAG_PARTY_MEMBER);
512 itrMember->BuildValuesUpdateBlockForPlayer(&groupData, player);
513 itrMember->RemoveFieldNotifyFlag(UF_FLAG_PARTY_MEMBER);
514 }
515
516 if (itrMember->HaveAtClient(player))
517 {
518 UpdateData newData;
519 WorldPacket newDataPacket;
520 player->BuildValuesUpdateBlockForPlayer(&newData, itrMember);
521 if (newData.HasData())
522 {
523 newData.BuildPacket(newDataPacket);
524 itrMember->SendDirectMessage(&newDataPacket);
525 }
526 }
527 }
528 }
529
530 if (groupData.HasData())
531 {
532 groupData.BuildPacket(groupDataPacket);
533 player->SendDirectMessage(&groupDataPacket);
534 }
535
537 }
538
539 if (m_maxEnchantingLevel < player->GetSkillValue(SKILL_ENCHANTING))
541 }
542
543 return true;
544}
#define sCharacterCache
Definition CharacterCache.h:83
@ CHAR_REP_GROUP_MEMBER
Definition CharacterDatabase.h:284
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
#define TARGETICONCOUNT
Definition Group.h:46
#define MAXGROUPSIZE
Definition Group.h:43
@ GROUP_UPDATE_FULL
Definition Group.h:121
@ INSTANCE_RESET_GROUP_JOIN
Definition Map.h:622
@ SKILL_ENCHANTING
Definition SharedDefines.h:3204
@ UF_FLAG_PARTY_MEMBER
Definition UpdateFieldFlags.h:33
Definition GroupReference.h:27
GroupReference * next()
Definition GroupReference.h:36
bool isLFGGroup(bool restricted=false) const
Definition Group.cpp:2275
bool IsLeader(ObjectGuid guid) const
Definition Group.cpp:2351
void SendUpdate()
Definition Group.cpp:1665
ObjectGuid GetGUID() const
Definition Group.cpp:2316
void _cancelHomebindIfInstance(Player *player)
Definition Group.cpp:2199
Difficulty GetRaidDifficulty() const
Definition Group.cpp:2463
ObjectGuid m_targetIcons[TARGETICONCOUNT]
Definition Group.h:348
void UpdatePlayerOutOfRange(Player *player)
Definition Group.cpp:1741
GroupReference * GetFirstMember()
Definition Group.h:243
void SubGroupCounterIncrease(uint8 subgroup)
Definition Group.cpp:2515
Difficulty GetDungeonDifficulty() const
Definition Group.cpp:2458
bool isRaidGroup() const
Definition Group.cpp:2281
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition Object.cpp:246
void RemoveFieldNotifyFlag(uint16 flag)
Definition Object.h:196
void SetFieldNotifyFlag(uint16 flag)
Definition Object.h:195
Definition Player.h:1072
Difficulty GetRaidDifficulty() const
Definition Player.h:1924
void SetOriginalGroup(Group *group, int8 subgroup=-1)
Definition Player.cpp:13136
void SetGroupUpdateFlag(uint32 flag)
Definition Player.h:2484
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5728
uint16 GetSkillValue(uint32 skill) const
Definition Player.cpp:5486
void SetDungeonDifficulty(Difficulty dungeon_difficulty)
Definition Player.h:1926
void SetGroup(Group *group, int8 subgroup=-1)
Definition Player.cpp:11590
bool HaveAtClient(WorldObject const *u) const
Definition Player.cpp:11448
void UpdateForQuestWorldObjects()
Definition PlayerUpdates.cpp:1781
void SetRaidDifficulty(Difficulty raid_difficulty)
Definition Player.h:1927
void SendDungeonDifficulty(bool IsInGroup)
Definition PlayerMisc.cpp:167
static void ResetInstances(ObjectGuid guid, uint8 method, bool isRaid)
Reset all solo instances and optionally send a message on success for each.
Definition PlayerMisc.cpp:195
Difficulty GetDungeonDifficulty() const
Definition Player.h:1923
void SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty=-1)
Definition PlayerMisc.cpp:177
void SetBattlegroundOrBattlefieldRaid(Group *group, int8 subgroup=-1)
Definition Player.cpp:13108
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157
Definition UpdateData.h:52
bool HasData() const
Definition UpdateData.h:60
bool BuildPacket(WorldPacket &packet)
Definition UpdateData.cpp:48
Definition WorldPacket.h:26

References _cancelHomebindIfInstance(), UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), CHAR_REP_GROUP_MEMBER, CharacterDatabase, Group::MemberSlot::flags, ObjectGuid::GetCounter(), Player::GetDungeonDifficulty(), GetDungeonDifficulty(), GetFirstMember(), Player::GetGroup(), GetGUID(), Object::GetGUID(), WorldObject::GetName(), Player::GetRaidDifficulty(), GetRaidDifficulty(), Player::GetSkillValue(), Group::MemberSlot::group, GROUP_UPDATE_FULL, Group::MemberSlot::guid, UpdateData::HasData(), Player::HaveAtClient(), INSTANCE_RESET_GROUP_JOIN, isBFGroup(), isBGGroup(), IsLeader(), isLFGGroup(), isRaidGroup(), m_maxEnchantingLevel, m_memberSlots, m_subGroupsCounts, m_targetIcons, MAX_RAID_SUBGROUPS, MAXGROUPSIZE, Group::MemberSlot::name, GroupReference::next(), Object::RemoveFieldNotifyFlag(), Player::ResetInstances(), Group::MemberSlot::roles, sCharacterCache, Player::SendDirectMessage(), Player::SendDungeonDifficulty(), Player::SendRaidDifficulty(), SendUpdate(), Player::SetBattlegroundOrBattlefieldRaid(), PreparedStatementBase::SetData(), Player::SetDungeonDifficulty(), Object::SetFieldNotifyFlag(), Player::SetGroup(), Player::SetGroupInvite(), Player::SetGroupUpdateFlag(), Player::SetOriginalGroup(), Player::SetRaidDifficulty(), SKILL_ENCHANTING, sScriptMgr, SubGroupCounterIncrease(), TARGETICONCOUNT, UF_FLAG_PARTY_MEMBER, Player::UpdateForQuestWorldObjects(), and UpdatePlayerOutOfRange().

Referenced by Battlefield::AddOrSetPlayerToCorrectBfGroup(), Battleground::AddOrSetPlayerToCorrectBgGroup(), Arena::AddPlayer(), Create(), group_commandscript::HandleGroupJoinCommand(), and lfg::LFGMgr::MakeNewGroup().

◆ BroadcastGroupUpdate()

void Group::BroadcastGroupUpdate ( void  )
2210{
2211 // FG: HACK: force flags update on group leave - for values update hack
2212 // -- not very efficient but safe
2213 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
2214 {
2215 Player* pp = ObjectAccessor::FindPlayer(citr->guid);
2216 if (pp)
2217 {
2220 LOG_DEBUG("group", "-- Forced group value update for '{}'", pp->GetName());
2221 }
2222 }
2223}
@ UNIT_FIELD_FACTIONTEMPLATE
Definition UpdateFields.h:115
@ UNIT_FIELD_BYTES_2
Definition UpdateFields.h:161
void ForceValuesUpdateAtIndex(uint32)
Definition Object.cpp:2052
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245

References ObjectAccessor::FindPlayer(), Object::ForceValuesUpdateAtIndex(), WorldObject::GetName(), LOG_DEBUG, m_memberSlots, UNIT_FIELD_BYTES_2, and UNIT_FIELD_FACTIONTEMPLATE.

Referenced by group_commandscript::HandleGroupJoinCommand(), and RemoveMember().

◆ BroadcastPacket()

void Group::BroadcastPacket ( WorldPacket const *  packet,
bool  ignorePlayersInBGRaid,
int  group = -1,
ObjectGuid  ignore = ObjectGuid::Empty 
)
1758{
1759 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1760 {
1761 Player* player = itr->GetSource();
1762 if (!player || (ignore && player->GetGUID() == ignore) || (ignorePlayersInBGRaid && player->GetGroup() != this))
1763 continue;
1764
1765 if (group == -1 || itr->getSubGroup() == group)
1766 player->GetSession()->SendPacket(packet);
1767 }
1768}
WorldSession * GetSession() const
Definition Player.h:2005
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition WorldSession.cpp:251

References GetFirstMember(), Player::GetGroup(), Object::GetGUID(), Player::GetSession(), GroupReference::next(), and WorldSession::SendPacket().

Referenced by ChangeLeader(), DoMinimapPing(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleRaidReadyCheckFinishedOpcode(), WorldSession::HandleRaidReadyCheckOpcode(), Unit::Kill(), SendLooter(), Player::SendNewItem(), and SetTargetIcon().

◆ BroadcastReadyCheck()

void Group::BroadcastReadyCheck ( WorldPacket const *  packet)
1771{
1772 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1773 {
1774 Player* player = itr->GetSource();
1775 if (player)
1776 if (IsLeader(player->GetGUID()) || IsAssistant(player->GetGUID()))
1777 player->GetSession()->SendPacket(packet);
1778 }
1779}
bool IsAssistant(ObjectGuid guid) const
Definition Group.cpp:2365

References GetFirstMember(), Object::GetGUID(), Player::GetSession(), IsAssistant(), IsLeader(), GroupReference::next(), and WorldSession::SendPacket().

Referenced by WorldSession::HandleRaidReadyCheckOpcode(), and OfflineReadyCheck().

◆ CanJoinBattlegroundQueue()

GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue ( Battleground const *  bgTemplate,
BattlegroundQueueTypeId  bgQueueTypeId,
uint32  MinPlayerCount,
uint32  MaxPlayerCount,
bool  isRated,
uint32  arenaSlot 
)
1931{
1932 // check if this group is LFG group
1933 if (isLFGGroup())
1935
1936 BattlemasterListEntry const* bgEntry = sBattlemasterListStore.LookupEntry(bgTemplate->GetBgTypeID());
1937 if (!bgEntry)
1939
1940 // too many players in the group
1941 if (GetMembersCount() > bgEntry->maxGroupSize)
1942 return ERR_BATTLEGROUND_NONE;
1943
1944 // get a player as reference, to compare other players' stats to (arena team id, level bracket, etc.)
1945 Player* reference = GetFirstMember()->GetSource();
1946 if (!reference)
1948
1949 PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bgTemplate->GetMapId(), reference->GetLevel());
1950 if (!bracketEntry)
1952
1953 uint32 arenaTeamId = reference->GetArenaTeamId(arenaSlot);
1954 TeamId teamId = reference->GetTeamId();
1955
1957
1958 // check every member of the group to be able to join
1959 uint32 memberscount = 0;
1960 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next(), ++memberscount)
1961 {
1962 Player* member = itr->GetSource();
1963
1964 // don't let join with offline members
1965 if (!member)
1967
1968 if (!sScriptMgr->CanGroupJoinBattlegroundQueue(this, member, bgTemplate, MinPlayerCount, isRated, arenaSlot))
1970
1971 // don't allow cross-faction groups to join queue
1972 if (member->GetTeamId() != teamId && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP))
1974
1975 // don't let join rated matches if the arena team id doesn't match
1976 if (isRated && member->GetArenaTeamId(arenaSlot) != arenaTeamId)
1978
1979 // not in the same battleground level braket, don't let join
1980 PvPDifficultyEntry const* memberBracketEntry = GetBattlegroundBracketByLevel(bracketEntry->mapId, member->GetLevel());
1981 if (memberBracketEntry != bracketEntry)
1983
1984 // check for deserter debuff in case not arena queue
1985 if (bgTemplate->GetBgTypeID() != BATTLEGROUND_AA && !member->CanJoinToBattleground())
1987
1988 // check if someone in party is using dungeon system
1989 lfg::LfgState lfgState = sLFGMgr->GetState(member->GetGUID());
1990 if (lfgState > lfg::LFG_STATE_NONE && (lfgState != lfg::LFG_STATE_QUEUED || !sWorld->getBoolConfig(CONFIG_ALLOW_JOIN_BG_AND_LFG)))
1991 {
1993 }
1994
1995 // pussywizard: prevent joining when any member is in bg/arena
1996 if (member->InBattleground())
1998
1999 // pussywizard: check for free slot, this is actually ensured before calling this function, but just in case
2000 if (!member->HasFreeBattlegroundQueueId())
2002
2003 // don't let join if someone from the group is already in that bg queue
2004 if (member->InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeId))
2005 {
2007 }
2008
2009 // don't let join if someone from the group is in bg queue random
2010 if (member->InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeIdRandom))
2011 return ERR_IN_RANDOM_BG;
2012
2013 // don't let join to bg queue random if someone from the group is already in bg queue
2014 if (bgTemplate->GetBgTypeID() == BATTLEGROUND_RB && member->InBattlegroundQueue())
2015 return ERR_IN_NON_RANDOM_BG;
2016
2017 // don't let Death Knights join BG queues when they are not allowed to be teleported yet
2018 if (member->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_TELEPORT) && member->GetMapId() == MAP_EBON_HOLD && !member->IsGameMaster() && !member->HasSpell(50977))
2020
2021 if (!member->GetBGAccessByLevel(bgTemplate->GetBgTypeID()))
2022 {
2024 }
2025 }
2026
2027 // for arenas: check party size is proper
2028 if (bgTemplate->isArena() && memberscount != MinPlayerCount)
2030
2031 //check against other arena team members
2032 if (isRated)
2033 {
2034 ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
2035 for (auto const& itr : arenaTeam->GetMembers())
2036 {
2037 Player* teamMember = ObjectAccessor::FindConnectedPlayer(itr.Guid);
2038 //are they online and not a member of this current group?
2039 if (teamMember && !IsMember(teamMember->GetGUID()))
2040 {
2041 //are they already in queue for a rated arena?
2042 if (teamMember->InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeId))
2043 {
2044 GroupQueueInfo ginfo;
2045 BattlegroundQueue& queue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId);
2046 if (queue.GetPlayerGroupInfoData(teamMember->GetGUID(), &ginfo))
2047 {
2048 if (ginfo.IsRated)
2050 }
2051 }
2052 //are they currently in an arena match?
2053 Battleground* bg = teamMember->GetBattleground(false);
2054 if (bg && bg->isRated() && bg->GetMinPlayersPerTeam() == MinPlayerCount)
2056 }
2057 }
2058 }
2059
2060 return GroupJoinBattlegroundResult(bgTemplate->GetBgTypeID());
2061}
@ MAP_EBON_HOLD
Definition AreaDefines.h:258
#define sArenaTeamMgr
Definition ArenaTeamMgr.h:69
#define sBattlegroundMgr
Definition BattlegroundMgr.h:187
DBCStorage< BattlemasterListEntry > sBattlemasterListStore(BattlemasterListEntryfmt)
PvPDifficultyEntry const * GetBattlegroundBracketByLevel(uint32 mapid, uint32 level)
Definition DBCStores.cpp:793
std::uint32_t uint32
Definition Define.h:107
#define sLFGMgr
Definition LFGMgr.h:641
GroupJoinBattlegroundResult
Definition SharedDefines.h:3901
@ ERR_BATTLEGROUND_JOIN_TIMED_OUT
Definition SharedDefines.h:3914
@ ERR_BATTLEGROUND_JOIN_FAILED
Definition SharedDefines.h:3915
@ ERR_LFG_CANT_USE_BATTLEGROUND
Definition SharedDefines.h:3916
@ ERR_IN_NON_RANDOM_BG
Definition SharedDefines.h:3918
@ ERR_BATTLEGROUND_NONE
Definition SharedDefines.h:3904
@ ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS
Definition SharedDefines.h:3905
@ ERR_ARENA_TEAM_PARTY_SIZE
Definition SharedDefines.h:3906
@ ERR_BATTLEGROUND_TOO_MANY_QUEUES
Definition SharedDefines.h:3907
@ ERR_GROUP_JOIN_BATTLEGROUND_FAIL
Definition SharedDefines.h:3903
@ ERR_BATTLEGROUND_JOIN_RANGE_INDEX
Definition SharedDefines.h:3913
@ ERR_IN_RANDOM_BG
Definition SharedDefines.h:3917
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:146
@ BATTLEGROUND_AA
Definition SharedDefines.h:3752
@ BATTLEGROUND_RB
Definition SharedDefines.h:3759
BattlegroundQueueTypeId
Definition SharedDefines.h:3885
TeamId
Definition SharedDefines.h:770
@ CLASS_CONTEXT_TELEPORT
Definition UnitDefines.h:230
@ CONFIG_ALLOW_JOIN_BG_AND_LFG
Definition WorldConfig.h:130
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition WorldConfig.h:34
Definition ArenaTeam.h:137
static BattlegroundQueueTypeId BGQueueTypeId(BattlegroundTypeId bgTypeId, uint8 arenaType)
Definition BattlegroundMgr.cpp:686
Definition BattlegroundQueue.h:64
bool GetPlayerGroupInfoData(ObjectGuid guid, GroupQueueInfo *ginfo)
Definition BattlegroundQueue.cpp:385
Definition Battleground.h:294
uint32 GetMinPlayersPerTeam() const
Definition Battleground.h:341
bool isRated() const
Definition Battleground.h:406
uint32 GetMembersCount() const
Definition Group.h:245
bool IsMember(ObjectGuid guid) const
Definition Group.cpp:2346
bool InBattlegroundQueueForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const
Definition Player.cpp:12266
bool InBattleground() const
Definition Player.h:2263
TeamId GetTeamId(bool original=false) const
Definition Player.h:2115
Battleground * GetBattleground(bool create=false) const
Definition Player.cpp:12223
bool InBattlegroundQueue(bool ignoreArena=false) const
Definition Player.cpp:12232
uint32 GetArenaTeamId(uint8 slot) const
Definition Player.cpp:16236
bool CanJoinToBattleground() const
Definition Player.cpp:11395
bool HasFreeBattlegroundQueueId() const
Definition Player.cpp:12286
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition Player.cpp:1295
bool HasSpell(uint32 spell) const override
Definition Player.cpp:3904
bool GetBGAccessByLevel(BattlegroundTypeId bgTypeId) const
Definition Player.cpp:12345
FROM * GetSource() const
Definition Reference.h:97
uint8 GetLevel() const
Definition Unit.h:1028
#define sWorld
Definition World.h:317
Player * FindConnectedPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:257
LfgState
Definition LFG.h:67
@ LFG_STATE_NONE
Definition LFG.h:68
@ LFG_STATE_QUEUED
Definition LFG.h:70
Definition DBCStructure.h:604
uint32 maxGroupSize
Definition DBCStructure.h:611
Definition BattlegroundQueue.h:31
bool IsRated
Definition BattlegroundQueue.h:36
Definition DBCStructure.h:1432
uint32 mapId
Definition DBCStructure.h:1434

References BATTLEGROUND_AA, BATTLEGROUND_RB, BattlegroundMgr::BGQueueTypeId(), Player::CanJoinToBattleground(), CLASS_CONTEXT_TELEPORT, CLASS_DEATH_KNIGHT, CONFIG_ALLOW_JOIN_BG_AND_LFG, CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP, ERR_ARENA_TEAM_PARTY_SIZE, ERR_BATTLEGROUND_JOIN_FAILED, ERR_BATTLEGROUND_JOIN_RANGE_INDEX, ERR_BATTLEGROUND_JOIN_TIMED_OUT, ERR_BATTLEGROUND_NONE, ERR_BATTLEGROUND_TOO_MANY_QUEUES, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS, ERR_GROUP_JOIN_BATTLEGROUND_FAIL, ERR_IN_NON_RANDOM_BG, ERR_IN_RANDOM_BG, ERR_LFG_CANT_USE_BATTLEGROUND, ObjectAccessor::FindConnectedPlayer(), Player::GetArenaTeamId(), Player::GetBattleground(), GetBattlegroundBracketByLevel(), Player::GetBGAccessByLevel(), Battleground::GetBgTypeID(), GetFirstMember(), Object::GetGUID(), Unit::GetLevel(), Battleground::GetMapId(), WorldLocation::GetMapId(), ArenaTeam::GetMembers(), GetMembersCount(), Battleground::GetMinPlayersPerTeam(), BattlegroundQueue::GetPlayerGroupInfoData(), Reference< TO, FROM >::GetSource(), Player::GetTeamId(), Player::HasFreeBattlegroundQueueId(), Player::HasSpell(), Player::InBattleground(), Player::InBattlegroundQueue(), Player::InBattlegroundQueueForBattlegroundQueueType(), Battleground::isArena(), Player::IsClass(), Player::IsGameMaster(), isLFGGroup(), IsMember(), Battleground::isRated(), GroupQueueInfo::IsRated, lfg::LFG_STATE_NONE, lfg::LFG_STATE_QUEUED, MAP_EBON_HOLD, PvPDifficultyEntry::mapId, BattlemasterListEntry::maxGroupSize, GroupReference::next(), sArenaTeamMgr, sBattlegroundMgr, sBattlemasterListStore, sLFGMgr, sScriptMgr, and sWorld.

Referenced by WorldSession::HandleBattlemasterJoinArena(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ ChangeLeader()

void Group::ChangeLeader ( ObjectGuid  guid)
713{
714 member_witerator slot = _getMemberWSlot(newLeaderGuid);
715
716 if (slot == m_memberSlots.end())
717 return;
718
719 Player* newLeader = ObjectAccessor::FindConnectedPlayer(slot->guid);
720
721 // Don't allow switching leader to offline players
722 if (!newLeader)
723 return;
724
725 if (!isBGGroup() && !isBFGroup())
726 {
727 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
728 // Update the group leader
730 stmt->SetData(0, newLeader->GetGUID().GetCounter());
731 stmt->SetData(1, GetGUID().GetCounter());
732 trans->Append(stmt);
733 CharacterDatabase.CommitTransaction(trans);
734
735 sInstanceSaveMgr->CopyBinds(m_leaderGuid, newLeaderGuid, newLeader);
736 }
737
739 oldLeader->RemovePlayerFlag(PLAYER_FLAGS_GROUP_LEADER);
740
742 m_leaderGuid = newLeader->GetGUID();
743 m_leaderName = newLeader->GetName();
745
747 data << slot->name;
748 BroadcastPacket(&data, true);
749
750 sScriptMgr->OnGroupChangeLeader(this, newLeaderGuid, m_leaderGuid); // This hook should be executed at the end - Not used anywhere in the original core
751}
@ CHAR_UPD_GROUP_LEADER
Definition CharacterDatabase.h:286
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
@ MEMBER_FLAG_ASSISTANT
Definition Group.h:73
@ PLAYER_FLAGS_GROUP_LEADER
Definition Player.h:469
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition Group.cpp:1757
void ToggleGroupMemberFlag(member_witerator slot, uint8 flag, bool apply)
Definition Group.cpp:2534
member_witerator _getMemberWSlot(ObjectGuid Guid)
Definition Group.cpp:2507
LowType GetCounter() const
Definition ObjectGuid.h:145
void SetPlayerFlag(PlayerFlags flags)
Definition Player.h:1117
@ SMSG_GROUP_SET_LEADER
Definition Opcodes.h:151

References _getMemberWSlot(), BroadcastPacket(), CHAR_UPD_GROUP_LEADER, CharacterDatabase, ObjectAccessor::FindConnectedPlayer(), ObjectGuid::GetCounter(), GetGUID(), Object::GetGUID(), WorldObject::GetName(), isBFGroup(), isBGGroup(), m_leaderGuid, m_leaderName, m_memberSlots, MEMBER_FLAG_ASSISTANT, PLAYER_FLAGS_GROUP_LEADER, PreparedStatementBase::SetData(), Player::SetPlayerFlag(), sInstanceSaveMgr, SMSG_GROUP_SET_LEADER, sScriptMgr, and ToggleGroupMemberFlag().

Referenced by Battleground::AddOrSetPlayerToCorrectBgGroup(), group_commandscript::HandleGroupLeaderCommand(), WorldSession::HandleGroupSetLeaderOpcode(), and RemoveMember().

◆ ChangeMembersGroup()

void Group::ChangeMembersGroup ( ObjectGuid  guid,
uint8  group 
)
1809{
1810 // Only raid groups have sub groups
1811 if (!isRaidGroup())
1812 return;
1813
1814 // Check if player is really in the raid
1815 member_witerator slot = _getMemberWSlot(guid);
1816 if (slot == m_memberSlots.end())
1817 return;
1818
1819 // Abort if the player is already in the target sub group
1820 uint8 prevSubGroup = GetMemberGroup(guid);
1821 if (prevSubGroup == group)
1822 return;
1823
1824 // Update the player slot with the new sub group setting
1825 slot->group = group;
1826
1827 // Increase the counter of the new sub group..
1829
1830 // ..and decrease the counter of the previous one
1831 SubGroupCounterDecrease(prevSubGroup);
1832
1833 // Preserve new sub group in database for non-raid groups
1834 if (!isBGGroup() && !isBFGroup())
1835 {
1837
1838 stmt->SetData(0, group);
1839 stmt->SetData(1, guid.GetCounter());
1840
1841 CharacterDatabase.Execute(stmt);
1842 }
1843
1844 // In case the moved player is online, update the player object with the new sub group references
1845 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
1846 {
1847 if (player->GetGroup() == this)
1848 player->GetGroupRef().setSubGroup(group);
1849 else // If player is in BG raid, it is possible that he is also in normal raid - and that normal raid is stored in m_originalGroup reference
1850 player->GetOriginalGroupRef().setSubGroup(group);
1851 }
1852
1853 // Broadcast the changes to the group
1854 SendUpdate();
1855}
@ CHAR_UPD_GROUP_MEMBER_SUBGROUP
Definition CharacterDatabase.h:288
uint8 GetMemberGroup(ObjectGuid guid) const
Definition Group.cpp:2394
void SubGroupCounterDecrease(uint8 subgroup)
Definition Group.cpp:2521

References _getMemberWSlot(), CHAR_UPD_GROUP_MEMBER_SUBGROUP, CharacterDatabase, ObjectAccessor::FindConnectedPlayer(), ObjectGuid::GetCounter(), GetMemberGroup(), isBFGroup(), isBGGroup(), isRaidGroup(), m_memberSlots, SendUpdate(), PreparedStatementBase::SetData(), SubGroupCounterDecrease(), and SubGroupCounterIncrease().

Referenced by WorldSession::HandleGroupChangeSubGroupOpcode(), and WorldSession::HandleGroupSwapSubGroupOpcode().

◆ CheckLevelForRaid()

bool Group::CheckLevelForRaid ( )
283{
284 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
285 if (Player* player = ObjectAccessor::FindPlayer(citr->guid))
286 if (player->GetLevel() < sConfigMgr->GetOption<int32>("Group.Raid.LevelRestriction", 10))
287 return true;
288
289 return false;
290}
#define sConfigMgr
Definition Config.h:74
std::int32_t int32
Definition Define.h:103

References ObjectAccessor::FindPlayer(), m_memberSlots, and sConfigMgr.

Referenced by WorldSession::HandleGroupRaidConvertOpcode().

◆ ConvertToLFG()

void Group::ConvertToLFG ( bool  restricted = true)
261{
263 if (restricted)
264 {
267 }
268
269 if (!isBGGroup() && !isBFGroup())
270 {
272
273 stmt->SetData(0, uint8(m_groupType));
274 stmt->SetData(1, GetGUID().GetCounter());
275
276 CharacterDatabase.Execute(stmt);
277 }
278
279 SendUpdate();
280}
@ CHAR_UPD_GROUP_TYPE
Definition CharacterDatabase.h:287
GroupType
Definition Group.h:85
@ GROUPTYPE_LFG_RESTRICTED
Definition Group.h:90
@ GROUPTYPE_LFG
Definition Group.h:91
@ NEED_BEFORE_GREED
Definition LootMgr.h:62

References CHAR_UPD_GROUP_TYPE, CharacterDatabase, GetGUID(), GROUPTYPE_LFG, GROUPTYPE_LFG_RESTRICTED, isBFGroup(), isBGGroup(), m_groupType, m_lootMethod, NEED_BEFORE_GREED, SendUpdate(), and PreparedStatementBase::SetData().

Referenced by lfg::LFGMgr::MakeNewGroup().

◆ ConvertToRaid()

void Group::ConvertToRaid ( )
293{
295
297
298 if (!isBGGroup() && !isBFGroup())
299 {
301
302 stmt->SetData(0, uint8(m_groupType));
303 stmt->SetData(1, GetGUID().GetCounter());
304
305 CharacterDatabase.Execute(stmt);
306 }
307
308 SendUpdate();
309
310 // update quest related GO states (quest activity dependent from raid membership)
311 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
312 if (Player* player = ObjectAccessor::FindPlayer(citr->guid))
313 player->UpdateForQuestWorldObjects();
314
315 // pussywizard: client automatically clears df "eye" near minimap, so remove from raid browser
317 sLFGMgr->LeaveLfg(GetLeaderGUID());
318}
@ GROUPTYPE_RAID
Definition Group.h:88
void _initRaidSubGroupsCounter()
Definition Group.cpp:2487
ObjectGuid GetLeaderGUID() const
Definition Group.cpp:2306
@ LFG_STATE_RAIDBROWSER
Definition LFG.h:75

References _initRaidSubGroupsCounter(), CHAR_UPD_GROUP_TYPE, CharacterDatabase, ObjectAccessor::FindPlayer(), GetGUID(), GetLeaderGUID(), GROUPTYPE_RAID, isBFGroup(), isBGGroup(), lfg::LFG_STATE_RAIDBROWSER, m_groupType, m_memberSlots, SendUpdate(), PreparedStatementBase::SetData(), and sLFGMgr.

Referenced by WorldSession::HandleGroupRaidConvertOpcode().

◆ CountRollVote()

bool Group::CountRollVote ( ObjectGuid  playerGUID,
ObjectGuid  Guid,
uint8  Choise 
)
1361{
1362 Rolls::iterator rollI = GetRoll(Guid);
1363 if (rollI == RollId.end())
1364 return false;
1365 Roll* roll = *rollI;
1366
1367 Roll::PlayerVote::iterator itr = roll->playerVote.find(playerGUID);
1368 // this condition means that player joins to the party after roll begins
1369 // Xinef: if choice == MAX_ROLL_TYPE, player was removed from the map in removefromgroup
1370 // Xinef: itr can be invalid as it is not used below
1371 if (Choice < MAX_ROLL_TYPE && itr == roll->playerVote.end())
1372 return false;
1373
1374 if (roll->getLoot())
1375 if (roll->getLoot()->items.empty())
1376 return false;
1377
1378 switch (Choice)
1379 {
1380 case ROLL_PASS: // Player choose pass
1381 SendLootRoll(ObjectGuid::Empty, playerGUID, 128, ROLL_PASS, *roll);
1382 ++roll->totalPass;
1383 itr->second = PASS;
1384 break;
1385 case ROLL_NEED: // player choose Need
1386 SendLootRoll(ObjectGuid::Empty, playerGUID, 0, 0, *roll);
1387 ++roll->totalNeed;
1388 itr->second = NEED;
1389 break;
1390 case ROLL_GREED: // player choose Greed
1391 SendLootRoll(ObjectGuid::Empty, playerGUID, 128, ROLL_GREED, *roll);
1392 ++roll->totalGreed;
1393 itr->second = GREED;
1394 break;
1395 case ROLL_DISENCHANT: // player choose Disenchant
1396 SendLootRoll(ObjectGuid::Empty, playerGUID, 128, ROLL_DISENCHANT, *roll);
1397 ++roll->totalGreed;
1398 itr->second = DISENCHANT;
1399 break;
1400 }
1401
1402 if (roll->totalPass + roll->totalNeed + roll->totalGreed >= roll->totalPlayersRolling)
1403 {
1404 CountTheRoll(rollI, nullptr);
1405 return true;
1406 }
1407 return false;
1408}
@ PASS
Definition Group.h:50
@ NEED
Definition Group.h:51
@ DISENCHANT
Definition Group.h:53
@ GREED
Definition Group.h:52
@ ROLL_PASS
Definition LootMgr.h:33
@ ROLL_GREED
Definition LootMgr.h:35
@ ROLL_NEED
Definition LootMgr.h:34
@ ROLL_DISENCHANT
Definition LootMgr.h:36
void SendLootRoll(ObjectGuid SourceGuid, ObjectGuid TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r, bool autoPass=false)
Definition Group.cpp:899
Rolls::iterator GetRoll(ObjectGuid Guid)
Definition Group.cpp:2473
void CountTheRoll(Rolls::iterator roll, Map *allowedMap)
Definition Group.cpp:1425
static ObjectGuid const Empty
Definition ObjectGuid.h:120
uint8 totalGreed
Definition Group.h:160
uint8 totalPlayersRolling
Definition Group.h:158
uint8 totalNeed
Definition Group.h:159
uint8 totalPass
Definition Group.h:161
Loot * getLoot()
Definition Group.cpp:61
PlayerVote playerVote
Definition Group.h:157
std::vector< LootItem > items
Definition LootMgr.h:320

References CountTheRoll(), DISENCHANT, ObjectGuid::Empty, Roll::getLoot(), GetRoll(), GREED, Loot::items, NEED, PASS, Roll::playerVote, ROLL_DISENCHANT, ROLL_GREED, ROLL_NEED, ROLL_PASS, RollId, SendLootRoll(), Roll::totalGreed, Roll::totalNeed, Roll::totalPass, and Roll::totalPlayersRolling.

Referenced by WorldSession::HandleLootRoll(), and RemoveMember().

◆ CountTheRoll()

void Group::CountTheRoll ( Rolls::iterator  roll,
Map allowedMap 
)
1426{
1427 Roll* roll = *rollI;
1428 if (!roll->isValid()) // is loot already deleted ?
1429 {
1430 RollId.erase(rollI);
1431 delete roll;
1432 return;
1433 }
1434
1435 //end of the roll
1436 if (roll->totalNeed > 0)
1437 {
1438 if (!roll->playerVote.empty())
1439 {
1440 uint8 maxresul = 0;
1441 ObjectGuid maxguid; // pussywizard: start with 0 >_>
1442 Player* player = nullptr;
1443
1444 for (Roll::PlayerVote::const_iterator itr = roll->playerVote.begin(); itr != roll->playerVote.end(); ++itr)
1445 {
1446 if (itr->second != NEED)
1447 continue;
1448
1449 player = ObjectAccessor::FindPlayer(itr->first);
1450 if (!player || (allowedMap != nullptr && player->FindMap() != allowedMap))
1451 {
1452 --roll->totalNeed;
1453 continue;
1454 }
1455
1456 uint8 randomN = urand(1, 100);
1457 SendLootRoll(ObjectGuid::Empty, itr->first, randomN, ROLL_NEED, *roll);
1458 if (maxresul < randomN)
1459 {
1460 maxguid = itr->first;
1461 maxresul = randomN;
1462 }
1463 }
1464
1465 if (maxguid) // pussywizard: added condition
1466 {
1467 SendLootRollWon(ObjectGuid::Empty, maxguid, maxresul, ROLL_NEED, *roll);
1468 player = ObjectAccessor::FindPlayer(maxguid);
1469
1470 if (player)
1471 {
1473
1474 ItemPosCountVec dest;
1475 LootItem* item = &(roll->itemSlot >= roll->getLoot()->items.size() ? roll->getLoot()->quest_items[roll->itemSlot - roll->getLoot()->items.size()] : roll->getLoot()->items[roll->itemSlot]);
1476 InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, roll->itemid, item->count);
1477 if (msg == EQUIP_ERR_OK)
1478 {
1479 item->is_looted = true;
1480 roll->getLoot()->NotifyItemRemoved(roll->itemSlot);
1481 roll->getLoot()->unlootedCount--;
1482 AllowedLooterSet looters = item->GetAllowedLooters();
1483 Item* _item = player->StoreNewItem(dest, roll->itemid, true, item->randomPropertyId, looters);
1484 if (_item)
1485 sScriptMgr->OnPlayerGroupRollRewardItem(player, _item, _item->GetCount(), NEED, roll);
1486 player->UpdateLootAchievements(item, roll->getLoot());
1487 }
1488 else
1489 {
1490 item->is_blocked = false;
1491 item->rollWinnerGUID = player->GetGUID();
1492 player->SendEquipError(msg, nullptr, nullptr, roll->itemid);
1493 }
1494 }
1495 }
1496 else
1497 roll->totalNeed = 0;
1498 }
1499 }
1500 if (roll->totalNeed == 0 && roll->totalGreed > 0) // pussywizard: if (roll->totalNeed == 0 && ...), not else if, because numbers can be modified above if player is on a different map
1501 {
1502 if (!roll->playerVote.empty())
1503 {
1504 uint8 maxresul = 0;
1505 ObjectGuid maxguid; // pussywizard: start with 0
1506 Player* player = nullptr;
1507 RollVote rollvote = NOT_VALID;
1508
1509 Roll::PlayerVote::iterator itr;
1510 for (itr = roll->playerVote.begin(); itr != roll->playerVote.end(); ++itr)
1511 {
1512 if (itr->second != GREED && itr->second != DISENCHANT)
1513 continue;
1514
1515 player = ObjectAccessor::FindPlayer(itr->first);
1516 if (!player || (allowedMap != nullptr && player->FindMap() != allowedMap))
1517 {
1518 --roll->totalGreed;
1519 continue;
1520 }
1521
1522 uint8 randomN = urand(1, 100);
1523 SendLootRoll(ObjectGuid::Empty, itr->first, randomN, itr->second, *roll);
1524 if (maxresul < randomN)
1525 {
1526 maxguid = itr->first;
1527 maxresul = randomN;
1528 rollvote = itr->second;
1529 }
1530 }
1531
1532 if (maxguid) // pussywizard: added condition
1533 {
1534 SendLootRollWon(ObjectGuid::Empty, maxguid, maxresul, rollvote, *roll);
1535 player = ObjectAccessor::FindPlayer(maxguid);
1536
1537 if (player)
1538 {
1540
1541 LootItem* item = &(roll->itemSlot >= roll->getLoot()->items.size() ? roll->getLoot()->quest_items[roll->itemSlot - roll->getLoot()->items.size()] : roll->getLoot()->items[roll->itemSlot]);
1542
1543 if (rollvote == GREED)
1544 {
1545 ItemPosCountVec dest;
1546 InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, roll->itemid, item->count);
1547 if (msg == EQUIP_ERR_OK)
1548 {
1549 item->is_looted = true;
1550 roll->getLoot()->NotifyItemRemoved(roll->itemSlot);
1551 roll->getLoot()->unlootedCount--;
1552 AllowedLooterSet looters = item->GetAllowedLooters();
1553 Item* _item = player->StoreNewItem(dest, roll->itemid, true, item->randomPropertyId, looters);
1554 if (_item)
1555 sScriptMgr->OnPlayerGroupRollRewardItem(player, _item, _item->GetCount(), GREED, roll);
1556 player->UpdateLootAchievements(item, roll->getLoot());
1557 }
1558 else
1559 {
1560 item->is_blocked = false;
1561 item->rollWinnerGUID = player->GetGUID();
1562 player->SendEquipError(msg, nullptr, nullptr, roll->itemid);
1563 }
1564 }
1565 else if (rollvote == DISENCHANT)
1566 {
1567 item->is_looted = true;
1568 roll->getLoot()->NotifyItemRemoved(roll->itemSlot);
1569 roll->getLoot()->unlootedCount--;
1570 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(roll->itemid);
1572
1573 ItemPosCountVec dest;
1574 InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, roll->itemid, item->count);
1575
1576 if (msg == EQUIP_ERR_OK)
1577 {
1578 player->AutoStoreLoot(pProto->DisenchantID, LootTemplates_Disenchant, true);
1579 }
1580 else
1581 {
1582 Loot loot;
1583 loot.FillLoot(pProto->DisenchantID, LootTemplates_Disenchant, player, true);
1584
1585 uint32 max_slot = loot.GetMaxSlotInLootFor(player);
1586 for(uint32 i = 0; i < max_slot; i++)
1587 {
1588 LootItem* lootItem = loot.LootItemInSlot(i, player);
1589 player->SendEquipError(msg, nullptr, nullptr, lootItem->itemid);
1590 player->SendItemRetrievalMail(lootItem->itemid, lootItem->count);
1591 }
1592 }
1593 }
1594 }
1595 }
1596 else
1597 roll->totalGreed = 0;
1598 }
1599 }
1600 if (roll->totalNeed == 0 && roll->totalGreed == 0) // pussywizard: if, not else, because numbers can be modified above if player is on a different map
1601 {
1602 SendLootAllPassed(*roll);
1603
1604 // remove is_blocked so that the item is lootable by all players
1605 LootItem* item = &(roll->itemSlot >= roll->getLoot()->items.size() ? roll->getLoot()->quest_items[roll->itemSlot - roll->getLoot()->items.size()] : roll->getLoot()->items[roll->itemSlot]);
1606 if (item)
1607 item->is_blocked = false;
1608 }
1609
1610 if (Loot* loot = roll->getLoot(); loot && loot->isLooted() && loot->sourceGameObject)
1611 {
1612 const GameObjectTemplate* goInfo = loot->sourceGameObject->GetGOInfo();
1613 if (goInfo && goInfo->type == GAMEOBJECT_TYPE_CHEST)
1614 {
1615 // Deactivate chest if the last item was rolled in group
1617 }
1618 }
1619
1620 RollId.erase(rollI);
1621 delete roll;
1622}
@ ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL
Definition DBCEnums.h:143
@ ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT
Definition DBCEnums.h:165
@ ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT
Definition DBCEnums.h:164
@ GO_JUST_DEACTIVATED
Definition GameObject.h:113
RollVote
Definition Group.h:49
@ NOT_VALID
Definition Group.h:55
InventoryResult
Definition Item.h:46
@ EQUIP_ERR_OK
Definition Item.h:47
@ NULL_BAG
Definition Item.h:40
@ NULL_SLOT
Definition Item.h:41
LootStore LootTemplates_Disenchant("disenchant_loot_template", "item disenchant id", true)
GuidSet AllowedLooterSet
Definition LootMgr.h:151
#define sObjectMgr
Definition ObjectMgr.h:1650
std::vector< ItemPosCount > ItemPosCountVec
Definition Player.h:767
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:44
@ GAMEOBJECT_TYPE_CHEST
Definition SharedDefines.h:1574
GameObjectTemplate const * GetGOInfo() const
Definition GameObject.h:136
void SetLootState(LootState s, Unit *unit=nullptr)
Definition GameObject.cpp:2423
void SendLootAllPassed(Roll const &roll)
Definition Group.cpp:946
void SendLootRollWon(ObjectGuid SourceGuid, ObjectGuid TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r)
Definition Group.cpp:923
Definition Item.h:220
uint32 GetCount() const
Definition Item.h:272
Definition ObjectGuid.h:118
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition PlayerUpdates.cpp:2167
void AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const &store, bool broadcast=false)
Definition Player.cpp:13513
void SendItemRetrievalMail(uint32 itemEntry, uint32 count)
Definition PlayerMisc.cpp:439
void UpdateLootAchievements(LootItem *item, Loot *loot)
Definition PlayerUpdates.cpp:2157
Item * StoreNewItem(ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId=0)
Definition PlayerStorage.cpp:2524
void SendEquipError(InventoryResult msg, Item *pItem, Item *pItem2=nullptr, uint32 itemid=0)
Definition PlayerStorage.cpp:4014
InventoryResult CanStoreNewItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 item, uint32 count, uint32 *no_space_count=nullptr) const
Definition Player.h:1285
bool isValid() const
Definition Reference.h:79
uint8 itemSlot
Definition Group.h:162
uint32 itemid
Definition Group.h:152
Definition GameObjectData.h:31
uint32 type
Definition GameObjectData.h:33
Definition ItemTemplate.h:619
uint32 DisenchantID
Definition ItemTemplate.h:690
Definition LootMgr.h:154
uint32 itemid
Definition LootMgr.h:155
bool is_blocked
Definition LootMgr.h:164
ObjectGuid rollWinnerGUID
Definition LootMgr.h:161
int32 randomPropertyId
Definition LootMgr.h:158
uint8 count
Definition LootMgr.h:162
bool is_looted
Definition LootMgr.h:163
const AllowedLooterSet & GetAllowedLooters() const
Definition LootMgr.h:181
Definition LootMgr.h:313
uint32 GetMaxSlotInLootFor(Player *player) const
Definition LootMgr.cpp:916
LootItem * LootItemInSlot(uint32 lootslot, Player *player, QuestItem **qitem=nullptr, QuestItem **ffaitem=nullptr, QuestItem **conditem=nullptr)
Definition LootMgr.cpp:851
bool isLooted() const
Definition LootMgr.h:368
uint8 unlootedCount
Definition LootMgr.h:323
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition LootMgr.cpp:571
GameObject * sourceGameObject
Definition LootMgr.h:331
void NotifyItemRemoved(uint8 lootIndex)
Definition LootMgr.cpp:773
std::vector< LootItem > quest_items
Definition LootMgr.h:321

References ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL, ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT, ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT, Player::AutoStoreLoot(), Player::CanStoreNewItem(), LootItem::count, DISENCHANT, ItemTemplate::DisenchantID, ObjectGuid::Empty, EQUIP_ERR_OK, Loot::FillLoot(), WorldObject::FindMap(), ObjectAccessor::FindPlayer(), GAMEOBJECT_TYPE_CHEST, LootItem::GetAllowedLooters(), Item::GetCount(), Object::GetGUID(), Roll::getLoot(), Loot::GetMaxSlotInLootFor(), GO_JUST_DEACTIVATED, GREED, LootItem::is_blocked, LootItem::is_looted, Loot::isLooted(), Reference< TO, FROM >::isValid(), Roll::itemid, LootItem::itemid, Loot::items, Roll::itemSlot, Loot::LootItemInSlot(), LootTemplates_Disenchant, NEED, NOT_VALID, Loot::NotifyItemRemoved(), NULL_BAG, NULL_SLOT, Roll::playerVote, Loot::quest_items, LootItem::randomPropertyId, ROLL_NEED, RollId, LootItem::rollWinnerGUID, Player::SendEquipError(), Player::SendItemRetrievalMail(), SendLootAllPassed(), SendLootRoll(), SendLootRollWon(), sObjectMgr, sScriptMgr, Player::StoreNewItem(), Roll::totalGreed, Roll::totalNeed, GameObjectTemplate::type, Loot::unlootedCount, Player::UpdateAchievementCriteria(), Player::UpdateLootAchievements(), and urand().

Referenced by CountRollVote(), and EndRoll().

◆ Create()

bool Group::Create ( Player leader)
109{
110 ObjectGuid leaderGuid = leader->GetGUID();
111 ObjectGuid::LowType lowguid = sGroupMgr->GenerateGroupId();
112
113 m_guid = ObjectGuid::Create<HighGuid::Group>(lowguid);
114 m_leaderGuid = leaderGuid;
115 m_leaderName = leader->GetName();
117
118 if (isBGGroup() || isBFGroup())
120
123
124 if (!isLFGGroup())
126
128 m_looterGuid = leaderGuid;
130
133
134 if (!isBGGroup() && !isBFGroup())
135 {
138
139 // Store group in database
141
142 uint8 index = 0;
143
144 stmt->SetData(index++, lowguid);
145 stmt->SetData(index++, m_leaderGuid.GetCounter());
146 stmt->SetData(index++, uint8(m_lootMethod));
147 stmt->SetData(index++, m_looterGuid.GetCounter());
148 stmt->SetData(index++, uint8(m_lootThreshold));
149 stmt->SetData(index++, m_targetIcons[0].GetRawValue());
150 stmt->SetData(index++, m_targetIcons[1].GetRawValue());
151 stmt->SetData(index++, m_targetIcons[2].GetRawValue());
152 stmt->SetData(index++, m_targetIcons[3].GetRawValue());
153 stmt->SetData(index++, m_targetIcons[4].GetRawValue());
154 stmt->SetData(index++, m_targetIcons[5].GetRawValue());
155 stmt->SetData(index++, m_targetIcons[6].GetRawValue());
156 stmt->SetData(index++, m_targetIcons[7].GetRawValue());
157 stmt->SetData(index++, uint8(m_groupType));
158 stmt->SetData(index++, uint8(m_dungeonDifficulty));
159 stmt->SetData(index++, uint8(m_raidDifficulty));
160 stmt->SetData(index++, m_masterLooterGuid.GetCounter());
161
162 CharacterDatabase.Execute(stmt);
163
164 ASSERT(AddMember(leader)); // If the leader can't be added to a new group because it appears full, something is clearly wrong.
165
166 sScriptMgr->OnCreate(this, leader);
167 }
168 else if (!AddMember(leader))
169 return false;
170
171 return true;
172}
@ CHAR_INS_GROUP
Definition CharacterDatabase.h:283
#define ASSERT
Definition Errors.h:68
#define sGroupMgr
Definition GroupMgr.h:51
@ GROUPTYPE_BGRAID
Definition Group.h:89
@ GROUP_LOOT
Definition LootMgr.h:61
ObjectGuid m_looterGuid
Definition Group.h:351
bool AddMember(Player *player)
Definition Group.cpp:390
ObjectGuid m_masterLooterGuid
Definition Group.h:352
ObjectGuid m_guid
Definition Group.h:355
uint32 LowType
Definition ObjectGuid.h:122
void Clear()
Definition ObjectGuid.h:138

References _initRaidSubGroupsCounter(), AddMember(), ASSERT, CHAR_INS_GROUP, CharacterDatabase, ObjectGuid::Clear(), DUNGEON_DIFFICULTY_NORMAL, ObjectGuid::GetCounter(), Player::GetDungeonDifficulty(), Object::GetGUID(), WorldObject::GetName(), Player::GetRaidDifficulty(), GROUP_LOOT, GROUPTYPE_BGRAID, GROUPTYPE_RAID, isBFGroup(), isBGGroup(), isLFGGroup(), ITEM_QUALITY_UNCOMMON, m_dungeonDifficulty, m_groupType, m_guid, m_leaderGuid, m_leaderName, m_looterGuid, m_lootMethod, m_lootThreshold, m_masterLooterGuid, m_raidDifficulty, m_targetIcons, PLAYER_FLAGS_GROUP_LEADER, RAID_DIFFICULTY_10MAN_NORMAL, PreparedStatementBase::SetData(), Player::SetPlayerFlag(), sGroupMgr, and sScriptMgr.

Referenced by Battlefield::AddOrSetPlayerToCorrectBfGroup(), Battleground::AddOrSetPlayerToCorrectBgGroup(), Arena::AddPlayer(), and lfg::LFGMgr::MakeNewGroup().

◆ Disband()

void Group::Disband ( bool  hideDestroy = false)
754{
755 sScriptMgr->OnGroupDisband(this);
756
757 Player* player;
758 uint32 instanceId = 0;
759
760 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
761 {
762 if (!isBGGroup() && !isBFGroup())
763 {
764 sCharacterCache->ClearCharacterGroup(citr->guid);
765 }
766
767 player = ObjectAccessor::FindConnectedPlayer(citr->guid);
768
769 if (player && !instanceId && !isBGGroup() && !isBFGroup())
770 {
771 instanceId = player->GetInstanceId();
772 }
773
774 _homebindIfInstance(player);
775 if (!isBGGroup() && !isBFGroup())
777
778 if (!player)
779 continue;
780
781 //we cannot call _removeMember because it would invalidate member iterator
782 //if we are removing player from battleground raid
783 if (isBGGroup() || isBFGroup())
785 else
786 {
787 //we can remove player who is in battleground from his original group
788 if (player->GetOriginalGroup() == this)
789 player->SetOriginalGroup(nullptr);
790 else
791 player->SetGroup(nullptr);
792 }
793
794 // quest related GO state dependent from raid membership
795 if (isRaidGroup())
797
798 WorldPacket data;
799 if (!hideDestroy)
800 {
802 player->GetSession()->SendPacket(&data);
803 }
804
805 //we already removed player from group and in player->GetGroup() is his original group, send update
806 if (Group* group = player->GetGroup())
807 {
808 group->SendUpdate();
809 }
810 else
811 {
812 data.Initialize(SMSG_GROUP_LIST, 1 + 1 + 1 + 1 + 8 + 4 + 4 + 8);
813 data << uint8(0x10) << uint8(0) << uint8(0) << uint8(0);
814 data << m_guid << uint32(m_counter) << uint32(0) << uint64(0);
815 player->GetSession()->SendPacket(&data);
816 }
817 }
818 RollId.clear();
819 m_memberSlots.clear();
820
822
823 if (!isBGGroup() && !isBFGroup())
824 {
825 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
826
828 stmt->SetData(0, GetGUID().GetCounter());
829 trans->Append(stmt);
830
831 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GROUP_MEMBER_ALL);
832 stmt->SetData(0, GetGUID().GetCounter());
833 trans->Append(stmt);
834
835 CharacterDatabase.CommitTransaction(trans);
836
837 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_LFG_DATA);
838 stmt->SetData(0, GetGUID().GetCounter());
839 CharacterDatabase.Execute(stmt);
840 }
841
842 // Cleaning up instance saved data for gameobjects when a group is disbanded
843 sInstanceSaveMgr->DeleteInstanceSavedData(instanceId);
844
845 sGroupMgr->RemoveGroup(this);
846 delete this;
847}
@ CHAR_DEL_GROUP_MEMBER_ALL
Definition CharacterDatabase.h:379
@ CHAR_DEL_GROUP
Definition CharacterDatabase.h:378
@ CHAR_DEL_LFG_DATA
Definition CharacterDatabase.h:327
std::uint64_t uint64
Definition Define.h:106
@ INSTANCE_RESET_GROUP_LEAVE
Definition Map.h:623
void RemoveAllInvites()
Definition Group.cpp:361
void _homebindIfInstance(Player *player)
Definition Group.cpp:2193
void RemoveFromBattlegroundOrBattlefieldRaid()
Definition Player.cpp:13124
void Initialize(uint16 opcode, std::size_t newres=200)
Definition WorldPacket.h:68
@ SMSG_GROUP_LIST
Definition Opcodes.h:155
@ SMSG_GROUP_DESTROYED
Definition Opcodes.h:154

References _homebindIfInstance(), CHAR_DEL_GROUP, CHAR_DEL_GROUP_MEMBER_ALL, CHAR_DEL_LFG_DATA, CharacterDatabase, ObjectAccessor::FindConnectedPlayer(), Player::GetGroup(), GetGUID(), WorldObject::GetInstanceId(), Player::GetOriginalGroup(), Player::GetSession(), WorldPacket::Initialize(), INSTANCE_RESET_GROUP_LEAVE, isBFGroup(), isBGGroup(), isRaidGroup(), m_counter, m_guid, m_memberSlots, RemoveAllInvites(), Player::RemoveFromBattlegroundOrBattlefieldRaid(), Player::ResetInstances(), RollId, sCharacterCache, WorldSession::SendPacket(), PreparedStatementBase::SetData(), Player::SetGroup(), Player::SetOriginalGroup(), sGroupMgr, sInstanceSaveMgr, SMSG_GROUP_DESTROYED, SMSG_GROUP_LIST, sScriptMgr, and Player::UpdateForQuestWorldObjects().

Referenced by Arena::AddPlayer(), group_commandscript::HandleGroupDisbandCommand(), WorldSession::HandleGroupDisbandOpcode(), RemoveMember(), and Player::UninviteFromGroup().

◆ DoForAllMembers()

void Group::DoForAllMembers ( std::function< void(Player *)> const &  worker)
2554{
2555 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
2556 {
2557 Player* member = itr->GetSource();
2558 if (!member)
2559 continue;
2560
2561 worker(member);
2562 }
2563}

References GetFirstMember(), and GroupReference::next().

Referenced by BattlegroundQueue::AddGroup(), WorldSession::HandleBattlemasterJoinArena(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ DoMinimapPing()

void Group::DoMinimapPing ( ObjectGuid  sourceGuid,
float  mapX,
float  mapY 
)
2064{
2066 minimapPing.SourceGuid = sourceGuid;
2067 minimapPing.MapX = mapX;
2068 minimapPing.MapY = mapY;
2069
2070 BroadcastPacket(minimapPing.Write(), true, -1, sourceGuid);
2071}
Definition MiscPackets.h:108
float MapY
Definition MiscPackets.h:116
WorldPacket const * Write() override
Definition MiscPackets.cpp:76
float MapX
Definition MiscPackets.h:115
ObjectGuid SourceGuid
Definition MiscPackets.h:114

References BroadcastPacket(), WorldPackets::Misc::MinimapPing::MapX, WorldPackets::Misc::MinimapPing::MapY, WorldPackets::Misc::MinimapPing::SourceGuid, and WorldPackets::Misc::MinimapPing::Write().

Referenced by WorldSession::HandleMinimapPingOpcode().

◆ EndRoll()

void Group::EndRoll ( Loot loot,
Map allowedMap 
)
1412{
1413 for (Rolls::iterator itr = RollId.begin(); itr != RollId.end();)
1414 {
1415 if ((*itr)->getLoot() == pLoot)
1416 {
1417 CountTheRoll(itr, allowedMap); //i don't have to edit player votes, who didn't vote ... he will pass
1418 itr = RollId.begin();
1419 }
1420 else
1421 ++itr;
1422 }
1423}

References CountTheRoll(), and RollId.

Referenced by GameObject::Update(), and Creature::Update().

◆ GetDifficulty()

Difficulty Group::GetDifficulty ( bool  isRaid) const
2454{
2455 return isRaid ? m_raidDifficulty : m_dungeonDifficulty;
2456}

References m_dungeonDifficulty, and m_raidDifficulty.

Referenced by MapInstanced::CreateInstanceForPlayer().

◆ GetDifficultyChangePreventionReason()

DifficultyPreventionChangeType Group::GetDifficultyChangePreventionReason ( ) const
inline

◆ GetDifficultyChangePreventionTime()

uint32 Group::GetDifficultyChangePreventionTime ( ) const

◆ GetDungeonDifficulty()

Difficulty Group::GetDungeonDifficulty ( ) const
2459{
2460 return m_dungeonDifficulty;
2461}

References m_dungeonDifficulty.

Referenced by AddMember().

◆ GetFirstMember() [1/2]

◆ GetFirstMember() [2/2]

GroupReference const * Group::GetFirstMember ( ) const
inline
244{ return m_memberMgr.getFirst(); }

References GroupRefMgr::getFirst(), and m_memberMgr.

◆ GetGroupType()

GroupType Group::GetGroupType ( ) const
2302{
2303 return m_groupType;
2304}

References m_groupType.

◆ GetGUID()

◆ GetInvited() [1/2]

Player * Group::GetInvited ( const std::string &  name) const
381{
382 for (InvitesList::const_iterator itr = m_invitees.begin(); itr != m_invitees.end(); ++itr)
383 {
384 if ((*itr) && (*itr)->GetName() == name)
385 return (*itr);
386 }
387 return nullptr;
388}

References m_invitees.

◆ GetInvited() [2/2]

Player * Group::GetInvited ( ObjectGuid  guid) const
371{
372 for (InvitesList::const_iterator itr = m_invitees.begin(); itr != m_invitees.end(); ++itr)
373 {
374 if ((*itr) && (*itr)->GetGUID() == guid)
375 return (*itr);
376 }
377 return nullptr;
378}

References m_invitees.

Referenced by WorldSession::HandleGroupUninviteGuidOpcode(), and WorldSession::HandleGroupUninviteOpcode().

◆ GetInviteeCount()

uint32 Group::GetInviteeCount ( ) const
inline
246{ return m_invitees.size(); }

References m_invitees.

Referenced by Player::UninviteFromGroup().

◆ GetLeader()

Player * Group::GetLeader ( )

◆ GetLeaderGUID()

◆ GetLeaderName()

const char * Group::GetLeaderName ( ) const
2322{
2323 return m_leaderName.c_str();
2324}

References m_leaderName.

Referenced by ChatLogScript::OnPlayerChat(), and Player::Satisfy().

◆ GetLooterGuid()

ObjectGuid Group::GetLooterGuid ( ) const
2332{
2333 return m_looterGuid;
2334}

References m_looterGuid.

Referenced by Unit::Kill(), and UpdateLooterGuid().

◆ GetLootMethod()

◆ GetLootThreshold()

ItemQualities Group::GetLootThreshold ( ) const
2342{
2343 return m_lootThreshold;
2344}

References m_lootThreshold.

Referenced by Loot::FillLoot().

◆ GetMasterLooterGuid()

ObjectGuid Group::GetMasterLooterGuid ( ) const

◆ GetMemberGroup()

uint8 Group::GetMemberGroup ( ObjectGuid  guid) const
2395{
2396 member_citerator mslot = _getMemberCSlot(guid);
2397 if (mslot == m_memberSlots.end())
2398 return (MAX_RAID_SUBGROUPS + 1);
2399 return mslot->group;
2400}
member_citerator _getMemberCSlot(ObjectGuid Guid) const
Definition Group.cpp:2499

References _getMemberCSlot(), m_memberSlots, and MAX_RAID_SUBGROUPS.

Referenced by Battlefield::AddOrSetPlayerToCorrectBfGroup(), Battleground::AddOrSetPlayerToCorrectBgGroup(), ChangeMembersGroup(), WorldSession::HandleGroupSwapSubGroupOpcode(), WorldSession::HandleMessagechatOpcode(), and Unit::Kill().

◆ GetMemberGUID()

ObjectGuid Group::GetMemberGUID ( const std::string &  name)
2357{
2358 for (member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr)
2359 if (itr->name == name)
2360 return itr->guid;
2361
2362 return ObjectGuid::Empty;
2363}

References ObjectGuid::Empty, and m_memberSlots.

Referenced by WorldSession::HandleGroupSwapSubGroupOpcode(), and WorldSession::HandleGroupUninviteOpcode().

◆ GetMembersCount()

◆ GetMemberSlots()

MemberSlotList const & Group::GetMemberSlots ( ) const
inline

◆ GetRaidDifficulty()

Difficulty Group::GetRaidDifficulty ( ) const
2464{
2465 return m_raidDifficulty;
2466}

References m_raidDifficulty.

Referenced by AddMember().

◆ GetRoll()

Group::Rolls::iterator Group::GetRoll ( ObjectGuid  Guid)
2474{
2475 Rolls::iterator iter;
2476 for (iter = RollId.begin(); iter != RollId.end(); ++iter)
2477 if ((*iter)->itemGUID == Guid && (*iter)->isValid())
2478 return iter;
2479 return RollId.end();
2480}

References RollId.

Referenced by CountRollVote().

◆ GroupLoot()

void Group::GroupLoot ( Loot loot,
WorldObject pLootedObject 
)
1005{
1006 std::vector<LootItem>::iterator i;
1007 ItemTemplate const* item;
1008 uint8 itemSlot = 0;
1009
1010 for (i = loot->items.begin(); i != loot->items.end(); ++i, ++itemSlot)
1011 {
1012 if (i->freeforall)
1013 continue;
1014
1015 item = sObjectMgr->GetItemTemplate(i->itemid);
1016 if (!item)
1017 {
1018 continue;
1019 }
1020
1021 // roll for over-threshold item if it's one-player loot
1022 if (item->Quality >= uint32(m_lootThreshold))
1023 {
1024 ObjectGuid newitemGUID = ObjectGuid::Create<HighGuid::Item>(sObjectMgr->GetGenerator<HighGuid::Item>().Generate());
1025 Roll* r = new Roll(newitemGUID, *i);
1026
1027 //a vector is filled with only near party members
1028 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1029 {
1030 Player* member = itr->GetSource();
1031 if (!member || !member->GetSession())
1032 continue;
1033 if (member->IsAtLootRewardDistance(pLootedObject))
1034 {
1036
1037 RollVote vote = member->GetPassOnGroupLoot() ? PASS : NOT_EMITED_YET;
1038 if (!CanRollOnItem(*i, member, loot))
1039 {
1040 vote = PASS;
1041 ++r->totalPass;
1042 }
1043
1044 r->playerVote[member->GetGUID()] = vote;
1045 }
1046 }
1047
1048 if (r->totalPlayersRolling > 0)
1049 {
1050 r->setLoot(loot);
1051 r->itemSlot = itemSlot;
1054
1055 loot->items[itemSlot].is_blocked = true;
1056
1057 // If there is any "auto pass", broadcast the pass now.
1058 if (r->totalPass)
1059 {
1060 for (Roll::PlayerVote::const_iterator itr = r->playerVote.begin(); itr != r->playerVote.end(); ++itr)
1061 {
1062 Player* p = ObjectAccessor::FindPlayer(itr->first);
1063 if (!p)
1064 continue;
1065
1066 if (itr->second == PASS)
1067 SendLootRoll(newitemGUID, p->GetGUID(), 128, ROLL_PASS, *r, true);
1068 }
1069 }
1070
1071 if (r->totalPass == r->totalPlayersRolling)
1072 delete r;
1073 else
1074 {
1075 SendLootStartRoll(60000, pLootedObject->GetMapId(), *r);
1076
1077 RollId.push_back(r);
1078
1079 if (Creature* creature = pLootedObject->ToCreature())
1080 {
1081 creature->m_groupLootTimer = 60000;
1082 creature->lootingGroupLowGUID = GetGUID().GetCounter();
1083 }
1084 else if (GameObject* go = pLootedObject->ToGameObject())
1085 {
1086 go->m_groupLootTimer = 60000;
1087 go->lootingGroupLowGUID = GetGUID().GetCounter();
1088 }
1089 }
1090 }
1091 else
1092 delete r;
1093 }
1094 else
1095 i->is_underthreshold = true;
1096 }
1097
1098 for (i = loot->quest_items.begin(); i != loot->quest_items.end(); ++i, ++itemSlot)
1099 {
1100 if (!i->follow_loot_rules)
1101 continue;
1102
1103 item = sObjectMgr->GetItemTemplate(i->itemid);
1104 if (!item)
1105 {
1106 continue;
1107 }
1108
1109 ObjectGuid newitemGUID = ObjectGuid::Create<HighGuid::Item>(sObjectMgr->GetGenerator<HighGuid::Item>().Generate());
1110 Roll* r = new Roll(newitemGUID, *i);
1111
1112 //a vector is filled with only near party members
1113 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1114 {
1115 Player* member = itr->GetSource();
1116 if (!member || !member->GetSession())
1117 continue;
1118
1119 if (member->IsAtLootRewardDistance(pLootedObject))
1120 {
1122
1123 RollVote vote = NOT_EMITED_YET;
1124 if (!CanRollOnItem(*i, member, loot))
1125 {
1126 vote = PASS;
1127 ++r->totalPass;
1128 }
1129 r->playerVote[member->GetGUID()] = vote;
1130 }
1131 }
1132
1133 if (r->totalPlayersRolling > 0)
1134 {
1135 r->setLoot(loot);
1136 r->itemSlot = itemSlot;
1137
1138 loot->quest_items[itemSlot - loot->items.size()].is_blocked = true;
1139
1140 SendLootStartRoll(60000, pLootedObject->GetMapId(), *r);
1141
1142 RollId.push_back(r);
1143
1144 if (Creature* creature = pLootedObject->ToCreature())
1145 {
1146 creature->m_groupLootTimer = 60000;
1147 creature->lootingGroupLowGUID = GetGUID().GetCounter();
1148 }
1149 else if (GameObject* go = pLootedObject->ToGameObject())
1150 {
1151 go->m_groupLootTimer = 60000;
1152 go->lootingGroupLowGUID = GetGUID().GetCounter();
1153 }
1154 }
1155 else
1156 delete r;
1157 }
1158}
bool CanRollOnItem(LootItem const &item, Player const *player, Loot *loot)
Definition Group.cpp:987
@ NOT_EMITED_YET
Definition Group.h:54
@ ROLL_FLAG_TYPE_DISENCHANT
Definition LootMgr.h:45
Definition Creature.h:43
Definition GameObject.h:120
void SendLootStartRoll(uint32 CountDown, uint32 mapid, const Roll &r)
Definition Group.cpp:853
GameObject * ToGameObject()
Definition Object.h:214
Creature * ToCreature()
Definition Object.h:206
bool IsAtLootRewardDistance(WorldObject const *pRewardSource) const
Definition Player.cpp:12807
bool GetPassOnGroupLoot() const
Definition Player.h:2499
void setLoot(Loot *pLoot)
Definition Group.cpp:56
uint8 rollVoteMask
Definition Group.h:163
uint32 Quality
Definition ItemTemplate.h:626
uint32 RequiredDisenchantSkill
Definition ItemTemplate.h:684

References CanRollOnItem(), ItemTemplate::DisenchantID, ObjectAccessor::FindPlayer(), ObjectGuid::GetCounter(), GetFirstMember(), GetGUID(), Object::GetGUID(), WorldLocation::GetMapId(), Player::GetPassOnGroupLoot(), Player::GetSession(), Player::IsAtLootRewardDistance(), Item, Loot::items, Roll::itemSlot, m_lootThreshold, m_maxEnchantingLevel, GroupReference::next(), NOT_EMITED_YET, PASS, Roll::playerVote, ItemTemplate::Quality, Loot::quest_items, ItemTemplate::RequiredDisenchantSkill, ROLL_FLAG_TYPE_DISENCHANT, ROLL_PASS, RollId, Roll::rollVoteMask, SendLootRoll(), SendLootStartRoll(), Roll::setLoot(), sObjectMgr, Object::ToCreature(), Object::ToGameObject(), Roll::totalPass, and Roll::totalPlayersRolling.

Referenced by Player::SendLoot().

◆ HasFreeSlotSubGroup()

bool Group::HasFreeSlotSubGroup ( uint8  subgroup) const

◆ InInstance()

uint16 Group::InInstance ( )

◆ IsAssistant()

◆ isBFGroup()

◆ isBGGroup()

◆ IsCreated()

bool Group::IsCreated ( ) const
2297{
2298 return GetMembersCount() > 0;
2299}

References GetMembersCount().

Referenced by Player::UninviteFromGroup().

◆ IsFull()

bool Group::IsFull ( ) const

◆ IsLeader()

◆ isLFGGroup()

◆ IsLfgHeroic()

bool Group::IsLfgHeroic ( ) const
inline

◆ IsLfgRandomInstance()

◆ IsLfgWithBuff()

◆ IsMember()

◆ isRaidGroup()

◆ isRollLootActive()

bool Group::isRollLootActive ( ) const
2469{
2470 return !RollId.empty();
2471}

References RollId.

Referenced by Player::CanUninviteFromGroup().

◆ LinkMember()

void Group::LinkMember ( GroupReference pRef)
2483{
2485}
void insertFirst(LinkedListElement *pElem)
Definition LinkedList.h:105

References LinkedListHead::insertFirst(), and m_memberMgr.

Referenced by GroupReference::targetObjectBuildLink().

◆ LoadGroupFromDB()

bool Group::LoadGroupFromDB ( Field field)
175{
176 ObjectGuid::LowType groupLowGuid = fields[16].Get<uint32>();
177 m_guid = ObjectGuid::Create<HighGuid::Group>(groupLowGuid);
178
179 m_leaderGuid = ObjectGuid::Create<HighGuid::Player>(fields[0].Get<uint32>());
180
181 // group leader not exist
182 if (!sCharacterCache->GetCharacterNameByGuid(m_leaderGuid, m_leaderName))
183 {
184 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
186 stmt->SetData(0, groupLowGuid);
187 trans->Append(stmt);
188 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GROUP_MEMBER_ALL);
189 stmt->SetData(0, groupLowGuid);
190 trans->Append(stmt);
191 CharacterDatabase.CommitTransaction(trans);
192 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_LFG_DATA);
193 stmt->SetData(0, groupLowGuid);
194 CharacterDatabase.Execute(stmt);
195 return false;
196 }
197
198 m_lootMethod = LootMethod(fields[1].Get<uint8>());
199 m_looterGuid = ObjectGuid::Create<HighGuid::Player>(fields[2].Get<uint32>());
200 m_lootThreshold = ItemQualities(fields[3].Get<uint8>());
201
202 for (uint8 i = 0; i < TARGETICONCOUNT; ++i)
203 m_targetIcons[i].Set(fields[4 + i].Get<uint64>());
204
205 m_groupType = GroupType(fields[12].Get<uint8>());
208
209 uint32 diff = fields[13].Get<uint8>();
210 if (diff >= MAX_DUNGEON_DIFFICULTY)
212 else
214
215 uint32 r_diff = fields[14].Get<uint8>();
216 if (r_diff >= MAX_RAID_DIFFICULTY)
218 else
220
221 m_masterLooterGuid = ObjectGuid::Create<HighGuid::Player>(fields[15].Get<uint32>());
222
224 sLFGMgr->_LoadFromDB(fields, GetGUID());
225
226 return true;
227}
#define MAX_RAID_DIFFICULTY
Definition DBCEnums.h:282
Difficulty
Definition DBCEnums.h:266
#define MAX_DUNGEON_DIFFICULTY
Definition DBCEnums.h:281
LootMethod
Definition LootMgr.h:57
ItemQualities
Definition SharedDefines.h:339

References _initRaidSubGroupsCounter(), CHAR_DEL_GROUP, CHAR_DEL_GROUP_MEMBER_ALL, CHAR_DEL_LFG_DATA, CharacterDatabase, DUNGEON_DIFFICULTY_NORMAL, Field::Get(), GetGUID(), GROUPTYPE_LFG, GROUPTYPE_RAID, m_dungeonDifficulty, m_groupType, m_guid, m_leaderGuid, m_leaderName, m_looterGuid, m_lootMethod, m_lootThreshold, m_masterLooterGuid, m_raidDifficulty, m_targetIcons, MAX_DUNGEON_DIFFICULTY, MAX_RAID_DIFFICULTY, RAID_DIFFICULTY_10MAN_NORMAL, sCharacterCache, PreparedStatementBase::SetData(), sLFGMgr, and TARGETICONCOUNT.

Referenced by GroupMgr::LoadGroups().

◆ LoadMemberFromDB()

void Group::LoadMemberFromDB ( ObjectGuid::LowType  guidLow,
uint8  memberFlags,
uint8  subgroup,
uint8  roles 
)
230{
231 MemberSlot member;
232 member.guid = ObjectGuid::Create<HighGuid::Player>(guidLow);
233
234 // skip non-existed member
235 if (!sCharacterCache->GetCharacterNameByGuid(member.guid, member.name))
236 {
238 stmt->SetData(0, guidLow);
239 stmt->SetData(1, GetGUID().GetCounter());
240 CharacterDatabase.Execute(stmt);
241 return;
242 }
243
244 member.group = subgroup;
245 member.flags = memberFlags;
246 member.roles = roles;
247
248 m_memberSlots.push_back(member);
249
250 if (!isBGGroup() && !isBFGroup())
251 {
252 sCharacterCache->UpdateCharacterGroup(ObjectGuid(HighGuid::Player, guidLow), GetGUID());
253 }
254
255 SubGroupCounterIncrease(subgroup);
256
257 sLFGMgr->SetupGroupMember(member.guid, GetGUID());
258}
@ CHAR_DEL_GROUP_MEMBER
Definition CharacterDatabase.h:285

References CHAR_DEL_GROUP_MEMBER, CharacterDatabase, Group::MemberSlot::flags, GetGUID(), Group::MemberSlot::group, Group::MemberSlot::guid, isBFGroup(), isBGGroup(), m_memberSlots, Group::MemberSlot::name, Player, Group::MemberSlot::roles, sCharacterCache, PreparedStatementBase::SetData(), sLFGMgr, and SubGroupCounterIncrease().

Referenced by GroupMgr::LoadGroups().

◆ MasterLoot()

void Group::MasterLoot ( Loot loot,
WorldObject pLootedObject 
)
1312{
1313 LOG_DEBUG("network", "Group::MasterLoot (SMSG_LOOT_MASTER_LIST, 330)");
1314
1315 for (std::vector<LootItem>::iterator i = loot->items.begin(); i != loot->items.end(); ++i)
1316 {
1317 if (i->freeforall)
1318 continue;
1319
1320 i->is_blocked = !i->is_underthreshold;
1321 }
1322
1323 for (std::vector<LootItem>::iterator i = loot->quest_items.begin(); i != loot->quest_items.end(); ++i)
1324 {
1325 if (!i->follow_loot_rules)
1326 continue;
1327
1328 i->is_blocked = !i->is_underthreshold;
1329 }
1330
1331 std::vector<Player*> looters;
1332 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1333 {
1334 Player* looter = itr->GetSource();
1335 if (!looter->IsInWorld())
1336 {
1337 continue;
1338 }
1339
1340 if (looter->IsAtLootRewardDistance(pLootedObject))
1341 {
1342 looters.push_back(looter);
1343 }
1344 }
1345
1346 WorldPacket data(SMSG_LOOT_MASTER_LIST, 1 + looters.size() * (1 + 8));
1347 data << uint8(looters.size());
1348
1349 for (Player* looter : looters)
1350 {
1351 data << looter->GetGUID();
1352 }
1353
1354 for (Player* looter : looters)
1355 {
1356 looter->GetSession()->SendPacket(&data);
1357 }
1358}
bool IsInWorld() const
Definition Object.h:108
@ SMSG_LOOT_MASTER_LIST
Definition Opcodes.h:706

References GetFirstMember(), Player::IsAtLootRewardDistance(), Object::IsInWorld(), Loot::items, LOG_DEBUG, GroupReference::next(), Loot::quest_items, and SMSG_LOOT_MASTER_LIST.

Referenced by Player::SendLoot().

◆ NeedBeforeGreed()

void Group::NeedBeforeGreed ( Loot loot,
WorldObject pLootedObject 
)
1161{
1162 ItemTemplate const* item;
1163 uint8 itemSlot = 0;
1164 for (std::vector<LootItem>::iterator i = loot->items.begin(); i != loot->items.end(); ++i, ++itemSlot)
1165 {
1166 if (i->freeforall)
1167 continue;
1168
1169 item = sObjectMgr->GetItemTemplate(i->itemid);
1170
1171 //roll for over-threshold item if it's one-player loot
1172 if (item->Quality >= uint32(m_lootThreshold))
1173 {
1174 ObjectGuid newitemGUID = ObjectGuid::Create<HighGuid::Item>(sObjectMgr->GetGenerator<HighGuid::Item>().Generate());
1175 Roll* r = new Roll(newitemGUID, *i);
1176
1177 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1178 {
1179 Player* playerToRoll = itr->GetSource();
1180 if (!playerToRoll || !playerToRoll->GetSession())
1181 continue;
1182
1183 if (playerToRoll->IsAtGroupRewardDistance(lootedObject))
1184 {
1186
1187 RollVote vote = playerToRoll->GetPassOnGroupLoot() ? PASS : NOT_EMITED_YET;
1188 if (!CanRollOnItem(*i, playerToRoll, loot))
1189 {
1190 vote = PASS;
1191 r->totalPass++; // Can't broadcast the pass now. need to wait until all rolling players are known
1192 }
1193
1194 r->playerVote[playerToRoll->GetGUID()] = vote;
1195 }
1196 }
1197
1198 if (r->totalPlayersRolling > 0)
1199 {
1200 r->setLoot(loot);
1201 r->itemSlot = itemSlot;
1204
1206 r->rollVoteMask &= ~ROLL_FLAG_TYPE_NEED;
1207
1208 loot->items[itemSlot].is_blocked = true;
1209
1210 //Broadcast Pass and Send Rollstart
1211 for (Roll::PlayerVote::const_iterator itr = r->playerVote.begin(); itr != r->playerVote.end(); ++itr)
1212 {
1213 Player* p = ObjectAccessor::FindPlayer(itr->first);
1214 if (!p)
1215 continue;
1216
1217 if (itr->second == PASS)
1218 SendLootRoll(newitemGUID, p->GetGUID(), 128, ROLL_PASS, *r);
1219 else
1220 SendLootStartRollToPlayer(60000, lootedObject->GetMapId(), p, p->CanRollForItemInLFG(item, lootedObject) == EQUIP_ERR_OK, *r);
1221 }
1222
1223 RollId.push_back(r);
1224
1225 if (Creature* creature = lootedObject->ToCreature())
1226 {
1227 creature->m_groupLootTimer = 60000;
1228 creature->lootingGroupLowGUID = GetGUID().GetCounter();
1229 }
1230 else if (GameObject* go = lootedObject->ToGameObject())
1231 {
1232 go->m_groupLootTimer = 60000;
1233 go->lootingGroupLowGUID = GetGUID().GetCounter();
1234 }
1235 }
1236 else
1237 delete r;
1238 }
1239 else
1240 i->is_underthreshold = true;
1241 }
1242
1243 for (std::vector<LootItem>::iterator i = loot->quest_items.begin(); i != loot->quest_items.end(); ++i, ++itemSlot)
1244 {
1245 if (!i->follow_loot_rules)
1246 continue;
1247
1248 item = sObjectMgr->GetItemTemplate(i->itemid);
1249 ObjectGuid newitemGUID = ObjectGuid::Create<HighGuid::Item>(sObjectMgr->GetGenerator<HighGuid::Item>().Generate());
1250 Roll* r = new Roll(newitemGUID, *i);
1251
1252 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1253 {
1254 Player* playerToRoll = itr->GetSource();
1255 if (!playerToRoll || !playerToRoll->GetSession())
1256 continue;
1257
1258 if (playerToRoll->IsAtGroupRewardDistance(lootedObject))
1259 {
1261
1262 RollVote vote = playerToRoll->GetPassOnGroupLoot() ? PASS : NOT_EMITED_YET;
1263 if (!CanRollOnItem(*i, playerToRoll, loot))
1264 {
1265 vote = PASS;
1266 r->totalPass++; // Can't broadcast the pass now. need to wait until all rolling players are known
1267 }
1268
1269 r->playerVote[playerToRoll->GetGUID()] = vote;
1270 }
1271 }
1272
1273 if (r->totalPlayersRolling > 0)
1274 {
1275 r->setLoot(loot);
1276 r->itemSlot = itemSlot;
1277
1278 loot->quest_items[itemSlot - loot->items.size()].is_blocked = true;
1279
1280 //Broadcast Pass and Send Rollstart
1281 for (Roll::PlayerVote::const_iterator itr = r->playerVote.begin(); itr != r->playerVote.end(); ++itr)
1282 {
1283 Player* p = ObjectAccessor::FindPlayer(itr->first);
1284 if (!p)
1285 continue;
1286
1287 if (itr->second == PASS)
1288 SendLootRoll(newitemGUID, p->GetGUID(), 128, ROLL_PASS, *r);
1289 else
1290 SendLootStartRollToPlayer(60000, lootedObject->GetMapId(), p, p->CanRollForItemInLFG(item, lootedObject) == EQUIP_ERR_OK, *r);
1291 }
1292
1293 RollId.push_back(r);
1294
1295 if (Creature* creature = lootedObject->ToCreature())
1296 {
1297 creature->m_groupLootTimer = 60000;
1298 creature->lootingGroupLowGUID = GetGUID().GetCounter();
1299 }
1300 else if (GameObject* go = lootedObject->ToGameObject())
1301 {
1302 go->m_groupLootTimer = 60000;
1303 go->lootingGroupLowGUID = GetGUID().GetCounter();
1304 }
1305 }
1306 else
1307 delete r;
1308 }
1309}
@ ITEM_FLAG2_CAN_ONLY_ROLL_GREED
Definition ItemTemplate.h:191
void SendLootStartRollToPlayer(uint32 countDown, uint32 mapId, Player *p, bool canNeed, Roll const &r)
Definition Group.cpp:877
InventoryResult CanRollForItemInLFG(ItemTemplate const *item, WorldObject const *lootedObject) const
Definition PlayerStorage.cpp:2337
bool IsAtGroupRewardDistance(WorldObject const *pRewardSource) const
Definition Player.cpp:12786
bool HasFlag2(ItemFlags2 flag) const
Definition ItemTemplate.h:826

References Player::CanRollForItemInLFG(), CanRollOnItem(), ItemTemplate::DisenchantID, EQUIP_ERR_OK, ObjectAccessor::FindPlayer(), ObjectGuid::GetCounter(), GetFirstMember(), GetGUID(), Object::GetGUID(), WorldLocation::GetMapId(), Player::GetPassOnGroupLoot(), Player::GetSession(), ItemTemplate::HasFlag2(), Player::IsAtGroupRewardDistance(), Item, ITEM_FLAG2_CAN_ONLY_ROLL_GREED, Loot::items, Roll::itemSlot, m_lootThreshold, m_maxEnchantingLevel, GroupReference::next(), NOT_EMITED_YET, PASS, Roll::playerVote, ItemTemplate::Quality, Loot::quest_items, ItemTemplate::RequiredDisenchantSkill, ROLL_FLAG_TYPE_DISENCHANT, ROLL_PASS, RollId, Roll::rollVoteMask, SendLootRoll(), SendLootStartRollToPlayer(), Roll::setLoot(), sObjectMgr, Object::ToCreature(), Object::ToGameObject(), Roll::totalPass, and Roll::totalPlayersRolling.

Referenced by Player::SendLoot().

◆ OfflineReadyCheck()

void Group::OfflineReadyCheck ( )
1782{
1783 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
1784 {
1785 Player* player = ObjectAccessor::FindConnectedPlayer(citr->guid);
1786 if (!player)
1787 {
1789 data << citr->guid;
1790 data << uint8(0);
1791 BroadcastReadyCheck(&data);
1792 }
1793 }
1794}
void BroadcastReadyCheck(WorldPacket const *packet)
Definition Group.cpp:1770
@ MSG_RAID_READY_CHECK_CONFIRM
Definition Opcodes.h:972

References BroadcastReadyCheck(), ObjectAccessor::FindConnectedPlayer(), m_memberSlots, and MSG_RAID_READY_CHECK_CONFIRM.

Referenced by WorldSession::HandleRaidReadyCheckOpcode().

◆ RemoveAllInvites()

void Group::RemoveAllInvites ( )
362{
363 for (InvitesList::iterator itr = m_invitees.begin(); itr != m_invitees.end(); ++itr)
364 if (*itr)
365 (*itr)->SetGroupInvite(nullptr);
366
367 m_invitees.clear();
368}

References m_invitees.

Referenced by Disband(), and Player::UninviteFromGroup().

◆ RemoveInvite()

void Group::RemoveInvite ( Player player)
352{
353 if (player)
354 {
355 if (!m_invitees.empty())
356 m_invitees.erase(player);
357 player->SetGroupInvite(nullptr);
358 }
359}

References m_invitees, and Player::SetGroupInvite().

Referenced by AddInvite(), WorldSession::HandleGroupAcceptOpcode(), and Player::UninviteFromGroup().

◆ RemoveMember()

bool Group::RemoveMember ( ObjectGuid  guid,
const RemoveMethod method = GROUP_REMOVEMETHOD_DEFAULT,
ObjectGuid  kicker = ObjectGuid::Empty,
const char *  reason = nullptr 
)
547{
549
550 // LFG group vote kick handled in scripts
551 if (isLFGGroup(true) && method == GROUP_REMOVEMETHOD_KICK)
552 {
553 sLFGMgr->InitBoot(GetGUID(), kicker, guid, std::string(reason ? reason : ""));
554 return m_memberSlots.size() > 0;
555 }
556
557 // remove member and change leader (if need) only if strong more 2 members _before_ member remove (BG/BF allow 1 member group)
558 if (GetMembersCount() > ((isBGGroup() || isLFGGroup() || isBFGroup()) ? 1u : 2u))
559 {
561 if (player)
562 {
563 // Battleground group handling
564 if (isBGGroup() || isBFGroup())
566 else
567 // Regular group
568 {
569 if (player->GetOriginalGroup() == this)
570 player->SetOriginalGroup(nullptr);
571 else
572 player->SetGroup(nullptr);
573
574 // quest related GO state dependent from raid membership
576 }
577
578 WorldPacket data;
579
580 if (method == GROUP_REMOVEMETHOD_KICK || method == GROUP_REMOVEMETHOD_KICK_LFG)
581 {
583 player->GetSession()->SendPacket(&data);
584 }
585
586 // Do we really need to send this opcode?
587 data.Initialize(SMSG_GROUP_LIST, 1 + 1 + 1 + 1 + 8 + 4 + 4 + 8);
588 data << uint8(0x10) << uint8(0) << uint8(0) << uint8(0);
589 data << m_guid << uint32(m_counter) << uint32(0) << uint64(0);
590 player->GetSession()->SendPacket(&data);
591 }
592
593 // Remove player from group in DB
594 if (!isBGGroup() && !isBFGroup())
595 {
597 stmt->SetData(0, guid.GetCounter());
598 stmt->SetData(1, GetGUID().GetCounter());
599 CharacterDatabase.Execute(stmt);
600 }
601
602 // Remove player from loot rolls
603 for (Rolls::iterator it = RollId.begin(); it != RollId.end();)
604 {
605 Roll* roll = *it;
606 Roll::PlayerVote::iterator itr2 = roll->playerVote.find(guid);
607 if (itr2 == roll->playerVote.end())
608 {
609 ++it;
610 continue;
611 }
612
613 if (itr2->second == GREED || itr2->second == DISENCHANT)
614 --roll->totalGreed;
615 else if (itr2->second == NEED)
616 --roll->totalNeed;
617 else if (itr2->second == PASS)
618 --roll->totalPass;
619
620 if (itr2->second != NOT_VALID)
621 --roll->totalPlayersRolling;
622
623 roll->playerVote.erase(itr2);
624
625 // Xinef: itr can be erased inside
626 // Xinef: player is removed from all vote lists so it will not pass above playerVote == playerVote.end statement during second iteration
627 if (CountRollVote(guid, roll->itemGUID, MAX_ROLL_TYPE))
628 it = RollId.begin();
629 else
630 ++it;
631 }
632
633 // Update subgroups
635 if (slot != m_memberSlots.end())
636 {
637 SubGroupCounterDecrease(slot->group);
638 m_memberSlots.erase(slot);
639
640 if (!isBGGroup() && !isBFGroup())
641 {
642 sCharacterCache->ClearCharacterGroup(guid);
643 }
644 }
645
646 // Reevaluate group enchanter if the leaving player had enchanting skill or the player is offline
647 if (!player || player->GetSkillValue(SKILL_ENCHANTING))
648 {
650 }
651
652 // Pick new leader if necessary
653 bool validLeader = true;
654 if (m_leaderGuid == guid)
655 {
656 validLeader = false;
657 for (member_witerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr)
658 {
660 {
661 ChangeLeader(itr->guid);
662 validLeader = true;
663 break;
664 }
665 }
666 }
667
668 _homebindIfInstance(player);
669 if (!isBGGroup() && !isBFGroup())
671
672 sScriptMgr->OnGroupRemoveMember(this, guid, method, kicker, reason);
673
674 SendUpdate();
675
676 if (!validLeader)
677 {
678 // pussywizard: temp do nothing, something causes crashes in MakeNewGroup
679 //Disband();
680 //return false;
681 }
682
683 if (isLFGGroup() && GetMembersCount() == 1)
684 {
686 uint32 mapId = sLFGMgr->GetDungeonMapId(GetGUID());
687 lfg::LfgState state = sLFGMgr->GetState(GetGUID());
688 if (!mapId || !leader || (leader->IsAlive() && leader->GetMapId() != mapId) || state == lfg::LFG_STATE_NONE)
689 {
690 Disband();
691 return false;
692 }
693 }
694
695 if (m_memberMgr.getSize() < ((isLFGGroup() || isBGGroup() || isBFGroup()) ? 1u : 2u))
696 {
697 Disband();
698 return false;
699 }
700
701 return true;
702 }
703 // If group size before player removal <= 2 then disband it
704 else
705 {
706 sScriptMgr->OnGroupRemoveMember(this, guid, method, kicker, reason);
707 Disband();
708 return false;
709 }
710}
@ MAX_ROLL_TYPE
Definition LootMgr.h:37
@ GROUP_REMOVEMETHOD_KICK_LFG
Definition SharedDefines.h:3856
@ GROUP_REMOVEMETHOD_KICK
Definition SharedDefines.h:3854
void BroadcastGroupUpdate(void)
Definition Group.cpp:2209
void Disband(bool hideDestroy=false)
Definition Group.cpp:753
void ResetMaxEnchantingLevel()
Definition Group.cpp:2225
void ChangeLeader(ObjectGuid guid)
Definition Group.cpp:712
bool CountRollVote(ObjectGuid playerGUID, ObjectGuid Guid, uint8 Choise)
Definition Group.cpp:1360
uint32 getSize() const
Definition LinkedList.h:115
ObjectGuid itemGUID
Definition Group.h:151
bool IsAlive() const
Definition Unit.h:1710
@ SMSG_GROUP_UNINVITE
Definition Opcodes.h:149

References _getMemberWSlot(), _homebindIfInstance(), BroadcastGroupUpdate(), ChangeLeader(), CHAR_DEL_GROUP_MEMBER, CharacterDatabase, CountRollVote(), Disband(), DISENCHANT, ObjectAccessor::FindConnectedPlayer(), ObjectGuid::GetCounter(), GetGUID(), GetLeaderGUID(), WorldLocation::GetMapId(), GetMembersCount(), Player::GetOriginalGroup(), Player::GetSession(), LinkedListHead::getSize(), Player::GetSkillValue(), GREED, GROUP_REMOVEMETHOD_KICK, GROUP_REMOVEMETHOD_KICK_LFG, WorldPacket::Initialize(), INSTANCE_RESET_GROUP_LEAVE, Unit::IsAlive(), isBFGroup(), isBGGroup(), isLFGGroup(), Roll::itemGUID, lfg::LFG_STATE_NONE, m_counter, m_guid, m_leaderGuid, m_memberMgr, m_memberSlots, MAX_ROLL_TYPE, NEED, NOT_VALID, PASS, Roll::playerVote, Player::RemoveFromBattlegroundOrBattlefieldRaid(), Player::ResetInstances(), ResetMaxEnchantingLevel(), RollId, sCharacterCache, WorldSession::SendPacket(), SendUpdate(), PreparedStatementBase::SetData(), Player::SetGroup(), Player::SetOriginalGroup(), SKILL_ENCHANTING, sLFGMgr, SMSG_GROUP_LIST, SMSG_GROUP_UNINVITE, sScriptMgr, SubGroupCounterDecrease(), Roll::totalGreed, Roll::totalNeed, Roll::totalPass, Roll::totalPlayersRolling, and Player::UpdateForQuestWorldObjects().

Referenced by group_commandscript::HandleGroupRemoveCommand(), lfg::LFGMgr::MakeNewGroup(), and Player::RemoveFromGroup().

◆ RemoveUniqueGroupMemberFlag()

void Group::RemoveUniqueGroupMemberFlag ( GroupMemberFlags  flag)
2528{
2529 for (member_witerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr)
2530 if (itr->flags & flag)
2531 itr->flags &= ~flag;
2532}

References m_memberSlots.

Referenced by WorldSession::HandlePartyAssignmentOpcode(), and SetGroupMemberFlag().

◆ ResetInstances()

void Group::ResetInstances ( uint8  method,
bool  isRaid,
Player leader 
)
2126{
2127 if (isBGGroup() || isBFGroup() || isLFGGroup())
2128 return;
2129
2130 switch (method)
2131 {
2132 case INSTANCE_RESET_ALL:
2133 {
2134 if (leader->GetDifficulty(false) != DUNGEON_DIFFICULTY_NORMAL)
2135 break;
2136 std::vector<InstanceSave*> toUnbind;
2137 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(leader->GetGUID(), Difficulty(DUNGEON_DIFFICULTY_NORMAL));
2138 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
2139 {
2140 InstanceSave* instanceSave = itr->second.save;
2141 MapEntry const* entry = sMapStore.LookupEntry(itr->first);
2142 if (!entry || entry->IsRaid() || !instanceSave->CanReset())
2143 continue;
2144
2145 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
2146 if (!map || map->ToInstanceMap()->Reset(method))
2147 {
2148 leader->SendResetInstanceSuccess(instanceSave->GetMapId());
2149 toUnbind.push_back(instanceSave);
2150 }
2151 else
2152 {
2153 leader->SendResetInstanceFailed(0, instanceSave->GetMapId());
2154 }
2155
2156 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
2157 }
2158 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
2159 sInstanceSaveMgr->UnbindAllFor(*itr);
2160 }
2161 break;
2163 {
2164 std::vector<InstanceSave*> toUnbind;
2165 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(leader->GetGUID(), leader->GetDifficulty(isRaid));
2166 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
2167 {
2168 InstanceSave* instanceSave = itr->second.save;
2169 MapEntry const* entry = sMapStore.LookupEntry(itr->first);
2170 if (!entry || entry->IsRaid() != isRaid || !instanceSave->CanReset())
2171 continue;
2172
2173 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
2174 if (!map || map->ToInstanceMap()->Reset(method))
2175 {
2176 leader->SendResetInstanceSuccess(instanceSave->GetMapId());
2177 toUnbind.push_back(instanceSave);
2178 }
2179 else
2180 {
2181 leader->SendResetInstanceFailed(0, instanceSave->GetMapId());
2182 }
2183
2184 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
2185 }
2186 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
2187 sInstanceSaveMgr->UnbindAllFor(*itr);
2188 }
2189 break;
2190 }
2191}
std::unordered_map< uint32, InstancePlayerBind > BoundInstancesMap
Definition InstanceSaveMgr.h:46
#define sMapMgr
Definition MapMgr.h:220
@ INSTANCE_RESET_CHANGE_DIFFICULTY
Definition Map.h:620
@ INSTANCE_RESET_ALL
Definition Map.h:619
bool Reset(uint8 method, GuidList *globalSkipList=nullptr)
Definition Map.cpp:2155
Definition InstanceSaveMgr.h:56
uint32 GetMapId() const
Definition InstanceSaveMgr.h:62
bool CanReset() const
Definition InstanceSaveMgr.h:81
Definition Map.h:160
InstanceMap * ToInstanceMap()
Definition Map.h:374
void SendResetInstanceSuccess(uint32 MapId)
Definition PlayerMisc.cpp:326
void SendResetInstanceFailed(uint32 reason, uint32 MapId)
Definition PlayerMisc.cpp:333
Definition DBCStructure.h:1326
bool IsRaid() const
Definition DBCStructure.h:1355

References InstanceSave::CanReset(), DUNGEON_DIFFICULTY_NORMAL, Player::GetDifficulty(), Object::GetGUID(), InstanceSave::GetInstanceId(), InstanceSave::GetMapId(), INSTANCE_RESET_ALL, INSTANCE_RESET_CHANGE_DIFFICULTY, isBFGroup(), isBGGroup(), isLFGGroup(), MapEntry::IsRaid(), InstanceMap::Reset(), Player::SendResetInstanceFailed(), Player::SendResetInstanceSuccess(), sInstanceSaveMgr, sMapMgr, sMapStore, and Map::ToInstanceMap().

Referenced by WorldSession::HandleSetDungeonDifficultyOpcode(), and WorldSession::HandleSetRaidDifficultyOpcode().

◆ ResetMaxEnchantingLevel()

void Group::ResetMaxEnchantingLevel ( )
2226{
2228 Player* pMember = nullptr;
2229 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
2230 {
2231 pMember = ObjectAccessor::FindPlayer(citr->guid);
2232 if (pMember && pMember->GetSession() && !pMember->GetSession()->IsSocketClosed()
2233 && m_maxEnchantingLevel < pMember->GetSkillValue(SKILL_ENCHANTING))
2234 {
2236 }
2237 }
2238}
bool IsSocketClosed() const
Definition WorldSession.cpp:574

References ObjectAccessor::FindPlayer(), Player::GetSession(), Player::GetSkillValue(), WorldSession::IsSocketClosed(), m_maxEnchantingLevel, m_memberSlots, and SKILL_ENCHANTING.

Referenced by WorldSession::LogoutPlayer(), and RemoveMember().

◆ SameSubGroup() [1/3]

bool Group::SameSubGroup ( ObjectGuid  guid1,
MemberSlot const *  slot2 
) const
2382{
2383 member_citerator mslot1 = _getMemberCSlot(guid1);
2384 if (mslot1 == m_memberSlots.end() || !slot2)
2385 return false;
2386 return (mslot1->group == slot2->group);
2387}

References _getMemberCSlot(), Group::MemberSlot::group, and m_memberSlots.

◆ SameSubGroup() [2/3]

bool Group::SameSubGroup ( ObjectGuid  guid1,
ObjectGuid  guid2 
) const
2374{
2375 member_citerator mslot2 = _getMemberCSlot(guid2);
2376 if (mslot2 == m_memberSlots.end())
2377 return false;
2378 return SameSubGroup(guid1, &*mslot2);
2379}
bool SameSubGroup(ObjectGuid guid1, ObjectGuid guid2) const
Definition Group.cpp:2373

References _getMemberCSlot(), m_memberSlots, and SameSubGroup().

Referenced by Player::IsInSameGroupWith(), SameSubGroup(), and PetAI::UpdateAllies().

◆ SameSubGroup() [3/3]

bool Group::SameSubGroup ( Player const *  member1,
Player const *  member2 
) const
1797{
1798 if (!member1 || !member2)
1799 return false;
1800
1801 if (member1->GetGroup() != this || member2->GetGroup() != this)
1802 return false;
1803 else
1804 return member1->GetSubGroup() == member2->GetSubGroup();
1805}

References Player::GetGroup(), and Player::GetSubGroup().

◆ SendLootAllPassed()

void Group::SendLootAllPassed ( Roll const &  roll)
947{
948 WorldPacket data(SMSG_LOOT_ALL_PASSED, (8 + 4 + 4 + 4 + 4));
949 data << roll.itemGUID; // Guid of the item rolled
950 data << uint32(roll.itemSlot); // Item loot slot
951 data << uint32(roll.itemid); // The itemEntryId for the item that shall be rolled for
952 data << uint32(roll.itemRandomPropId); // Item random property ID
953 data << uint32(roll.itemRandomSuffix); // Item random suffix ID
954
955 for (Roll::PlayerVote::const_iterator itr = roll.playerVote.begin(); itr != roll.playerVote.end(); ++itr)
956 {
957 Player* player = ObjectAccessor::FindConnectedPlayer(itr->first);
958 if (!player)
959 continue;
960
961 if (itr->second != NOT_VALID)
962 player->GetSession()->SendPacket(&data);
963 }
964}
@ SMSG_LOOT_ALL_PASSED
Definition Opcodes.h:700

References ObjectAccessor::FindConnectedPlayer(), Player::GetSession(), Roll::itemGUID, Roll::itemid, Roll::itemRandomPropId, Roll::itemRandomSuffix, Roll::itemSlot, NOT_VALID, Roll::playerVote, WorldSession::SendPacket(), and SMSG_LOOT_ALL_PASSED.

Referenced by CountTheRoll().

◆ SendLooter()

void Group::SendLooter ( Creature creature,
Player pLooter 
)
968{
969 ASSERT(creature);
970
971 WorldPacket data(SMSG_LOOT_LIST, (8 + 8));
972 data << creature->GetGUID();
973
974 if (GetLootMethod() == MASTER_LOOT && creature->loot.hasOverThresholdItem())
976 else
977 data << uint8(0);
978
979 if (groupLooter)
980 data << groupLooter->GetPackGUID();
981 else
982 data << uint8(0);
983
984 BroadcastPacket(&data, false);
985}
@ MASTER_LOOT
Definition LootMgr.h:60
Loot loot
Definition Creature.h:230
ObjectGuid GetMasterLooterGuid() const
Definition Group.cpp:2336
LootMethod GetLootMethod() const
Definition Group.cpp:2326
PackedGuid WriteAsPacked() const
Definition ObjectGuid.h:316
@ SMSG_LOOT_LIST
Definition Opcodes.h:1047
bool hasOverThresholdItem() const
Definition LootMgr.cpp:982

References ASSERT, BroadcastPacket(), Object::GetGUID(), GetLootMethod(), GetMasterLooterGuid(), Object::GetPackGUID(), Loot::hasOverThresholdItem(), Creature::loot, MASTER_LOOT, SMSG_LOOT_LIST, and ObjectGuid::WriteAsPacked().

Referenced by Unit::Kill().

◆ SendLootRoll()

void Group::SendLootRoll ( ObjectGuid  SourceGuid,
ObjectGuid  TargetGuid,
uint8  RollNumber,
uint8  RollType,
const Roll r,
bool  autoPass = false 
)
900{
901 WorldPacket data(SMSG_LOOT_ROLL, (8 + 4 + 8 + 4 + 4 + 4 + 1 + 1 + 1));
902 data << sourceGuid; // guid of the item rolled
903 data << uint32(roll.itemSlot); // slot
904 data << targetGuid;
905 data << uint32(roll.itemid); // the itemEntryId for the item that shall be rolled for
906 data << uint32(roll.itemRandomSuffix); // randomSuffix
907 data << uint32(roll.itemRandomPropId); // Item random property ID
908 data << uint8(rollNumber); // 0: "Need for: [item name]" > 127: "you passed on: [item name]" Roll number
909 data << uint8(rollType); // 0: "Need for: [item name]" 0: "You have selected need for [item name] 1: need roll 2: greed roll
910 data << uint8(autoPass); // 1: "You automatically passed on: %s because you cannot loot that item."
911
912 for (Roll::PlayerVote::const_iterator itr = roll.playerVote.begin(); itr != roll.playerVote.end(); ++itr)
913 {
915 if (!p)
916 continue;
917
918 if (itr->second != NOT_VALID)
919 p->GetSession()->SendPacket(&data);
920 }
921}
@ SMSG_LOOT_ROLL
Definition Opcodes.h:704

References ObjectAccessor::FindConnectedPlayer(), Player::GetSession(), Roll::itemid, Roll::itemRandomPropId, Roll::itemRandomSuffix, Roll::itemSlot, NOT_VALID, Roll::playerVote, WorldSession::SendPacket(), and SMSG_LOOT_ROLL.

Referenced by CountRollVote(), CountTheRoll(), GroupLoot(), and NeedBeforeGreed().

◆ SendLootRollWon()

void Group::SendLootRollWon ( ObjectGuid  SourceGuid,
ObjectGuid  TargetGuid,
uint8  RollNumber,
uint8  RollType,
const Roll r 
)
924{
925 WorldPacket data(SMSG_LOOT_ROLL_WON, (8 + 4 + 4 + 4 + 4 + 8 + 1 + 1));
926 data << sourceGuid; // guid of the item rolled
927 data << uint32(roll.itemSlot); // slot
928 data << uint32(roll.itemid); // the itemEntryId for the item that shall be rolled for
929 data << uint32(roll.itemRandomSuffix); // randomSuffix
930 data << uint32(roll.itemRandomPropId); // Item random property
931 data << targetGuid; // guid of the player who won.
932 data << uint8(rollNumber); // rollnumber realted to SMSG_LOOT_ROLL
933 data << uint8(rollType); // rollType related to SMSG_LOOT_ROLL
934
935 for (Roll::PlayerVote::const_iterator itr = roll.playerVote.begin(); itr != roll.playerVote.end(); ++itr)
936 {
938 if (!p)
939 continue;
940
941 if (itr->second != NOT_VALID)
942 p->GetSession()->SendPacket(&data);
943 }
944}
@ SMSG_LOOT_ROLL_WON
Definition Opcodes.h:701

References ObjectAccessor::FindConnectedPlayer(), Player::GetSession(), Roll::itemid, Roll::itemRandomPropId, Roll::itemRandomSuffix, Roll::itemSlot, NOT_VALID, Roll::playerVote, WorldSession::SendPacket(), and SMSG_LOOT_ROLL_WON.

Referenced by CountTheRoll().

◆ SendLootStartRoll()

void Group::SendLootStartRoll ( uint32  CountDown,
uint32  mapid,
const Roll r 
)
854{
855 WorldPacket data(SMSG_LOOT_START_ROLL, (8 + 4 + 4 + 4 + 4 + 4 + 4 + 1));
856 data << r.itemGUID; // guid of rolled item
857 data << uint32(mapid); // 3.3.3 mapid
858 data << uint32(r.itemSlot); // itemslot
859 data << uint32(r.itemid); // the itemEntryId for the item that shall be rolled for
860 data << uint32(r.itemRandomSuffix); // randomSuffix
861 data << uint32(r.itemRandomPropId); // item random property ID
862 data << uint32(r.itemCount); // items in stack
863 data << uint32(CountDown); // the countdown time to choose "need" or "greed"
864 data << uint8(r.rollVoteMask); // roll type mask
865
866 for (Roll::PlayerVote::const_iterator itr = r.playerVote.begin(); itr != r.playerVote.end(); ++itr)
867 {
869 if (!p)
870 continue;
871
872 if (itr->second == NOT_EMITED_YET)
873 p->GetSession()->SendPacket(&data);
874 }
875}
int32 itemRandomPropId
Definition Group.h:153
uint8 itemCount
Definition Group.h:155
uint32 itemRandomSuffix
Definition Group.h:154
@ SMSG_LOOT_START_ROLL
Definition Opcodes.h:703

References ObjectAccessor::FindConnectedPlayer(), Player::GetSession(), Roll::itemCount, Roll::itemGUID, Roll::itemid, Roll::itemRandomPropId, Roll::itemRandomSuffix, Roll::itemSlot, NOT_EMITED_YET, Roll::playerVote, Roll::rollVoteMask, WorldSession::SendPacket(), and SMSG_LOOT_START_ROLL.

Referenced by GroupLoot().

◆ SendLootStartRollToPlayer()

void Group::SendLootStartRollToPlayer ( uint32  countDown,
uint32  mapId,
Player p,
bool  canNeed,
Roll const &  r 
)
878{
879 if (!p)
880 return;
881
882 WorldPacket data(SMSG_LOOT_START_ROLL, (8 + 4 + 4 + 4 + 4 + 4 + 4 + 1));
883 data << r.itemGUID; // guid of rolled item
884 data << uint32(mapId); // 3.3.3 mapid
885 data << uint32(r.itemSlot); // itemslot
886 data << uint32(r.itemid); // the itemEntryId for the item that shall be rolled for
887 data << uint32(r.itemRandomSuffix); // randomSuffix
888 data << uint32(r.itemRandomPropId); // item random property ID
889 data << uint32(r.itemCount); // items in stack
890 data << uint32(countDown); // the countdown time to choose "need" or "greed"
891 uint8 voteMask = r.rollVoteMask;
892 if (!canNeed)
893 voteMask &= ~ROLL_FLAG_TYPE_NEED;
894 data << uint8(voteMask); // roll type mask
895
896 p->GetSession()->SendPacket(&data);
897}

References Player::GetSession(), Roll::itemCount, Roll::itemGUID, Roll::itemid, Roll::itemRandomPropId, Roll::itemRandomSuffix, Roll::itemSlot, Roll::rollVoteMask, WorldSession::SendPacket(), and SMSG_LOOT_START_ROLL.

Referenced by NeedBeforeGreed().

◆ SendTargetIconList()

void Group::SendTargetIconList ( WorldSession session)
1646{
1647 if (!session)
1648 return;
1649
1651 data << uint8(1); // list targets
1652
1653 for (uint8 i = 0; i < TARGETICONCOUNT; ++i)
1654 {
1655 if (!m_targetIcons[i])
1656 continue;
1657
1658 data << uint8(i);
1659 data << m_targetIcons[i];
1660 }
1661
1662 session->SendPacket(&data);
1663}
@ MSG_RAID_TARGET_UPDATE
Definition Opcodes.h:831

References m_targetIcons, MSG_RAID_TARGET_UPDATE, WorldSession::SendPacket(), and TARGETICONCOUNT.

Referenced by WorldSession::HandleRaidTargetUpdateOpcode().

◆ SendUpdate()

◆ SendUpdateToPlayer()

void Group::SendUpdateToPlayer ( ObjectGuid  playerGUID,
MemberSlot slot = nullptr 
)
1672{
1673 Player* player = ObjectAccessor::FindConnectedPlayer(playerGUID);
1674
1675 if (!player || player->GetGroup() != this)
1676 return;
1677
1678 // if MemberSlot wasn't provided
1679 if (!slot)
1680 {
1681 member_witerator witr = _getMemberWSlot(playerGUID);
1682
1683 if (witr == m_memberSlots.end()) // if there is no MemberSlot for such a player
1684 return;
1685
1686 slot = &(*witr);
1687 }
1688
1689 WorldPacket data(SMSG_GROUP_LIST, (1 + 1 + 1 + 1 + 1 + 4 + 8 + 4 + 4 + (GetMembersCount() - 1) * (13 + 8 + 1 + 1 + 1 + 1) + 8 + 1 + 8 + 1 + 1 + 1 + 1));
1690 data << uint8(m_groupType); // group type (flags in 3.3)
1691 data << uint8(slot->group);
1692 data << uint8(slot->flags);
1693 data << uint8(slot->roles);
1694 if (isLFGGroup())
1695 {
1696 data << uint8(sLFGMgr->GetState(m_guid) == lfg::LFG_STATE_FINISHED_DUNGEON ? 2 : 0); // FIXME - Dungeon save status? 2 = done
1697 data << uint32(sLFGMgr->GetDungeon(m_guid));
1698 }
1699
1700 data << m_guid;
1701 data << uint32(m_counter++); // 3.3, value increases every time this packet gets sent
1702 data << uint32(GetMembersCount() - 1);
1703 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
1704 {
1705 if (slot->guid == citr->guid)
1706 continue;
1707
1708 Player* member = ObjectAccessor::FindConnectedPlayer(citr->guid);
1709
1710 uint8 onlineState = (member && !member->GetSession()->PlayerLogout()) ? MEMBER_STATUS_ONLINE : MEMBER_STATUS_OFFLINE;
1711 onlineState = onlineState | ((isBGGroup() || isBFGroup()) ? MEMBER_STATUS_PVP : 0);
1712
1713 data << citr->name;
1714 data << citr->guid; // guid
1715 data << uint8(onlineState); // online-state
1716 data << uint8(citr->group); // groupid
1717 data << uint8(citr->flags); // See enum GroupMemberFlags
1718 data << uint8(citr->roles); // Lfg Roles
1719 }
1720
1721 data << m_leaderGuid; // leader guid
1722
1723 if (GetMembersCount() - 1)
1724 {
1725 data << uint8(m_lootMethod); // loot method
1726
1728 data << m_masterLooterGuid; // master looter guid
1729 else
1730 data << uint64(0); // looter guid
1731
1732 data << uint8(m_lootThreshold); // loot threshold
1733 data << uint8(m_dungeonDifficulty); // Dungeon Difficulty
1734 data << uint8(m_raidDifficulty); // Raid Difficulty
1735 data << uint8(m_raidDifficulty >= RAID_DIFFICULTY_10MAN_HEROIC); // 3.3 Dynamic Raid Difficulty - 0 normal/1 heroic
1736 }
1737
1738 player->GetSession()->SendPacket(&data);
1739}
@ RAID_DIFFICULTY_10MAN_HEROIC
Definition DBCEnums.h:275
@ MEMBER_STATUS_OFFLINE
Definition Group.h:60
@ MEMBER_STATUS_PVP
Definition Group.h:62
@ MEMBER_STATUS_ONLINE
Definition Group.h:61
bool PlayerLogout() const
Definition WorldSession.h:373
@ LFG_STATE_FINISHED_DUNGEON
Definition LFG.h:74

References _getMemberWSlot(), ObjectAccessor::FindConnectedPlayer(), Group::MemberSlot::flags, Player::GetGroup(), GetMembersCount(), Player::GetSession(), Group::MemberSlot::group, Group::MemberSlot::guid, isBFGroup(), isBGGroup(), isLFGGroup(), lfg::LFG_STATE_FINISHED_DUNGEON, m_counter, m_dungeonDifficulty, m_groupType, m_guid, m_leaderGuid, m_lootMethod, m_lootThreshold, m_masterLooterGuid, m_memberSlots, m_raidDifficulty, MASTER_LOOT, MEMBER_STATUS_OFFLINE, MEMBER_STATUS_ONLINE, MEMBER_STATUS_PVP, WorldSession::PlayerLogout(), RAID_DIFFICULTY_10MAN_HEROIC, Group::MemberSlot::roles, WorldSession::SendPacket(), sLFGMgr, and SMSG_GROUP_LIST.

Referenced by SendUpdate().

◆ SetBattlefieldGroup()

void Group::SetBattlefieldGroup ( Battlefield bf)
2408{
2409 m_bfGroup = bg;
2410}

References m_bfGroup.

Referenced by Battlefield::AddOrSetPlayerToCorrectBfGroup().

◆ SetBattlegroundGroup()

void Group::SetBattlegroundGroup ( Battleground bg)
2403{
2404 m_bgGroup = bg;
2405}

References m_bgGroup.

Referenced by Battleground::SetBgRaid().

◆ SetDifficultyChangePrevention()

◆ SetDungeonDifficulty()

void Group::SetDungeonDifficulty ( Difficulty  difficulty)
2084{
2085 m_dungeonDifficulty = difficulty;
2086 if (!isBGGroup() && !isBFGroup())
2087 {
2089
2091 stmt->SetData(1, GetGUID().GetCounter());
2092
2093 CharacterDatabase.Execute(stmt);
2094 }
2095
2096 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
2097 {
2098 Player* player = itr->GetSource();
2099 player->SetDungeonDifficulty(difficulty);
2100 player->SendDungeonDifficulty(true);
2101 }
2102}
@ CHAR_UPD_GROUP_DIFFICULTY
Definition CharacterDatabase.h:290

References CHAR_UPD_GROUP_DIFFICULTY, CharacterDatabase, GetFirstMember(), GetGUID(), isBFGroup(), isBGGroup(), m_dungeonDifficulty, GroupReference::next(), Player::SendDungeonDifficulty(), PreparedStatementBase::SetData(), and Player::SetDungeonDifficulty().

Referenced by WorldSession::HandleSetDungeonDifficultyOpcode(), and lfg::LFGMgr::MakeNewGroup().

◆ SetGroupMemberFlag()

void Group::SetGroupMemberFlag ( ObjectGuid  guid,
bool  apply,
GroupMemberFlags  flag 
)
2413{
2414 // Assistants, main assistants and main tanks are only available in raid groups
2415 if (!isRaidGroup())
2416 return;
2417
2418 // Check if player is really in the raid
2419 member_witerator slot = _getMemberWSlot(guid);
2420 if (slot == m_memberSlots.end())
2421 return;
2422
2423 // Do flag specific actions, e.g ensure uniqueness
2424 switch (flag)
2425 {
2427 RemoveUniqueGroupMemberFlag(MEMBER_FLAG_MAINASSIST); // Remove main assist flag from current if any.
2428 break;
2430 RemoveUniqueGroupMemberFlag(MEMBER_FLAG_MAINTANK); // Remove main tank flag from current if any.
2431 break;
2433 break;
2434 default:
2435 return; // This should never happen
2436 }
2437
2438 // Switch the actual flag
2439 ToggleGroupMemberFlag(slot, flag, apply);
2440
2441 // Preserve the new setting in the db
2443
2444 stmt->SetData(0, slot->flags);
2445 stmt->SetData(1, guid.GetCounter());
2446
2447 CharacterDatabase.Execute(stmt);
2448
2449 // Broadcast the changes to the group
2450 SendUpdate();
2451}
@ CHAR_UPD_GROUP_MEMBER_FLAG
Definition CharacterDatabase.h:289
@ MEMBER_FLAG_MAINASSIST
Definition Group.h:75
@ MEMBER_FLAG_MAINTANK
Definition Group.h:74
void RemoveUniqueGroupMemberFlag(GroupMemberFlags flag)
Definition Group.cpp:2527

References _getMemberWSlot(), CHAR_UPD_GROUP_MEMBER_FLAG, CharacterDatabase, ObjectGuid::GetCounter(), isRaidGroup(), m_memberSlots, MEMBER_FLAG_ASSISTANT, MEMBER_FLAG_MAINASSIST, MEMBER_FLAG_MAINTANK, RemoveUniqueGroupMemberFlag(), SendUpdate(), PreparedStatementBase::SetData(), and ToggleGroupMemberFlag().

Referenced by WorldSession::HandleGroupAssistantLeaderOpcode(), and WorldSession::HandlePartyAssignmentOpcode().

◆ SetLfgRoles()

void Group::SetLfgRoles ( ObjectGuid  guid,
const uint8  roles 
)
2261{
2262 member_witerator slot = _getMemberWSlot(guid);
2263 if (slot == m_memberSlots.end())
2264 return;
2265
2266 slot->roles = roles;
2267 SendUpdate();
2268}

References _getMemberWSlot(), m_memberSlots, and SendUpdate().

Referenced by lfg::LFGMgr::MakeNewGroup().

◆ SetLooterGuid()

void Group::SetLooterGuid ( ObjectGuid  guid)
2246{
2247 m_looterGuid = guid;
2248}

References m_looterGuid.

Referenced by UpdateLooterGuid().

◆ SetLootMethod()

void Group::SetLootMethod ( LootMethod  method)
2241{
2242 m_lootMethod = method;
2243}

References m_lootMethod.

Referenced by WorldSession::HandleLootMethodOpcode().

◆ SetLootThreshold()

void Group::SetLootThreshold ( ItemQualities  threshold)
2256{
2257 m_lootThreshold = threshold;
2258}

References m_lootThreshold.

Referenced by WorldSession::HandleLootMethodOpcode().

◆ SetMasterLooterGuid()

void Group::SetMasterLooterGuid ( ObjectGuid  guid)
2251{
2252 m_masterLooterGuid = guid;
2253}

References m_masterLooterGuid.

Referenced by WorldSession::HandleLootMethodOpcode().

◆ SetRaidDifficulty()

void Group::SetRaidDifficulty ( Difficulty  difficulty)
2105{
2106 m_raidDifficulty = difficulty;
2107 if (!isBGGroup() && !isBFGroup())
2108 {
2110
2111 stmt->SetData(0, uint8(m_raidDifficulty));
2112 stmt->SetData(1, GetGUID().GetCounter());
2113
2114 CharacterDatabase.Execute(stmt);
2115 }
2116
2117 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
2118 {
2119 Player* player = itr->GetSource();
2120 player->SetRaidDifficulty(difficulty);
2121 player->SendRaidDifficulty(true);
2122 }
2123}
@ CHAR_UPD_GROUP_RAID_DIFFICULTY
Definition CharacterDatabase.h:291

References CHAR_UPD_GROUP_RAID_DIFFICULTY, CharacterDatabase, GetFirstMember(), GetGUID(), isBFGroup(), isBGGroup(), m_raidDifficulty, GroupReference::next(), Player::SendRaidDifficulty(), PreparedStatementBase::SetData(), and Player::SetRaidDifficulty().

Referenced by WorldSession::HandleSetRaidDifficultyOpcode().

◆ SetTargetIcon()

void Group::SetTargetIcon ( uint8  id,
ObjectGuid  whoGuid,
ObjectGuid  targetGuid 
)
1625{
1626 if (id >= TARGETICONCOUNT)
1627 return;
1628
1629 // clean other icons
1630 if (targetGuid)
1631 for (int i = 0; i < TARGETICONCOUNT; ++i)
1632 if (m_targetIcons[i] == targetGuid)
1634
1635 m_targetIcons[id] = targetGuid;
1636
1637 WorldPacket data(MSG_RAID_TARGET_UPDATE, (1 + 8 + 1 + 8));
1638 data << uint8(0); // set targets
1639 data << whoGuid;
1640 data << uint8(id);
1641 data << targetGuid;
1642 BroadcastPacket(&data, true);
1643}
void SetTargetIcon(uint8 id, ObjectGuid whoGuid, ObjectGuid targetGuid)
Definition Group.cpp:1624

References BroadcastPacket(), ObjectGuid::Empty, m_targetIcons, MSG_RAID_TARGET_UPDATE, SetTargetIcon(), and TARGETICONCOUNT.

Referenced by WorldSession::HandleRaidTargetUpdateOpcode(), and SetTargetIcon().

◆ SubGroupCounterDecrease()

void Group::SubGroupCounterDecrease ( uint8  subgroup)
protected
2522{
2524 --m_subGroupsCounts[subgroup];
2525}

References m_subGroupsCounts.

Referenced by ChangeMembersGroup(), and RemoveMember().

◆ SubGroupCounterIncrease()

void Group::SubGroupCounterIncrease ( uint8  subgroup)
protected
2516{
2518 ++m_subGroupsCounts[subgroup];
2519}

References m_subGroupsCounts.

Referenced by AddMember(), ChangeMembersGroup(), and LoadMemberFromDB().

◆ ToggleGroupMemberFlag()

void Group::ToggleGroupMemberFlag ( member_witerator  slot,
uint8  flag,
bool  apply 
)
protected
2535{
2536 if (apply)
2537 slot->flags |= flag;
2538 else
2539 slot->flags &= ~flag;
2540}

Referenced by ChangeLeader(), and SetGroupMemberFlag().

◆ UpdateLooterGuid()

void Group::UpdateLooterGuid ( WorldObject pLootedObject,
bool  ifneed = false 
)
1869{
1870 // round robin style looting applies for all low
1871 // quality items in each loot method except free for all
1872 if (GetLootMethod() == FREE_FOR_ALL)
1873 return;
1874
1875 ObjectGuid oldLooterGUID = GetLooterGuid();
1876 member_citerator guid_itr = _getMemberCSlot(oldLooterGUID);
1877 if (guid_itr != m_memberSlots.end())
1878 {
1879 if (ifneed)
1880 {
1881 // not update if only update if need and ok
1882 Player* looter = ObjectAccessor::FindPlayer(guid_itr->guid);
1883 if (looter && looter->IsAtLootRewardDistance(pLootedObject))
1884 return;
1885 }
1886 ++guid_itr;
1887 }
1888
1889 // search next after current
1890 Player* pNewLooter = nullptr;
1891 for (member_citerator itr = guid_itr; itr != m_memberSlots.end(); ++itr)
1892 {
1893 if (Player* player = ObjectAccessor::FindPlayer(itr->guid))
1894 if (player->IsAtLootRewardDistance(pLootedObject))
1895 {
1896 pNewLooter = player;
1897 break;
1898 }
1899 }
1900
1901 if (!pNewLooter)
1902 {
1903 // search from start
1904 for (member_citerator itr = m_memberSlots.begin(); itr != guid_itr; ++itr)
1905 {
1906 if (Player* player = ObjectAccessor::FindPlayer(itr->guid))
1907 if (player->IsAtLootRewardDistance(pLootedObject))
1908 {
1909 pNewLooter = player;
1910 break;
1911 }
1912 }
1913 }
1914
1915 if (pNewLooter)
1916 {
1917 if (oldLooterGUID != pNewLooter->GetGUID())
1918 {
1919 SetLooterGuid(pNewLooter->GetGUID());
1920 SendUpdate();
1921 }
1922 }
1923 else
1924 {
1926 SendUpdate();
1927 }
1928}
ObjectGuid GetLooterGuid() const
Definition Group.cpp:2331
void SetLooterGuid(ObjectGuid guid)
Definition Group.cpp:2245

References _getMemberCSlot(), ObjectGuid::Empty, ObjectAccessor::FindPlayer(), FREE_FOR_ALL, Object::GetGUID(), GetLooterGuid(), GetLootMethod(), Player::IsAtLootRewardDistance(), m_memberSlots, SendUpdate(), and SetLooterGuid().

Referenced by Unit::Kill(), and Player::SendLoot().

◆ UpdatePlayerOutOfRange()

void Group::UpdatePlayerOutOfRange ( Player player)
1742{
1743 if (!player || !player->IsInWorld())
1744 return;
1745
1746 WorldPacket data;
1747 player->GetSession()->BuildPartyMemberStatsChangedPacket(player, &data);
1748
1749 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1750 {
1751 Player* member = itr->GetSource();
1752 if (member && (!member->IsInMap(player) || !member->IsWithinDist(player, member->GetSightRange(player), false)))
1753 member->GetSession()->SendPacket(&data);
1754 }
1755}
float GetSightRange(WorldObject const *target=nullptr) const override
Definition Player.cpp:16310
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition Object.cpp:1321
bool IsInMap(WorldObject const *obj) const
Definition Object.cpp:1290
void BuildPartyMemberStatsChangedPacket(Player *player, WorldPacket *data)
Definition GroupHandler.cpp:759

References WorldSession::BuildPartyMemberStatsChangedPacket(), GetFirstMember(), Player::GetSession(), Player::GetSightRange(), WorldObject::IsInMap(), Object::IsInWorld(), WorldObject::IsWithinDist(), GroupReference::next(), and WorldSession::SendPacket().

Referenced by AddMember().

Member Data Documentation

◆ _difficultyChangePreventionTime

uint32 Group::_difficultyChangePreventionTime
protected

◆ _difficultyChangePreventionType

DifficultyPreventionChangeType Group::_difficultyChangePreventionType
protected

◆ CustomData

DataMap Group::CustomData

◆ m_bfGroup

Battlefield* Group::m_bfGroup
protected

Referenced by isBFGroup(), and SetBattlefieldGroup().

◆ m_bgGroup

Battleground* Group::m_bgGroup
protected

◆ m_counter

uint32 Group::m_counter
protected

◆ m_dungeonDifficulty

◆ m_groupType

◆ m_guid

◆ m_invitees

◆ m_leaderGuid

◆ m_leaderName

std::string Group::m_leaderName
protected

◆ m_lfgGroupFlags

◆ m_looterGuid

ObjectGuid Group::m_looterGuid
protected

◆ m_lootMethod

◆ m_lootThreshold

◆ m_masterLooterGuid

ObjectGuid Group::m_masterLooterGuid
protected

◆ m_maxEnchantingLevel

uint32 Group::m_maxEnchantingLevel
protected

◆ m_memberMgr

GroupRefMgr Group::m_memberMgr
protected

◆ m_memberSlots

◆ m_raidDifficulty

◆ m_subGroupsCounts

◆ m_targetIcons

◆ RollId


The documentation for this class was generated from the following files: