diff options
| author | Matan Shukry <matanshukry@gmail.com> | 2021-04-06 09:02:00 +0300 | 
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-05-15 17:44:31 +0200 | 
| commit | be8cbab4b3cd9623c42bf89d1bf1d6b40e0ae4fd (patch) | |
| tree | 872447b7245a94a1ae6a2893769373a9cd96bcb8 | |
| parent | e2964dadf475a745390be25fed6f67c7ad1af3f0 (diff) | |
Scripts/Spells: Fixed arcane barrage + explosion
| -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); | 
