diff options
Diffstat (limited to 'src/game/Unit.cpp')
-rw-r--r-- | src/game/Unit.cpp | 34 |
1 files changed, 12 insertions, 22 deletions
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 2a958411f58..7e64c9617d9 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -3864,7 +3864,7 @@ bool Unit::AddAura(Aura *Aur) } // update single target auras list (before aura add to aura list, to prevent unexpected remove recently added aura) - if (IsSingleTargetSpell(aurSpellInfo) && Aur->GetTarget()) + if (Aur->IsSingleTarget() && Aur->GetTarget()) { // caster pointer can be deleted in time aura remove, find it by guid at each iteration for(;;) @@ -4231,10 +4231,9 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit if (aur->GetId() == spellId && aur->GetCasterGUID() == casterGUID) { int32 basePoints = aur->GetBasePoints(); - // construct the new aura for the attacker - Aura * new_aur = CreateAura(aur->GetSpellProto(), aur->GetEffIndex(), NULL/*&basePoints*/, stealer); - if(!new_aur) - continue; + // construct the new aura for the attacker - will never return NULL, it's just a wrapper for + // some different constructors + Aura * new_aur = CreateAura(aur->GetSpellProto(), aur->GetEffIndex(), NULL, stealer, this); // set its duration and maximum duration // max duration 2 minutes (in msecs) @@ -4243,6 +4242,12 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit new_aur->SetAuraMaxDuration( max_dur > dur ? dur : max_dur ); new_aur->SetAuraDuration( max_dur > dur ? dur : max_dur ); + // Unregister _before_ adding to stealer + aur->UnregisterSingleCastAura(); + + // strange but intended behaviour: Stolen single target auras won't be treated as single targeted + new_aur->SetIsSingleTarget(false); + // add the new aura to stealer stealer->AddAura(new_aur); @@ -4352,21 +4357,7 @@ void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode) m_Auras.erase(i); ++m_removedAuras; // internal count used by unit update - Unit* caster = NULL; - if (IsSingleTargetSpell(AurSpellInfo)) - { - caster = Aur->GetCaster(); - if(caster) - { - AuraList& scAuras = caster->GetSingleCastAuras(); - scAuras.remove(Aur); - } - else - { - sLog.outError("Couldn't find the caster of the single target aura, may crash later!"); - assert(false); - } - } + Aur->UnregisterSingleCastAura(); // remove from list before mods removing (prevent cyclic calls, mods added before including to aura list - use reverse order) if (Aur->GetModifier()->m_auraname < TOTAL_AURAS) @@ -4395,8 +4386,7 @@ void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode) bool channeled = false; if(Aur->GetAuraDuration() && !Aur->IsPersistent() && IsChanneledSpell(AurSpellInfo)) { - if(!caster) // can be already located for IsSingleTargetSpell case - caster = Aur->GetCaster(); + Unit* caster = Aur->GetCaster(); if(caster && caster->isAlive()) { |