diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-03-04 00:05:35 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-03-04 00:05:35 +0100 |
commit | 1369b8708458fb5020b6ab7a9608123459d4eb26 (patch) | |
tree | 005298c2db7f1b5067f8e1746f74541cf1b9c9d8 /src/server/game/Combat/CombatManager.cpp | |
parent | 74ec1d3cfb3172a7bb3c2d2317396ff82245418e (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.cpp | 35 |
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) |