aboutsummaryrefslogtreecommitdiff
path: root/src/game/Unit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/Unit.cpp')
-rw-r--r--src/game/Unit.cpp34
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())
{