diff options
| -rw-r--r-- | sql/updates/world/master/2021_05_15_00_world_mage_spells.sql | 5 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 14 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 1 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_mage.cpp | 78 |
4 files changed, 97 insertions, 1 deletions
diff --git a/sql/updates/world/master/2021_05_15_00_world_mage_spells.sql b/sql/updates/world/master/2021_05_15_00_world_mage_spells.sql new file mode 100644 index 00000000000..e34c405eb06 --- /dev/null +++ b/sql/updates/world/master/2021_05_15_00_world_mage_spells.sql @@ -0,0 +1,5 @@ +-- Mage Spells +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_mage_arcane_barrage', 'spell_mage_arcane_explosion'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(44425, 'spell_mage_arcane_barrage'), +(1449, 'spell_mage_arcane_explosion'); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index a606cd14190..119e43ad525 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -8636,6 +8636,20 @@ int64 Unit::GetHealthGain(int64 dVal) return gain; } +// Always return negative value for power reduction (or 0) +int32 Unit::ConsumeAllPower(Powers power) +{ + int32 curPower = GetPower(power); + int32 minPower = GetMinPower(power); + + if (curPower <= minPower) + return 0; + + int32 diff = minPower - curPower; + SetPower(power, minPower); + return diff; +} + // returns negative amount on power reduction int32 Unit::ModifyPower(Powers power, int32 dVal, bool withPowerUpdate /*= true*/) { diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 5275677e2e8..ab339e8a816 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -940,6 +940,7 @@ class TC_GAME_API Unit : public WorldObject inline void SetFullPower(Powers power) { SetPower(power, GetMaxPower(power)); } // returns the change in power int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate = true); + int32 ConsumeAllPower(Powers power); void ApplyModManaCostMultiplier(float manaCostMultiplier, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ManaCostMultiplier), manaCostMultiplier, apply); } void ApplyModManaCostModifier(SpellSchools school, int32 mod, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ManaCostModifier, school), mod, apply); } diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 5a2f88df076..2b4e8265606 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -33,6 +33,7 @@ enum MageSpells { + SPELL_MAGE_ARCANE_BARRAGE_R3 = 321526, SPELL_MAGE_BLAZING_BARRIER_TRIGGER = 235314, SPELL_MAGE_CAUTERIZE_DOT = 87023, SPELL_MAGE_CAUTERIZED = 87024, @@ -64,7 +65,6 @@ enum MageSpells SPELL_MAGE_ICY_VEINS = 12472, SPELL_MAGE_CHAIN_REACTION_DUMMY = 278309, SPELL_MAGE_CHAIN_REACTION = 278310, - SPELL_MAGE_TOUCH_OF_THE_MAGI_AURA = 210824, SPELL_MAGE_TOUCH_OF_THE_MAGI_EXPLODE = 210833, }; @@ -76,6 +76,80 @@ enum MiscSpells SPELL_MAGE_CHILLED = 205708 }; +// 44425 - Arcane Barrage +class spell_mage_arcane_barrage : public SpellScript +{ + PrepareSpellScript(spell_mage_arcane_barrage); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MAGE_ARCANE_BARRAGE_R3 }); + } + + void HandleEffectHitTarget(SpellEffIndex /*effIndex*/) + { + // Consume all arcane charges; for each charge add 30% additional damage + Unit* caster = GetCaster(); + double charges = double(-caster->ConsumeAllPower(POWER_ARCANE_CHARGES)); + + double currDamage = double(GetHitDamage()); + double extraDamage = (charges * 0.3) * currDamage; + SetHitDamage(int32(currDamage + extraDamage)); + + if (Aura const* aura = caster->GetAura(SPELL_MAGE_ARCANE_BARRAGE_R3)) + { + if (AuraEffect const* auraEffect = aura->GetEffect(EFFECT_0)) + { + double pct = charges * (double(auraEffect->GetAmount()) * 0.01); + int32 maxMana = caster->GetMaxPower(POWER_MANA); + + int32 extraMana = CalculatePct(double(maxMana), pct); + caster->ModifyPower(POWER_MANA, extraMana); + } + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_mage_arcane_barrage::HandleEffectHitTarget, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } +}; + +// 1449 - Arcane Explosion +class spell_mage_arcane_explosion : public SpellScript +{ + PrepareSpellScript(spell_mage_arcane_explosion); + + void PreventEnergize(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + } + + void HandleTargetHit(SpellEffIndex /*effIndex*/) + { + if (_once) + { + if (SpellEffectInfo const* effInfo = GetEffectInfo(EFFECT_0)) + { + Unit* caster = GetCaster(); + int32 value = effInfo->CalcValue(caster); + caster->ModifyPower(Powers(effInfo->MiscValue), value); + } + _once = false; + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_mage_arcane_explosion::PreventEnergize, EFFECT_0, SPELL_EFFECT_ENERGIZE); + OnEffectHitTarget += SpellEffectFn(spell_mage_arcane_explosion::PreventEnergize, EFFECT_2, SPELL_EFFECT_ENERGIZE); + OnEffectHitTarget += SpellEffectFn(spell_mage_arcane_explosion::HandleTargetHit, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE); + } + +private: + bool _once = true; +}; + // 235313 - Blazing Barrier class spell_mage_blazing_barrier : public AuraScript { @@ -868,6 +942,8 @@ class spell_mage_water_elemental_freeze : public SpellScript void AddSC_mage_spell_scripts() { + RegisterSpellScript(spell_mage_arcane_barrage); + RegisterSpellScript(spell_mage_arcane_explosion); RegisterAuraScript(spell_mage_blazing_barrier); RegisterAuraScript(spell_mage_burning_determination); RegisterSpellAndAuraScriptPair(spell_mage_cauterize, spell_mage_cauterize_AuraScript); |
