aboutsummaryrefslogtreecommitdiff
path: root/src/server
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
parentae197a62b77cd93799571b16756c372081704929 (diff)
Core/Groups: Use iterators instead of raw LinkedListElement to interact with group members
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/AI/CoreAI/PetAI.cpp6
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp14
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp19
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp8
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp7
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp7
-rw-r--r--src/server/game/Achievements/CriteriaHandler.cpp24
-rw-r--r--src/server/game/Battlegrounds/BattlegroundQueue.cpp6
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp67
-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
-rw-r--r--src/server/game/Groups/Group.cpp109
-rw-r--r--src/server/game/Groups/Group.h8
-rw-r--r--src/server/game/Handlers/BattleGroundHandler.cpp14
-rw-r--r--src/server/game/Handlers/GroupHandler.cpp8
-rw-r--r--src/server/game/Handlers/LFGHandler.cpp7
-rw-r--r--src/server/game/Handlers/LootHandler.cpp7
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp12
-rw-r--r--src/server/game/Loot/Loot.cpp10
-rw-r--r--src/server/game/Maps/Map.cpp2
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvP.cpp7
-rw-r--r--src/server/scripts/Commands/cs_group.cpp62
-rw-r--r--src/server/scripts/Commands/cs_tele.cpp7
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp10
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp14
-rw-r--r--src/server/scripts/Outland/zone_terokkar_forest.cpp8
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)
{