aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorQAston <qaston@gmail.com>2011-05-31 15:30:41 +0200
committerQAston <qaston@gmail.com>2011-05-31 15:30:41 +0200
commitf3428cbad48262996f35c356f1016394fb7bd8c8 (patch)
tree612f59f2e09500fe75cb0263753b30899846707a /src
parent5254f3490b4a80d031b7d10072f102a198c9c0cf (diff)
Core/Auras: Fix a crash in Unit::RemoveAurasDueToSpellBySteal
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp32
1 files changed, 15 insertions, 17 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index b5411a661c4..7bf5021fcc5 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -3797,30 +3797,28 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit
newAura->SetCharges(maxCharges < newCharges ? maxCharges : newCharges);
}
else
- {
- uint8 newStacks = newAura->GetStackAmount() + 1;
- uint8 maxStacks = newAura->GetSpellProto()->StackAmount;
- newAura->SetStackAmount(maxStacks < newStacks ? maxStacks : newStacks);
- }
+ newAura->ModStackAmount(1);
newAura->SetDuration(dur);
}
else
{
- bool isSingleTarget = aura->IsSingleTarget() && caster;
- if (isSingleTarget)
+ // single target state must be removed before aura creation to preserve existing single target aura
+ if (aura->IsSingleTarget())
aura->UnregisterSingleTarget();
- newAura = Aura::TryCreate(aura->GetSpellProto(), effMask, stealer, NULL, &baseDamage[0], NULL, aura->GetCasterGUID());
- // strange but intended behaviour: Stolen single target auras won't be treated as single targeted
- if (newAura && isSingleTarget)
+
+ if (newAura = Aura::TryCreate(aura->GetSpellProto(), effMask, stealer, NULL, &baseDamage[0], NULL, aura->GetCasterGUID()))
{
- aura->SetIsSingleTarget(true);
- caster->GetSingleCastAuras().push_back(aura);
- newAura->UnregisterSingleTarget();
+ // created aura must not be single target aura,, so stealer won't loose it on recast
+ if (newAura->IsSingleTarget())
+ {
+ newAura->UnregisterSingleTarget();
+ // bring back single target aura status to the old aura
+ aura->SetIsSingleTarget(true);
+ caster->GetSingleCastAuras().push_back(aura);
+ }
+ newAura->SetLoadedState(dur, dur, stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]);
+ newAura->ApplyForTargets();
}
- if (!newAura)
- return;
- newAura->SetLoadedState(dur, dur, stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]);
- newAura->ApplyForTargets();
}
if (stealCharge)