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

#include "Group.h"

Classes

struct  MemberSlot
 

Public Types

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

Public Member Functions

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

Public Attributes

DataMap CustomData
 

Protected Types

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

Protected Member Functions

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

Protected Attributes

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

Detailed Description

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

Member Typedef Documentation

◆ InvitesList

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

◆ member_citerator

typedef MemberSlotList::const_iterator Group::member_citerator

◆ member_witerator

typedef MemberSlotList::iterator Group::member_witerator
protected

◆ MemberSlotList

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

◆ Rolls

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

Constructor & Destructor Documentation

◆ Group()

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

References sScriptMgr.

◆ ~Group()

Group::~Group ( )
76{
77 sScriptMgr->OnDestructGroup(this);
78
79 if (m_bgGroup)
80 {
81 LOG_DEBUG("bg.battleground", "Group::~Group: battleground group being deleted.");
82
83 if (m_bgGroup->GetBgRaid(TEAM_ALLIANCE) == this)
84 {
86 }
87 else if (m_bgGroup->GetBgRaid(TEAM_HORDE) == this)
88 {
90 }
91 else
92 LOG_ERROR("bg.battleground", "Group::~Group: battleground group is not linked to the correct battleground.");
93 }
94
95 Rolls::iterator itr;
96 while (!RollId.empty())
97 {
98 itr = RollId.begin();
99 Roll* r = *itr;
100 RollId.erase(itr);
101 delete(r);
102 }
103
104 // Sub group counters clean up
105 delete[] m_subGroupsCounts;
106}
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
#define LOG_DEBUG(filterType__,...)
Definition Log.h:157
@ TEAM_ALLIANCE
Definition SharedDefines.h:748
@ TEAM_HORDE
Definition SharedDefines.h:749
Group * GetBgRaid(TeamId teamId) const
Definition Battleground.h:482
void SetBgRaid(TeamId teamId, Group *bg_raid)
Definition Battleground.cpp:1879
Rolls RollId
Definition Group.h:354
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
2203{
2204 // if player is reinvited to group and in the instance - cancel homebind timer
2205 if (!player->FindMap() || !player->FindMap()->IsDungeon())
2206 return;
2207 InstancePlayerBind* bind = sInstanceSaveMgr->PlayerGetBoundInstance(player->GetGUID(), player->FindMap()->GetId(), player->GetDifficulty(player->FindMap()->IsRaid()));
2208 if (bind && bind->save->GetInstanceId() == player->GetInstanceId())
2209 player->m_InstanceValid = true;
2210}
#define sInstanceSaveMgr
Definition InstanceSaveMgr.h:202
uint32 GetInstanceId() const
Definition InstanceSaveMgr.h:61
bool IsDungeon() const
Definition Map.h:297
bool IsRaid() const
Definition Map.h:299
uint32 GetId() const
Definition Map.h:232
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114
bool m_InstanceValid
Definition Player.h:2473
Difficulty GetDifficulty(bool isRaid) const
Definition Player.h:1937
Map * FindMap() const
Definition Object.h:626
uint32 GetInstanceId() const
Definition Object.h:513
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
2503{
2504 for (member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr)
2505 if (itr->guid == Guid)
2506 return itr;
2507 return m_memberSlots.end();
2508}
MemberSlotList m_memberSlots
Definition Group.h:339
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
2511{
2512 for (member_witerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr)
2513 if (itr->guid == Guid)
2514 return itr;
2515 return m_memberSlots.end();
2516}
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
2197{
2198 if (player && !player->IsGameMaster() && player->FindMap() && sMapStore.LookupEntry(player->GetMapId())->IsDungeon())
2199 player->m_InstanceValid = false;
2200}
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
bool IsGameMaster() const
Definition Player.h:1174
uint32 GetMapId() const
Definition Position.h:281

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

Referenced by Disband(), and RemoveMember().

◆ _initRaidSubGroupsCounter()

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

References m_memberSlots, m_subGroupsCounts, and MAX_RAID_SUBGROUPS.

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

◆ AddInvite()

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

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

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

◆ AddLeaderInvite()

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

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

References GROUP_LFG_FLAG_APPLY_RANDOM_BUFF, and m_lfgGroupFlags.

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

◆ AddLfgHeroicFlag()

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

References GROUP_LFG_FLAG_IS_HEROIC, and m_lfgGroupFlags.

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

◆ AddLfgRandomInstanceFlag()

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

References GROUP_LFG_FLAG_IS_RANDOM_INSTANCE, and m_lfgGroupFlags.

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

◆ AddMember()

bool Group::AddMember ( Player player)
391{
392 if (!player)
393 return false;
394
395 // Get first not-full group
396 uint8 subGroup = 0;
398 {
399 bool groupFound = false;
400 for (; subGroup < MAX_RAID_SUBGROUPS; ++subGroup)
401 {
402 if (m_subGroupsCounts[subGroup] < MAXGROUPSIZE)
403 {
404 groupFound = true;
405 break;
406 }
407 }
408 // We are raid group and no one slot is free
409 if (!groupFound)
410 return false;
411 }
412
413 MemberSlot member;
414 member.guid = player->GetGUID();
415 member.name = player->GetName();
416 member.group = subGroup;
417 member.flags = 0;
418 member.roles = 0;
419 m_memberSlots.push_back(member);
420
421 if (!isBGGroup() && !isBFGroup())
422 {
423 sCharacterCache->UpdateCharacterGroup(player->GetGUID(), GetGUID());
424 }
425
426 SubGroupCounterIncrease(subGroup);
427
428 player->SetGroupInvite(nullptr);
429 if (player->GetGroup())
430 {
431 if (isBGGroup() || isBFGroup()) // if player is in group and he is being added to BG raid group, then call SetBattlegroundRaid()
432 player->SetBattlegroundOrBattlefieldRaid(this, subGroup);
433 else //if player is in bg raid and we are adding him to normal group, then call SetOriginalGroup()
434 player->SetOriginalGroup(this, subGroup);
435 }
436 else //if player is not in group, then call set group
437 player->SetGroup(this, subGroup);
438
439 // if the same group invites the player back, cancel the homebind timer
441
442 if (!isRaidGroup()) // reset targetIcons for non-raid-groups
443 {
444 for (uint8 i = 0; i < TARGETICONCOUNT; ++i)
445 m_targetIcons[i].Clear();
446 }
447
448 if (!isBGGroup() && !isBFGroup())
449 {
451 stmt->SetData(0, GetGUID().GetCounter());
452 stmt->SetData(1, member.guid.GetCounter());
453 stmt->SetData(2, member.flags);
454 stmt->SetData(3, member.group);
455 stmt->SetData(4, member.roles);
456 CharacterDatabase.Execute(stmt);
457 }
458
459 SendUpdate();
460
461 if (player)
462 {
463 sScriptMgr->OnGroupAddMember(this, player->GetGUID());
464
465 if (!IsLeader(player->GetGUID()) && !isBGGroup() && !isBFGroup())
466 {
468
470 {
472 player->SendDungeonDifficulty(true);
473 }
474 if (player->GetRaidDifficulty() != GetRaidDifficulty())
475 {
477 player->SendRaidDifficulty(true);
478 }
479 }
480 else if (IsLeader(player->GetGUID()) && isLFGGroup()) // pussywizard
481 {
483 }
484
487
488 // quest related GO state dependent from raid membership
489 if (isRaidGroup())
491
492 {
493 // Broadcast new player group member fields to rest of the group
495
496 UpdateData groupData;
497 WorldPacket groupDataPacket;
498
499 // Broadcast group members' fields to player
500 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
501 {
502 if (itr->GetSource() == player) // pussywizard: no check same map, adding members is single threaded
503 {
504 continue;
505 }
506
507 if (Player* itrMember = itr->GetSource())
508 {
509 if (player->HaveAtClient(itrMember))
510 {
511 itrMember->SetFieldNotifyFlag(UF_FLAG_PARTY_MEMBER);
512 itrMember->BuildValuesUpdateBlockForPlayer(&groupData, player);
513 itrMember->RemoveFieldNotifyFlag(UF_FLAG_PARTY_MEMBER);
514 }
515
516 if (itrMember->HaveAtClient(player))
517 {
518 UpdateData newData;
519 WorldPacket newDataPacket;
520 player->BuildValuesUpdateBlockForPlayer(&newData, itrMember);
521 if (newData.HasData())
522 {
523 newData.BuildPacket(newDataPacket);
524 itrMember->SendDirectMessage(&newDataPacket);
525 }
526 }
527 }
528 }
529
530 if (groupData.HasData())
531 {
532 groupData.BuildPacket(groupDataPacket);
533 player->SendDirectMessage(&groupDataPacket);
534 }
535
537 }
538
539 if (m_maxEnchantingLevel < player->GetSkillValue(SKILL_ENCHANTING))
541 }
542
543 return true;
544}
#define sCharacterCache
Definition CharacterCache.h:83
@ CHAR_REP_GROUP_MEMBER
Definition CharacterDatabase.h:285
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:703
@ SKILL_ENCHANTING
Definition SharedDefines.h:3187
@ 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:2278
bool IsLeader(ObjectGuid guid) const
Definition Group.cpp:2354
void SendUpdate()
Definition Group.cpp:1668
ObjectGuid GetGUID() const
Definition Group.cpp:2319
void _cancelHomebindIfInstance(Player *player)
Definition Group.cpp:2202
Difficulty GetRaidDifficulty() const
Definition Group.cpp:2466
ObjectGuid m_targetIcons[TARGETICONCOUNT]
Definition Group.h:349
void UpdatePlayerOutOfRange(Player *player)
Definition Group.cpp:1744
GroupReference * GetFirstMember()
Definition Group.h:243
void SubGroupCounterIncrease(uint8 subgroup)
Definition Group.cpp:2518
Difficulty GetDungeonDifficulty() const
Definition Group.cpp:2461
bool isRaidGroup() const
Definition Group.cpp:2284
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition Object.cpp:246
void RemoveFieldNotifyFlag(uint16 flag)
Definition Object.h:196
void SetFieldNotifyFlag(uint16 flag)
Definition Object.h:195
Definition Player.h:1084
Difficulty GetRaidDifficulty() const
Definition Player.h:1939
void SetOriginalGroup(Group *group, int8 subgroup=-1)
Definition Player.cpp:13158
void SetGroupUpdateFlag(uint32 flag)
Definition Player.h:2511
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5692
uint16 GetSkillValue(uint32 skill) const
Definition Player.cpp:5450
void SetDungeonDifficulty(Difficulty dungeon_difficulty)
Definition Player.h:1941
void SetGroup(Group *group, int8 subgroup=-1)
Definition Player.cpp:11506
bool HaveAtClient(WorldObject const *u) const
Definition Player.cpp:11364
void UpdateForQuestWorldObjects()
Definition PlayerUpdates.cpp:1786
void SetRaidDifficulty(Difficulty raid_difficulty)
Definition Player.h:1942
void SendDungeonDifficulty(bool IsInGroup)
Definition PlayerMisc.cpp:169
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:193
Difficulty GetDungeonDifficulty() const
Definition Player.h:1938
void SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty=-1)
Definition PlayerMisc.cpp:177
void SetBattlegroundOrBattlefieldRaid(Group *group, int8 subgroup=-1)
Definition Player.cpp:13130
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  )
2213{
2214 // FG: HACK: force flags update on group leave - for values update hack
2215 // -- not very efficient but safe
2216 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
2217 {
2218 Player* pp = ObjectAccessor::FindPlayer(citr->guid);
2219 if (pp)
2220 {
2223 LOG_DEBUG("group", "-- Forced group value update for '{}'", pp->GetName());
2224 }
2225 }
2226}
@ UNIT_FIELD_FACTIONTEMPLATE
Definition UpdateFields.h:115
@ UNIT_FIELD_BYTES_2
Definition UpdateFields.h:161
void ForceValuesUpdateAtIndex(uint32)
Definition Object.cpp:2099
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 
)
1761{
1762 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1763 {
1764 Player* player = itr->GetSource();
1765 if (!player || (ignore && player->GetGUID() == ignore) || (ignorePlayersInBGRaid && player->GetGroup() != this))
1766 continue;
1767
1768 if (group == -1 || itr->getSubGroup() == group)
1769 player->SendDirectMessage(packet);
1770 }
1771}

References GetFirstMember(), Player::GetGroup(), Object::GetGUID(), GroupReference::next(), and Player::SendDirectMessage().

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

◆ BroadcastReadyCheck()

void Group::BroadcastReadyCheck ( WorldPacket const *  packet)
1774{
1775 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1776 {
1777 Player* player = itr->GetSource();
1778 if (player)
1779 if (IsLeader(player->GetGUID()) || IsAssistant(player->GetGUID()))
1780 player->SendDirectMessage(packet);
1781 }
1782}
bool IsAssistant(ObjectGuid guid) const
Definition Group.cpp:2368

References GetFirstMember(), Object::GetGUID(), IsAssistant(), IsLeader(), GroupReference::next(), and Player::SendDirectMessage().

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

◆ CanJoinBattlegroundQueue()

GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue ( Battleground const *  bgTemplate,
BattlegroundQueueTypeId  bgQueueTypeId,
uint32  MinPlayerCount,
uint32  MaxPlayerCount,
bool  isRated,
uint32  arenaSlot 
)
1934{
1935 // check if this group is LFG group
1936 if (isLFGGroup())
1938
1939 BattlemasterListEntry const* bgEntry = sBattlemasterListStore.LookupEntry(bgTemplate->GetBgTypeID());
1940 if (!bgEntry)
1942
1943 // too many players in the group
1944 if (GetMembersCount() > bgEntry->maxGroupSize)
1945 return ERR_BATTLEGROUND_NONE;
1946
1947 // get a player as reference, to compare other players' stats to (arena team id, level bracket, etc.)
1948 Player* reference = GetFirstMember()->GetSource();
1949 if (!reference)
1951
1952 PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bgTemplate->GetMapId(), reference->GetLevel());
1953 if (!bracketEntry)
1955
1956 uint32 arenaTeamId = reference->GetArenaTeamId(arenaSlot);
1957 TeamId teamId = reference->GetTeamId();
1958
1960
1961 // check every member of the group to be able to join
1962 uint32 memberscount = 0;
1963 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next(), ++memberscount)
1964 {
1965 Player* member = itr->GetSource();
1966
1967 // don't let join with offline members
1968 if (!member)
1970
1971 if (!sScriptMgr->CanGroupJoinBattlegroundQueue(this, member, bgTemplate, MinPlayerCount, isRated, arenaSlot))
1973
1974 // don't allow cross-faction groups to join queue
1975 if (member->GetTeamId() != teamId && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP))
1977
1978 // don't let join rated matches if the arena team id doesn't match
1979 if (isRated && member->GetArenaTeamId(arenaSlot) != arenaTeamId)
1981
1982 // not in the same battleground level braket, don't let join
1983 PvPDifficultyEntry const* memberBracketEntry = GetBattlegroundBracketByLevel(bracketEntry->mapId, member->GetLevel());
1984 if (memberBracketEntry != bracketEntry)
1986
1987 // check for deserter debuff in case not arena queue
1988 if (bgTemplate->GetBgTypeID() != BATTLEGROUND_AA && !member->CanJoinToBattleground(bgTemplate))
1990
1991 // check if someone in party is using dungeon system
1992 lfg::LfgState lfgState = sLFGMgr->GetState(member->GetGUID());
1993 if (lfgState > lfg::LFG_STATE_NONE && (lfgState != lfg::LFG_STATE_QUEUED || !sWorld->getBoolConfig(CONFIG_ALLOW_JOIN_BG_AND_LFG)))
1994 {
1996 }
1997
1998 // pussywizard: prevent joining when any member is in bg/arena
1999 if (member->InBattleground())
2001
2002 // pussywizard: check for free slot, this is actually ensured before calling this function, but just in case
2003 if (!member->HasFreeBattlegroundQueueId())
2005
2006 // don't let join if someone from the group is already in that bg queue
2007 if (member->InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeId))
2008 {
2010 }
2011
2012 // don't let join if someone from the group is in bg queue random
2013 if (member->InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeIdRandom))
2014 return ERR_IN_RANDOM_BG;
2015
2016 // don't let join to bg queue random if someone from the group is already in bg queue
2017 if (bgTemplate->GetBgTypeID() == BATTLEGROUND_RB && member->InBattlegroundQueue())
2018 return ERR_IN_NON_RANDOM_BG;
2019
2020 // don't let Death Knights join BG queues when they are not allowed to be teleported yet
2021 if (member->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_TELEPORT) && member->GetMapId() == MAP_EBON_HOLD && !member->IsGameMaster() && !member->HasSpell(50977))
2023
2024 if (!member->GetBGAccessByLevel(bgTemplate->GetBgTypeID()))
2025 {
2027 }
2028 }
2029
2030 // for arenas: check party size is proper
2031 if (bgTemplate->isArena() && memberscount != MinPlayerCount)
2033
2034 //check against other arena team members
2035 if (isRated)
2036 {
2037 ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
2038 for (auto const& itr : arenaTeam->GetMembers())
2039 {
2040 Player* teamMember = ObjectAccessor::FindConnectedPlayer(itr.Guid);
2041 //are they online and not a member of this current group?
2042 if (teamMember && !IsMember(teamMember->GetGUID()))
2043 {
2044 //are they already in queue for a rated arena?
2045 if (teamMember->InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeId))
2046 {
2047 GroupQueueInfo ginfo;
2048 BattlegroundQueue& queue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId);
2049 if (queue.GetPlayerGroupInfoData(teamMember->GetGUID(), &ginfo))
2050 {
2051 if (ginfo.IsRated)
2053 }
2054 }
2055 //are they currently in an arena match?
2056 Battleground* bg = teamMember->GetBattleground(false);
2057 if (bg && bg->isRated() && bg->GetMinPlayersPerTeam() == MinPlayerCount)
2059 }
2060 }
2061 }
2062
2063 return GroupJoinBattlegroundResult(bgTemplate->GetBgTypeID());
2064}
@ MAP_EBON_HOLD
Definition AreaDefines.h:259
#define sArenaTeamMgr
Definition ArenaTeamMgr.h:69
#define sBattlegroundMgr
Definition BattlegroundMgr.h:187
DBCStorage< BattlemasterListEntry > sBattlemasterListStore(BattlemasterListEntryfmt)
PvPDifficultyEntry const * GetBattlegroundBracketByLevel(uint32 mapid, uint32 level)
Definition DBCStores.cpp:793
std::uint32_t uint32
Definition Define.h:107
#define sLFGMgr
Definition LFGMgr.h:658
GroupJoinBattlegroundResult
Definition SharedDefines.h:3891
@ ERR_BATTLEGROUND_JOIN_TIMED_OUT
Definition SharedDefines.h:3904
@ ERR_BATTLEGROUND_JOIN_FAILED
Definition SharedDefines.h:3905
@ ERR_LFG_CANT_USE_BATTLEGROUND
Definition SharedDefines.h:3906
@ ERR_IN_NON_RANDOM_BG
Definition SharedDefines.h:3908
@ ERR_BATTLEGROUND_NONE
Definition SharedDefines.h:3894
@ ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS
Definition SharedDefines.h:3895
@ ERR_ARENA_TEAM_PARTY_SIZE
Definition SharedDefines.h:3896
@ ERR_BATTLEGROUND_TOO_MANY_QUEUES
Definition SharedDefines.h:3897
@ ERR_GROUP_JOIN_BATTLEGROUND_FAIL
Definition SharedDefines.h:3893
@ ERR_BATTLEGROUND_JOIN_RANGE_INDEX
Definition SharedDefines.h:3903
@ ERR_IN_RANDOM_BG
Definition SharedDefines.h:3907
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:131
@ BATTLEGROUND_AA
Definition SharedDefines.h:3742
@ BATTLEGROUND_RB
Definition SharedDefines.h:3749
BattlegroundQueueTypeId
Definition SharedDefines.h:3875
TeamId
Definition SharedDefines.h:747
@ CLASS_CONTEXT_TELEPORT
Definition UnitDefines.h:235
@ CONFIG_ALLOW_JOIN_BG_AND_LFG
Definition WorldConfig.h:130
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition WorldConfig.h:34
Definition ArenaTeam.h:137
static BattlegroundQueueTypeId BGQueueTypeId(BattlegroundTypeId bgTypeId, uint8 arenaType)
Definition BattlegroundMgr.cpp:686
Definition BattlegroundQueue.h:64
bool GetPlayerGroupInfoData(ObjectGuid guid, GroupQueueInfo *ginfo)
Definition BattlegroundQueue.cpp:385
Definition Battleground.h:294
uint32 GetMinPlayersPerTeam() const
Definition Battleground.h:341
bool isRated() const
Definition Battleground.h:406
uint32 GetMembersCount() const
Definition Group.h:245
bool IsMember(ObjectGuid guid) const
Definition Group.cpp:2349
bool InBattlegroundQueueForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const
Definition Player.cpp:12230
bool InBattleground() const
Definition Player.h:2288
TeamId GetTeamId(bool original=false) const
Definition Player.h:2128
Battleground * GetBattleground(bool create=false) const
Definition Player.cpp:12187
bool InBattlegroundQueue(bool ignoreArena=false) const
Definition Player.cpp:12196
uint32 GetArenaTeamId(uint8 slot) const
Definition Player.cpp:16267
bool HasFreeBattlegroundQueueId() const
Definition Player.cpp:12250
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition Player.cpp:1302
bool CanJoinToBattleground(Battleground const *bg) const
Definition Player.cpp:11307
bool HasSpell(uint32 spell) const override
Definition Player.cpp:3881
bool GetBGAccessByLevel(BattlegroundTypeId bgTypeId) const
Definition Player.cpp:12309
FROM * GetSource() const
Definition Reference.h:97
uint8 GetLevel() const
Definition Unit.h:1103
#define sWorld
Definition World.h:317
Player * FindConnectedPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:257
LfgState
Definition LFG.h:67
@ LFG_STATE_NONE
Definition LFG.h:68
@ LFG_STATE_QUEUED
Definition LFG.h:70
Definition DBCStructure.h:604
uint32 maxGroupSize
Definition DBCStructure.h:611
Definition BattlegroundQueue.h:31
bool IsRated
Definition BattlegroundQueue.h:36
Definition DBCStructure.h:1431
uint32 mapId
Definition DBCStructure.h:1433

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

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

◆ ChangeLeader()

void Group::ChangeLeader ( ObjectGuid  guid)
685{
686 member_witerator slot = _getMemberWSlot(newLeaderGuid);
687
688 if (slot == m_memberSlots.end())
689 return;
690
691 Player* newLeader = ObjectAccessor::FindConnectedPlayer(slot->guid);
692
693 // Don't allow switching leader to offline players
694 if (!newLeader)
695 return;
696
697 if (!isBGGroup() && !isBFGroup())
698 {
699 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
700 // Update the group leader
702 stmt->SetData(0, newLeader->GetGUID().GetCounter());
703 stmt->SetData(1, GetGUID().GetCounter());
704 trans->Append(stmt);
705 CharacterDatabase.CommitTransaction(trans);
706
707 sInstanceSaveMgr->CopyBinds(m_leaderGuid, newLeaderGuid, newLeader);
708 }
709
711 oldLeader->RemovePlayerFlag(PLAYER_FLAGS_GROUP_LEADER);
712
714 m_leaderGuid = newLeader->GetGUID();
715 m_leaderName = newLeader->GetName();
717
719 data << slot->name;
720 BroadcastPacket(&data, true);
721
722 sScriptMgr->OnGroupChangeLeader(this, newLeaderGuid, m_leaderGuid); // This hook should be executed at the end - Not used anywhere in the original core
723}
@ CHAR_UPD_GROUP_LEADER
Definition CharacterDatabase.h:287
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
@ MEMBER_FLAG_ASSISTANT
Definition Group.h:73
@ PLAYER_FLAGS_GROUP_LEADER
Definition Player.h:459
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition Group.cpp:1760
void ToggleGroupMemberFlag(member_witerator slot, uint8 flag, bool apply)
Definition Group.cpp:2537
member_witerator _getMemberWSlot(ObjectGuid Guid)
Definition Group.cpp:2510
LowType GetCounter() const
Definition ObjectGuid.h:145
void SetPlayerFlag(PlayerFlags flags)
Definition Player.h:1124
@ 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 
)
1812{
1813 // Only raid groups have sub groups
1814 if (!isRaidGroup())
1815 return;
1816
1817 // Check if player is really in the raid
1818 member_witerator slot = _getMemberWSlot(guid);
1819 if (slot == m_memberSlots.end())
1820 return;
1821
1822 // Abort if the player is already in the target sub group
1823 uint8 prevSubGroup = GetMemberGroup(guid);
1824 if (prevSubGroup == group)
1825 return;
1826
1827 // Update the player slot with the new sub group setting
1828 slot->group = group;
1829
1830 // Increase the counter of the new sub group..
1832
1833 // ..and decrease the counter of the previous one
1834 SubGroupCounterDecrease(prevSubGroup);
1835
1836 // Preserve new sub group in database for non-raid groups
1837 if (!isBGGroup() && !isBFGroup())
1838 {
1840
1841 stmt->SetData(0, group);
1842 stmt->SetData(1, guid.GetCounter());
1843
1844 CharacterDatabase.Execute(stmt);
1845 }
1846
1847 // In case the moved player is online, update the player object with the new sub group references
1848 if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
1849 {
1850 if (player->GetGroup() == this)
1851 player->GetGroupRef().setSubGroup(group);
1852 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
1853 player->GetOriginalGroupRef().setSubGroup(group);
1854 }
1855
1856 // Broadcast the changes to the group
1857 SendUpdate();
1858}
@ CHAR_UPD_GROUP_MEMBER_SUBGROUP
Definition CharacterDatabase.h:289
uint8 GetMemberGroup(ObjectGuid guid) const
Definition Group.cpp:2397
void SubGroupCounterDecrease(uint8 subgroup)
Definition Group.cpp:2524

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

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

◆ CheckLevelForRaid()

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

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

Referenced by WorldSession::HandleGroupRaidConvertOpcode().

◆ ConvertToLFG()

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

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

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

◆ ConvertToRaid()

void Group::ConvertToRaid ( )
293{
295
297
298 if (!isBGGroup() && !isBFGroup())
299 {
301
302 stmt->SetData(0, uint8(m_groupType));
303 stmt->SetData(1, GetGUID().GetCounter());
304
305 CharacterDatabase.Execute(stmt);
306 }
307
308 SendUpdate();
309
310 // update quest related GO states (quest activity dependent from raid membership)
311 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
312 if (Player* player = ObjectAccessor::FindPlayer(citr->guid))
313 player->UpdateForQuestWorldObjects();
314
315 // pussywizard: client automatically clears df "eye" near minimap, so remove from raid browser
317 sLFGMgr->LeaveLfg(GetLeaderGUID());
318}
@ GROUPTYPE_RAID
Definition Group.h:88
void _initRaidSubGroupsCounter()
Definition Group.cpp:2490
ObjectGuid GetLeaderGUID() const
Definition Group.cpp:2309
@ 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 
)
1333{
1334 Rolls::iterator rollI = GetRoll(Guid);
1335 if (rollI == RollId.end())
1336 return false;
1337 Roll* roll = *rollI;
1338
1339 Roll::PlayerVote::iterator itr = roll->playerVote.find(playerGUID);
1340 // this condition means that player joins to the party after roll begins
1341 // Xinef: if choice == MAX_ROLL_TYPE, player was removed from the map in removefromgroup
1342 // Xinef: itr can be invalid as it is not used below
1343 if (Choice < MAX_ROLL_TYPE && itr == roll->playerVote.end())
1344 return false;
1345
1346 if (roll->getLoot())
1347 if (roll->getLoot()->items.empty())
1348 return false;
1349
1350 switch (Choice)
1351 {
1352 case ROLL_PASS: // Player choose pass
1353 SendLootRoll(ObjectGuid::Empty, playerGUID, 128, ROLL_PASS, *roll);
1354 ++roll->totalPass;
1355 itr->second = PASS;
1356 break;
1357 case ROLL_NEED: // player choose Need
1358 SendLootRoll(ObjectGuid::Empty, playerGUID, 0, 0, *roll);
1359 ++roll->totalNeed;
1360 itr->second = NEED;
1361 break;
1362 case ROLL_GREED: // player choose Greed
1363 SendLootRoll(ObjectGuid::Empty, playerGUID, 128, ROLL_GREED, *roll);
1364 ++roll->totalGreed;
1365 itr->second = GREED;
1366 break;
1367 case ROLL_DISENCHANT: // player choose Disenchant
1368 SendLootRoll(ObjectGuid::Empty, playerGUID, 128, ROLL_DISENCHANT, *roll);
1369 ++roll->totalGreed;
1370 itr->second = DISENCHANT;
1371 break;
1372 }
1373
1374 if (roll->totalPass + roll->totalNeed + roll->totalGreed >= roll->totalPlayersRolling)
1375 {
1376 CountTheRoll(rollI, nullptr);
1377 return true;
1378 }
1379 return false;
1380}
@ 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:871
Rolls::iterator GetRoll(ObjectGuid Guid)
Definition Group.cpp:2476
void CountTheRoll(Rolls::iterator roll, Map *allowedMap)
Definition Group.cpp:1428
static ObjectGuid const Empty
Definition ObjectGuid.h:120
uint8 totalGreed
Definition Group.h:160
uint8 totalPlayersRolling
Definition Group.h:158
uint8 totalNeed
Definition Group.h:159
uint8 totalPass
Definition Group.h:161
Loot * getLoot()
Definition Group.cpp:61
PlayerVote playerVote
Definition Group.h:157
std::vector< LootItem > items
Definition LootMgr.h:320

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

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

◆ CountTheRoll()

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

Referenced by CountRollVote(), and EndRoll().

◆ Create()

bool Group::Create ( Player leader)
109{
110 ObjectGuid leaderGuid = leader->GetGUID();
111 ObjectGuid::LowType lowguid = sGroupMgr->GenerateGroupId();
112
113 m_guid = ObjectGuid::Create<HighGuid::Group>(lowguid);
114 m_leaderGuid = leaderGuid;
115 m_leaderName = leader->GetName();
117
118 if (isBGGroup() || isBFGroup())
120
123
124 if (!isLFGGroup())
126
128 m_looterGuid = leaderGuid;
130
133
134 if (!isBGGroup() && !isBFGroup())
135 {
138
139 // Store group in database
141
142 uint8 index = 0;
143
144 stmt->SetData(index++, lowguid);
145 stmt->SetData(index++, m_leaderGuid.GetCounter());
146 stmt->SetData(index++, uint8(m_lootMethod));
147 stmt->SetData(index++, m_looterGuid.GetCounter());
148 stmt->SetData(index++, uint8(m_lootThreshold));
149 stmt->SetData(index++, m_targetIcons[0].GetRawValue());
150 stmt->SetData(index++, m_targetIcons[1].GetRawValue());
151 stmt->SetData(index++, m_targetIcons[2].GetRawValue());
152 stmt->SetData(index++, m_targetIcons[3].GetRawValue());
153 stmt->SetData(index++, m_targetIcons[4].GetRawValue());
154 stmt->SetData(index++, m_targetIcons[5].GetRawValue());
155 stmt->SetData(index++, m_targetIcons[6].GetRawValue());
156 stmt->SetData(index++, m_targetIcons[7].GetRawValue());
157 stmt->SetData(index++, uint8(m_groupType));
158 stmt->SetData(index++, uint8(m_dungeonDifficulty));
159 stmt->SetData(index++, uint8(m_raidDifficulty));
160 stmt->SetData(index++, m_masterLooterGuid.GetCounter());
161
162 CharacterDatabase.Execute(stmt);
163
164 ASSERT(AddMember(leader)); // If the leader can't be added to a new group because it appears full, something is clearly wrong.
165
166 sScriptMgr->OnCreate(this, leader);
167 }
168 else if (!AddMember(leader))
169 return false;
170
171 return true;
172}
@ CHAR_INS_GROUP
Definition CharacterDatabase.h:284
#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:352
bool AddMember(Player *player)
Definition Group.cpp:390
ObjectGuid m_masterLooterGuid
Definition Group.h:353
ObjectGuid m_guid
Definition Group.h:356
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)
726{
727 sScriptMgr->OnGroupDisband(this);
728
729 Player* player;
730 uint32 instanceId = 0;
731
732 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
733 {
734 if (!isBGGroup() && !isBFGroup())
735 {
736 sCharacterCache->ClearCharacterGroup(citr->guid);
737 }
738
739 player = ObjectAccessor::FindConnectedPlayer(citr->guid);
740
741 if (player && !instanceId && !isBGGroup() && !isBFGroup())
742 {
743 instanceId = player->GetInstanceId();
744 }
745
746 _homebindIfInstance(player);
747 if (!isBGGroup() && !isBFGroup())
749
750 if (!player)
751 continue;
752
753 //we cannot call _removeMember because it would invalidate member iterator
754 //if we are removing player from battleground raid
755 if (isBGGroup() || isBFGroup())
757 else
758 {
759 //we can remove player who is in battleground from his original group
760 if (player->GetOriginalGroup() == this)
761 player->SetOriginalGroup(nullptr);
762 else
763 player->SetGroup(nullptr);
764 }
765
766 // quest related GO state dependent from raid membership
767 if (isRaidGroup())
769
770 WorldPacket data;
771 if (!hideDestroy)
772 {
774 player->SendDirectMessage(&data);
775 }
776
777 //we already removed player from group and in player->GetGroup() is his original group, send update
778 if (Group* group = player->GetGroup())
779 {
780 group->SendUpdate();
781 }
782 else
783 {
784 data.Initialize(SMSG_GROUP_LIST, 1 + 1 + 1 + 1 + 8 + 4 + 4 + 8);
785 data << uint8(0x10) << uint8(0) << uint8(0) << uint8(0);
786 data << m_guid << uint32(m_counter) << uint32(0) << uint64(0);
787 player->SendDirectMessage(&data);
788 }
789 }
790 RollId.clear();
791 m_memberSlots.clear();
792
794
795 if (!isBGGroup() && !isBFGroup())
796 {
797 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
798
800 stmt->SetData(0, GetGUID().GetCounter());
801 trans->Append(stmt);
802
803 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GROUP_MEMBER_ALL);
804 stmt->SetData(0, GetGUID().GetCounter());
805 trans->Append(stmt);
806
807 CharacterDatabase.CommitTransaction(trans);
808
809 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_LFG_DATA);
810 stmt->SetData(0, GetGUID().GetCounter());
811 CharacterDatabase.Execute(stmt);
812 }
813
814 // Cleaning up instance saved data for gameobjects when a group is disbanded
815 sInstanceSaveMgr->DeleteInstanceSavedData(instanceId);
816
817 sGroupMgr->RemoveGroup(this);
818 delete this;
819}
@ CHAR_DEL_GROUP_MEMBER_ALL
Definition CharacterDatabase.h:381
@ CHAR_DEL_GROUP
Definition CharacterDatabase.h:380
@ CHAR_DEL_LFG_DATA
Definition CharacterDatabase.h:328
std::uint64_t uint64
Definition Define.h:106
@ INSTANCE_RESET_GROUP_LEAVE
Definition Map.h:704
void RemoveAllInvites()
Definition Group.cpp:361
void _homebindIfInstance(Player *player)
Definition Group.cpp:2196
void RemoveFromBattlegroundOrBattlefieldRaid()
Definition Player.cpp:13146
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(), WorldPacket::Initialize(), INSTANCE_RESET_GROUP_LEAVE, isBFGroup(), isBGGroup(), isRaidGroup(), m_counter, m_guid, m_memberSlots, RemoveAllInvites(), Player::RemoveFromBattlegroundOrBattlefieldRaid(), Player::ResetInstances(), RollId, sCharacterCache, Player::SendDirectMessage(), 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)
2557{
2558 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
2559 {
2560 Player* member = itr->GetSource();
2561 if (!member)
2562 continue;
2563
2564 worker(member);
2565 }
2566}

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

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

◆ DoMinimapPing()

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

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

Referenced by WorldSession::HandleMinimapPingOpcode().

◆ EndRoll()

void Group::EndRoll ( Loot loot,
Map allowedMap 
)
1384{
1385 for (Rolls::iterator itr = RollId.begin(); itr != RollId.end();)
1386 {
1387 if ((*itr)->getLoot() == pLoot)
1388 {
1389 CountTheRoll(itr, allowedMap); //i don't have to edit player votes, who didn't vote ... he will pass
1390 itr = RollId.begin();
1391 }
1392 else
1393 ++itr;
1394 }
1395}

References CountTheRoll(), and RollId.

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

◆ GetDifficulty()

Difficulty Group::GetDifficulty ( bool  isRaid) const
2457{
2458 return isRaid ? m_raidDifficulty : m_dungeonDifficulty;
2459}

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
2462{
2463 return m_dungeonDifficulty;
2464}

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
2305{
2306 return m_groupType;
2307}

References m_groupType.

◆ GetGUID()

◆ GetInvited() [1/2]

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

References m_invitees.

◆ GetInvited() [2/2]

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

References m_invitees.

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

◆ GetInviteeCount()

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

References m_invitees.

Referenced by Player::UninviteFromGroup().

◆ GetLeader()

Player * Group::GetLeader ( )

◆ GetLeaderGUID()

◆ GetLeaderName()

const char * Group::GetLeaderName ( ) const
2325{
2326 return m_leaderName.c_str();
2327}

References m_leaderName.

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

◆ GetLooterGuid()

ObjectGuid Group::GetLooterGuid ( ) const
2335{
2336 return m_looterGuid;
2337}

References m_looterGuid.

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

◆ GetLootMethod()

◆ GetLootThreshold()

ItemQualities Group::GetLootThreshold ( ) const
2345{
2346 return m_lootThreshold;
2347}

References m_lootThreshold.

Referenced by Loot::FillLoot().

◆ GetMasterLooterGuid()

ObjectGuid Group::GetMasterLooterGuid ( ) const

◆ GetMemberGroup()

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

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)
2360{
2361 for (member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr)
2362 if (itr->name == name)
2363 return itr->guid;
2364
2365 return ObjectGuid::Empty;
2366}

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
2467{
2468 return m_raidDifficulty;
2469}

References m_raidDifficulty.

Referenced by AddMember().

◆ GetRoll()

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

References RollId.

Referenced by CountRollVote().

◆ GroupLoot()

void Group::GroupLoot ( Loot loot,
WorldObject pLootedObject 
)
977{
978 std::vector<LootItem>::iterator i;
979 ItemTemplate const* item;
980 uint8 itemSlot = 0;
981
982 for (i = loot->items.begin(); i != loot->items.end(); ++i, ++itemSlot)
983 {
984 if (i->freeforall)
985 continue;
986
987 item = sObjectMgr->GetItemTemplate(i->itemid);
988 if (!item)
989 {
990 continue;
991 }
992
993 // roll for over-threshold item if it's one-player loot
994 if (item->Quality >= uint32(m_lootThreshold))
995 {
996 ObjectGuid newitemGUID = ObjectGuid::Create<HighGuid::Item>(sObjectMgr->GetGenerator<HighGuid::Item>().Generate());
997 Roll* r = new Roll(newitemGUID, *i);
998
999 //a vector is filled with only near party members
1000 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1001 {
1002 Player* member = itr->GetSource();
1003 if (!member || !member->GetSession())
1004 continue;
1005 if (member->IsAtLootRewardDistance(pLootedObject))
1006 {
1008
1009 RollVote vote = member->GetPassOnGroupLoot() ? PASS : NOT_EMITED_YET;
1010 if (!CanRollOnItem(*i, member, loot))
1011 {
1012 vote = PASS;
1013 ++r->totalPass;
1014 }
1015
1016 r->playerVote[member->GetGUID()] = vote;
1017 }
1018 }
1019
1020 if (r->totalPlayersRolling > 0)
1021 {
1022 r->setLoot(loot);
1023 r->itemSlot = itemSlot;
1026
1027 loot->items[itemSlot].is_blocked = true;
1028
1029 // If there is any "auto pass", broadcast the pass now.
1030 if (r->totalPass)
1031 {
1032 for (Roll::PlayerVote::const_iterator itr = r->playerVote.begin(); itr != r->playerVote.end(); ++itr)
1033 {
1034 Player* p = ObjectAccessor::FindPlayer(itr->first);
1035 if (!p)
1036 continue;
1037
1038 if (itr->second == PASS)
1039 SendLootRoll(newitemGUID, p->GetGUID(), 128, ROLL_PASS, *r, true);
1040 }
1041 }
1042
1043 if (r->totalPass == r->totalPlayersRolling)
1044 delete r;
1045 else
1046 {
1047 SendLootStartRoll(60000, pLootedObject->GetMapId(), *r);
1048
1049 RollId.push_back(r);
1050
1051 if (Creature* creature = pLootedObject->ToCreature())
1052 {
1053 creature->m_groupLootTimer = 60000;
1054 creature->lootingGroupLowGUID = GetGUID().GetCounter();
1055 }
1056 else if (GameObject* go = pLootedObject->ToGameObject())
1057 {
1058 go->m_groupLootTimer = 60000;
1059 go->lootingGroupLowGUID = GetGUID().GetCounter();
1060 }
1061 }
1062 }
1063 else
1064 delete r;
1065 }
1066 else
1067 i->is_underthreshold = true;
1068 }
1069
1070 for (i = loot->quest_items.begin(); i != loot->quest_items.end(); ++i, ++itemSlot)
1071 {
1072 if (!i->follow_loot_rules)
1073 continue;
1074
1075 item = sObjectMgr->GetItemTemplate(i->itemid);
1076 if (!item)
1077 {
1078 continue;
1079 }
1080
1081 ObjectGuid newitemGUID = ObjectGuid::Create<HighGuid::Item>(sObjectMgr->GetGenerator<HighGuid::Item>().Generate());
1082 Roll* r = new Roll(newitemGUID, *i);
1083
1084 //a vector is filled with only near party members
1085 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1086 {
1087 Player* member = itr->GetSource();
1088 if (!member || !member->GetSession())
1089 continue;
1090
1091 if (member->IsAtLootRewardDistance(pLootedObject))
1092 {
1094
1095 RollVote vote = NOT_EMITED_YET;
1096 if (!CanRollOnItem(*i, member, loot))
1097 {
1098 vote = PASS;
1099 ++r->totalPass;
1100 }
1101 r->playerVote[member->GetGUID()] = vote;
1102 }
1103 }
1104
1105 if (r->totalPlayersRolling > 0)
1106 {
1107 r->setLoot(loot);
1108 r->itemSlot = itemSlot;
1109
1110 loot->quest_items[itemSlot - loot->items.size()].is_blocked = true;
1111
1112 SendLootStartRoll(60000, pLootedObject->GetMapId(), *r);
1113
1114 RollId.push_back(r);
1115
1116 if (Creature* creature = pLootedObject->ToCreature())
1117 {
1118 creature->m_groupLootTimer = 60000;
1119 creature->lootingGroupLowGUID = GetGUID().GetCounter();
1120 }
1121 else if (GameObject* go = pLootedObject->ToGameObject())
1122 {
1123 go->m_groupLootTimer = 60000;
1124 go->lootingGroupLowGUID = GetGUID().GetCounter();
1125 }
1126 }
1127 else
1128 delete r;
1129 }
1130}
bool CanRollOnItem(LootItem const &item, Player const *player, Loot *loot)
Definition Group.cpp:959
@ NOT_EMITED_YET
Definition Group.h:54
@ ROLL_FLAG_TYPE_DISENCHANT
Definition LootMgr.h:45
Definition Creature.h:47
Definition GameObject.h:120
void SendLootStartRoll(uint32 CountDown, uint32 mapid, const Roll &r)
Definition Group.cpp:825
GameObject * ToGameObject()
Definition Object.h:214
Creature * ToCreature()
Definition Object.h:206
WorldSession * GetSession() const
Definition Player.h:2020
bool IsAtLootRewardDistance(WorldObject const *pRewardSource) const
Definition Player.cpp:12817
bool GetPassOnGroupLoot() const
Definition Player.h:2526
void setLoot(Loot *pLoot)
Definition Group.cpp:56
uint8 rollVoteMask
Definition Group.h:163
uint32 Quality
Definition ItemTemplate.h:626
uint32 RequiredDisenchantSkill
Definition ItemTemplate.h:684

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

Referenced by Player::SendLoot().

◆ HasFreeSlotSubGroup()

bool Group::HasFreeSlotSubGroup ( uint8  subgroup) const

◆ InInstance()

uint16 Group::InInstance ( )

◆ IsAssistant()

◆ isBFGroup()

◆ isBGGroup()

◆ IsCreated()

bool Group::IsCreated ( ) const
2300{
2301 return GetMembersCount() > 0;
2302}

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
2472{
2473 return !RollId.empty();
2474}

References RollId.

Referenced by Player::CanUninviteFromGroup().

◆ LinkMember()

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

References LinkedListHead::insertFirst(), and m_memberMgr.

Referenced by GroupReference::targetObjectBuildLink().

◆ LoadGroupFromDB()

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

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

Referenced by GroupMgr::LoadGroups().

◆ LoadMemberFromDB()

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

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 
)
1284{
1285 LOG_DEBUG("network", "Group::MasterLoot (SMSG_LOOT_MASTER_LIST, 330)");
1286
1287 for (std::vector<LootItem>::iterator i = loot->items.begin(); i != loot->items.end(); ++i)
1288 {
1289 if (i->freeforall)
1290 continue;
1291
1292 i->is_blocked = !i->is_underthreshold;
1293 }
1294
1295 for (std::vector<LootItem>::iterator i = loot->quest_items.begin(); i != loot->quest_items.end(); ++i)
1296 {
1297 if (!i->follow_loot_rules)
1298 continue;
1299
1300 i->is_blocked = !i->is_underthreshold;
1301 }
1302
1303 std::vector<Player*> looters;
1304 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1305 {
1306 Player* looter = itr->GetSource();
1307 if (!looter->IsInWorld())
1308 {
1309 continue;
1310 }
1311
1312 if (looter->IsAtLootRewardDistance(pLootedObject))
1313 {
1314 looters.push_back(looter);
1315 }
1316 }
1317
1318 WorldPacket data(SMSG_LOOT_MASTER_LIST, 1 + looters.size() * (1 + 8));
1319 data << uint8(looters.size());
1320
1321 for (Player* looter : looters)
1322 {
1323 data << looter->GetGUID();
1324 }
1325
1326 for (Player* looter : looters)
1327 {
1328 looter->SendDirectMessage(&data);
1329 }
1330}
bool IsInWorld() const
Definition Object.h:109
@ 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 
)
1133{
1134 ItemTemplate const* item;
1135 uint8 itemSlot = 0;
1136 for (std::vector<LootItem>::iterator i = loot->items.begin(); i != loot->items.end(); ++i, ++itemSlot)
1137 {
1138 if (i->freeforall)
1139 continue;
1140
1141 item = sObjectMgr->GetItemTemplate(i->itemid);
1142
1143 //roll for over-threshold item if it's one-player loot
1144 if (item->Quality >= uint32(m_lootThreshold))
1145 {
1146 ObjectGuid newitemGUID = ObjectGuid::Create<HighGuid::Item>(sObjectMgr->GetGenerator<HighGuid::Item>().Generate());
1147 Roll* r = new Roll(newitemGUID, *i);
1148
1149 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1150 {
1151 Player* playerToRoll = itr->GetSource();
1152 if (!playerToRoll || !playerToRoll->GetSession())
1153 continue;
1154
1155 if (playerToRoll->IsAtGroupRewardDistance(lootedObject))
1156 {
1158
1159 RollVote vote = playerToRoll->GetPassOnGroupLoot() ? PASS : NOT_EMITED_YET;
1160 if (!CanRollOnItem(*i, playerToRoll, loot))
1161 {
1162 vote = PASS;
1163 r->totalPass++; // Can't broadcast the pass now. need to wait until all rolling players are known
1164 }
1165
1166 r->playerVote[playerToRoll->GetGUID()] = vote;
1167 }
1168 }
1169
1170 if (r->totalPlayersRolling > 0)
1171 {
1172 r->setLoot(loot);
1173 r->itemSlot = itemSlot;
1176
1178 r->rollVoteMask &= ~ROLL_FLAG_TYPE_NEED;
1179
1180 loot->items[itemSlot].is_blocked = true;
1181
1182 //Broadcast Pass and Send Rollstart
1183 for (Roll::PlayerVote::const_iterator itr = r->playerVote.begin(); itr != r->playerVote.end(); ++itr)
1184 {
1185 Player* p = ObjectAccessor::FindPlayer(itr->first);
1186 if (!p)
1187 continue;
1188
1189 if (itr->second == PASS)
1190 SendLootRoll(newitemGUID, p->GetGUID(), 128, ROLL_PASS, *r);
1191 else
1192 SendLootStartRollToPlayer(60000, lootedObject->GetMapId(), p, p->CanRollForItemInLFG(item, lootedObject) == EQUIP_ERR_OK, *r);
1193 }
1194
1195 RollId.push_back(r);
1196
1197 if (Creature* creature = lootedObject->ToCreature())
1198 {
1199 creature->m_groupLootTimer = 60000;
1200 creature->lootingGroupLowGUID = GetGUID().GetCounter();
1201 }
1202 else if (GameObject* go = lootedObject->ToGameObject())
1203 {
1204 go->m_groupLootTimer = 60000;
1205 go->lootingGroupLowGUID = GetGUID().GetCounter();
1206 }
1207 }
1208 else
1209 delete r;
1210 }
1211 else
1212 i->is_underthreshold = true;
1213 }
1214
1215 for (std::vector<LootItem>::iterator i = loot->quest_items.begin(); i != loot->quest_items.end(); ++i, ++itemSlot)
1216 {
1217 if (!i->follow_loot_rules)
1218 continue;
1219
1220 item = sObjectMgr->GetItemTemplate(i->itemid);
1221 ObjectGuid newitemGUID = ObjectGuid::Create<HighGuid::Item>(sObjectMgr->GetGenerator<HighGuid::Item>().Generate());
1222 Roll* r = new Roll(newitemGUID, *i);
1223
1224 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1225 {
1226 Player* playerToRoll = itr->GetSource();
1227 if (!playerToRoll || !playerToRoll->GetSession())
1228 continue;
1229
1230 if (playerToRoll->IsAtGroupRewardDistance(lootedObject))
1231 {
1233
1234 RollVote vote = playerToRoll->GetPassOnGroupLoot() ? PASS : NOT_EMITED_YET;
1235 if (!CanRollOnItem(*i, playerToRoll, loot))
1236 {
1237 vote = PASS;
1238 r->totalPass++; // Can't broadcast the pass now. need to wait until all rolling players are known
1239 }
1240
1241 r->playerVote[playerToRoll->GetGUID()] = vote;
1242 }
1243 }
1244
1245 if (r->totalPlayersRolling > 0)
1246 {
1247 r->setLoot(loot);
1248 r->itemSlot = itemSlot;
1249
1250 loot->quest_items[itemSlot - loot->items.size()].is_blocked = true;
1251
1252 //Broadcast Pass and Send Rollstart
1253 for (Roll::PlayerVote::const_iterator itr = r->playerVote.begin(); itr != r->playerVote.end(); ++itr)
1254 {
1255 Player* p = ObjectAccessor::FindPlayer(itr->first);
1256 if (!p)
1257 continue;
1258
1259 if (itr->second == PASS)
1260 SendLootRoll(newitemGUID, p->GetGUID(), 128, ROLL_PASS, *r);
1261 else
1262 SendLootStartRollToPlayer(60000, lootedObject->GetMapId(), p, p->CanRollForItemInLFG(item, lootedObject) == EQUIP_ERR_OK, *r);
1263 }
1264
1265 RollId.push_back(r);
1266
1267 if (Creature* creature = lootedObject->ToCreature())
1268 {
1269 creature->m_groupLootTimer = 60000;
1270 creature->lootingGroupLowGUID = GetGUID().GetCounter();
1271 }
1272 else if (GameObject* go = lootedObject->ToGameObject())
1273 {
1274 go->m_groupLootTimer = 60000;
1275 go->lootingGroupLowGUID = GetGUID().GetCounter();
1276 }
1277 }
1278 else
1279 delete r;
1280 }
1281}
@ 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:849
InventoryResult CanRollForItemInLFG(ItemTemplate const *item, WorldObject const *lootedObject) const
Definition PlayerStorage.cpp:2410
bool IsAtGroupRewardDistance(WorldObject const *pRewardSource) const
Definition Player.cpp:12796
bool HasFlag2(ItemFlags2 flag) const
Definition ItemTemplate.h:826

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

Referenced by Player::SendLoot().

◆ OfflineReadyCheck()

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

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

Referenced by WorldSession::HandleRaidReadyCheckOpcode().

◆ RemoveAllInvites()

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

References m_invitees.

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

◆ RemoveInvite()

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

References m_invitees, and Player::SetGroupInvite().

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

◆ RemoveMember()

bool Group::RemoveMember ( ObjectGuid  guid,
const RemoveMethod method = GROUP_REMOVEMETHOD_DEFAULT,
ObjectGuid  kicker = ObjectGuid::Empty,
const char *  reason = nullptr 
)
547{
549
550 // LFG group vote kick handled in scripts
551 if (isLFGGroup(true) && method == GROUP_REMOVEMETHOD_KICK)
552 {
553 sLFGMgr->InitBoot(GetGUID(), kicker, guid, std::string(reason ? reason : ""));
554 return m_memberSlots.size() > 0;
555 }
556
557 // remove member and change leader (if need) only if strong more 2 members _before_ member remove (BG/BF allow 1 member group)
558 if (GetMembersCount() > ((isBGGroup() || isLFGGroup() || isBFGroup()) ? 1u : 2u))
559 {
561 if (player)
562 {
563 // Battleground group handling
564 if (isBGGroup() || isBFGroup())
566 else
567 // Regular group
568 {
569 if (player->GetOriginalGroup() == this)
570 player->SetOriginalGroup(nullptr);
571 else
572 player->SetGroup(nullptr);
573
574 // quest related GO state dependent from raid membership
576 }
577
578 WorldPacket data;
579
580 if (method == GROUP_REMOVEMETHOD_KICK || method == GROUP_REMOVEMETHOD_KICK_LFG)
581 {
583 player->SendDirectMessage(&data);
584 }
585
586 // Do we really need to send this opcode?
587 data.Initialize(SMSG_GROUP_LIST, 1 + 1 + 1 + 1 + 8 + 4 + 4 + 8);
588 data << uint8(0x10) << uint8(0) << uint8(0) << uint8(0);
589 data << m_guid << uint32(m_counter) << uint32(0) << uint64(0);
590 player->SendDirectMessage(&data);
591 }
592
593 // Remove player from group in DB
594 if (!isBGGroup() && !isBFGroup())
595 {
597 stmt->SetData(0, guid.GetCounter());
598 stmt->SetData(1, GetGUID().GetCounter());
599 CharacterDatabase.Execute(stmt);
600 }
601
602 // Remove player from loot rolls
604
605 // Update subgroups
607 if (slot != m_memberSlots.end())
608 {
609 SubGroupCounterDecrease(slot->group);
610 m_memberSlots.erase(slot);
611
612 if (!isBGGroup() && !isBFGroup())
613 {
614 sCharacterCache->ClearCharacterGroup(guid);
615 }
616 }
617
618 // Reevaluate group enchanter if the leaving player had enchanting skill or the player is offline
619 if (!player || player->GetSkillValue(SKILL_ENCHANTING))
620 {
622 }
623
624 // Pick new leader if necessary
625 bool validLeader = true;
626 if (m_leaderGuid == guid)
627 {
628 validLeader = false;
629 for (member_witerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr)
630 {
632 {
633 ChangeLeader(itr->guid);
634 validLeader = true;
635 break;
636 }
637 }
638 }
639
640 _homebindIfInstance(player);
641 if (!isBGGroup() && !isBFGroup())
643
644 sScriptMgr->OnGroupRemoveMember(this, guid, method, kicker, reason);
645
646 SendUpdate();
647
648 if (!validLeader)
649 {
650 // pussywizard: temp do nothing, something causes crashes in MakeNewGroup
651 //Disband();
652 //return false;
653 }
654
655 if (isLFGGroup() && GetMembersCount() == 1)
656 {
658 uint32 mapId = sLFGMgr->GetDungeonMapId(GetGUID());
659 lfg::LfgState state = sLFGMgr->GetState(GetGUID());
660 if (!mapId || !leader || (leader->IsAlive() && leader->GetMapId() != mapId) || state == lfg::LFG_STATE_NONE)
661 {
662 Disband();
663 return false;
664 }
665 }
666
667 if (m_memberMgr.getSize() < ((isLFGGroup() || isBGGroup() || isBFGroup()) ? 1u : 2u))
668 {
669 Disband();
670 return false;
671 }
672
673 return true;
674 }
675 // If group size before player removal <= 2 then disband it
676 else
677 {
678 sScriptMgr->OnGroupRemoveMember(this, guid, method, kicker, reason);
679 Disband();
680 return false;
681 }
682}
@ GROUP_REMOVEMETHOD_KICK_LFG
Definition SharedDefines.h:3846
@ GROUP_REMOVEMETHOD_KICK
Definition SharedDefines.h:3844
void BroadcastGroupUpdate(void)
Definition Group.cpp:2212
void Disband(bool hideDestroy=false)
Definition Group.cpp:725
void ResetMaxEnchantingLevel()
Definition Group.cpp:2228
void ChangeLeader(ObjectGuid guid)
Definition Group.cpp:684
void RemovePlayerFromRolls(ObjectGuid guid)
Definition Group.cpp:1397
uint32 getSize() const
Definition LinkedList.h:115
bool IsAlive() const
Definition Unit.h:1794
@ SMSG_GROUP_UNINVITE
Definition Opcodes.h:149

References _getMemberWSlot(), _homebindIfInstance(), BroadcastGroupUpdate(), ChangeLeader(), CHAR_DEL_GROUP_MEMBER, CharacterDatabase, Disband(), ObjectAccessor::FindConnectedPlayer(), ObjectGuid::GetCounter(), GetGUID(), GetLeaderGUID(), WorldLocation::GetMapId(), GetMembersCount(), Player::GetOriginalGroup(), LinkedListHead::getSize(), Player::GetSkillValue(), GROUP_REMOVEMETHOD_KICK, GROUP_REMOVEMETHOD_KICK_LFG, WorldPacket::Initialize(), INSTANCE_RESET_GROUP_LEAVE, Unit::IsAlive(), isBFGroup(), isBGGroup(), isLFGGroup(), lfg::LFG_STATE_NONE, m_counter, m_guid, m_leaderGuid, m_memberMgr, m_memberSlots, Player::RemoveFromBattlegroundOrBattlefieldRaid(), RemovePlayerFromRolls(), Player::ResetInstances(), ResetMaxEnchantingLevel(), sCharacterCache, Player::SendDirectMessage(), SendUpdate(), PreparedStatementBase::SetData(), Player::SetGroup(), Player::SetOriginalGroup(), SKILL_ENCHANTING, sLFGMgr, SMSG_GROUP_LIST, SMSG_GROUP_UNINVITE, sScriptMgr, SubGroupCounterDecrease(), and Player::UpdateForQuestWorldObjects().

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

◆ RemovePlayerFromRolls()

void Group::RemovePlayerFromRolls ( ObjectGuid  guid)
1398{
1399 for (Rolls::iterator it = RollId.begin(); it != RollId.end();)
1400 {
1401 Roll* roll = *it;
1402 Roll::PlayerVote::iterator itr2 = roll->playerVote.find(guid);
1403 if (itr2 == roll->playerVote.end())
1404 {
1405 ++it;
1406 continue;
1407 }
1408
1409 if (itr2->second == GREED || itr2->second == DISENCHANT)
1410 --roll->totalGreed;
1411 else if (itr2->second == NEED)
1412 --roll->totalNeed;
1413 else if (itr2->second == PASS)
1414 --roll->totalPass;
1415
1416 if (itr2->second != NOT_VALID)
1417 --roll->totalPlayersRolling;
1418
1419 roll->playerVote.erase(itr2);
1420
1421 if (CountRollVote(guid, roll->itemGUID, MAX_ROLL_TYPE))
1422 it = RollId.begin();
1423 else
1424 ++it;
1425 }
1426}
@ MAX_ROLL_TYPE
Definition LootMgr.h:37
bool CountRollVote(ObjectGuid playerGUID, ObjectGuid Guid, uint8 Choise)
Definition Group.cpp:1332
ObjectGuid itemGUID
Definition Group.h:151

References CountRollVote(), DISENCHANT, GREED, Roll::itemGUID, MAX_ROLL_TYPE, NEED, NOT_VALID, PASS, Roll::playerVote, RollId, Roll::totalGreed, Roll::totalNeed, Roll::totalPass, and Roll::totalPlayersRolling.

Referenced by RemoveMember().

◆ RemoveUniqueGroupMemberFlag()

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

References m_memberSlots.

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

◆ ResetInstances()

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

References InstanceSave::CanReset(), DUNGEON_DIFFICULTY_NORMAL, Player::GetDifficulty(), Object::GetGUID(), InstanceSave::GetInstanceId(), InstanceSave::GetMapId(), INSTANCE_RESET_ALL, INSTANCE_RESET_CHANGE_DIFFICULTY, INSTANCE_RESET_FAILED, 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 ( )
2229{
2231 Player* pMember = nullptr;
2232 for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
2233 {
2234 pMember = ObjectAccessor::FindPlayer(citr->guid);
2235 if (pMember && pMember->GetSession() && !pMember->GetSession()->IsSocketClosed()
2236 && m_maxEnchantingLevel < pMember->GetSkillValue(SKILL_ENCHANTING))
2237 {
2239 }
2240 }
2241}
bool IsSocketClosed() const
Definition WorldSession.cpp:608

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
2385{
2386 member_citerator mslot1 = _getMemberCSlot(guid1);
2387 if (mslot1 == m_memberSlots.end() || !slot2)
2388 return false;
2389 return (mslot1->group == slot2->group);
2390}

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

◆ SameSubGroup() [2/3]

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

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
1800{
1801 if (!member1 || !member2)
1802 return false;
1803
1804 if (member1->GetGroup() != this || member2->GetGroup() != this)
1805 return false;
1806 else
1807 return member1->GetSubGroup() == member2->GetSubGroup();
1808}

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

◆ SendLootAllPassed()

void Group::SendLootAllPassed ( Roll const &  roll)
919{
920 WorldPacket data(SMSG_LOOT_ALL_PASSED, (8 + 4 + 4 + 4 + 4));
921 data << roll.itemGUID; // Guid of the item rolled
922 data << uint32(roll.itemSlot); // Item loot slot
923 data << uint32(roll.itemid); // The itemEntryId for the item that shall be rolled for
924 data << uint32(roll.itemRandomPropId); // Item random property ID
925 data << uint32(roll.itemRandomSuffix); // Item random suffix ID
926
927 for (Roll::PlayerVote::const_iterator itr = roll.playerVote.begin(); itr != roll.playerVote.end(); ++itr)
928 {
929 Player* player = ObjectAccessor::FindConnectedPlayer(itr->first);
930 if (!player)
931 continue;
932
933 if (itr->second != NOT_VALID)
934 player->SendDirectMessage(&data);
935 }
936}
@ SMSG_LOOT_ALL_PASSED
Definition Opcodes.h:700

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

Referenced by CountTheRoll().

◆ SendLooter()

void Group::SendLooter ( Creature creature,
Player pLooter 
)
940{
941 ASSERT(creature);
942
943 WorldPacket data(SMSG_LOOT_LIST, (8 + 8));
944 data << creature->GetGUID();
945
946 if (GetLootMethod() == MASTER_LOOT && creature->loot.hasOverThresholdItem())
948 else
949 data << uint8(0);
950
951 if (groupLooter)
952 data << groupLooter->GetPackGUID();
953 else
954 data << uint8(0);
955
956 BroadcastPacket(&data, false);
957}
@ MASTER_LOOT
Definition LootMgr.h:60
Loot loot
Definition Creature.h:231
ObjectGuid GetMasterLooterGuid() const
Definition Group.cpp:2339
LootMethod GetLootMethod() const
Definition Group.cpp:2329
PackedGuid WriteAsPacked() const
Definition ObjectGuid.h:316
@ SMSG_LOOT_LIST
Definition Opcodes.h:1047
bool hasOverThresholdItem() const
Definition LootMgr.cpp:952

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 
)
872{
873 WorldPacket data(SMSG_LOOT_ROLL, (8 + 4 + 8 + 4 + 4 + 4 + 1 + 1 + 1));
874 data << sourceGuid; // guid of the item rolled
875 data << uint32(roll.itemSlot); // slot
876 data << targetGuid;
877 data << uint32(roll.itemid); // the itemEntryId for the item that shall be rolled for
878 data << uint32(roll.itemRandomSuffix); // randomSuffix
879 data << uint32(roll.itemRandomPropId); // Item random property ID
880 data << uint8(rollNumber); // 0: "Need for: [item name]" > 127: "you passed on: [item name]" Roll number
881 data << uint8(rollType); // 0: "Need for: [item name]" 0: "You have selected need for [item name] 1: need roll 2: greed roll
882 data << uint8(autoPass); // 1: "You automatically passed on: %s because you cannot loot that item."
883
884 for (Roll::PlayerVote::const_iterator itr = roll.playerVote.begin(); itr != roll.playerVote.end(); ++itr)
885 {
887 if (!p)
888 continue;
889
890 if (itr->second != NOT_VALID)
891 p->SendDirectMessage(&data);
892 }
893}
@ SMSG_LOOT_ROLL
Definition Opcodes.h:704

References ObjectAccessor::FindConnectedPlayer(), Roll::itemid, Roll::itemRandomPropId, Roll::itemRandomSuffix, Roll::itemSlot, NOT_VALID, Roll::playerVote, Player::SendDirectMessage(), 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 
)
896{
897 WorldPacket data(SMSG_LOOT_ROLL_WON, (8 + 4 + 4 + 4 + 4 + 8 + 1 + 1));
898 data << sourceGuid; // guid of the item rolled
899 data << uint32(roll.itemSlot); // slot
900 data << uint32(roll.itemid); // the itemEntryId for the item that shall be rolled for
901 data << uint32(roll.itemRandomSuffix); // randomSuffix
902 data << uint32(roll.itemRandomPropId); // Item random property
903 data << targetGuid; // guid of the player who won.
904 data << uint8(rollNumber); // rollnumber realted to SMSG_LOOT_ROLL
905 data << uint8(rollType); // rollType related to SMSG_LOOT_ROLL
906
907 for (Roll::PlayerVote::const_iterator itr = roll.playerVote.begin(); itr != roll.playerVote.end(); ++itr)
908 {
910 if (!p)
911 continue;
912
913 if (itr->second != NOT_VALID)
914 p->SendDirectMessage(&data);
915 }
916}
@ SMSG_LOOT_ROLL_WON
Definition Opcodes.h:701

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

Referenced by CountTheRoll().

◆ SendLootStartRoll()

void Group::SendLootStartRoll ( uint32  CountDown,
uint32  mapid,
const Roll r 
)
826{
827 WorldPacket data(SMSG_LOOT_START_ROLL, (8 + 4 + 4 + 4 + 4 + 4 + 4 + 1));
828 data << r.itemGUID; // guid of rolled item
829 data << uint32(mapid); // 3.3.3 mapid
830 data << uint32(r.itemSlot); // itemslot
831 data << uint32(r.itemid); // the itemEntryId for the item that shall be rolled for
832 data << uint32(r.itemRandomSuffix); // randomSuffix
833 data << uint32(r.itemRandomPropId); // item random property ID
834 data << uint32(r.itemCount); // items in stack
835 data << uint32(CountDown); // the countdown time to choose "need" or "greed"
836 data << uint8(r.rollVoteMask); // roll type mask
837
838 for (Roll::PlayerVote::const_iterator itr = r.playerVote.begin(); itr != r.playerVote.end(); ++itr)
839 {
841 if (!p)
842 continue;
843
844 if (itr->second == NOT_EMITED_YET)
845 p->SendDirectMessage(&data);
846 }
847}
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(), Roll::itemCount, Roll::itemGUID, Roll::itemid, Roll::itemRandomPropId, Roll::itemRandomSuffix, Roll::itemSlot, NOT_EMITED_YET, Roll::playerVote, Roll::rollVoteMask, Player::SendDirectMessage(), and SMSG_LOOT_START_ROLL.

Referenced by GroupLoot().

◆ SendLootStartRollToPlayer()

void Group::SendLootStartRollToPlayer ( uint32  countDown,
uint32  mapId,
Player p,
bool  canNeed,
Roll const &  r 
)
850{
851 if (!p)
852 return;
853
854 WorldPacket data(SMSG_LOOT_START_ROLL, (8 + 4 + 4 + 4 + 4 + 4 + 4 + 1));
855 data << r.itemGUID; // guid of rolled item
856 data << uint32(mapId); // 3.3.3 mapid
857 data << uint32(r.itemSlot); // itemslot
858 data << uint32(r.itemid); // the itemEntryId for the item that shall be rolled for
859 data << uint32(r.itemRandomSuffix); // randomSuffix
860 data << uint32(r.itemRandomPropId); // item random property ID
861 data << uint32(r.itemCount); // items in stack
862 data << uint32(countDown); // the countdown time to choose "need" or "greed"
863 uint8 voteMask = r.rollVoteMask;
864 if (!canNeed)
865 voteMask &= ~ROLL_FLAG_TYPE_NEED;
866 data << uint8(voteMask); // roll type mask
867
868 p->SendDirectMessage(&data);
869}

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

Referenced by NeedBeforeGreed().

◆ SendTargetIconList()

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

Referenced by SendUpdate().

◆ SetBattlefieldGroup()

void Group::SetBattlefieldGroup ( Battlefield bf)
2411{
2412 m_bfGroup = bg;
2413}

References m_bfGroup.

Referenced by Battlefield::AddOrSetPlayerToCorrectBfGroup().

◆ SetBattlegroundGroup()

void Group::SetBattlegroundGroup ( Battleground bg)
2406{
2407 m_bgGroup = bg;
2408}

References m_bgGroup.

Referenced by Battleground::SetBgRaid().

◆ SetDifficultyChangePrevention()

◆ SetDungeonDifficulty()

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

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

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 
)
2264{
2265 member_witerator slot = _getMemberWSlot(guid);
2266 if (slot == m_memberSlots.end())
2267 return;
2268
2269 slot->roles = roles;
2270 SendUpdate();
2271}

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

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

◆ SetLooterGuid()

void Group::SetLooterGuid ( ObjectGuid  guid)
2249{
2250 m_looterGuid = guid;
2251}

References m_looterGuid.

Referenced by UpdateLooterGuid().

◆ SetLootMethod()

void Group::SetLootMethod ( LootMethod  method)
2244{
2245 m_lootMethod = method;
2246}

References m_lootMethod.

Referenced by WorldSession::HandleLootMethodOpcode().

◆ SetLootThreshold()

void Group::SetLootThreshold ( ItemQualities  threshold)
2259{
2260 m_lootThreshold = threshold;
2261}

References m_lootThreshold.

Referenced by WorldSession::HandleLootMethodOpcode().

◆ SetMasterLooterGuid()

void Group::SetMasterLooterGuid ( ObjectGuid  guid)
2254{
2255 m_masterLooterGuid = guid;
2256}

References m_masterLooterGuid.

Referenced by WorldSession::HandleLootMethodOpcode().

◆ SetRaidDifficulty()

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

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

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
2525{
2527 --m_subGroupsCounts[subgroup];
2528}

References m_subGroupsCounts.

Referenced by ChangeMembersGroup(), and RemoveMember().

◆ SubGroupCounterIncrease()

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

References m_subGroupsCounts.

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

◆ ToggleGroupMemberFlag()

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

Referenced by ChangeLeader(), and SetGroupMemberFlag().

◆ UpdateLooterGuid()

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

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)
1745{
1746 if (!player || !player->IsInWorld())
1747 return;
1748
1749 WorldPacket data;
1750 player->GetSession()->BuildPartyMemberStatsChangedPacket(player, &data);
1751
1752 for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
1753 {
1754 Player* member = itr->GetSource();
1755 if (member && (!member->IsInMap(player) || !member->IsWithinDist(player, member->GetSightRange(player), false)))
1756 member->SendDirectMessage(&data);
1757 }
1758}
float GetSightRange(WorldObject const *target=nullptr) const override
Definition Player.cpp:16341
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:1372
bool IsInMap(WorldObject const *obj) const
Definition Object.cpp:1335
void BuildPartyMemberStatsChangedPacket(Player *player, WorldPacket *data)
Definition GroupHandler.cpp:756

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

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: