diff options
author | QAston <qaston@gmail.com> | 2011-05-29 15:46:14 +0200 |
---|---|---|
committer | QAston <qaston@gmail.com> | 2011-05-29 15:49:32 +0200 |
commit | 3c93cccdb11f40629d93c604d1b040d4f14144b0 (patch) | |
tree | 3665d85ea913930c1a0a5fd7714ef6360237c281 /src | |
parent | ab15d2526f2a55086eb8e502b9e5499246b060b3 (diff) |
Core/Auras: Prevent assertion fail due code in AuraEffect::HandleAuraLinked, also improve the sync between auras linked by this aura type.
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 39 | ||||
-rwxr-xr-x | src/server/game/Spells/SpellMgr.cpp | 11 | ||||
-rwxr-xr-x | src/server/game/Spells/SpellMgr.h | 1 |
3 files changed, 36 insertions, 15 deletions
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index be2c4cf3273..f17deb515b1 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -6554,25 +6554,38 @@ void AuraEffect::HandleAuraConvertRune(AuraApplication const * aurApp, uint8 mod void AuraEffect::HandleAuraLinked(AuraApplication const * aurApp, uint8 mode, bool apply) const { - if (!(mode & (AURA_EFFECT_HANDLE_REAL | AURA_EFFECT_HANDLE_REAPPLY))) - return; - Unit * target = aurApp->GetTarget(); - if (apply) + uint32 triggeredSpellId = m_spellProto->EffectTriggerSpell[m_effIndex]; + + if (mode & AURA_EFFECT_HANDLE_REAL) { - Unit * caster = GetTriggeredSpellCaster(m_spellProto, GetCaster(), target); + if (apply) + { + Unit * caster = GetTriggeredSpellCaster(m_spellProto, GetCaster(), target); - if (!caster) - return; - // If amount avalible cast with basepoints (Crypt Fever for example) - if (GetAmount()) - caster->CastCustomSpell(target, m_spellProto->EffectTriggerSpell[m_effIndex], &m_amount, NULL, NULL, true, NULL, this); + if (!caster) + return; + // If amount avalible cast with basepoints (Crypt Fever for example) + if (GetAmount()) + caster->CastCustomSpell(target, triggeredSpellId, &m_amount, NULL, NULL, true, NULL, this); + else + caster->CastSpell(target, triggeredSpellId, true, NULL, this); + } else - caster->CastSpell(target, m_spellProto->EffectTriggerSpell[m_effIndex], true, NULL, this); + { + uint64 casterGUID = IsSpellRequiringFocusedTarget(GetSpellProto()) ? GetCasterGUID() : target->GetGUID(); + target->RemoveAura(triggeredSpellId, casterGUID, 0, aurApp->GetRemoveMode()); + } + } + else if (mode & AURA_EFFECT_HANDLE_REAPPLY && apply) + { + uint64 casterGUID = IsSpellRequiringFocusedTarget(GetSpellProto()) ? GetCasterGUID() : target->GetGUID(); + + // change the stack amount to be equal to stack amount of our aura + if (Aura* triggeredAura = target->GetAura(triggeredSpellId, casterGUID)) + triggeredAura->ModStackAmount(GetBase()->GetStackAmount() - triggeredAura->GetStackAmount()); } - else - target->RemoveAura(m_spellProto->EffectTriggerSpell[m_effIndex], GetCasterGUID(), 0, AuraRemoveMode(aurApp->GetRemoveMode())); } void AuraEffect::HandleAuraOpenStable(AuraApplication const * aurApp, uint8 mode, bool apply) const diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index c852e2d133c..9c64c292a6e 100755 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -427,7 +427,7 @@ uint32 CalculatePowerCost(SpellEntry const * spellInfo, Unit const * caster, Spe return powerCost; } -Unit* GetTriggeredSpellCaster(SpellEntry const * spellInfo, Unit * caster, Unit * target) +bool IsSpellRequiringFocusedTarget(SpellEntry const * spellInfo) { for (uint8 i = 0 ; i < MAX_SPELL_EFFECTS; ++i) { @@ -437,8 +437,15 @@ Unit* GetTriggeredSpellCaster(SpellEntry const * spellInfo, Unit * caster, Unit || SpellTargetType[spellInfo->EffectImplicitTargetB[i]] == TARGET_TYPE_CHANNEL || SpellTargetType[spellInfo->EffectImplicitTargetA[i]] == TARGET_TYPE_DEST_TARGET || SpellTargetType[spellInfo->EffectImplicitTargetB[i]] == TARGET_TYPE_DEST_TARGET) - return caster; + return true; } + +} + +Unit* GetTriggeredSpellCaster(SpellEntry const * spellInfo, Unit * caster, Unit * target) +{ + if (IsSpellRequiringFocusedTarget(spellInfo)) + return caster; return target; } diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index 1560cf43430..e423461c987 100755 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -173,6 +173,7 @@ enum SpellLinkedType SPELL_LINK_REMOVE = 0, }; +bool IsSpellRequiringFocusedTarget(SpellEntry const * spellInfo); Unit * GetTriggeredSpellCaster(SpellEntry const * spellInfo, Unit * caster, Unit * target); SpellSpecific GetSpellSpecific(SpellEntry const * spellInfo); AuraState GetSpellAuraState(SpellEntry const * spellInfo); |