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:
parent
72ac87626b
commit
d222a9f99b
1 changed files with 3 additions and 10 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue