fix(Core/Unit): avoid iterator invalidation in RemoveAllControlled (#25108)

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
sogladev 2026-03-18 03:47:28 +01:00 committed by GitHub
parent 72ac87626b
commit d222a9f99b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -8080,10 +8080,11 @@ void Unit::RemoveAllControlled(bool onDeath /*= false*/)
for (auto it = m_Controlled.begin(); it != m_Controlled.end();)
{
Unit* target = *it;
++it;
if (target->GetCharmerGUID() == GetGUID())
{
it = m_Controlled.erase(it);
m_Controlled.erase(target);
target->RemoveCharmAuras();
}
else if (target->GetOwnerGUID() == GetGUID() && target->IsSummon())
@ -8092,23 +8093,15 @@ void Unit::RemoveAllControlled(bool onDeath /*= false*/)
if (onDeath)
if (TempSummon* ts = target->ToTempSummon())
if (ts->m_Properties && ts->m_Properties->Type == SUMMON_TYPE_LIGHTWELL)
{
++it;
continue;
}
if (!(onDeath && !IsPlayer() && target->IsGuardian()))
{
target->ToTempSummon()->UnSummon();
it = m_Controlled.erase(it);
}
else
++it;
}
else
{
LOG_ERROR("entities.unit", "Unit {} is trying to release unit {} which is neither charmed nor owned by it", GetEntry(), target->GetEntry());
++it;
m_Controlled.erase(target);
}
}
}