diff options
| author | Shauren <shauren.trinity@gmail.com> | 2025-07-11 17:40:34 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2025-07-11 17:40:34 +0200 |
| commit | cbb532e4bec11d59f2072441a43b7c797de6d16d (patch) | |
| tree | 27a0dc63805e527d2f47744963fc2f341493ce27 /src/server/game/Entities | |
| parent | ae197a62b77cd93799571b16756c372081704929 (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.cpp | 12 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 7 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/KillRewarder.cpp | 48 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 30 | ||||
| -rw-r--r-- | src/server/game/Entities/Totem/Totem.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 20 |
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); |
