aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-07-11 17:40:34 +0200
committerShauren <shauren.trinity@gmail.com>2025-07-11 17:40:34 +0200
commitcbb532e4bec11d59f2072441a43b7c797de6d16d (patch)
tree27a0dc63805e527d2f47744963fc2f341493ce27 /src/server/game/Entities
parentae197a62b77cd93799571b16756c372081704929 (diff)
Core/Groups: Use iterators instead of raw LinkedListElement to interact with group members
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp12
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp7
-rw-r--r--src/server/game/Entities/Player/KillRewarder.cpp48
-rw-r--r--src/server/game/Entities/Player/Player.cpp30
-rw-r--r--src/server/game/Entities/Totem/Totem.cpp6
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp20
6 files changed, 55 insertions, 68 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 964c6862faf..a44f2c1d420 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -1391,9 +1391,9 @@ void Creature::SetTappedBy(Unit const* unit, bool withGroup)
m_tapList.insert(player->GetGUID());
if (withGroup)
if (Group const* group = player->GetGroup())
- for (auto const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
- if (GetMap()->IsRaid() || group->SameSubGroup(player, itr->GetSource()))
- m_tapList.insert(itr->GetSource()->GetGUID());
+ for (GroupReference const& itr : group->GetMembers())
+ if (GetMap()->IsRaid() || group->SameSubGroup(player, itr.GetSource()))
+ m_tapList.insert(itr.GetSource()->GetGUID());
if (m_tapList.size() >= CREATURE_TAPPERS_SOFT_CAP)
SetDynamicFlag(UNIT_DYNFLAG_TAPPED);
@@ -3779,10 +3779,10 @@ void Creature::ForcePartyMembersIntoCombat()
for (Group const* partyToForceIntoCombat : partiesToForceIntoCombat)
{
- for (GroupReference const* ref = partyToForceIntoCombat->GetFirstMember(); ref != nullptr; ref = ref->next())
+ for (GroupReference const& ref : partyToForceIntoCombat->GetMembers())
{
- Player* player = ref->GetSource();
- if (!player || !player->IsInWorld() || player->GetMap() != GetMap() || player->IsGameMaster())
+ Player* player = ref.GetSource();
+ if (!player->IsInMap(this) || player->IsGameMaster())
continue;
EngageWithTarget(player);
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 7e15231016a..6bb1f0a6aa1 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -2835,10 +2835,9 @@ void GameObject::Use(Unit* user, bool ignoreCastInProgress /*= false*/)
if (Group* group = player->GetGroup())
{
- for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
- if (Player* member = itr->GetSource())
- if (member->IsAtGroupRewardDistance(this))
- member->KillCreditGO(info->entry, GetGUID());
+ for (GroupReference const& itr : group->GetMembers())
+ if (itr.GetSource()->IsAtGroupRewardDistance(this))
+ itr.GetSource()->KillCreditGO(info->entry, GetGUID());
}
else
player->KillCreditGO(info->entry, GetGUID());
diff --git a/src/server/game/Entities/Player/KillRewarder.cpp b/src/server/game/Entities/Player/KillRewarder.cpp
index 99d57edb1a3..742d97761bf 100644
--- a/src/server/game/Entities/Player/KillRewarder.cpp
+++ b/src/server/game/Entities/Player/KillRewarder.cpp
@@ -91,26 +91,24 @@ inline void KillRewarder::_InitGroupData(Player const* killer)
if (Group const* group = killer->GetGroup())
{
// 2. In case when player is in group, initialize variables necessary for group calculations:
- for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
+ for (GroupReference const& itr : group->GetMembers())
{
- if (Player* member = itr->GetSource())
+ Player* member = itr.GetSource();
+ if (killer == member || (member->IsAtGroupRewardDistance(_victim) && member->IsAlive()))
{
- if (killer == member || (member->IsAtGroupRewardDistance(_victim) && member->IsAlive()))
- {
- const uint8 lvl = member->GetLevel();
- // 2.1. _count - number of alive group members within reward distance;
- ++_count;
- // 2.2. _sumLevel - sum of levels of alive group members within reward distance;
- _sumLevel += lvl;
- // 2.3. _maxLevel - maximum level of alive group member within reward distance;
- if (_maxLevel < lvl)
- _maxLevel = lvl;
- // 2.4. _maxNotGrayMember - maximum level of alive group member within reward distance,
- // for whom victim is not gray;
- uint32 grayLevel = Trinity::XP::GetGrayLevel(lvl);
- if (_victim->GetLevelForTarget(member) > grayLevel && (!_maxNotGrayMember || _maxNotGrayMember->GetLevel() < lvl))
- _maxNotGrayMember = member;
- }
+ const uint8 lvl = member->GetLevel();
+ // 2.1. _count - number of alive group members within reward distance;
+ ++_count;
+ // 2.2. _sumLevel - sum of levels of alive group members within reward distance;
+ _sumLevel += lvl;
+ // 2.3. _maxLevel - maximum level of alive group member within reward distance;
+ if (_maxLevel < lvl)
+ _maxLevel = lvl;
+ // 2.4. _maxNotGrayMember - maximum level of alive group member within reward distance,
+ // for whom victim is not gray;
+ uint32 grayLevel = Trinity::XP::GetGrayLevel(lvl);
+ if (_victim->GetLevelForTarget(member) > grayLevel && (!_maxNotGrayMember || _maxNotGrayMember->GetLevel() < lvl))
+ _maxNotGrayMember = member;
}
}
// 2.5. _isFullXP - flag identifying that for all group members victim is not gray,
@@ -241,16 +239,12 @@ void KillRewarder::_RewardGroup(Group const* group, Player const* killer)
}
// 3.1.3. Reward each group member (even dead or corpse) within reward distance.
- for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
+ for (GroupReference const& itr : group->GetMembers())
{
- if (Player* member = itr->GetSource())
- {
- // Killer may not be at reward distance, check directly
- if (killer == member || member->IsAtGroupRewardDistance(_victim))
- {
- _RewardPlayer(member, isDungeon);
- }
- }
+ Player* member = itr.GetSource();
+ // Killer may not be at reward distance, check directly
+ if (killer == member || member->IsAtGroupRewardDistance(_victim))
+ _RewardPlayer(member, isDungeon);
}
}
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index be44c7a9898..017c19bb6c7 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -16582,12 +16582,12 @@ void Player::GroupEventHappens(uint32 questId, WorldObject const* pEventObject)
{
if (Group* group = GetGroup())
{
- for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
+ for (GroupReference const& itr : group->GetMembers())
{
- Player* player = itr->GetSource();
+ Player* player = itr.GetSource();
// for any leave or dead (with not released body) group member at appropriate distance
- if (player && player->IsAtGroupRewardDistance(pEventObject) && !player->GetCorpse())
+ if (player->IsAtGroupRewardDistance(pEventObject) && !player->GetCorpse())
player->AreaExploredOrEventHappens(questId);
}
}
@@ -26209,12 +26209,9 @@ bool Player::GetsRecruitAFriendBonus(bool forXP)
{
if (Group* group = GetGroup())
{
- for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
+ for (GroupReference const& itr : group->GetMembers())
{
- Player* player = itr->GetSource();
- if (!player)
- continue;
-
+ Player* player = itr.GetSource();
if (!player->IsAtRecruitAFriendDistance(this))
continue; // member (alive or dead) or his corpse at req. distance
@@ -26253,12 +26250,9 @@ void Player::RewardPlayerAndGroupAtEvent(uint32 creature_id, WorldObject* pRewar
// prepare data for near group iteration
if (Group* group = GetGroup())
{
- for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
+ for (GroupReference const& itr : group->GetMembers())
{
- Player* player = itr->GetSource();
- if (!player)
- continue;
-
+ Player* player = itr.GetSource();
if (!player->IsAtGroupRewardDistance(pRewardSource))
continue; // member (alive or dead) or his corpse at req. distance
@@ -26501,12 +26495,12 @@ Player* Player::GetNextRandomRaidMember(float radius)
std::vector<Player*> nearMembers;
nearMembers.reserve(group->GetMembersCount());
- for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
+ for (GroupReference const& itr : group->GetMembers())
{
- Player* Target = itr->GetSource();
+ Player* Target = itr.GetSource();
// IsHostileTo check duel and controlled by enemy
- if (Target && Target != this && IsWithinDistInMap(Target, radius) &&
+ if (Target != this && IsWithinDistInMap(Target, radius) &&
!Target->HasInvisibilityAura() && !IsHostileTo(Target))
nearMembers.push_back(Target);
}
@@ -26545,8 +26539,8 @@ PartyResult Player::CanUninviteFromGroup(ObjectGuid guidMember, Optional<uint8>
return ERR_PARTY_LFG_BOOT_LOOT_ROLLS;
/// @todo Should also be sent when anyone has recently left combat, with an aprox ~5 seconds timer.
- for (GroupReference const* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next())
- if (itr->GetSource() && itr->GetSource()->IsInMap(this) && itr->GetSource()->IsInCombat())
+ for (GroupReference const& itr : grp->GetMembers())
+ if (itr.GetSource()->IsInMap(this) && itr.GetSource()->IsInCombat())
return ERR_PARTY_LFG_BOOT_IN_COMBAT;
/* Missing support for these types
diff --git a/src/server/game/Entities/Totem/Totem.cpp b/src/server/game/Entities/Totem/Totem.cpp
index 4cf2095bc21..acbd66883f0 100644
--- a/src/server/game/Entities/Totem/Totem.cpp
+++ b/src/server/game/Entities/Totem/Totem.cpp
@@ -130,10 +130,10 @@ void Totem::UnSummon(uint32 msTime)
if (Group* group = owner->GetGroup())
{
- for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
+ for (GroupReference const& itr : group->GetMembers())
{
- Player* target = itr->GetSource();
- if (target && target->IsInMap(owner) && group->SameSubGroup(owner, target))
+ Player* target = itr.GetSource();
+ if (target->IsInMap(owner) && group->SameSubGroup(owner, target))
target->RemoveAurasDueToSpell(GetSpell(), GetGUID());
}
}
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 63eeb3b1ea2..91ab4c5168c 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -6612,18 +6612,18 @@ Unit* Unit::GetNextRandomRaidMemberOrPet(float radius)
// reserve place for players and pets because resizing vector every unit push is unefficient (vector is reallocated then)
nearMembers.reserve(group->GetMembersCount() * 2);
- for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
- if (Player* Target = itr->GetSource())
- {
- // IsHostileTo check duel and controlled by enemy
- if (Target != this && IsWithinDistInMap(Target, radius) && Target->IsAlive() && !IsHostileTo(Target))
- nearMembers.push_back(Target);
+ for (GroupReference const& itr : group->GetMembers())
+ {
+ Player* Target = itr.GetSource();
+ // IsHostileTo check duel and controlled by enemy
+ if (Target != this && IsWithinDistInMap(Target, radius) && Target->IsAlive() && !IsHostileTo(Target))
+ nearMembers.push_back(Target);
// Push player's pet to vector
if (Unit* pet = Target->GetGuardianPet())
if (pet != this && IsWithinDistInMap(pet, radius) && pet->IsAlive() && !IsHostileTo(pet))
nearMembers.push_back(pet);
- }
+ }
if (nearMembers.empty())
return nullptr;
@@ -11978,12 +11978,12 @@ void Unit::GetPartyMembers(std::list<Unit*> &TagUnitMap)
{
uint8 subgroup = owner->ToPlayer()->GetSubGroup();
- for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
+ for (GroupReference const& itr : group->GetMembers())
{
- Player* Target = itr->GetSource();
+ Player* Target = itr.GetSource();
// IsHostileTo check duel and controlled by enemy
- if (Target && Target->IsInMap(owner) && Target->GetSubGroup() == subgroup && !IsHostileTo(Target))
+ if (Target->IsInMap(owner) && Target->GetSubGroup() == subgroup && !IsHostileTo(Target))
{
if (Target->IsAlive())
TagUnitMap.push_back(Target);