aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Combat/CombatManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Combat/CombatManager.cpp')
-rw-r--r--src/server/game/Combat/CombatManager.cpp35
1 files changed, 25 insertions, 10 deletions
diff --git a/src/server/game/Combat/CombatManager.cpp b/src/server/game/Combat/CombatManager.cpp
index 721b8d5c3f5..18e084f8e0d 100644
--- a/src/server/game/Combat/CombatManager.cpp
+++ b/src/server/game/Combat/CombatManager.cpp
@@ -295,22 +295,31 @@ void CombatManager::EndCombatBeyondRange(float range, bool includingPvP)
}
}
-void CombatManager::SuppressPvPCombat()
+void CombatManager::SuppressPvPCombat(UnitFilter* unitFilter /*= nullptr*/)
{
- for (auto const& pair : _pvpRefs)
- pair.second->Suppress(_owner);
+ for (auto const& [guid, combatRef] : _pvpRefs)
+ if (!unitFilter || unitFilter(combatRef->GetOther(_owner)))
+ combatRef->Suppress(_owner);
+
if (UpdateOwnerCombatState())
if (UnitAI* ownerAI = _owner->GetAI())
ownerAI->JustExitedCombat();
}
-void CombatManager::EndAllPvECombat()
+void CombatManager::EndAllPvECombat(UnitFilter* unitFilter /*= nullptr*/)
{
// cannot have threat without combat
- _owner->GetThreatManager().RemoveMeFromThreatLists();
+ _owner->GetThreatManager().RemoveMeFromThreatLists(unitFilter);
_owner->GetThreatManager().ClearAllThreat();
- while (!_pveRefs.empty())
- _pveRefs.begin()->second->EndCombat();
+
+ std::vector<CombatReference*> combatReferencesToRemove;
+ combatReferencesToRemove.reserve(_pveRefs.size());
+ for (auto const& [guid, combatRef] : _pveRefs)
+ if (!unitFilter || unitFilter(combatRef->GetOther(_owner)))
+ combatReferencesToRemove.push_back(combatRef);
+
+ for (CombatReference* combatRef : combatReferencesToRemove)
+ combatRef->EndCombat();
}
void CombatManager::RevalidateCombat()
@@ -342,10 +351,16 @@ void CombatManager::RevalidateCombat()
}
}
-void CombatManager::EndAllPvPCombat()
+void CombatManager::EndAllPvPCombat(UnitFilter* unitFilter /*= nullptr*/)
{
- while (!_pvpRefs.empty())
- _pvpRefs.begin()->second->EndCombat();
+ std::vector<CombatReference*> combatReferencesToRemove;
+ combatReferencesToRemove.reserve(_pvpRefs.size());
+ for (auto const& [guid, combatRef] : _pvpRefs)
+ if (!unitFilter || unitFilter(combatRef->GetOther(_owner)))
+ combatReferencesToRemove.push_back(combatRef);
+
+ for (CombatReference* combatRef : combatReferencesToRemove)
+ combatRef->EndCombat();
}
/*static*/ void CombatManager::NotifyAICombat(Unit* me, Unit* other)