aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatan Shukry <matanshukry@gmail.com>2021-04-06 09:02:00 +0300
committerShauren <shauren.trinity@gmail.com>2021-05-15 17:44:31 +0200
commitbe8cbab4b3cd9623c42bf89d1bf1d6b40e0ae4fd (patch)
tree872447b7245a94a1ae6a2893769373a9cd96bcb8
parente2964dadf475a745390be25fed6f67c7ad1af3f0 (diff)
Scripts/Spells: Fixed arcane barrage + explosion
-rw-r--r--sql/updates/world/master/2021_05_15_00_world_mage_spells.sql5
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp14
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
-rw-r--r--src/server/scripts/Spells/spell_mage.cpp78
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);