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 | |
parent | ae197a62b77cd93799571b16756c372081704929 (diff) |
Core/Groups: Use iterators instead of raw LinkedListElement to interact with group members
Diffstat (limited to 'src')
31 files changed, 251 insertions, 321 deletions
diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index fb2d3848946..249f9a64afb 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -613,10 +613,10 @@ void PetAI::UpdateAllies() _allySet.insert(me->GetGUID()); if (group) // add group { - 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->ToPlayer(), Target)) + Player* Target = itr.GetSource(); + if (!Target->IsInMap(owner) || !group->SameSubGroup(owner->ToPlayer(), Target)) continue; if (Target->GetGUID() == owner->GetGUID()) diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp index 572861113e5..a6343124e51 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp @@ -60,10 +60,9 @@ void EscortAI::JustDied(Unit* /*killer*/) { if (Group* group = player->GetGroup()) { - for (GroupReference* groupRef = group->GetFirstMember(); groupRef != nullptr; groupRef = groupRef->next()) - if (Player* member = groupRef->GetSource()) - if (member->IsInMap(player)) - member->FailQuest(_escortQuest->GetQuestId()); + for (GroupReference const& groupRef : group->GetMembers()) + if (groupRef.GetSource()->IsInMap(player)) + groupRef.GetSource()->FailQuest(_escortQuest->GetQuestId()); } else player->FailQuest(_escortQuest->GetQuestId()); @@ -417,10 +416,9 @@ bool EscortAI::IsPlayerOrGroupInRange() { if (Group* group = player->GetGroup()) { - for (GroupReference* groupRef = group->GetFirstMember(); groupRef != nullptr; groupRef = groupRef->next()) - if (Player* member = groupRef->GetSource()) - if (me->IsWithinDistInMap(member, GetMaxPlayerDistance())) - return true; + for (GroupReference const& groupRef : group->GetMembers()) + if (me->IsWithinDistInMap(groupRef.GetSource(), GetMaxPlayerDistance())) + return true; } else if (me->IsWithinDistInMap(player, GetMaxPlayerDistance())) return true; diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp index 5c048d36f07..f91ff6f1207 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp @@ -51,10 +51,9 @@ void FollowerAI::JustDied(Unit* /*killer*/) { if (Group* group = player->GetGroup()) { - for (GroupReference* groupRef = group->GetFirstMember(); groupRef != nullptr; groupRef = groupRef->next()) - if (Player* member = groupRef->GetSource()) - if (member->IsInMap(player)) - member->FailQuest(_questForFollow); + for (GroupReference const& groupRef : group->GetMembers()) + if (groupRef.GetSource()->IsInMap(player)) + groupRef.GetSource()->FailQuest(_questForFollow); } else player->FailQuest(_questForFollow); @@ -101,11 +100,9 @@ void FollowerAI::UpdateAI(uint32 uiDiff) { if (Group* group = player->GetGroup()) { - for (GroupReference* groupRef = group->GetFirstMember(); groupRef && (maxRangeExceeded || questAbandoned); groupRef = groupRef->next()) + for (GroupReference const& groupRef : group->GetMembers()) { - Player* member = groupRef->GetSource(); - if (!member) - continue; + Player* member = groupRef.GetSource(); if (maxRangeExceeded && me->IsWithinDistInMap(member, MAX_PLAYER_DISTANCE)) maxRangeExceeded = false; if (questAbandoned) @@ -238,10 +235,10 @@ Player* FollowerAI::GetLeaderForFollower() { if (Group* group = player->GetGroup()) { - for (GroupReference* groupRef = group->GetFirstMember(); groupRef != nullptr; groupRef = groupRef->next()) + for (GroupReference const& groupRef : group->GetMembers()) { - Player* member = groupRef->GetSource(); - if (member && me->IsWithinDistInMap(member, MAX_PLAYER_DISTANCE) && member->IsAlive()) + Player* member = groupRef.GetSource(); + if (me->IsWithinDistInMap(member, MAX_PLAYER_DISTANCE) && member->IsAlive()) { TC_LOG_DEBUG("scripts.ai.followerai", "FollowerAI::GetLeaderForFollower: GetLeader changed and returned new leader. ({})", me->GetGUID().ToString()); _leaderGUID = member->GetGUID(); diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 11f645bc6da..de5fbddfb5a 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -202,9 +202,9 @@ void SmartAI::EndPath(bool fail) if (Group* group = player->GetGroup()) { - for (GroupReference* groupRef = group->GetFirstMember(); groupRef != nullptr; groupRef = groupRef->next()) + for (GroupReference const& groupRef : group->GetMembers()) { - Player* groupGuy = groupRef->GetSource(); + Player* groupGuy = groupRef.GetSource(); if (!groupGuy->IsInMap(player)) continue; @@ -306,9 +306,9 @@ bool SmartAI::IsEscortInvokerInRange() if (Group* group = player->GetGroup()) { - for (GroupReference* groupRef = group->GetFirstMember(); groupRef != nullptr; groupRef = groupRef->next()) + for (GroupReference const& groupRef : group->GetMembers()) { - Player* groupGuy = groupRef->GetSource(); + Player* groupGuy = groupRef.GetSource(); if (groupGuy->IsInMap(player) && me->GetDistance(groupGuy) <= checkDist) return true; } diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 3a6054fe3d5..d089abc9ca7 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2795,10 +2795,9 @@ void SmartScript::GetTargets(ObjectVector& targets, SmartScriptHolder const& e, { if (Group* group = player->GetGroup()) { - for (GroupReference* groupRef = group->GetFirstMember(); groupRef != nullptr; groupRef = groupRef->next()) - if (Player* member = groupRef->GetSource()) - if (member->IsInMap(player)) - targets.push_back(member); + for (GroupReference const& groupRef : group->GetMembers()) + if (groupRef.GetSource()->IsInMap(player)) + targets.push_back(groupRef.GetSource()); } // We still add the player to the list if there is no group. If we do // this even if there is a group (thus the else-check), it will add the diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 246cafea6a7..3323e9c7212 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -958,10 +958,9 @@ void GuildAchievementMgr::CompletedAchievement(AchievementEntry const* achieveme ca.CompletingPlayers.insert(referencePlayer->GetGUID()); if (Group const* group = referencePlayer->GetGroup()) - for (GroupReference const* ref = group->GetFirstMember(); ref != nullptr; ref = ref->next()) - if (Player const* groupMember = ref->GetSource()) - if (groupMember->GetGuildId() == _owner->GetId()) - ca.CompletingPlayers.insert(groupMember->GetGUID()); + for (GroupReference const& ref : group->GetMembers()) + if (ref.GetSource()->GetGuildId() == _owner->GetId()) + ca.CompletingPlayers.insert(ref.GetSource()->GetGUID()); } if (achievement->Flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL)) diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index 708afe85b69..5e1ed43ab1e 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -2149,8 +2149,8 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 { uint32 guildMemberCount = 0; if (Group const* group = referencePlayer->GetGroup()) - for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) - if (itr->GetSource()->GetGuildId() == referencePlayer->GetGuildId()) + for (GroupReference const& itr : group->GetMembers()) + if (itr.GetSource()->GetGuildId() == referencePlayer->GetGuildId()) ++guildMemberCount; if (guildMemberCount < reqValue) @@ -3088,8 +3088,8 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 { uint32 memberCount = 0; if (Group const* group = referencePlayer->GetGroup()) - for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) - if (itr->GetSource() != referencePlayer && *referencePlayer->m_playerData->VirtualPlayerRealm == *itr->GetSource()->m_playerData->VirtualPlayerRealm) + for (GroupReference const& itr : group->GetMembers()) + if (itr.GetSource() != referencePlayer && *referencePlayer->m_playerData->VirtualPlayerRealm == *itr.GetSource()->m_playerData->VirtualPlayerRealm) ++memberCount; if (memberCount < reqValue) return false; @@ -3188,8 +3188,8 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 if (Group const* group = referencePlayer->GetGroup()) { uint32 membersWithAchievement = 0; - for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) - if (itr->GetSource()->HasAchieved(secondaryAsset)) + for (GroupReference const& itr : group->GetMembers()) + if (itr.GetSource()->HasAchieved(secondaryAsset)) ++membersWithAchievement; if (membersWithAchievement > reqValue) @@ -3551,8 +3551,8 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 Group const* group = referencePlayer->GetGroup(); if (!group) return false; - for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) - if (itr->GetSource()->GetSession()->GetRecruiterId() == referencePlayer->GetSession()->GetAccountId()) + for (GroupReference const& itr : group->GetMembers()) + if (itr.GetSource()->GetSession()->GetRecruiterId() == referencePlayer->GetSession()->GetAccountId()) return true; return false; } @@ -3561,8 +3561,8 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 Group const* group = referencePlayer->GetGroup(); if (!group) return false; - for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) - if (itr->GetSource()->GetSession()->GetAccountId() == referencePlayer->GetSession()->GetRecruiterId()) + for (GroupReference const& itr : group->GetMembers()) + if (itr.GetSource()->GetSession()->GetAccountId() == referencePlayer->GetSession()->GetRecruiterId()) return true; return false; } @@ -3693,8 +3693,8 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 { if (Group const* group = referencePlayer->GetGroup()) { - for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) - if (!itr->GetSource()->HasAchieved(reqValue)) + for (GroupReference const& itr : group->GetMembers()) + if (!itr.GetSource()->HasAchieved(reqValue)) return false; } else if (!referencePlayer->HasAchieved(reqValue)) diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index 29de0d03291..429b1d91b5e 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -169,11 +169,9 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player const* leader, Group const* g //add players from group to ginfo if (group) { - for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : group->GetMembers()) { - Player* member = itr->GetSource(); - if (!member) - continue; // this should never happen + Player* member = itr.GetSource(); PlayerQueueInfo& pl_info = m_QueuedPlayers[member->GetGUID()]; pl_info.LastOnlineTime = lastOnlineTime; pl_info.GroupInfo = ginfo; diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 5dc01536bf6..86d0b5f5148 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -452,26 +452,27 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons) else { uint8 memberCount = 0; - for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr && joinData.result == LFG_JOIN_OK; itr = itr->next()) + for (GroupReference const& itr : grp->GetMembers()) { - if (Player* plrg = itr->GetSource()) + Player* plrg = itr.GetSource(); + if (!plrg->GetSession()->HasPermission(rbac::RBAC_PERM_JOIN_DUNGEON_FINDER)) + joinData.result = LFG_JOIN_NO_LFG_OBJECT; + if (plrg->HasAura(LFG_SPELL_DUNGEON_DESERTER)) + joinData.result = LFG_JOIN_DESERTER_PARTY; + else if (!isContinue && plrg->HasAura(LFG_SPELL_DUNGEON_COOLDOWN)) + joinData.result = LFG_JOIN_RANDOM_COOLDOWN_PARTY; + else if (plrg->InBattleground() || plrg->InArena() || plrg->InBattlegroundQueue()) + joinData.result = LFG_JOIN_CANT_USE_DUNGEONS; + else if (plrg->HasAura(9454)) // check Freeze debuff { - if (!plrg->GetSession()->HasPermission(rbac::RBAC_PERM_JOIN_DUNGEON_FINDER)) - joinData.result = LFG_JOIN_NO_LFG_OBJECT; - if (plrg->HasAura(LFG_SPELL_DUNGEON_DESERTER)) - joinData.result = LFG_JOIN_DESERTER_PARTY; - else if (!isContinue && plrg->HasAura(LFG_SPELL_DUNGEON_COOLDOWN)) - joinData.result = LFG_JOIN_RANDOM_COOLDOWN_PARTY; - else if (plrg->InBattleground() || plrg->InArena() || plrg->InBattlegroundQueue()) - joinData.result = LFG_JOIN_CANT_USE_DUNGEONS; - else if (plrg->HasAura(9454)) // check Freeze debuff - { - joinData.result = LFG_JOIN_NO_SLOTS; - joinData.playersMissingRequirement.push_back(plrg->GetName()); - } - ++memberCount; - players.insert(plrg->GetGUID()); + joinData.result = LFG_JOIN_NO_SLOTS; + joinData.playersMissingRequirement.push_back(plrg->GetName()); } + ++memberCount; + players.insert(plrg->GetGUID()); + + if (joinData.result != LFG_JOIN_OK) + break; } if (joinData.result == LFG_JOIN_OK && memberCount != grp->GetMembersCount()) @@ -571,21 +572,19 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons) SetState(gguid, LFG_STATE_ROLECHECK); // Send update to player LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_JOIN_QUEUE, dungeons); - for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : grp->GetMembers()) { - if (Player* plrg = itr->GetSource()) - { - ObjectGuid pguid = plrg->GetGUID(); - plrg->GetSession()->SendLfgUpdateStatus(updateData, true); - SetState(pguid, LFG_STATE_ROLECHECK); - SetTicket(pguid, ticket); - if (!isContinue) - SetSelectedDungeons(pguid, dungeons); - roleCheck.roles[pguid] = 0; - if (!debugNames.empty()) - debugNames.append(", "); - debugNames.append(plrg->GetName()); - } + Player* plrg = itr.GetSource(); + ObjectGuid pguid = plrg->GetGUID(); + plrg->GetSession()->SendLfgUpdateStatus(updateData, true); + SetState(pguid, LFG_STATE_ROLECHECK); + SetTicket(pguid, ticket); + if (!isContinue) + SetSelectedDungeons(pguid, dungeons); + roleCheck.roles[pguid] = 0; + if (!debugNames.empty()) + debugNames.append(", "); + debugNames.append(plrg->GetName()); } // Update leader role UpdateRoleCheck(gguid, guid, roles); @@ -1407,10 +1406,10 @@ void LFGMgr::TeleportPlayer(Player* player, bool out, bool fromOpcode /*= false* if (!fromOpcode) { // Select a player inside to be teleported to - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : group->GetMembers()) { - Player* plrg = itr->GetSource(); - if (plrg && plrg != player && plrg->GetMapId() == uint32(dungeon->map)) + Player* plrg = itr.GetSource(); + if (plrg != player && plrg->GetMapId() == uint32(dungeon->map)) { mapid = plrg->GetMapId(); x = plrg->GetPositionX(); 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); diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index b1d15f2da29..763b6b001a2 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -531,26 +531,24 @@ bool Group::AddMember(Player* player) WorldPacket groupDataPacket; // Broadcast group members' fields to player - for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : GetMembers()) { - if (itr->GetSource() == player) + Player* existingMember = itr.GetSource(); + if (existingMember == player) continue; - if (Player* existingMember = itr->GetSource()) - { - if (player->HaveAtClient(existingMember)) - existingMember->BuildValuesUpdateBlockForPlayerWithFlag(&groupData, UF::UpdateFieldFlag::PartyMember, player); + if (player->HaveAtClient(existingMember)) + existingMember->BuildValuesUpdateBlockForPlayerWithFlag(&groupData, UF::UpdateFieldFlag::PartyMember, player); - if (existingMember->HaveAtClient(player)) + if (existingMember->HaveAtClient(player)) + { + UpdateData newData(player->GetMapId()); + WorldPacket newDataPacket; + player->BuildValuesUpdateBlockForPlayerWithFlag(&newData, UF::UpdateFieldFlag::PartyMember, existingMember); + if (newData.HasData()) { - UpdateData newData(player->GetMapId()); - WorldPacket newDataPacket; - player->BuildValuesUpdateBlockForPlayerWithFlag(&newData, UF::UpdateFieldFlag::PartyMember, existingMember); - if (newData.HasData()) - { - newData.BuildPacket(&newDataPacket); - existingMember->SendDirectMessage(&newDataPacket); - } + newData.BuildPacket(&newDataPacket); + existingMember->SendDirectMessage(&newDataPacket); } } } @@ -574,16 +572,14 @@ bool Group::RemoveMember(ObjectGuid guid, RemoveMethod method /*= GROUP_REMOVEME Player* player = ObjectAccessor::FindConnectedPlayer(guid); if (player) { - for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : GetMembers()) { - if (Player* groupMember = itr->GetSource()) - { - if (groupMember->GetGUID() == guid) - continue; + Player* groupMember = itr.GetSource(); + if (groupMember->GetGUID() == guid) + continue; - groupMember->RemoveAllGroupBuffsFromCaster(guid); - player->RemoveAllGroupBuffsFromCaster(groupMember->GetGUID()); - } + groupMember->RemoveAllGroupBuffsFromCaster(guid); + player->RemoveAllGroupBuffsFromCaster(groupMember->GetGUID()); } } @@ -953,36 +949,36 @@ void Group::UpdatePlayerOutOfRange(Player const* player) const packet.Initialize(player); packet.Write(); - for (GroupReference const* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : GetMembers()) { - Player const* member = itr->GetSource(); - if (member && member != player && (!member->IsInMap(player) || !member->IsWithinDist(player, member->GetSightRange(), false))) + Player const* member = itr.GetSource(); + if (member != player && (!member->IsInMap(player) || !member->IsWithinDist(player, member->GetSightRange(), false))) member->SendDirectMessage(packet.GetRawPacket()); } } void Group::BroadcastAddonMessagePacket(WorldPacket const* packet, const std::string& prefix, bool ignorePlayersInBGRaid, int group /*= -1*/, ObjectGuid ignore /*= ObjectGuid::Empty*/) const { - for (GroupReference const* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : GetMembers()) { - Player* player = itr->GetSource(); - if (!player || (!ignore.IsEmpty() && player->GetGUID() == ignore) || (ignorePlayersInBGRaid && player->GetGroup() != this)) + Player* player = itr.GetSource(); + if ((!ignore.IsEmpty() && player->GetGUID() == ignore) || (ignorePlayersInBGRaid && player->GetGroup() != this)) continue; - if (player->GetSession()->IsAddonRegistered(prefix) && (group == -1 || itr->getSubGroup() == group)) + if (player->GetSession()->IsAddonRegistered(prefix) && (group == -1 || itr.getSubGroup() == group)) player->SendDirectMessage(packet); } } void Group::BroadcastPacket(WorldPacket const* packet, bool ignorePlayersInBGRaid, int group, ObjectGuid ignoredPlayer) const { - for (GroupReference const* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : GetMembers()) { - Player const* player = itr->GetSource(); - if (!player || (!ignoredPlayer.IsEmpty() && player->GetGUID() == ignoredPlayer) || (ignorePlayersInBGRaid && player->GetGroup() != this)) + Player const* player = itr.GetSource(); + if ((!ignoredPlayer.IsEmpty() && player->GetGUID() == ignoredPlayer) || (ignorePlayersInBGRaid && player->GetGroup() != this)) continue; - if (group == -1 || itr->getSubGroup() == group) + if (group == -1 || itr.getSubGroup() == group) player->SendDirectMessage(packet); } } @@ -1211,11 +1207,13 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(BattlegroundTemplate return ERR_BATTLEGROUND_NONE; // ERR_GROUP_JOIN_BATTLEGROUND_TOO_MANY handled on client side // get a player as reference, to compare other players' stats to (arena team id, queue id based on level, etc.) - Player* reference = ASSERT_NOTNULL(GetFirstMember())->GetSource(); + auto membersIterator = GetMembers().begin(); + auto membersEnd = GetMembers().end(); // no reference found, can't join this way - if (!reference) + if (membersIterator == membersEnd) return ERR_BATTLEGROUND_JOIN_FAILED; + Player* reference = membersIterator->GetSource(); PVPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bgOrTemplate->MapIDs.front(), reference->GetLevel()); if (!bracketEntry) return ERR_BATTLEGROUND_JOIN_FAILED; @@ -1226,9 +1224,9 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(BattlegroundTemplate // check every member of the group to be able to join memberscount = 0; - for (GroupReference const* itr = GetFirstMember(); itr != nullptr; itr = itr->next(), ++memberscount) + for (; membersIterator != membersEnd; ++membersIterator) { - Player* member = itr->GetSource(); + Player* member = membersIterator->GetSource(); // offline member? don't let join if (!member) return ERR_BATTLEGROUND_JOIN_FAILED; @@ -1295,12 +1293,9 @@ void Group::SetDungeonDifficultyID(Difficulty difficulty) CharacterDatabase.Execute(stmt); } - for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : GetMembers()) { - Player* player = itr->GetSource(); - if (!player->GetSession()) - continue; - + Player* player = itr.GetSource(); player->SetDungeonDifficultyID(difficulty); player->SendDungeonDifficulty(); } @@ -1319,12 +1314,9 @@ void Group::SetRaidDifficultyID(Difficulty difficulty) CharacterDatabase.Execute(stmt); } - for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : GetMembers()) { - Player* player = itr->GetSource(); - if (!player->GetSession()) - continue; - + Player* player = itr.GetSource(); player->SetRaidDifficultyID(difficulty); player->SendRaidDifficulty(false); } @@ -1343,12 +1335,9 @@ void Group::SetLegacyRaidDifficultyID(Difficulty difficulty) CharacterDatabase.Execute(stmt); } - for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : GetMembers()) { - Player* player = itr->GetSource(); - if (!player->GetSession()) - continue; - + Player* player = itr.GetSource(); player->SetLegacyRaidDifficultyID(difficulty); player->SendRaidDifficulty(true); } @@ -1805,17 +1794,9 @@ void Group::LinkMember(GroupReference* pRef) void Group::DelinkMember(ObjectGuid guid) { - GroupReference* ref = m_memberMgr.getFirst(); - while (ref) - { - GroupReference* nextRef = ref->next(); - if (ref->GetSource()->GetGUID() == guid) - { - ref->unlink(); - break; - } - ref = nextRef; - } + auto itr = std::ranges::find(m_memberMgr, guid, [](GroupReference const& ref) { return ref.GetSource()->GetGUID(); }); + if (itr != m_memberMgr.end()) + itr->unlink(); } void Group::_initRaidSubGroupsCounter() diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h index 0f780f127dc..e3d2930b8a1 100644 --- a/src/server/game/Groups/Group.h +++ b/src/server/game/Groups/Group.h @@ -329,9 +329,9 @@ class TC_GAME_API Group bool SameSubGroup(Player const* member1, Player const* member2) const; bool HasFreeSlotSubGroup(uint8 subgroup) const; + GroupRefManager& GetMembers() { return m_memberMgr; } + GroupRefManager const& GetMembers() const { return m_memberMgr; } MemberSlotList const& GetMemberSlots() const { return m_memberSlots; } - GroupReference* GetFirstMember() { return m_memberMgr.getFirst(); } - GroupReference const* GetFirstMember() const { return m_memberMgr.getFirst(); } uint32 GetMembersCount() const { return uint32(m_memberSlots.size()); } uint32 GetInviteeCount() const { return m_invitees.size(); } GroupFlags GetGroupFlags() const { return m_groupFlags; } @@ -371,8 +371,8 @@ class TC_GAME_API Group template<class Worker> void BroadcastWorker(Worker const& worker) const { - for (GroupReference const* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) - worker(itr->GetSource()); + for (GroupReference const& itr : GetMembers()) + worker(itr.GetSource()); } void BroadcastPacket(WorldPacket const* packet, bool ignorePlayersInBGRaid, int group = -1, ObjectGuid ignoredPlayer = ObjectGuid::Empty) const; diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index a04564c5a41..cad7634d64a 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -224,12 +224,9 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId()); } - for (GroupReference const* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : grp->GetMembers()) { - Player* member = itr->GetSource(); - if (!member) - continue; // this should never happen - + Player* member = itr.GetSource(); if (err) { WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; @@ -578,12 +575,9 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::Battl avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId()); } - for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : grp->GetMembers()) { - Player* member = itr->GetSource(); - if (!member) - continue; - + Player* member = itr.GetSource(); if (err) { WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index daa0e086981..617850957a9 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -720,9 +720,9 @@ void WorldSession::HandleSendPingUnit(WorldPackets::Party::SendPingUnit const& p broadcastPingUnit.SpellOverrideNameID = pingUnit.SpellOverrideNameID; broadcastPingUnit.Write(); - for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : group->GetMembers()) { - Player const* member = itr->GetSource(); + Player const* member = itr.GetSource(); if (_player == member || !_player->IsInMap(member)) continue; @@ -749,9 +749,9 @@ void WorldSession::HandleSendPingWorldPoint(WorldPackets::Party::SendPingWorldPo broadcastPingWorldPoint.PingDuration = pingWorldPoint.PingDuration; broadcastPingWorldPoint.Write(); - for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : group->GetMembers()) { - Player const* member = itr->GetSource(); + Player const* member = itr.GetSource(); if (_player == member || !_player->IsInMap(member)) continue; diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp index 5abec45cbf8..3e4030a5691 100644 --- a/src/server/game/Handlers/LFGHandler.cpp +++ b/src/server/game/Handlers/LFGHandler.cpp @@ -209,12 +209,9 @@ void WorldSession::SendLfgPartyLockInfo() WorldPackets::LFG::LfgPartyInfo lfgPartyInfo; // Get the locked dungeons of the other party members - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : group->GetMembers()) { - Player* plrg = itr->GetSource(); - if (!plrg) - continue; - + Player* plrg = itr.GetSource(); ObjectGuid pguid = plrg->GetGUID(); if (pguid == guid) continue; diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index e73fe2a5203..695caeb7282 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -155,12 +155,9 @@ void WorldSession::HandleLootMoneyOpcode(WorldPackets::Loot::LootMoney& /*packet Group* group = player->GetGroup(); std::vector<Player*> playersNear; - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : group->GetMembers()) { - Player* member = itr->GetSource(); - if (!member) - continue; - + Player* member = itr.GetSource(); if (!loot->HasAllowedLooter(member->GetGUID())) continue; diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index d86bbf17cb1..085ec2e1ff9 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -152,11 +152,11 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG { if (Group* group = _player->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(); - if (!player || player == _player || !player->IsInMap(_player)) // not self and in same map + if (player == _player || !player->IsInMap(_player)) // not self and in same map continue; if (player->CanTakeQuest(quest, true)) @@ -595,11 +595,11 @@ void WorldSession::HandlePushQuestToParty(WorldPackets::Quest::PushQuestToParty& return; } - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : group->GetMembers()) { - Player* receiver = itr->GetSource(); + Player* receiver = itr.GetSource(); - if (!receiver || receiver == sender) + if (receiver == sender) continue; if (!receiver->GetPlayerSharingQuest().IsEmpty()) diff --git a/src/server/game/Loot/Loot.cpp b/src/server/game/Loot/Loot.cpp index f8990384b26..d2c22a93373 100644 --- a/src/server/game/Loot/Loot.cpp +++ b/src/server/game/Loot/Loot.cpp @@ -884,10 +884,12 @@ bool Loot::FillLoot(uint32 lootId, LootStore const& store, Player* lootOwner, bo if (loot_type == LOOT_CORPSE) roundRobinPlayer = lootOwner->GetGUID(); - for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) - if (Player* player = itr->GetSource()) // should actually be looted object instead of lootOwner but looter has to be really close so doesnt really matter - if (player->IsAtGroupRewardDistance(lootOwner)) - FillNotNormalLootFor(player); + for (GroupReference const& itr : group->GetMembers()) + { + Player* member = itr.GetSource(); // should actually be looted object instead of lootOwner but looter has to be really close so doesnt really matter + if (member->IsAtGroupRewardDistance(lootOwner)) + FillNotNormalLootFor(member); + } for (LootItem& item : items) { diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 2382850e9f8..290bd2f73f9 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -135,7 +135,7 @@ void Map::DeleteStateMachine() Map::Map(uint32 id, time_t expiry, uint32 InstanceId, Difficulty SpawnMode) : _creatureToMoveLock(false), _gameObjectsToMoveLock(false), _dynamicObjectsToMoveLock(false), _areaTriggersToMoveLock(false), i_mapEntry(sMapStore.LookupEntry(id)), i_spawnMode(SpawnMode), i_InstanceId(InstanceId), -m_unloadTimer(0), m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE), +m_unloadTimer(0), m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE), m_mapRefIter(m_mapRefManager.end()), m_VisibilityNotifyPeriod(DEFAULT_VISIBILITY_NOTIFY_PERIOD), m_activeNonPlayersIter(m_activeNonPlayers.end()), _transportsUpdateIter(_transports.end()), i_gridExpiry(expiry), m_terrain(sTerrainMgr.LoadTerrain(id)), m_forceEnabledNavMeshFilterFlags(0), m_forceDisabledNavMeshFilterFlags(0), diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp index 0379f8b15e5..b6db2c304b3 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp @@ -97,12 +97,9 @@ void OutdoorPvP::HandleKill(Player* killer, Unit* killed) { if (Group* group = killer->GetGroup()) { - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : group->GetMembers()) { - Player* groupGuy = itr->GetSource(); - - if (!groupGuy) - continue; + Player* groupGuy = itr.GetSource(); // skip if too far away if (!groupGuy->IsAtGroupRewardDistance(killed)) diff --git a/src/server/scripts/Commands/cs_group.cpp b/src/server/scripts/Commands/cs_group.cpp index 24e412e0c93..83471c9716a 100644 --- a/src/server/scripts/Commands/cs_group.cpp +++ b/src/server/scripts/Commands/cs_group.cpp @@ -92,27 +92,24 @@ public: if (!groupTarget) return false; - for (GroupReference* it = groupTarget->GetFirstMember(); it != nullptr; it = it->next()) + for (GroupReference const& it : groupTarget->GetMembers()) { - target = it->GetSource(); - if (target) - { - uint8 oldlevel = static_cast<uint8>(target->GetLevel()); + target = it.GetSource(); + uint8 oldlevel = static_cast<uint8>(target->GetLevel()); - if (level != oldlevel) - { - target->SetLevel(static_cast<uint8>(level)); - target->InitTalentForLevel(); - target->SetXP(0); - } + if (level != oldlevel) + { + target->SetLevel(static_cast<uint8>(level)); + target->InitTalentForLevel(); + target->SetXP(0); + } - if (handler->needReportToTarget(target)) - { - if (oldlevel < static_cast<uint8>(level)) - ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_LEVEL_UP, handler->GetNameLink().c_str(), level); - else // if (oldlevel > newlevel) - ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_LEVEL_DOWN, handler->GetNameLink().c_str(), level); - } + if (handler->needReportToTarget(target)) + { + if (oldlevel < static_cast<uint8>(level)) + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_LEVEL_UP, handler->GetNameLink().c_str(), level); + else // if (oldlevel > newlevel) + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_LEVEL_DOWN, handler->GetNameLink().c_str(), level); } } return true; @@ -128,15 +125,12 @@ public: if (!groupTarget) return false; - for (GroupReference* it = groupTarget->GetFirstMember(); it != nullptr; it = it->next()) + for (GroupReference const& it : groupTarget->GetMembers()) { - Player* target = it->GetSource(); - if (target) - { - target->ResurrectPlayer(target->GetSession()->HasPermission(rbac::RBAC_PERM_RESURRECT_WITH_FULL_HPS) ? 1.0f : 0.5f); - target->SpawnCorpseBones(); - target->SaveToDB(); - } + Player* target = it.GetSource(); + target->ResurrectPlayer(target->GetSession()->HasPermission(rbac::RBAC_PERM_RESURRECT_WITH_FULL_HPS) ? 1.0f : 0.5f); + target->SpawnCorpseBones(); + target->SaveToDB(); } return true; @@ -153,14 +147,8 @@ public: if (!groupTarget) return false; - for (GroupReference* it = groupTarget->GetFirstMember(); it != nullptr; it = it->next()) - { - Player* target = it->GetSource(); - if (target) - { - target->DurabilityRepairAll(false, 0, false); - } - } + for (GroupReference const& it : groupTarget->GetMembers()) + it.GetSource()->DurabilityRepairAll(false, 0, false); return true; } @@ -204,11 +192,11 @@ public: } } - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : group->GetMembers()) { - Player* player = itr->GetSource(); + Player* player = itr.GetSource(); - if (!player || player == gmPlayer || !player->GetSession()) + if (player == gmPlayer) continue; // check online security diff --git a/src/server/scripts/Commands/cs_tele.cpp b/src/server/scripts/Commands/cs_tele.cpp index 0e1b2178bac..48866791fcb 100644 --- a/src/server/scripts/Commands/cs_tele.cpp +++ b/src/server/scripts/Commands/cs_tele.cpp @@ -249,12 +249,9 @@ public: return false; } - for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : grp->GetMembers()) { - Player* player = itr->GetSource(); - - if (!player || !player->GetSession()) - continue; + Player* player = itr.GetSource(); // check online security if (handler->HasLowerSecurity(player, ObjectGuid::Empty)) diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp index 920d2f1d0b2..43bd93489d4 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp @@ -67,10 +67,10 @@ class go_gauntlet_gate : public GameObjectScript if (Group* group = player->GetGroup()) { - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : group->GetMembers()) { - Player* pGroupie = itr->GetSource(); - if (!pGroupie || !pGroupie->IsInMap(player)) + Player* pGroupie = itr.GetSource(); + if (!pGroupie->IsInMap(player)) continue; if (pGroupie->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE && diff --git a/src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp b/src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp index 06098172780..e369cef4dac 100644 --- a/src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp @@ -44,10 +44,12 @@ class spell_razelikh_teleport_group : public SpellScript { if (Group* group = player->GetGroup()) { - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) - if (Player* member = itr->GetSource()) - if (member->IsWithinDistInMap(player, 20.0f) && !member->isDead()) - member->CastSpell(member, SPELL_TELEPORT_SINGLE_IN_GROUP, true); + for (GroupReference const& itr : group->GetMembers()) + { + Player* member = itr.GetSource(); + if (member->IsWithinDistInMap(player, 20.0f) && !member->isDead()) + member->CastSpell(member, SPELL_TELEPORT_SINGLE_IN_GROUP, true); + } } else player->CastSpell(player, SPELL_TELEPORT_SINGLE, true); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index b28d92a4175..7ac91ae5cf8 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -379,10 +379,9 @@ struct boss_lady_deathwhisper : public BossAI { if (Group* group = owner->GetGroup()) { - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) - if (Player* member = itr->GetSource()) - if (member->IsInMap(owner)) - member->KilledMonsterCredit(NPC_DARNAVAN_CREDIT); + for (GroupReference const& itr : group->GetMembers()) + if (itr.GetSource()->IsInMap(owner)) + itr.GetSource()->KilledMonsterCredit(NPC_DARNAVAN_CREDIT); } else owner->KilledMonsterCredit(NPC_DARNAVAN_CREDIT); @@ -854,10 +853,9 @@ struct npc_darnavan : public ScriptedAI { if (Group* group = owner->GetGroup()) { - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) - if (Player* member = itr->GetSource()) - if (member->IsInMap(owner)) - member->FailQuest(QUEST_DEPROGRAMMING); + for (GroupReference const& itr : group->GetMembers()) + if (itr.GetSource()->IsInMap(owner)) + itr.GetSource()->FailQuest(QUEST_DEPROGRAMMING); } else owner->FailQuest(QUEST_DEPROGRAMMING); diff --git a/src/server/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp index d17045509d5..6a5224a60de 100644 --- a/src/server/scripts/Outland/zone_terokkar_forest.cpp +++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp @@ -91,12 +91,12 @@ public: if (Player* player = done_by->ToPlayer()) { - if (Group* group = player->GetGroup()) + if (Group const* group = player->GetGroup()) { - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const& itr : group->GetMembers()) { - Player* groupie = itr->GetSource(); - if (groupie && groupie->IsInMap(player) && + Player* groupie = itr.GetSource(); + if (groupie->IsInMap(player) && groupie->GetQuestStatus(QUEST_DONTKILLTHEFATONE) == QUEST_STATUS_INCOMPLETE && groupie->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, NPC_BOULDERFIST_INVADER) == REQUIRED_KILL_COUNT) { |