diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Spells/spell_mage.cpp | 162 |
1 files changed, 106 insertions, 56 deletions
diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 049bf3772b6..3b7c8332385 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -59,11 +59,10 @@ enum MageSpells SPELL_MAGE_TEMPORAL_DISPLACEMENT = 80354, SPELL_MAGE_WORGEN_FORM = 32819, SPELL_PET_NETHERWINDS_FATIGUED = 160455, - SPELL_MAGE_ICE_LANCE = 30455, SPELL_MAGE_ICE_LANCE_TRIGGER = 228598, SPELL_MAGE_THERMAL_VOID = 155149, SPELL_MAGE_ICY_VEINS = 12472, - SPELL_MAGE_SPLITTING_ICE = 56377, + SPELL_MAGE_CHAIN_REACTION_DUMMY = 278309, SPELL_MAGE_CHAIN_REACTION = 278310, }; @@ -277,6 +276,28 @@ class spell_mage_conjure_refreshment : public SpellScript } }; +// 44544 - Fingers of Frost +class spell_mage_fingers_of_frost : public AuraScript +{ + PrepareAuraScript(spell_mage_fingers_of_frost); + + void SuppressWarning(AuraEffect const* /*aurEff*/, ProcEventInfo& /*procInfo*/) + { + PreventDefaultAction(); + } + + void DropFingersOfFrost(ProcEventInfo& /*eventInfo*/) + { + GetAura()->ModStackAmount(-1); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_mage_fingers_of_frost::SuppressWarning, EFFECT_1, SPELL_AURA_DUMMY); + AfterProc += AuraProcFn(spell_mage_fingers_of_frost::DropFingersOfFrost); + } +}; + // 11426 - Ice Barrier class spell_mage_ice_barrier : public AuraScript { @@ -313,6 +334,86 @@ class spell_mage_ice_barrier : public AuraScript } }; +// Ice Lance - 30455 +class spell_mage_ice_lance : public SpellScript +{ + PrepareSpellScript(spell_mage_ice_lance); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo + ({ + SPELL_MAGE_ICE_LANCE_TRIGGER, + SPELL_MAGE_THERMAL_VOID, + SPELL_MAGE_ICY_VEINS, + SPELL_MAGE_CHAIN_REACTION_DUMMY, + SPELL_MAGE_CHAIN_REACTION, + SPELL_MAGE_FINGERS_OF_FROST + }); + } + + void IndexTarget(SpellEffIndex /*effIndex*/) + { + _orderedTargets.push_back(GetHitUnit()->GetGUID()); + } + + void HandleOnHit(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + Unit* target = GetHitUnit(); + + std::ptrdiff_t index = std::distance(_orderedTargets.begin(), std::find(_orderedTargets.begin(), _orderedTargets.end(), target->GetGUID())); + + if (index == 0 // only primary target triggers these benefits + && target->HasAuraState(AURA_STATE_FROZEN, GetSpellInfo(), caster)) + { + // Thermal Void + if (Aura const* thermalVoid = caster->GetAura(SPELL_MAGE_THERMAL_VOID)) + if (SpellEffectInfo const* thermalVoidEffect = thermalVoid->GetSpellInfo()->GetEffect(EFFECT_0)) + if (Aura* icyVeins = caster->GetAura(SPELL_MAGE_ICY_VEINS)) + icyVeins->SetDuration(icyVeins->GetDuration() + thermalVoidEffect->CalcValue(caster) * IN_MILLISECONDS); + + // Chain Reaction + if (caster->HasAura(SPELL_MAGE_CHAIN_REACTION_DUMMY)) + caster->CastSpell(caster, SPELL_MAGE_CHAIN_REACTION, true); + } + + // put target index for chain value multiplier into EFFECT_1 base points, otherwise triggered spell doesn't know which damage multiplier to apply + caster->CastCustomSpell(SPELL_MAGE_ICE_LANCE_TRIGGER, SPELLVALUE_BASE_POINT1, index, target, true); + } + + void Register() override + { + OnEffectLaunchTarget += SpellEffectFn(spell_mage_ice_lance::IndexTarget, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_mage_ice_lance::HandleOnHit, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + + std::vector<ObjectGuid> _orderedTargets; +}; + +// 228598 - Ice Lance +class spell_mage_ice_lance_damage : public SpellScript +{ + PrepareSpellScript(spell_mage_ice_lance_damage); + + void ApplyDamageMultiplier(SpellEffIndex /*effIndex*/) + { + SpellValue const* spellValue = GetSpellValue(); + if (spellValue->CustomBasePointsMask & (1 << EFFECT_1)) + { + int32 originalDamage = GetHitDamage(); + float targetIndex = float(spellValue->EffectBasePoints[EFFECT_1]); + float multiplier = std::pow(GetEffectInfo()->CalcDamageMultiplier(GetCaster(), GetSpell()), targetIndex); + SetHitDamage(int32(originalDamage * multiplier)); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_mage_ice_lance_damage::ApplyDamageMultiplier, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } +}; + // 12846 - Ignite class spell_mage_ignite : public AuraScript { @@ -701,59 +802,6 @@ class spell_mage_water_elemental_freeze : public SpellScript } }; -// Ice Lance - 30455 -class spell_mage_ice_lance : public SpellScript -{ - PrepareSpellScript(spell_mage_ice_lance); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ - SPELL_MAGE_ICE_LANCE, - SPELL_MAGE_ICE_LANCE_TRIGGER - }); - } - - void HandleOnHit(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - Unit* target = GetHitUnit(); - - bool targetFrozen = target->HasAuraState(AURA_STATE_FROZEN, GetSpellInfo(), caster); - - // Thermal Void - if (caster->HasAura(SPELL_MAGE_THERMAL_VOID) && targetFrozen) - { - if (Aura* icyVeins = caster->GetAura(SPELL_MAGE_ICY_VEINS)) - { - if (SpellInfo const* thermalVoidInfo = sSpellMgr->GetSpellInfo(SPELL_MAGE_THERMAL_VOID, GetCastDifficulty())) - { - if (SpellEffectInfo const* eff0 = thermalVoidInfo->GetEffect(EFFECT_0)) - { - int32 increaseDuration = eff0->CalcValue() * IN_MILLISECONDS; - int32 newDuration = (icyVeins->GetDuration() + increaseDuration); - icyVeins->SetDuration(newDuration); - } - } - } - } - - caster->CastSpell(target, SPELL_MAGE_ICE_LANCE_TRIGGER, true); // TODO damage x3 on frozen target - - // Chain Reaction - if (targetFrozen) - caster->CastSpell(caster, SPELL_MAGE_CHAIN_REACTION, true); - - if (Aura* fingersOfFrost = caster->GetAura(SPELL_MAGE_FINGERS_OF_FROST)) - fingersOfFrost->ModStackAmount(-1); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_mage_ice_lance::HandleOnHit, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } -}; - void AddSC_mage_spell_scripts() { RegisterAuraScript(spell_mage_blazing_barrier); @@ -762,7 +810,10 @@ void AddSC_mage_spell_scripts() RegisterSpellScript(spell_mage_cold_snap); RegisterSpellScript(spell_mage_cone_of_cold); RegisterSpellScript(spell_mage_conjure_refreshment); + RegisterAuraScript(spell_mage_fingers_of_frost); RegisterAuraScript(spell_mage_ice_barrier); + RegisterSpellScript(spell_mage_ice_lance); + RegisterSpellScript(spell_mage_ice_lance_damage); RegisterAuraScript(spell_mage_ignite); RegisterAuraScript(spell_mage_imp_mana_gems); RegisterSpellScript(spell_mage_living_bomb); @@ -775,5 +826,4 @@ void AddSC_mage_spell_scripts() RegisterSpellScript(spell_mage_time_warp); RegisterSpellScript(spell_mage_trigger_chilled); RegisterSpellScript(spell_mage_water_elemental_freeze); - RegisterSpellScript(spell_mage_ice_lance); } |