diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Combat/CombatManager.cpp | 29 | ||||
-rw-r--r-- | src/server/game/Combat/CombatManager.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 1 |
3 files changed, 31 insertions, 0 deletions
diff --git a/src/server/game/Combat/CombatManager.cpp b/src/server/game/Combat/CombatManager.cpp index 7cbab16aa04..41ee2147113 100644 --- a/src/server/game/Combat/CombatManager.cpp +++ b/src/server/game/Combat/CombatManager.cpp @@ -294,6 +294,35 @@ void CombatManager::EndAllPvECombat() _pveRefs.begin()->second->EndCombat(); } +void CombatManager::RevalidateCombat() +{ + auto it = _pveRefs.begin(), end = _pveRefs.end(); + while (it != end) + { + CombatReference* const ref = it->second; + if (!CanBeginCombat(_owner, ref->GetOther(_owner))) + { + it = _pveRefs.erase(it), end = _pveRefs.end(); // erase manually here to avoid iterator invalidation + ref->EndCombat(); + } + else + ++it; + } + + auto it2 = _pvpRefs.begin(), end2 = _pvpRefs.end(); + while (it2 != end2) + { + CombatReference* const ref = it2->second; + if (!CanBeginCombat(_owner, ref->GetOther(_owner))) + { + it2 = _pvpRefs.erase(it2), end2 = _pvpRefs.end(); // erase manually here to avoid iterator invalidation + ref->EndCombat(); + } + else + ++it2; + } +} + void CombatManager::EndAllPvPCombat() { while (!_pvpRefs.empty()) diff --git a/src/server/game/Combat/CombatManager.h b/src/server/game/Combat/CombatManager.h index d945c44a412..6939062ee10 100644 --- a/src/server/game/Combat/CombatManager.h +++ b/src/server/game/Combat/CombatManager.h @@ -122,6 +122,7 @@ class TC_GAME_API CombatManager // flags any pvp refs for suppression on owner's side - these refs will not generate combat until refreshed void SuppressPvPCombat(); void EndAllPvECombat(); + void RevalidateCombat(); void EndAllPvPCombat(); void EndAllCombat() { EndAllPvECombat(); EndAllPvPCombat(); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d72bdd264d8..8d4e9c22ec7 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11240,6 +11240,7 @@ void Unit::RemoveCharmedBy(Unit* charmer) ASSERT(type != CHARM_TYPE_VEHICLE || (GetTypeId() == TYPEID_UNIT && IsVehicle())); charmer->SetCharm(this, false); + m_combatManager.RevalidateCombat(); Player* playerCharmer = charmer->ToPlayer(); if (playerCharmer) |