diff options
Diffstat (limited to 'src')
-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 | 40 |
3 files changed, 22 insertions, 33 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 119e43ad525..a606cd14190 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -8636,20 +8636,6 @@ 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 ab339e8a816..5275677e2e8 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -940,7 +940,6 @@ 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 73e9420699c..461a093be3e 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_ENERGIZE = 321529, SPELL_MAGE_ARCANE_BARRAGE_R3 = 321526, SPELL_MAGE_ARCANE_MAGE = 137021, SPELL_MAGE_BLAZING_BARRIER_TRIGGER = 235314, @@ -83,38 +84,41 @@ class spell_mage_arcane_barrage : public SpellScript { PrepareSpellScript(spell_mage_arcane_barrage); - bool Validate(SpellInfo const* /*spellInfo*/) override + bool Validate(SpellInfo const* spellInfo) override { - return ValidateSpellInfo({ SPELL_MAGE_ARCANE_BARRAGE_R3 }); + return ValidateSpellInfo({ SPELL_MAGE_ARCANE_BARRAGE_R3, SPELL_MAGE_ARCANE_BARRAGE_ENERGIZE }) + && spellInfo->GetEffect(EFFECT_1); } - void HandleEffectHitTarget(SpellEffIndex /*effIndex*/) + void ConsumeArcaneCharges() { - // 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)); + // Consume all arcane charges + if (int32 arcaneCharges = -caster->ModifyPower(POWER_ARCANE_CHARGES, -caster->GetMaxPower(POWER_ARCANE_CHARGES), false)) + if (AuraEffect const* auraEffect = caster->GetAuraEffect(SPELL_MAGE_ARCANE_BARRAGE_R3, EFFECT_0, caster->GetGUID())) + caster->CastSpell(caster, SPELL_MAGE_ARCANE_BARRAGE_ENERGIZE, { SPELLVALUE_BASE_POINT0, arcaneCharges * auraEffect->GetAmount() / 100 }); + } - 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); + void HandleEffectHitTarget(SpellEffIndex /*effIndex*/) + { + if (GetHitUnit()->GetGUID() != _primaryTarget) + SetHitDamage(CalculatePct(GetHitDamage(), GetEffectInfo(EFFECT_1)->CalcValue(GetCaster()))); + } - int32 extraMana = CalculatePct(double(maxMana), pct); - caster->ModifyPower(POWER_MANA, extraMana); - } - } + void MarkPrimaryTarget(SpellEffIndex /*effIndex*/) + { + _primaryTarget = GetHitUnit()->GetGUID(); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_mage_arcane_barrage::HandleEffectHitTarget, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + OnEffectLaunchTarget += SpellEffectFn(spell_mage_arcane_barrage::MarkPrimaryTarget, EFFECT_1, SPELL_EFFECT_DUMMY); + AfterCast += SpellCastFn(spell_mage_arcane_barrage::ConsumeArcaneCharges); } + + ObjectGuid _primaryTarget; }; // 1449 - Arcane Explosion |