aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorQAston <qaston@gmail.com>2011-05-29 15:46:14 +0200
committerQAston <qaston@gmail.com>2011-05-29 15:49:32 +0200
commit3c93cccdb11f40629d93c604d1b040d4f14144b0 (patch)
tree3665d85ea913930c1a0a5fd7714ef6360237c281 /src
parentab15d2526f2a55086eb8e502b9e5499246b060b3 (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-xsrc/server/game/Spells/Auras/SpellAuraEffects.cpp39
-rwxr-xr-xsrc/server/game/Spells/SpellMgr.cpp11
-rwxr-xr-xsrc/server/game/Spells/SpellMgr.h1
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);