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 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 ( )
69{
70 sScriptMgr->OnConstructGroup(this);
71}
@ 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:727
@ ITEM_QUALITY_UNCOMMON
Definition SharedDefines.h:331
uint32 m_counter
Definition Group.h:354
Battlefield * m_bfGroup
Definition Group.h:344
uint32 m_maxEnchantingLevel
Definition Group.h:355
DifficultyPreventionChangeType _difficultyChangePreventionType
Definition Group.h:360
std::string m_leaderName
Definition Group.h:340
Battleground * m_bgGroup
Definition Group.h:345
Difficulty m_raidDifficulty
Definition Group.h:343
LootMethod m_lootMethod
Definition Group.h:347
uint8 * m_subGroupsCounts
Definition Group.h:352
Difficulty m_dungeonDifficulty
Definition Group.h:342
ItemQualities m_lootThreshold
Definition Group.h:348
GroupType m_groupType
Definition Group.h:341
uint32 _difficultyChangePreventionTime
Definition Group.h:359

References sScriptMgr.

◆ ~Group()

Group::~Group ( )
74{
75 sScriptMgr->OnDestructGroup(this);
76
77 if (m_bgGroup)
78 {
79 LOG_DEBUG("bg.battleground", "Group::~Group: battleground group being deleted.");
80
81 if (m_bgGroup->GetBgRaid(TEAM_ALLIANCE) == this)
82 {
84 }
85 else if (m_bgGroup->GetBgRaid(TEAM_HORDE) == this)
86 {
88 }
89 else
90 LOG_ERROR("bg.battleground", "Group::~Group: battleground group is not linked to the correct battleground.");
91 }
92
93 Rolls::iterator itr;
94 while (!RollId.empty())
95 {
96 itr = RollId.begin();
97 Roll* r = *itr;
98 RollId.erase(itr);
99 delete(r);
100 }
101
102 // Sub group counters clean up
103 delete[] m_subGroupsCounts;
104}
#define LOG_ERROR(filterType__,...)
Definition Log.h:157
#define LOG_DEBUG(filterType__,...)
Definition Log.h:169
@ TEAM_ALLIANCE
Definition SharedDefines.h:760
@ TEAM_HORDE
Definition SharedDefines.h:761
Group * GetBgRaid(TeamId teamId) const
Definition Battleground.h:492
void SetBgRaid(TeamId teamId, Group *bg_raid)
Definition Battleground.cpp:1806
Rolls RollId
Definition Group.h:351
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
2188{
2189 // if player is reinvited to group and in the instance - cancel homebind timer
2190 if (!player->FindMap() || !player->FindMap()->IsDungeon())
2191 return;
2192 InstancePlayerBind* bind = sInstanceSaveMgr->PlayerGetBoundInstance(player->GetGUID(), player->FindMap()->GetId(), player->GetDifficulty(player->FindMap()->IsRaid()));
2193 if (bind && bind->save->GetInstanceId() == player->GetInstanceId())
2194 player->m_InstanceValid = true;
2195}
#define sInstanceSaveMgr
Definition InstanceSaveMgr.h:202
uint32 GetInstanceId() const
Definition InstanceSaveMgr.h:61
bool IsDungeon() const
Definition Map.h:295
bool IsRaid() const
Definition Map.h:297
uint32 GetId() const
Definition Map.h:229
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:112
bool m_InstanceValid
Definition Player.h:2444
Difficulty GetDifficulty(bool isRaid) const
Definition Player.h:1927
Map * FindMap() const
Definition Object.h:537
uint32 GetInstanceId() const
Definition Object.h:448
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
2488{
2489 for (member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr)
2490 if (itr->guid == Guid)
2491 return itr;
2492 return m_memberSlots.end();
2493}
MemberSlotList m_memberSlots
Definition Group.h:336
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
2496{
2497 for (member_witerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr)
2498 if (itr->guid == Guid)
2499 return itr;
2500 return m_memberSlots.end();
2501}
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
2182{
2183 if (player && !player->IsGameMaster() && player->FindMap() && sMapStore.LookupEntry(player->GetMapId())->IsDungeon())
2184 player->m_InstanceValid = false;
2185}
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
bool IsGameMaster() const
Definition Player.h:1175
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
2476{
2477 // Sub group counters initialization
2478 if (!m_subGroupsCounts)
2480
2481 memset((void*)m_subGroupsCounts, 0, (MAX_RAID_SUBGROUPS)*sizeof(uint8));
2482
2483 for (member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr)
2484 ++m_subGroupsCounts[itr->group];
2485}
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)
319{
320 if (!player || player->GetGroupInvite())
321 return false;
322 Group* group = player->GetGroup();
323 if (group && (group->isBGGroup() || group->isBFGroup()))
324 group = player->GetOriginalGroup();
325 if (group)
326 return false;
327
328 RemoveInvite(player);
329
330 m_invitees.insert(player);
331
332 player->SetGroupInvite(this);
333
334 sScriptMgr->OnGroupInviteMember(this, player->GetGUID());
335
336 return true;
337}
Definition Group.h:169
InvitesList m_invitees
Definition Group.h:338
void RemoveInvite(Player *player)
Definition Group.cpp:349
bool isBGGroup() const
Definition Group.cpp:2274
bool isBFGroup() const
Definition Group.cpp:2279
void SetGroupInvite(Group *group)
Definition Player.h:2475
Group * GetGroup()
Definition Player.h:2476
Group * GetGroupInvite()
Definition Player.h:2474
Group * GetOriginalGroup()
Definition Player.h:2491

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)
340{
341 if (!AddInvite(player))
342 return false;
343
344 m_leaderGuid = player->GetGUID();
345 m_leaderName = player->GetName();
346 return true;
347}
ObjectGuid m_leaderGuid
Definition Group.h:339
bool AddInvite(Player *player)
Definition Group.cpp:318
std::string const & GetName() const
Definition Object.h:463

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:356

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)
389{
390 if (!player)
391 return false;
392
393 // Get first not-full group
394 uint8 subGroup = 0;
396 {
397 bool groupFound = false;
398 for (; subGroup < MAX_RAID_SUBGROUPS; ++subGroup)
399 {
400 if (m_subGroupsCounts[subGroup] < MAXGROUPSIZE)
401 {
402 groupFound = true;
403 break;
404 }
405 }
406 // We are raid group and no one slot is free
407 if (!groupFound)
408 return false;
409 }
410
411 MemberSlot member;
412 member.guid = player->GetGUID();
413 member.name = player->GetName();
414 member.group = subGroup;
415 member.flags = 0;
416 member.roles = 0;
417 m_memberSlots.push_back(member);
418
419 if (!isBGGroup() && !isBFGroup())
420 {
421 sCharacterCache->UpdateCharacterGroup(player->GetGUID(), GetGUID());
422 }
423
424 SubGroupCounterIncrease(subGroup);
425
426 player->SetGroupInvite(nullptr);
427 if (player->GetGroup())
428 {
429 if (isBGGroup() || isBFGroup()) // if player is in group and he is being added to BG raid group, then call SetBattlegroundRaid()
430 player->SetBattlegroundOrBattlefieldRaid(this, subGroup);
431 else //if player is in bg raid and we are adding him to normal group, then call SetOriginalGroup()
432 player->SetOriginalGroup(this, subGroup);
433 }
434 else //if player is not in group, then call set group
435 player->SetGroup(this, subGroup);
436
437 // if the same group invites the player back, cancel the homebind timer
439
440 if (!isRaidGroup()) // reset targetIcons for non-raid-groups
441 {
442 for (uint8 i = 0; i < TARGETICONCOUNT; ++i)
443 m_targetIcons[i].Clear();
444 }
445
446 if (!isBGGroup() && !isBFGroup())
447 {
449 stmt->SetData(0, GetGUID().GetCounter());
450 stmt->SetData(1, member.guid.GetCounter());
451 stmt->SetData(2, member.flags);
452 stmt->SetData(3, member.group);
453 stmt->SetData(4, member.roles);
454 CharacterDatabase.Execute(stmt);
455 }
456
457 SendUpdate();
458
459 if (player)
460 {
461 sScriptMgr->OnGroupAddMember(this, player->GetGUID());
462
463 if (!IsLeader(player->GetGUID()) && !isBGGroup() && !isBFGroup())
464 {
466
468 {
470 player->SendDungeonDifficulty(true);
471 }
472 if (player->GetRaidDifficulty() != GetRaidDifficulty())
473 {
475 player->SendRaidDifficulty(true);
476 }
477 }
478 else if (IsLeader(player->GetGUID()) && isLFGGroup()) // pussywizard
479 {
481 }
482
485
486 // quest related GO state dependent from raid membership
487 if (isRaidGroup())
489
490 {
491 // Broadcast new player group member fields to rest of the group
493
494 UpdateData groupData;
495 WorldPacket groupDataPacket;
496
497 // Broadcast group members' fields to player
498 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
499 {
500 if (itr->GetSource() == player) // pussywizard: no check same map, adding members is single threaded
501 {
502 continue;
503 }
504
505 if (Player* itrMember = itr->GetSource())
506 {
507 if (player->HaveAtClient(itrMember))
508 {
509 itrMember->SetFieldNotifyFlag(UF_FLAG_PARTY_MEMBER);
510 itrMember->BuildValuesUpdateBlockForPlayer(&groupData, player);
511 itrMember->RemoveFieldNotifyFlag(UF_FLAG_PARTY_MEMBER);
512 }
513
514 if (itrMember->HaveAtClient(player))
515 {
516 UpdateData newData;
517 WorldPacket newDataPacket;
518 player->BuildValuesUpdateBlockForPlayer(&newData, itrMember);
519 if (newData.HasData())
520 {
521 newData.BuildPacket(newDataPacket);
522 itrMember->SendDirectMessage(&newDataPacket);
523 }
524 }
525 }
526 }
527
528 if (groupData.HasData())
529 {
530 groupData.BuildPacket(groupDataPacket);
531 player->SendDirectMessage(&groupDataPacket);
532 }
533
535 }
536
537 if (m_maxEnchantingLevel < player->GetSkillValue(SKILL_ENCHANTING))
539 }
540
541 return true;
542}
#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:647
@ SKILL_ENCHANTING
Definition SharedDefines.h:2954
@ 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:2263
bool IsLeader(ObjectGuid guid) const
Definition Group.cpp:2339
void SendUpdate()
Definition Group.cpp:1663
ObjectGuid GetGUID() const
Definition Group.cpp:2304
void _cancelHomebindIfInstance(Player *player)
Definition Group.cpp:2187
Difficulty GetRaidDifficulty() const
Definition Group.cpp:2451
ObjectGuid m_targetIcons[TARGETICONCOUNT]
Definition Group.h:346
void UpdatePlayerOutOfRange(Player *player)
Definition Group.cpp:1739
GroupReference * GetFirstMember()
Definition Group.h:243
void SubGroupCounterIncrease(uint8 subgroup)
Definition Group.cpp:2503
Difficulty GetDungeonDifficulty() const
Definition Group.cpp:2446
bool isRaidGroup() const
Definition Group.cpp:2269
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition Object.cpp:257
void RemoveFieldNotifyFlag(uint16 flag)
Definition Object.h:195
void SetFieldNotifyFlag(uint16 flag)
Definition Object.h:194
Definition Player.h:1081
Difficulty GetRaidDifficulty() const
Definition Player.h:1929
void SetOriginalGroup(Group *group, int8 subgroup=-1)
Definition Player.cpp:13170
void SetGroupUpdateFlag(uint32 flag)
Definition Player.h:2482
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5733
uint16 GetSkillValue(uint32 skill) const
Definition Player.cpp:5478
void SetDungeonDifficulty(Difficulty dungeon_difficulty)
Definition Player.h:1931
void SetGroup(Group *group, int8 subgroup=-1)
Definition Player.cpp:11624
bool HaveAtClient(WorldObject const *u) const
Definition Player.cpp:11473
void UpdateForQuestWorldObjects()
Definition PlayerUpdates.cpp:1792
void SetRaidDifficulty(Difficulty raid_difficulty)
Definition Player.h:1932
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:1928
void SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty=-1)
Definition PlayerMisc.cpp:177
void SetBattlegroundOrBattlefieldRaid(Group *group, int8 subgroup=-1)
Definition Player.cpp:13142
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  )
2198{
2199 // FG: HACK: force flags update on group leave - for values update hack
2200 // -- not very efficient but safe
2201 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
2202 {
2203 Player* pp = ObjectAccessor::FindPlayer(citr->guid);
2204 if (pp)
2205 {
2208 LOG_DEBUG("group", "-- Forced group value update for '{}'", pp->GetName());
2209 }
2210 }
2211}
@ UNIT_FIELD_FACTIONTEMPLATE
Definition UpdateFields.h:115
@ UNIT_FIELD_BYTES_2
Definition UpdateFields.h:161
void ForceValuesUpdateAtIndex(uint32)
Definition Object.cpp:2078
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 
)
1756{
1757 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1758 {
1759 Player* player = itr->GetSource();
1760 if (!player || (ignore && player->GetGUID() == ignore) || (ignorePlayersInBGRaid && player->GetGroup() != this))
1761 continue;
1762
1763 if (group == -1 || itr->getSubGroup() == group)
1764 player->GetSession()->SendPacket(packet);
1765 }
1766}
WorldSession * GetSession() const
Definition Player.h:2005
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition WorldSession.cpp:226

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

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

◆ BroadcastReadyCheck()

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

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 
)
1929{
1930 // check if this group is LFG group
1931 if (isLFGGroup())
1933
1934 BattlemasterListEntry const* bgEntry = sBattlemasterListStore.LookupEntry(bgTemplate->GetBgTypeID());
1935 if (!bgEntry)
1937
1938 // too many players in the group
1939 if (GetMembersCount() > bgEntry->maxGroupSize)
1940 return ERR_BATTLEGROUND_NONE;
1941
1942 // get a player as reference, to compare other players' stats to (arena team id, level bracket, etc.)
1943 Player* reference = GetFirstMember()->GetSource();
1944 if (!reference)
1946
1947 PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bgTemplate->GetMapId(), reference->GetLevel());
1948 if (!bracketEntry)
1950
1951 uint32 arenaTeamId = reference->GetArenaTeamId(arenaSlot);
1952 TeamId teamId = reference->GetTeamId();
1953
1955
1956 // check every member of the group to be able to join
1957 uint32 memberscount = 0;
1958 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next(), ++memberscount)
1959 {
1960 Player* member = itr->GetSource();
1961
1962 // don't let join with offline members
1963 if (!member)
1965
1966 if (!sScriptMgr->CanGroupJoinBattlegroundQueue(this, member, bgTemplate, MinPlayerCount, isRated, arenaSlot))
1968
1969 // don't allow cross-faction groups to join queue
1970 if (member->GetTeamId() != teamId && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP))
1972
1973 // don't let join rated matches if the arena team id doesn't match
1974 if (isRated && member->GetArenaTeamId(arenaSlot) != arenaTeamId)
1976
1977 // not in the same battleground level braket, don't let join
1978 PvPDifficultyEntry const* memberBracketEntry = GetBattlegroundBracketByLevel(bracketEntry->mapId, member->GetLevel());
1979 if (memberBracketEntry != bracketEntry)
1981
1982 // check for deserter debuff in case not arena queue
1983 if (bgTemplate->GetBgTypeID() != BATTLEGROUND_AA && !member->CanJoinToBattleground())
1985
1986 // check if someone in party is using dungeon system
1987 lfg::LfgState lfgState = sLFGMgr->GetState(member->GetGUID());
1988 if (lfgState > lfg::LFG_STATE_NONE && (lfgState != lfg::LFG_STATE_QUEUED || !sWorld->getBoolConfig(CONFIG_ALLOW_JOIN_BG_AND_LFG)))
1989 {
1991 }
1992
1993 // pussywizard: prevent joining when any member is in bg/arena
1994 if (member->InBattleground())
1996
1997 // pussywizard: check for free slot, this is actually ensured before calling this function, but just in case
1998 if (!member->HasFreeBattlegroundQueueId())
2000
2001 // don't let join if someone from the group is already in that bg queue
2002 if (member->InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeId))
2003 {
2005 }
2006
2007 // don't let join if someone from the group is in bg queue random
2008 if (member->InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeIdRandom))
2009 return ERR_IN_RANDOM_BG;
2010
2011 // don't let join to bg queue random if someone from the group is already in bg queue
2012 if (bgTemplate->GetBgTypeID() == BATTLEGROUND_RB && member->InBattlegroundQueue())
2013 return ERR_IN_NON_RANDOM_BG;
2014
2015 // don't let Death Knights join BG queues when they are not allowed to be teleported yet
2016 if (member->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_TELEPORT) && member->GetMapId() == 609 && !member->IsGameMaster() && !member->HasSpell(50977))
2018
2019 if (!member->GetBGAccessByLevel(bgTemplate->GetBgTypeID()))
2020 {
2022 }
2023 }
2024
2025 // for arenas: check party size is proper
2026 if (bgTemplate->isArena() && memberscount != MinPlayerCount)
2028
2029 //check against other arena team members
2030 if (isRated)
2031 {
2032 ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
2033 for (auto const& itr : arenaTeam->GetMembers())
2034 {
2035 Player* teamMember = ObjectAccessor::FindConnectedPlayer(itr.Guid);
2036 //are they online and not a member of this current group?
2037 if (teamMember && !IsMember(teamMember->GetGUID()))
2038 {
2039 //are they already in queue for a rated arena?
2040 if (teamMember->InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeId))
2041 {
2042 GroupQueueInfo ginfo;
2043 BattlegroundQueue& queue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId);
2044 if (queue.GetPlayerGroupInfoData(teamMember->GetGUID(), &ginfo))
2045 {
2046 if (ginfo.IsRated)
2048 }
2049 }
2050 //are they currently in an arena match?
2051 Battleground* bg = teamMember->GetBattleground(false);
2052 if (bg && bg->isRated() && bg->GetMinPlayersPerTeam() == MinPlayerCount)
2054 }
2055 }
2056 }
2057
2058 return GroupJoinBattlegroundResult(bgTemplate->GetBgTypeID());
2059}
#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
@ CONFIG_ALLOW_JOIN_BG_AND_LFG
Definition IWorld.h:169
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition IWorld.h:73
#define sLFGMgr
Definition LFGMgr.h:641
GroupJoinBattlegroundResult
Definition SharedDefines.h:3635
@ ERR_BATTLEGROUND_JOIN_TIMED_OUT
Definition SharedDefines.h:3648
@ ERR_BATTLEGROUND_JOIN_FAILED
Definition SharedDefines.h:3649
@ ERR_LFG_CANT_USE_BATTLEGROUND
Definition SharedDefines.h:3650
@ ERR_IN_NON_RANDOM_BG
Definition SharedDefines.h:3652
@ ERR_BATTLEGROUND_NONE
Definition SharedDefines.h:3638
@ ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS
Definition SharedDefines.h:3639
@ ERR_ARENA_TEAM_PARTY_SIZE
Definition SharedDefines.h:3640
@ ERR_BATTLEGROUND_TOO_MANY_QUEUES
Definition SharedDefines.h:3641
@ ERR_GROUP_JOIN_BATTLEGROUND_FAIL
Definition SharedDefines.h:3637
@ ERR_BATTLEGROUND_JOIN_RANGE_INDEX
Definition SharedDefines.h:3647
@ ERR_IN_RANDOM_BG
Definition SharedDefines.h:3651
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:146
@ BATTLEGROUND_AA
Definition SharedDefines.h:3486
@ BATTLEGROUND_RB
Definition SharedDefines.h:3493
BattlegroundQueueTypeId
Definition SharedDefines.h:3619
TeamId
Definition SharedDefines.h:759
@ CLASS_CONTEXT_TELEPORT
Definition UnitDefines.h:228
Definition ArenaTeam.h:137
static BattlegroundQueueTypeId BGQueueTypeId(BattlegroundTypeId bgTypeId, uint8 arenaType)
Definition BattlegroundMgr.cpp:685
Definition BattlegroundQueue.h:64
bool GetPlayerGroupInfoData(ObjectGuid guid, GroupQueueInfo *ginfo)
Definition BattlegroundQueue.cpp:385
Definition Battleground.h:304
uint32 GetMinPlayersPerTeam() const
Definition Battleground.h:351
bool isRated() const
Definition Battleground.h:416
uint32 GetMembersCount() const
Definition Group.h:245
bool IsMember(ObjectGuid guid) const
Definition Group.cpp:2334
bool InBattlegroundQueueForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const
Definition Player.cpp:12300
bool InBattleground() const
Definition Player.h:2260
TeamId GetTeamId(bool original=false) const
Definition Player.h:2116
Battleground * GetBattleground(bool create=false) const
Definition Player.cpp:12257
bool InBattlegroundQueue(bool ignoreArena=false) const
Definition Player.cpp:12266
uint32 GetArenaTeamId(uint8 slot) const
Definition Player.cpp:16265
bool CanJoinToBattleground() const
Definition Player.cpp:11420
bool HasFreeBattlegroundQueueId() const
Definition Player.cpp:12320
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition Player.cpp:1288
bool HasSpell(uint32 spell) const override
Definition Player.cpp:3899
bool GetBGAccessByLevel(BattlegroundTypeId bgTypeId) const
Definition Player.cpp:12379
FROM * GetSource() const
Definition Reference.h:97
uint8 GetLevel() const
Definition Unit.h:1033
#define sWorld
Definition World.h:363
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:603
uint32 maxGroupSize
Definition DBCStructure.h:610
Definition BattlegroundQueue.h:31
bool IsRated
Definition BattlegroundQueue.h:36
Definition DBCStructure.h:1430
uint32 mapId
Definition DBCStructure.h:1432

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, 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)
711{
712 member_witerator slot = _getMemberWSlot(newLeaderGuid);
713
714 if (slot == m_memberSlots.end())
715 return;
716
717 Player* newLeader = ObjectAccessor::FindConnectedPlayer(slot->guid);
718
719 // Don't allow switching leader to offline players
720 if (!newLeader)
721 return;
722
723 if (!isBGGroup() && !isBFGroup())
724 {
725 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
726 // Update the group leader
728 stmt->SetData(0, newLeader->GetGUID().GetCounter());
729 stmt->SetData(1, GetGUID().GetCounter());
730 trans->Append(stmt);
731 CharacterDatabase.CommitTransaction(trans);
732
733 sInstanceSaveMgr->CopyBinds(m_leaderGuid, newLeaderGuid, newLeader);
734 }
735
737 oldLeader->RemovePlayerFlag(PLAYER_FLAGS_GROUP_LEADER);
738
740 m_leaderGuid = newLeader->GetGUID();
741 m_leaderName = newLeader->GetName();
743
745 data << slot->name;
746 BroadcastPacket(&data, true);
747
748 sScriptMgr->OnGroupChangeLeader(this, newLeaderGuid, m_leaderGuid); // This hook should be executed at the end - Not used anywhere in the original core
749}
@ 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:479
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition Group.cpp:1755
void ToggleGroupMemberFlag(member_witerator slot, uint8 flag, bool apply)
Definition Group.cpp:2522
member_witerator _getMemberWSlot(ObjectGuid Guid)
Definition Group.cpp:2495
LowType GetCounter() const
Definition ObjectGuid.h:145
void SetPlayerFlag(PlayerFlags flags)
Definition Player.h:1126
@ 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 
)
1807{
1808 // Only raid groups have sub groups
1809 if (!isRaidGroup())
1810 return;
1811
1812 // Check if player is really in the raid
1813 member_witerator slot = _getMemberWSlot(guid);
1814 if (slot == m_memberSlots.end())
1815 return;
1816
1817 // Abort if the player is already in the target sub group
1818 uint8 prevSubGroup = GetMemberGroup(guid);
1819 if (prevSubGroup == group)
1820 return;
1821
1822 // Update the player slot with the new sub group setting
1823 slot->group = group;
1824
1825 // Increase the counter of the new sub group..
1827
1828 // ..and decrease the counter of the previous one
1829 SubGroupCounterDecrease(prevSubGroup);
1830
1831 // Preserve new sub group in database for non-raid groups
1832 if (!isBGGroup() && !isBFGroup())
1833 {
1835
1836 stmt->SetData(0, group);
1837 stmt->SetData(1, guid.GetCounter());
1838
1839 CharacterDatabase.Execute(stmt);
1840 }
1841
1842 // In case the moved player is online, update the player object with the new sub group references
1843 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
1844 {
1845 if (player->GetGroup() == this)
1846 player->GetGroupRef().setSubGroup(group);
1847 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
1848 player->GetOriginalGroupRef().setSubGroup(group);
1849 }
1850
1851 // Broadcast the changes to the group
1852 SendUpdate();
1853}
@ CHAR_UPD_GROUP_MEMBER_SUBGROUP
Definition CharacterDatabase.h:288
uint8 GetMemberGroup(ObjectGuid guid) const
Definition Group.cpp:2382
void SubGroupCounterDecrease(uint8 subgroup)
Definition Group.cpp:2509

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 ( )
281{
282 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
283 if (Player* player = ObjectAccessor::FindPlayer(citr->guid))
284 if (player->GetLevel() < sConfigMgr->GetOption<int32>("Group.Raid.LevelRestriction", 10))
285 return true;
286
287 return false;
288}
#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)
259{
261 if (restricted)
262 {
265 }
266
267 if (!isBGGroup() && !isBFGroup())
268 {
270
271 stmt->SetData(0, uint8(m_groupType));
272 stmt->SetData(1, GetGUID().GetCounter());
273
274 CharacterDatabase.Execute(stmt);
275 }
276
277 SendUpdate();
278}
@ 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 ( )
291{
293
295
296 if (!isBGGroup() && !isBFGroup())
297 {
299
300 stmt->SetData(0, uint8(m_groupType));
301 stmt->SetData(1, GetGUID().GetCounter());
302
303 CharacterDatabase.Execute(stmt);
304 }
305
306 SendUpdate();
307
308 // update quest related GO states (quest activity dependent from raid membership)
309 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
310 if (Player* player = ObjectAccessor::FindPlayer(citr->guid))
311 player->UpdateForQuestWorldObjects();
312
313 // pussywizard: client automatically clears df "eye" near minimap, so remove from raid browser
315 sLFGMgr->LeaveLfg(GetLeaderGUID());
316}
@ GROUPTYPE_RAID
Definition Group.h:88
void _initRaidSubGroupsCounter()
Definition Group.cpp:2475
ObjectGuid GetLeaderGUID() const
Definition Group.cpp:2294
@ 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 
)
1359{
1360 Rolls::iterator rollI = GetRoll(Guid);
1361 if (rollI == RollId.end())
1362 return false;
1363 Roll* roll = *rollI;
1364
1365 Roll::PlayerVote::iterator itr = roll->playerVote.find(playerGUID);
1366 // this condition means that player joins to the party after roll begins
1367 // Xinef: if choice == MAX_ROLL_TYPE, player was removed from the map in removefromgroup
1368 // Xinef: itr can be invalid as it is not used below
1369 if (Choice < MAX_ROLL_TYPE && itr == roll->playerVote.end())
1370 return false;
1371
1372 if (roll->getLoot())
1373 if (roll->getLoot()->items.empty())
1374 return false;
1375
1376 switch (Choice)
1377 {
1378 case ROLL_PASS: // Player choose pass
1379 SendLootRoll(ObjectGuid::Empty, playerGUID, 128, ROLL_PASS, *roll);
1380 ++roll->totalPass;
1381 itr->second = PASS;
1382 break;
1383 case ROLL_NEED: // player choose Need
1384 SendLootRoll(ObjectGuid::Empty, playerGUID, 0, 0, *roll);
1385 ++roll->totalNeed;
1386 itr->second = NEED;
1387 break;
1388 case ROLL_GREED: // player choose Greed
1389 SendLootRoll(ObjectGuid::Empty, playerGUID, 128, ROLL_GREED, *roll);
1390 ++roll->totalGreed;
1391 itr->second = GREED;
1392 break;
1393 case ROLL_DISENCHANT: // player choose Disenchant
1394 SendLootRoll(ObjectGuid::Empty, playerGUID, 128, ROLL_DISENCHANT, *roll);
1395 ++roll->totalGreed;
1396 itr->second = DISENCHANT;
1397 break;
1398 }
1399
1400 if (roll->totalPass + roll->totalNeed + roll->totalGreed >= roll->totalPlayersRolling)
1401 {
1402 CountTheRoll(rollI, nullptr);
1403 return true;
1404 }
1405 return false;
1406}
@ 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:897
Rolls::iterator GetRoll(ObjectGuid Guid)
Definition Group.cpp:2461
void CountTheRoll(Rolls::iterator roll, Map *allowedMap)
Definition Group.cpp:1423
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:59
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 
)
1424{
1425 Roll* roll = *rollI;
1426 if (!roll->isValid()) // is loot already deleted ?
1427 {
1428 RollId.erase(rollI);
1429 delete roll;
1430 return;
1431 }
1432
1433 //end of the roll
1434 if (roll->totalNeed > 0)
1435 {
1436 if (!roll->playerVote.empty())
1437 {
1438 uint8 maxresul = 0;
1439 ObjectGuid maxguid; // pussywizard: start with 0 >_>
1440 Player* player = nullptr;
1441
1442 for (Roll::PlayerVote::const_iterator itr = roll->playerVote.begin(); itr != roll->playerVote.end(); ++itr)
1443 {
1444 if (itr->second != NEED)
1445 continue;
1446
1447 player = ObjectAccessor::FindPlayer(itr->first);
1448 if (!player || (allowedMap != nullptr && player->FindMap() != allowedMap))
1449 {
1450 --roll->totalNeed;
1451 continue;
1452 }
1453
1454 uint8 randomN = urand(1, 100);
1455 SendLootRoll(ObjectGuid::Empty, itr->first, randomN, ROLL_NEED, *roll);
1456 if (maxresul < randomN)
1457 {
1458 maxguid = itr->first;
1459 maxresul = randomN;
1460 }
1461 }
1462
1463 if (maxguid) // pussywizard: added condition
1464 {
1465 SendLootRollWon(ObjectGuid::Empty, maxguid, maxresul, ROLL_NEED, *roll);
1466 player = ObjectAccessor::FindPlayer(maxguid);
1467
1468 if (player)
1469 {
1471
1472 ItemPosCountVec dest;
1473 LootItem* item = &(roll->itemSlot >= roll->getLoot()->items.size() ? roll->getLoot()->quest_items[roll->itemSlot - roll->getLoot()->items.size()] : roll->getLoot()->items[roll->itemSlot]);
1474 InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, roll->itemid, item->count);
1475 if (msg == EQUIP_ERR_OK)
1476 {
1477 item->is_looted = true;
1478 roll->getLoot()->NotifyItemRemoved(roll->itemSlot);
1479 roll->getLoot()->unlootedCount--;
1480 AllowedLooterSet looters = item->GetAllowedLooters();
1481 Item* _item = player->StoreNewItem(dest, roll->itemid, true, item->randomPropertyId, looters);
1482 if (_item)
1483 sScriptMgr->OnPlayerGroupRollRewardItem(player, _item, _item->GetCount(), NEED, roll);
1484 player->UpdateLootAchievements(item, roll->getLoot());
1485 }
1486 else
1487 {
1488 item->is_blocked = false;
1489 item->rollWinnerGUID = player->GetGUID();
1490 player->SendEquipError(msg, nullptr, nullptr, roll->itemid);
1491 }
1492 }
1493 }
1494 else
1495 roll->totalNeed = 0;
1496 }
1497 }
1498 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
1499 {
1500 if (!roll->playerVote.empty())
1501 {
1502 uint8 maxresul = 0;
1503 ObjectGuid maxguid; // pussywizard: start with 0
1504 Player* player = nullptr;
1505 RollVote rollvote = NOT_VALID;
1506
1507 Roll::PlayerVote::iterator itr;
1508 for (itr = roll->playerVote.begin(); itr != roll->playerVote.end(); ++itr)
1509 {
1510 if (itr->second != GREED && itr->second != DISENCHANT)
1511 continue;
1512
1513 player = ObjectAccessor::FindPlayer(itr->first);
1514 if (!player || (allowedMap != nullptr && player->FindMap() != allowedMap))
1515 {
1516 --roll->totalGreed;
1517 continue;
1518 }
1519
1520 uint8 randomN = urand(1, 100);
1521 SendLootRoll(ObjectGuid::Empty, itr->first, randomN, itr->second, *roll);
1522 if (maxresul < randomN)
1523 {
1524 maxguid = itr->first;
1525 maxresul = randomN;
1526 rollvote = itr->second;
1527 }
1528 }
1529
1530 if (maxguid) // pussywizard: added condition
1531 {
1532 SendLootRollWon(ObjectGuid::Empty, maxguid, maxresul, rollvote, *roll);
1533 player = ObjectAccessor::FindPlayer(maxguid);
1534
1535 if (player)
1536 {
1538
1539 LootItem* item = &(roll->itemSlot >= roll->getLoot()->items.size() ? roll->getLoot()->quest_items[roll->itemSlot - roll->getLoot()->items.size()] : roll->getLoot()->items[roll->itemSlot]);
1540
1541 if (rollvote == GREED)
1542 {
1543 ItemPosCountVec dest;
1544 InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, roll->itemid, item->count);
1545 if (msg == EQUIP_ERR_OK)
1546 {
1547 item->is_looted = true;
1548 roll->getLoot()->NotifyItemRemoved(roll->itemSlot);
1549 roll->getLoot()->unlootedCount--;
1550 AllowedLooterSet looters = item->GetAllowedLooters();
1551 Item* _item = player->StoreNewItem(dest, roll->itemid, true, item->randomPropertyId, looters);
1552 if (_item)
1553 sScriptMgr->OnPlayerGroupRollRewardItem(player, _item, _item->GetCount(), GREED, roll);
1554 player->UpdateLootAchievements(item, roll->getLoot());
1555 }
1556 else
1557 {
1558 item->is_blocked = false;
1559 item->rollWinnerGUID = player->GetGUID();
1560 player->SendEquipError(msg, nullptr, nullptr, roll->itemid);
1561 }
1562 }
1563 else if (rollvote == DISENCHANT)
1564 {
1565 item->is_looted = true;
1566 roll->getLoot()->NotifyItemRemoved(roll->itemSlot);
1567 roll->getLoot()->unlootedCount--;
1568 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(roll->itemid);
1570
1571 ItemPosCountVec dest;
1572 InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, roll->itemid, item->count);
1573
1574 if (msg == EQUIP_ERR_OK)
1575 {
1576 player->AutoStoreLoot(pProto->DisenchantID, LootTemplates_Disenchant, true);
1577 }
1578 else
1579 {
1580 Loot loot;
1581 loot.FillLoot(pProto->DisenchantID, LootTemplates_Disenchant, player, true);
1582
1583 uint32 max_slot = loot.GetMaxSlotInLootFor(player);
1584 for(uint32 i = 0; i < max_slot; i++)
1585 {
1586 LootItem* lootItem = loot.LootItemInSlot(i, player);
1587 player->SendEquipError(msg, nullptr, nullptr, lootItem->itemid);
1588 player->SendItemRetrievalMail(lootItem->itemid, lootItem->count);
1589 }
1590 }
1591 }
1592 }
1593 }
1594 else
1595 roll->totalGreed = 0;
1596 }
1597 }
1598 if (roll->totalNeed == 0 && roll->totalGreed == 0) // pussywizard: if, not else, because numbers can be modified above if player is on a different map
1599 {
1600 SendLootAllPassed(*roll);
1601
1602 // remove is_blocked so that the item is lootable by all players
1603 LootItem* item = &(roll->itemSlot >= roll->getLoot()->items.size() ? roll->getLoot()->quest_items[roll->itemSlot - roll->getLoot()->items.size()] : roll->getLoot()->items[roll->itemSlot]);
1604 if (item)
1605 item->is_blocked = false;
1606 }
1607
1608 if (Loot* loot = roll->getLoot(); loot && loot->isLooted() && loot->sourceGameObject)
1609 {
1610 const GameObjectTemplate* goInfo = loot->sourceGameObject->GetGOInfo();
1611 if (goInfo && goInfo->type == GAMEOBJECT_TYPE_CHEST)
1612 {
1613 // Deactivate chest if the last item was rolled in group
1615 }
1616 }
1617
1618 RollId.erase(rollI);
1619 delete roll;
1620}
@ 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:1636
std::vector< ItemPosCount > ItemPosCountVec
Definition Player.h:776
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:44
@ GAMEOBJECT_TYPE_CHEST
Definition SharedDefines.h:1563
GameObjectTemplate const * GetGOInfo() const
Definition GameObject.h:136
void SetLootState(LootState s, Unit *unit=nullptr)
Definition GameObject.cpp:2427
void SendLootAllPassed(Roll const &roll)
Definition Group.cpp:944
void SendLootRollWon(ObjectGuid SourceGuid, ObjectGuid TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r)
Definition Group.cpp:921
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:2177
void AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const &store, bool broadcast=false)
Definition Player.cpp:13547
void SendItemRetrievalMail(uint32 itemEntry, uint32 count)
Definition PlayerMisc.cpp:439
void UpdateLootAchievements(LootItem *item, Loot *loot)
Definition PlayerUpdates.cpp:2167
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:4021
InventoryResult CanStoreNewItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 item, uint32 count, uint32 *no_space_count=nullptr) const
Definition Player.h:1291
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:915
LootItem * LootItemInSlot(uint32 lootslot, Player *player, QuestItem **qitem=nullptr, QuestItem **ffaitem=nullptr, QuestItem **conditem=nullptr)
Definition LootMgr.cpp:850
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:570
GameObject * sourceGameObject
Definition LootMgr.h:331
void NotifyItemRemoved(uint8 lootIndex)
Definition LootMgr.cpp:772
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)
107{
108 ObjectGuid leaderGuid = leader->GetGUID();
109 ObjectGuid::LowType lowguid = sGroupMgr->GenerateGroupId();
110
111 m_guid = ObjectGuid::Create<HighGuid::Group>(lowguid);
112 m_leaderGuid = leaderGuid;
113 m_leaderName = leader->GetName();
115
116 if (isBGGroup() || isBFGroup())
118
121
122 if (!isLFGGroup())
124
126 m_looterGuid = leaderGuid;
128
131
132 if (!isBGGroup() && !isBFGroup())
133 {
136
137 // Store group in database
139
140 uint8 index = 0;
141
142 stmt->SetData(index++, lowguid);
143 stmt->SetData(index++, m_leaderGuid.GetCounter());
144 stmt->SetData(index++, uint8(m_lootMethod));
145 stmt->SetData(index++, m_looterGuid.GetCounter());
146 stmt->SetData(index++, uint8(m_lootThreshold));
147 stmt->SetData(index++, m_targetIcons[0].GetRawValue());
148 stmt->SetData(index++, m_targetIcons[1].GetRawValue());
149 stmt->SetData(index++, m_targetIcons[2].GetRawValue());
150 stmt->SetData(index++, m_targetIcons[3].GetRawValue());
151 stmt->SetData(index++, m_targetIcons[4].GetRawValue());
152 stmt->SetData(index++, m_targetIcons[5].GetRawValue());
153 stmt->SetData(index++, m_targetIcons[6].GetRawValue());
154 stmt->SetData(index++, m_targetIcons[7].GetRawValue());
155 stmt->SetData(index++, uint8(m_groupType));
156 stmt->SetData(index++, uint8(m_dungeonDifficulty));
157 stmt->SetData(index++, uint8(m_raidDifficulty));
158 stmt->SetData(index++, m_masterLooterGuid.GetCounter());
159
160 CharacterDatabase.Execute(stmt);
161
162 ASSERT(AddMember(leader)); // If the leader can't be added to a new group because it appears full, something is clearly wrong.
163
164 sScriptMgr->OnCreate(this, leader);
165 }
166 else if (!AddMember(leader))
167 return false;
168
169 return true;
170}
@ 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:349
bool AddMember(Player *player)
Definition Group.cpp:388
ObjectGuid m_masterLooterGuid
Definition Group.h:350
ObjectGuid m_guid
Definition Group.h:353
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)
752{
753 sScriptMgr->OnGroupDisband(this);
754
755 Player* player;
756 uint32 instanceId = 0;
757
758 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
759 {
760 if (!isBGGroup() && !isBFGroup())
761 {
762 sCharacterCache->ClearCharacterGroup(citr->guid);
763 }
764
765 player = ObjectAccessor::FindConnectedPlayer(citr->guid);
766
767 if (player && !instanceId && !isBGGroup() && !isBFGroup())
768 {
769 instanceId = player->GetInstanceId();
770 }
771
772 _homebindIfInstance(player);
773 if (!isBGGroup() && !isBFGroup())
775
776 if (!player)
777 continue;
778
779 //we cannot call _removeMember because it would invalidate member iterator
780 //if we are removing player from battleground raid
781 if (isBGGroup() || isBFGroup())
783 else
784 {
785 //we can remove player who is in battleground from his original group
786 if (player->GetOriginalGroup() == this)
787 player->SetOriginalGroup(nullptr);
788 else
789 player->SetGroup(nullptr);
790 }
791
792 // quest related GO state dependent from raid membership
793 if (isRaidGroup())
795
796 WorldPacket data;
797 if (!hideDestroy)
798 {
800 player->GetSession()->SendPacket(&data);
801 }
802
803 //we already removed player from group and in player->GetGroup() is his original group, send update
804 if (Group* group = player->GetGroup())
805 {
806 group->SendUpdate();
807 }
808 else
809 {
810 data.Initialize(SMSG_GROUP_LIST, 1 + 1 + 1 + 1 + 8 + 4 + 4 + 8);
811 data << uint8(0x10) << uint8(0) << uint8(0) << uint8(0);
812 data << m_guid << uint32(m_counter) << uint32(0) << uint64(0);
813 player->GetSession()->SendPacket(&data);
814 }
815 }
816 RollId.clear();
817 m_memberSlots.clear();
818
820
821 if (!isBGGroup() && !isBFGroup())
822 {
823 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
824
826 stmt->SetData(0, GetGUID().GetCounter());
827 trans->Append(stmt);
828
829 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GROUP_MEMBER_ALL);
830 stmt->SetData(0, GetGUID().GetCounter());
831 trans->Append(stmt);
832
833 CharacterDatabase.CommitTransaction(trans);
834
835 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_LFG_DATA);
836 stmt->SetData(0, GetGUID().GetCounter());
837 CharacterDatabase.Execute(stmt);
838 }
839
840 // Cleaning up instance saved data for gameobjects when a group is disbanded
841 sInstanceSaveMgr->DeleteInstanceSavedData(instanceId);
842
843 sGroupMgr->RemoveGroup(this);
844 delete this;
845}
@ 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:648
void RemoveAllInvites()
Definition Group.cpp:359
void _homebindIfInstance(Player *player)
Definition Group.cpp:2181
void RemoveFromBattlegroundOrBattlefieldRaid()
Definition Player.cpp:13158
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)
2542{
2543 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
2544 {
2545 Player* member = itr->GetSource();
2546 if (!member)
2547 continue;
2548
2549 worker(member);
2550 }
2551}

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

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

◆ EndRoll()

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

References CountTheRoll(), and RollId.

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

◆ GetDifficulty()

Difficulty Group::GetDifficulty ( bool  isRaid) const
2442{
2443 return isRaid ? m_raidDifficulty : m_dungeonDifficulty;
2444}

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
2447{
2448 return m_dungeonDifficulty;
2449}

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
2290{
2291 return m_groupType;
2292}

References m_groupType.

◆ GetGUID()

◆ GetInvited() [1/2]

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

References m_invitees.

◆ GetInvited() [2/2]

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

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
2310{
2311 return m_leaderName.c_str();
2312}

References m_leaderName.

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

◆ GetLooterGuid()

ObjectGuid Group::GetLooterGuid ( ) const
2320{
2321 return m_looterGuid;
2322}

References m_looterGuid.

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

◆ GetLootMethod()

◆ GetLootThreshold()

ItemQualities Group::GetLootThreshold ( ) const
2330{
2331 return m_lootThreshold;
2332}

References m_lootThreshold.

Referenced by Loot::FillLoot().

◆ GetMasterLooterGuid()

ObjectGuid Group::GetMasterLooterGuid ( ) const

◆ GetMemberGroup()

uint8 Group::GetMemberGroup ( ObjectGuid  guid) const
2383{
2384 member_citerator mslot = _getMemberCSlot(guid);
2385 if (mslot == m_memberSlots.end())
2386 return (MAX_RAID_SUBGROUPS + 1);
2387 return mslot->group;
2388}
member_citerator _getMemberCSlot(ObjectGuid Guid) const
Definition Group.cpp:2487

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)
2345{
2346 for (member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr)
2347 if (itr->name == name)
2348 return itr->guid;
2349
2350 return ObjectGuid::Empty;
2351}

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
2452{
2453 return m_raidDifficulty;
2454}

References m_raidDifficulty.

Referenced by AddMember().

◆ GetRoll()

Group::Rolls::iterator Group::GetRoll ( ObjectGuid  Guid)
2462{
2463 Rolls::iterator iter;
2464 for (iter = RollId.begin(); iter != RollId.end(); ++iter)
2465 if ((*iter)->itemGUID == Guid && (*iter)->isValid())
2466 return iter;
2467 return RollId.end();
2468}

References RollId.

Referenced by CountRollVote().

◆ GroupLoot()

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

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
2457{
2458 return !RollId.empty();
2459}

References RollId.

Referenced by Player::CanUninviteFromGroup().

◆ LinkMember()

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

References LinkedListHead::insertFirst(), and m_memberMgr.

Referenced by GroupReference::targetObjectBuildLink().

◆ LoadGroupFromDB()

bool Group::LoadGroupFromDB ( Field field)
173{
174 ObjectGuid::LowType groupLowGuid = fields[16].Get<uint32>();
175 m_guid = ObjectGuid::Create<HighGuid::Group>(groupLowGuid);
176
177 m_leaderGuid = ObjectGuid::Create<HighGuid::Player>(fields[0].Get<uint32>());
178
179 // group leader not exist
180 if (!sCharacterCache->GetCharacterNameByGuid(m_leaderGuid, m_leaderName))
181 {
182 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
184 stmt->SetData(0, groupLowGuid);
185 trans->Append(stmt);
186 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GROUP_MEMBER_ALL);
187 stmt->SetData(0, groupLowGuid);
188 trans->Append(stmt);
189 CharacterDatabase.CommitTransaction(trans);
190 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_LFG_DATA);
191 stmt->SetData(0, groupLowGuid);
192 CharacterDatabase.Execute(stmt);
193 return false;
194 }
195
196 m_lootMethod = LootMethod(fields[1].Get<uint8>());
197 m_looterGuid = ObjectGuid::Create<HighGuid::Player>(fields[2].Get<uint32>());
198 m_lootThreshold = ItemQualities(fields[3].Get<uint8>());
199
200 for (uint8 i = 0; i < TARGETICONCOUNT; ++i)
201 m_targetIcons[i].Set(fields[4 + i].Get<uint64>());
202
203 m_groupType = GroupType(fields[12].Get<uint8>());
206
207 uint32 diff = fields[13].Get<uint8>();
208 if (diff >= MAX_DUNGEON_DIFFICULTY)
210 else
212
213 uint32 r_diff = fields[14].Get<uint8>();
214 if (r_diff >= MAX_RAID_DIFFICULTY)
216 else
218
219 m_masterLooterGuid = ObjectGuid::Create<HighGuid::Player>(fields[15].Get<uint32>());
220
222 sLFGMgr->_LoadFromDB(fields, GetGUID());
223
224 return true;
225}
#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:328

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 
)
228{
229 MemberSlot member;
230 member.guid = ObjectGuid::Create<HighGuid::Player>(guidLow);
231
232 // skip non-existed member
233 if (!sCharacterCache->GetCharacterNameByGuid(member.guid, member.name))
234 {
236 stmt->SetData(0, guidLow);
237 stmt->SetData(1, GetGUID().GetCounter());
238 CharacterDatabase.Execute(stmt);
239 return;
240 }
241
242 member.group = subgroup;
243 member.flags = memberFlags;
244 member.roles = roles;
245
246 m_memberSlots.push_back(member);
247
248 if (!isBGGroup() && !isBFGroup())
249 {
250 sCharacterCache->UpdateCharacterGroup(ObjectGuid(HighGuid::Player, guidLow), GetGUID());
251 }
252
253 SubGroupCounterIncrease(subgroup);
254
255 sLFGMgr->SetupGroupMember(member.guid, GetGUID());
256}
@ 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 
)
1310{
1311 LOG_DEBUG("network", "Group::MasterLoot (SMSG_LOOT_MASTER_LIST, 330)");
1312
1313 for (std::vector<LootItem>::iterator i = loot->items.begin(); i != loot->items.end(); ++i)
1314 {
1315 if (i->freeforall)
1316 continue;
1317
1318 i->is_blocked = !i->is_underthreshold;
1319 }
1320
1321 for (std::vector<LootItem>::iterator i = loot->quest_items.begin(); i != loot->quest_items.end(); ++i)
1322 {
1323 if (!i->follow_loot_rules)
1324 continue;
1325
1326 i->is_blocked = !i->is_underthreshold;
1327 }
1328
1329 std::vector<Player*> looters;
1330 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1331 {
1332 Player* looter = itr->GetSource();
1333 if (!looter->IsInWorld())
1334 {
1335 continue;
1336 }
1337
1338 if (looter->IsAtLootRewardDistance(pLootedObject))
1339 {
1340 looters.push_back(looter);
1341 }
1342 }
1343
1344 WorldPacket data(SMSG_LOOT_MASTER_LIST, 1 + looters.size() * (1 + 8));
1345 data << uint8(looters.size());
1346
1347 for (Player* looter : looters)
1348 {
1349 data << looter->GetGUID();
1350 }
1351
1352 for (Player* looter : looters)
1353 {
1354 looter->GetSession()->SendPacket(&data);
1355 }
1356}
bool IsInWorld() const
Definition Object.h:107
@ 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 
)
1159{
1160 ItemTemplate const* item;
1161 uint8 itemSlot = 0;
1162 for (std::vector<LootItem>::iterator i = loot->items.begin(); i != loot->items.end(); ++i, ++itemSlot)
1163 {
1164 if (i->freeforall)
1165 continue;
1166
1167 item = sObjectMgr->GetItemTemplate(i->itemid);
1168
1169 //roll for over-threshold item if it's one-player loot
1170 if (item->Quality >= uint32(m_lootThreshold))
1171 {
1172 ObjectGuid newitemGUID = ObjectGuid::Create<HighGuid::Item>(sObjectMgr->GetGenerator<HighGuid::Item>().Generate());
1173 Roll* r = new Roll(newitemGUID, *i);
1174
1175 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1176 {
1177 Player* playerToRoll = itr->GetSource();
1178 if (!playerToRoll || !playerToRoll->GetSession())
1179 continue;
1180
1181 if (playerToRoll->IsAtGroupRewardDistance(lootedObject))
1182 {
1184
1185 RollVote vote = playerToRoll->GetPassOnGroupLoot() ? PASS : NOT_EMITED_YET;
1186 if (!CanRollOnItem(*i, playerToRoll, loot))
1187 {
1188 vote = PASS;
1189 r->totalPass++; // Can't broadcast the pass now. need to wait until all rolling players are known
1190 }
1191
1192 r->playerVote[playerToRoll->GetGUID()] = vote;
1193 }
1194 }
1195
1196 if (r->totalPlayersRolling > 0)
1197 {
1198 r->setLoot(loot);
1199 r->itemSlot = itemSlot;
1202
1204 r->rollVoteMask &= ~ROLL_FLAG_TYPE_NEED;
1205
1206 loot->items[itemSlot].is_blocked = true;
1207
1208 //Broadcast Pass and Send Rollstart
1209 for (Roll::PlayerVote::const_iterator itr = r->playerVote.begin(); itr != r->playerVote.end(); ++itr)
1210 {
1211 Player* p = ObjectAccessor::FindPlayer(itr->first);
1212 if (!p)
1213 continue;
1214
1215 if (itr->second == PASS)
1216 SendLootRoll(newitemGUID, p->GetGUID(), 128, ROLL_PASS, *r);
1217 else
1218 SendLootStartRollToPlayer(60000, lootedObject->GetMapId(), p, p->CanRollForItemInLFG(item, lootedObject) == EQUIP_ERR_OK, *r);
1219 }
1220
1221 RollId.push_back(r);
1222
1223 if (Creature* creature = lootedObject->ToCreature())
1224 {
1225 creature->m_groupLootTimer = 60000;
1226 creature->lootingGroupLowGUID = GetGUID().GetCounter();
1227 }
1228 else if (GameObject* go = lootedObject->ToGameObject())
1229 {
1230 go->m_groupLootTimer = 60000;
1231 go->lootingGroupLowGUID = GetGUID().GetCounter();
1232 }
1233 }
1234 else
1235 delete r;
1236 }
1237 else
1238 i->is_underthreshold = true;
1239 }
1240
1241 for (std::vector<LootItem>::iterator i = loot->quest_items.begin(); i != loot->quest_items.end(); ++i, ++itemSlot)
1242 {
1243 if (!i->follow_loot_rules)
1244 continue;
1245
1246 item = sObjectMgr->GetItemTemplate(i->itemid);
1247 ObjectGuid newitemGUID = ObjectGuid::Create<HighGuid::Item>(sObjectMgr->GetGenerator<HighGuid::Item>().Generate());
1248 Roll* r = new Roll(newitemGUID, *i);
1249
1250 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1251 {
1252 Player* playerToRoll = itr->GetSource();
1253 if (!playerToRoll || !playerToRoll->GetSession())
1254 continue;
1255
1256 if (playerToRoll->IsAtGroupRewardDistance(lootedObject))
1257 {
1259
1260 RollVote vote = playerToRoll->GetPassOnGroupLoot() ? PASS : NOT_EMITED_YET;
1261 if (!CanRollOnItem(*i, playerToRoll, loot))
1262 {
1263 vote = PASS;
1264 r->totalPass++; // Can't broadcast the pass now. need to wait until all rolling players are known
1265 }
1266
1267 r->playerVote[playerToRoll->GetGUID()] = vote;
1268 }
1269 }
1270
1271 if (r->totalPlayersRolling > 0)
1272 {
1273 r->setLoot(loot);
1274 r->itemSlot = itemSlot;
1275
1276 loot->quest_items[itemSlot - loot->items.size()].is_blocked = true;
1277
1278 //Broadcast Pass and Send Rollstart
1279 for (Roll::PlayerVote::const_iterator itr = r->playerVote.begin(); itr != r->playerVote.end(); ++itr)
1280 {
1281 Player* p = ObjectAccessor::FindPlayer(itr->first);
1282 if (!p)
1283 continue;
1284
1285 if (itr->second == PASS)
1286 SendLootRoll(newitemGUID, p->GetGUID(), 128, ROLL_PASS, *r);
1287 else
1288 SendLootStartRollToPlayer(60000, lootedObject->GetMapId(), p, p->CanRollForItemInLFG(item, lootedObject) == EQUIP_ERR_OK, *r);
1289 }
1290
1291 RollId.push_back(r);
1292
1293 if (Creature* creature = lootedObject->ToCreature())
1294 {
1295 creature->m_groupLootTimer = 60000;
1296 creature->lootingGroupLowGUID = GetGUID().GetCounter();
1297 }
1298 else if (GameObject* go = lootedObject->ToGameObject())
1299 {
1300 go->m_groupLootTimer = 60000;
1301 go->lootingGroupLowGUID = GetGUID().GetCounter();
1302 }
1303 }
1304 else
1305 delete r;
1306 }
1307}
@ 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:875
InventoryResult CanRollForItemInLFG(ItemTemplate const *item, WorldObject const *lootedObject) const
Definition PlayerStorage.cpp:2337
bool IsAtGroupRewardDistance(WorldObject const *pRewardSource) const
Definition Player.cpp:12820
bool HasFlag2(ItemFlags2 flag) const
Definition ItemTemplate.h:828

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 ( )
1780{
1781 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
1782 {
1783 Player* player = ObjectAccessor::FindConnectedPlayer(citr->guid);
1784 if (!player)
1785 {
1787 data << citr->guid;
1788 data << uint8(0);
1789 BroadcastReadyCheck(&data);
1790 }
1791 }
1792}
void BroadcastReadyCheck(WorldPacket const *packet)
Definition Group.cpp:1768
@ 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 ( )
360{
361 for (InvitesList::iterator itr = m_invitees.begin(); itr != m_invitees.end(); ++itr)
362 if (*itr)
363 (*itr)->SetGroupInvite(nullptr);
364
365 m_invitees.clear();
366}

References m_invitees.

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

◆ RemoveInvite()

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

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

References m_memberSlots.

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

◆ ResetInstances()

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

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 ( )
2214{
2216 Player* pMember = nullptr;
2217 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
2218 {
2219 pMember = ObjectAccessor::FindPlayer(citr->guid);
2220 if (pMember && pMember->GetSession() && !pMember->GetSession()->IsSocketClosed()
2221 && m_maxEnchantingLevel < pMember->GetSkillValue(SKILL_ENCHANTING))
2222 {
2224 }
2225 }
2226}
bool IsSocketClosed() const
Definition WorldSession.cpp:549

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
2370{
2371 member_citerator mslot1 = _getMemberCSlot(guid1);
2372 if (mslot1 == m_memberSlots.end() || !slot2)
2373 return false;
2374 return (mslot1->group == slot2->group);
2375}

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

◆ SameSubGroup() [2/3]

bool Group::SameSubGroup ( ObjectGuid  guid1,
ObjectGuid  guid2 
) const
2362{
2363 member_citerator mslot2 = _getMemberCSlot(guid2);
2364 if (mslot2 == m_memberSlots.end())
2365 return false;
2366 return SameSubGroup(guid1, &*mslot2);
2367}
bool SameSubGroup(ObjectGuid guid1, ObjectGuid guid2) const
Definition Group.cpp:2361

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
1795{
1796 if (!member1 || !member2)
1797 return false;
1798
1799 if (member1->GetGroup() != this || member2->GetGroup() != this)
1800 return false;
1801 else
1802 return member1->GetSubGroup() == member2->GetSubGroup();
1803}

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

◆ SendLootAllPassed()

void Group::SendLootAllPassed ( Roll const &  roll)
945{
946 WorldPacket data(SMSG_LOOT_ALL_PASSED, (8 + 4 + 4 + 4 + 4));
947 data << roll.itemGUID; // Guid of the item rolled
948 data << uint32(roll.itemSlot); // Item loot slot
949 data << uint32(roll.itemid); // The itemEntryId for the item that shall be rolled for
950 data << uint32(roll.itemRandomPropId); // Item random property ID
951 data << uint32(roll.itemRandomSuffix); // Item random suffix ID
952
953 for (Roll::PlayerVote::const_iterator itr = roll.playerVote.begin(); itr != roll.playerVote.end(); ++itr)
954 {
955 Player* player = ObjectAccessor::FindConnectedPlayer(itr->first);
956 if (!player)
957 continue;
958
959 if (itr->second != NOT_VALID)
960 player->GetSession()->SendPacket(&data);
961 }
962}
@ 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 
)
966{
967 ASSERT(creature);
968
969 WorldPacket data(SMSG_LOOT_LIST, (8 + 8));
970 data << creature->GetGUID();
971
972 if (GetLootMethod() == MASTER_LOOT && creature->loot.hasOverThresholdItem())
974 else
975 data << uint8(0);
976
977 if (groupLooter)
978 data << groupLooter->GetPackGUID();
979 else
980 data << uint8(0);
981
982 BroadcastPacket(&data, false);
983}
@ MASTER_LOOT
Definition LootMgr.h:60
Loot loot
Definition Creature.h:230
ObjectGuid GetMasterLooterGuid() const
Definition Group.cpp:2324
LootMethod GetLootMethod() const
Definition Group.cpp:2314
PackedGuid WriteAsPacked() const
Definition ObjectGuid.h:316
@ SMSG_LOOT_LIST
Definition Opcodes.h:1047
bool hasOverThresholdItem() const
Definition LootMgr.cpp:981

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 
)
898{
899 WorldPacket data(SMSG_LOOT_ROLL, (8 + 4 + 8 + 4 + 4 + 4 + 1 + 1 + 1));
900 data << sourceGuid; // guid of the item rolled
901 data << uint32(roll.itemSlot); // slot
902 data << targetGuid;
903 data << uint32(roll.itemid); // the itemEntryId for the item that shall be rolled for
904 data << uint32(roll.itemRandomSuffix); // randomSuffix
905 data << uint32(roll.itemRandomPropId); // Item random property ID
906 data << uint8(rollNumber); // 0: "Need for: [item name]" > 127: "you passed on: [item name]" Roll number
907 data << uint8(rollType); // 0: "Need for: [item name]" 0: "You have selected need for [item name] 1: need roll 2: greed roll
908 data << uint8(autoPass); // 1: "You automatically passed on: %s because you cannot loot that item."
909
910 for (Roll::PlayerVote::const_iterator itr = roll.playerVote.begin(); itr != roll.playerVote.end(); ++itr)
911 {
913 if (!p)
914 continue;
915
916 if (itr->second != NOT_VALID)
917 p->GetSession()->SendPacket(&data);
918 }
919}
@ 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 
)
922{
923 WorldPacket data(SMSG_LOOT_ROLL_WON, (8 + 4 + 4 + 4 + 4 + 8 + 1 + 1));
924 data << sourceGuid; // guid of the item rolled
925 data << uint32(roll.itemSlot); // slot
926 data << uint32(roll.itemid); // the itemEntryId for the item that shall be rolled for
927 data << uint32(roll.itemRandomSuffix); // randomSuffix
928 data << uint32(roll.itemRandomPropId); // Item random property
929 data << targetGuid; // guid of the player who won.
930 data << uint8(rollNumber); // rollnumber realted to SMSG_LOOT_ROLL
931 data << uint8(rollType); // rollType related to SMSG_LOOT_ROLL
932
933 for (Roll::PlayerVote::const_iterator itr = roll.playerVote.begin(); itr != roll.playerVote.end(); ++itr)
934 {
936 if (!p)
937 continue;
938
939 if (itr->second != NOT_VALID)
940 p->GetSession()->SendPacket(&data);
941 }
942}
@ 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 
)
852{
853 WorldPacket data(SMSG_LOOT_START_ROLL, (8 + 4 + 4 + 4 + 4 + 4 + 4 + 1));
854 data << r.itemGUID; // guid of rolled item
855 data << uint32(mapid); // 3.3.3 mapid
856 data << uint32(r.itemSlot); // itemslot
857 data << uint32(r.itemid); // the itemEntryId for the item that shall be rolled for
858 data << uint32(r.itemRandomSuffix); // randomSuffix
859 data << uint32(r.itemRandomPropId); // item random property ID
860 data << uint32(r.itemCount); // items in stack
861 data << uint32(CountDown); // the countdown time to choose "need" or "greed"
862 data << uint8(r.rollVoteMask); // roll type mask
863
864 for (Roll::PlayerVote::const_iterator itr = r.playerVote.begin(); itr != r.playerVote.end(); ++itr)
865 {
867 if (!p)
868 continue;
869
870 if (itr->second == NOT_EMITED_YET)
871 p->GetSession()->SendPacket(&data);
872 }
873}
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 
)
876{
877 if (!p)
878 return;
879
880 WorldPacket data(SMSG_LOOT_START_ROLL, (8 + 4 + 4 + 4 + 4 + 4 + 4 + 1));
881 data << r.itemGUID; // guid of rolled item
882 data << uint32(mapId); // 3.3.3 mapid
883 data << uint32(r.itemSlot); // itemslot
884 data << uint32(r.itemid); // the itemEntryId for the item that shall be rolled for
885 data << uint32(r.itemRandomSuffix); // randomSuffix
886 data << uint32(r.itemRandomPropId); // item random property ID
887 data << uint32(r.itemCount); // items in stack
888 data << uint32(countDown); // the countdown time to choose "need" or "greed"
889 uint8 voteMask = r.rollVoteMask;
890 if (!canNeed)
891 voteMask &= ~ROLL_FLAG_TYPE_NEED;
892 data << uint8(voteMask); // roll type mask
893
894 p->GetSession()->SendPacket(&data);
895}

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)
1644{
1645 if (!session)
1646 return;
1647
1649 data << uint8(1); // list targets
1650
1651 for (uint8 i = 0; i < TARGETICONCOUNT; ++i)
1652 {
1653 if (!m_targetIcons[i])
1654 continue;
1655
1656 data << uint8(i);
1657 data << m_targetIcons[i];
1658 }
1659
1660 session->SendPacket(&data);
1661}
@ 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 
)
1670{
1671 Player* player = ObjectAccessor::FindConnectedPlayer(playerGUID);
1672
1673 if (!player || player->GetGroup() != this)
1674 return;
1675
1676 // if MemberSlot wasn't provided
1677 if (!slot)
1678 {
1679 member_witerator witr = _getMemberWSlot(playerGUID);
1680
1681 if (witr == m_memberSlots.end()) // if there is no MemberSlot for such a player
1682 return;
1683
1684 slot = &(*witr);
1685 }
1686
1687 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));
1688 data << uint8(m_groupType); // group type (flags in 3.3)
1689 data << uint8(slot->group);
1690 data << uint8(slot->flags);
1691 data << uint8(slot->roles);
1692 if (isLFGGroup())
1693 {
1694 data << uint8(sLFGMgr->GetState(m_guid) == lfg::LFG_STATE_FINISHED_DUNGEON ? 2 : 0); // FIXME - Dungeon save status? 2 = done
1695 data << uint32(sLFGMgr->GetDungeon(m_guid));
1696 }
1697
1698 data << m_guid;
1699 data << uint32(m_counter++); // 3.3, value increases every time this packet gets sent
1700 data << uint32(GetMembersCount() - 1);
1701 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
1702 {
1703 if (slot->guid == citr->guid)
1704 continue;
1705
1706 Player* member = ObjectAccessor::FindConnectedPlayer(citr->guid);
1707
1708 uint8 onlineState = (member && !member->GetSession()->PlayerLogout()) ? MEMBER_STATUS_ONLINE : MEMBER_STATUS_OFFLINE;
1709 onlineState = onlineState | ((isBGGroup() || isBFGroup()) ? MEMBER_STATUS_PVP : 0);
1710
1711 data << citr->name;
1712 data << citr->guid; // guid
1713 data << uint8(onlineState); // online-state
1714 data << uint8(citr->group); // groupid
1715 data << uint8(citr->flags); // See enum GroupMemberFlags
1716 data << uint8(citr->roles); // Lfg Roles
1717 }
1718
1719 data << m_leaderGuid; // leader guid
1720
1721 if (GetMembersCount() - 1)
1722 {
1723 data << uint8(m_lootMethod); // loot method
1724
1726 data << m_masterLooterGuid; // master looter guid
1727 else
1728 data << uint64(0); // looter guid
1729
1730 data << uint8(m_lootThreshold); // loot threshold
1731 data << uint8(m_dungeonDifficulty); // Dungeon Difficulty
1732 data << uint8(m_raidDifficulty); // Raid Difficulty
1733 data << uint8(m_raidDifficulty >= RAID_DIFFICULTY_10MAN_HEROIC); // 3.3 Dynamic Raid Difficulty - 0 normal/1 heroic
1734 }
1735
1736 player->GetSession()->SendPacket(&data);
1737}
@ 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:338
@ 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)
2396{
2397 m_bfGroup = bg;
2398}

References m_bfGroup.

Referenced by Battlefield::AddOrSetPlayerToCorrectBfGroup().

◆ SetBattlegroundGroup()

void Group::SetBattlegroundGroup ( Battleground bg)
2391{
2392 m_bgGroup = bg;
2393}

References m_bgGroup.

Referenced by Battleground::SetBgRaid().

◆ SetDifficultyChangePrevention()

◆ SetDungeonDifficulty()

void Group::SetDungeonDifficulty ( Difficulty  difficulty)
2072{
2073 m_dungeonDifficulty = difficulty;
2074 if (!isBGGroup() && !isBFGroup())
2075 {
2077
2079 stmt->SetData(1, GetGUID().GetCounter());
2080
2081 CharacterDatabase.Execute(stmt);
2082 }
2083
2084 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
2085 {
2086 Player* player = itr->GetSource();
2087 player->SetDungeonDifficulty(difficulty);
2088 player->SendDungeonDifficulty(true);
2089 }
2090}
@ 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 
)
2401{
2402 // Assistants, main assistants and main tanks are only available in raid groups
2403 if (!isRaidGroup())
2404 return;
2405
2406 // Check if player is really in the raid
2407 member_witerator slot = _getMemberWSlot(guid);
2408 if (slot == m_memberSlots.end())
2409 return;
2410
2411 // Do flag specific actions, e.g ensure uniqueness
2412 switch (flag)
2413 {
2415 RemoveUniqueGroupMemberFlag(MEMBER_FLAG_MAINASSIST); // Remove main assist flag from current if any.
2416 break;
2418 RemoveUniqueGroupMemberFlag(MEMBER_FLAG_MAINTANK); // Remove main tank flag from current if any.
2419 break;
2421 break;
2422 default:
2423 return; // This should never happen
2424 }
2425
2426 // Switch the actual flag
2427 ToggleGroupMemberFlag(slot, flag, apply);
2428
2429 // Preserve the new setting in the db
2431
2432 stmt->SetData(0, slot->flags);
2433 stmt->SetData(1, guid.GetCounter());
2434
2435 CharacterDatabase.Execute(stmt);
2436
2437 // Broadcast the changes to the group
2438 SendUpdate();
2439}
@ 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:2515

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 
)
2249{
2250 member_witerator slot = _getMemberWSlot(guid);
2251 if (slot == m_memberSlots.end())
2252 return;
2253
2254 slot->roles = roles;
2255 SendUpdate();
2256}

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

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

◆ SetLooterGuid()

void Group::SetLooterGuid ( ObjectGuid  guid)
2234{
2235 m_looterGuid = guid;
2236}

References m_looterGuid.

Referenced by UpdateLooterGuid().

◆ SetLootMethod()

void Group::SetLootMethod ( LootMethod  method)
2229{
2230 m_lootMethod = method;
2231}

References m_lootMethod.

Referenced by WorldSession::HandleLootMethodOpcode().

◆ SetLootThreshold()

void Group::SetLootThreshold ( ItemQualities  threshold)
2244{
2245 m_lootThreshold = threshold;
2246}

References m_lootThreshold.

Referenced by WorldSession::HandleLootMethodOpcode().

◆ SetMasterLooterGuid()

void Group::SetMasterLooterGuid ( ObjectGuid  guid)
2239{
2240 m_masterLooterGuid = guid;
2241}

References m_masterLooterGuid.

Referenced by WorldSession::HandleLootMethodOpcode().

◆ SetRaidDifficulty()

void Group::SetRaidDifficulty ( Difficulty  difficulty)
2093{
2094 m_raidDifficulty = difficulty;
2095 if (!isBGGroup() && !isBFGroup())
2096 {
2098
2099 stmt->SetData(0, uint8(m_raidDifficulty));
2100 stmt->SetData(1, GetGUID().GetCounter());
2101
2102 CharacterDatabase.Execute(stmt);
2103 }
2104
2105 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
2106 {
2107 Player* player = itr->GetSource();
2108 player->SetRaidDifficulty(difficulty);
2109 player->SendRaidDifficulty(true);
2110 }
2111}
@ 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 
)
1623{
1624 if (id >= TARGETICONCOUNT)
1625 return;
1626
1627 // clean other icons
1628 if (targetGuid)
1629 for (int i = 0; i < TARGETICONCOUNT; ++i)
1630 if (m_targetIcons[i] == targetGuid)
1632
1633 m_targetIcons[id] = targetGuid;
1634
1635 WorldPacket data(MSG_RAID_TARGET_UPDATE, (1 + 8 + 1 + 8));
1636 data << uint8(0); // set targets
1637 data << whoGuid;
1638 data << uint8(id);
1639 data << targetGuid;
1640 BroadcastPacket(&data, true);
1641}
void SetTargetIcon(uint8 id, ObjectGuid whoGuid, ObjectGuid targetGuid)
Definition Group.cpp:1622

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
2510{
2512 --m_subGroupsCounts[subgroup];
2513}

References m_subGroupsCounts.

Referenced by ChangeMembersGroup(), and RemoveMember().

◆ SubGroupCounterIncrease()

void Group::SubGroupCounterIncrease ( uint8  subgroup)
protected
2504{
2506 ++m_subGroupsCounts[subgroup];
2507}

References m_subGroupsCounts.

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

◆ ToggleGroupMemberFlag()

void Group::ToggleGroupMemberFlag ( member_witerator  slot,
uint8  flag,
bool  apply 
)
protected
2523{
2524 if (apply)
2525 slot->flags |= flag;
2526 else
2527 slot->flags &= ~flag;
2528}

Referenced by ChangeLeader(), and SetGroupMemberFlag().

◆ UpdateLooterGuid()

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

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)
1740{
1741 if (!player || !player->IsInWorld())
1742 return;
1743
1744 WorldPacket data;
1745 player->GetSession()->BuildPartyMemberStatsChangedPacket(player, &data);
1746
1747 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1748 {
1749 Player* member = itr->GetSource();
1750 if (member && (!member->IsInMap(player) || !member->IsWithinDist(player, member->GetSightRange(player), false)))
1751 member->GetSession()->SendPacket(&data);
1752 }
1753}
float GetSightRange(WorldObject const *target=nullptr) const override
Definition Player.cpp:16339
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition Object.cpp:1327
bool IsInMap(WorldObject const *obj) const
Definition Object.cpp:1296
void BuildPartyMemberStatsChangedPacket(Player *player, WorldPacket *data)
Definition GroupHandler.cpp:767

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: