aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Combat/CombatManager.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-03-04 00:05:35 +0100
committerShauren <shauren.trinity@gmail.com>2024-03-04 00:05:35 +0100
commit1369b8708458fb5020b6ab7a9608123459d4eb26 (patch)
tree005298c2db7f1b5067f8e1746f74541cf1b9c9d8 /src/server/game/Combat/CombatManager.cpp
parent74ec1d3cfb3172a7bb3c2d2317396ff82245418e (diff)
Core/Creatures: Implemented CREATURE_STATIC_FLAG_2_IGNORE_SANCTUARY (ignore SPELL_EFFECT_SANCTUARY, used by Vanish)
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)