aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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)