From 272e954a70c1b90d5e4b47e30d7eadcb231d7468 Mon Sep 17 00:00:00 2001 From: QAston Date: Fri, 30 Jul 2010 03:07:34 +0200 Subject: *Lock on RemoveAllAuras till all auras and applications are removed with all linked events they may cause. *Add assertion after error log, just in case you've missed it. --HG-- branch : trunk --- src/server/game/Entities/Unit/Unit.cpp | 20 ++++++++++++-------- src/server/game/Spells/Spell.cpp | 1 + 2 files changed, 13 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 2394613d731..1c7f5468ada 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -4412,14 +4412,18 @@ void Unit::RemoveAreaAurasDueToLeaveWorld() void Unit::RemoveAllAuras() { - AuraApplicationMap::iterator aurAppIter; - for (aurAppIter = m_appliedAuras.begin(); aurAppIter != m_appliedAuras.end();) - _UnapplyAura(aurAppIter, AURA_REMOVE_BY_DEFAULT); - - AuraMap::iterator aurIter; - for (aurIter = m_ownedAuras.begin(); aurIter != m_ownedAuras.end();) - RemoveOwnedAura(aurIter); - + // this may be a dead loop if some events on aura remove will continiously apply aura on remove + // we want to have all auras removed, so use your brain when linking events + while (!m_appliedAuras.empty() || !m_ownedAuras.empty()) + { + AuraApplicationMap::iterator aurAppIter; + for (aurAppIter = m_appliedAuras.begin(); aurAppIter != m_appliedAuras.end();) + _UnapplyAura(aurAppIter, AURA_REMOVE_BY_DEFAULT); + + AuraMap::iterator aurIter; + for (aurIter = m_ownedAuras.begin(); aurIter != m_ownedAuras.end();) + RemoveOwnedAura(aurIter); + } } void Unit::RemoveArenaAuras(bool onleave) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 2ad41fc4610..068252316a0 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -6631,6 +6631,7 @@ SpellEvent::~SpellEvent() { sLog.outError("~SpellEvent: %s %u tried to delete non-deletable spell %u. Was not deleted, causes memory leak.", (m_Spell->GetCaster()->GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature"), m_Spell->GetCaster()->GetGUIDLow(), m_Spell->m_spellInfo->Id); + ASSERT(false); } } -- cgit v1.2.3