aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Combat/CombatManager.cpp29
-rw-r--r--src/server/game/Combat/CombatManager.h1
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp1
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)