Core/Combat: Fixed combat after remove charm (#27248)
https://github.com/TrinityCore/TrinityCore/pull/27038#issuecomment-958784361 # Conflicts: # src/server/game/Combat/CombatManager.h
This commit is contained in:
1 parent
34c2da7bd9
commit
336ed5ce54
3 files changed
+31
No files matched your search
@@ -295,6 +295,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())
|
||||
|
||||
@@ -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(); }
|
||||
|
||||
|
||||
@@ -12422,6 +12422,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();
|
||||
|
||||
|
||||
Reference in new issue
Block a user