diff options
-rw-r--r-- | sql/updates/world/3.3.5/2018_11_04_00_world.sql | 3 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 31 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_warlock.cpp | 69 |
3 files changed, 71 insertions, 32 deletions
diff --git a/sql/updates/world/3.3.5/2018_11_04_00_world.sql b/sql/updates/world/3.3.5/2018_11_04_00_world.sql new file mode 100644 index 00000000000..8dbca08a328 --- /dev/null +++ b/sql/updates/world/3.3.5/2018_11_04_00_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` = -980; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(-980, 'spell_warl_curse_of_agony'); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index d89a4eb5015..419ec0ba865 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5088,37 +5088,6 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const switch (GetSpellInfo()->SpellFamilyName) { - case SPELLFAMILY_WARLOCK: - { - // Curse of Agony damage-per-tick calculation - if ((GetSpellInfo()->SpellFamilyFlags[0] & 0x400) && GetSpellInfo()->SpellIconID == 544) - { - uint32 totalTicks = GetTotalTicks(); - // 1..4 ticks, 1/2 from normal tick damage - if (_ticksDone <= totalTicks / 3) - damage = damage / 2; - // 9..12 ticks, 3/2 from normal tick damage - else if (_ticksDone > totalTicks * 2 / 3) - damage += (damage + 1) / 2; // +1 prevent 0.5 damage possible lost at 1..4 ticks - // 5..8 ticks have normal tick damage - } - // There is a Chance to make a Soul Shard when Drain soul does damage - else if ((GetSpellInfo()->SpellFamilyFlags[0] & 0x00004000)) - { - if (caster && caster->GetTypeId() == TYPEID_PLAYER && caster->ToPlayer()->isHonorOrXPTarget(target)) - { - if (roll_chance_i(20)) - { - caster->CastSpell(caster, 43836, this); - // Glyph of Drain Soul - chance to create an additional Soul Shard - if (AuraEffect* aur = caster->GetAuraEffect(58070, 0)) - if (roll_chance_i(aur->GetMiscValue())) - caster->CastSpell(caster, 58068, aur); - } - } - } - break; - } case SPELLFAMILY_GENERIC: { switch (GetId()) diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 1999e29192a..3629b2f1d2e 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -35,6 +35,7 @@ enum WarlockSpells { + SPELL_WARLOCK_CREATE_SOULSHARD = 43836, SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT = 18662, SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON = 48018, SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT = 48020, @@ -46,6 +47,8 @@ enum WarlockSpells SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP = 54444, SPELL_WARLOCK_DEMONIC_PACT_PROC = 48090, SPELL_WARLOCK_FEL_SYNERGY_HEAL = 54181, + SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_AURA = 58070, + SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_PROC = 58068, SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME = 63311, SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE = 56216, SPELL_WARLOCK_HAUNT = 48181, @@ -92,6 +95,48 @@ enum WarlockSpellIcons WARLOCK_ICON_ID_DEMONIC_PACT = 3220 }; +// -980 Curse of Agony +class spell_warl_curse_of_agony : public AuraScript +{ + PrepareAuraScript(spell_warl_curse_of_agony); + + void ApplyEffect(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + _tick_amount = aurEff->GetAmount(); + } + + void HandleEffectPeriodicUpdate(AuraEffect * aurEff) + { + switch (aurEff->GetTickNumber()) + { + // 1..4 ticks, 1/2 from normal tick damage + case 1: + aurEff->SetAmount(_tick_amount / 2); + break; + // 5..8 ticks have normal tick damage + case 5: + aurEff->SetAmount(_tick_amount); + break; + // 9..12 ticks, 3/2 from normal tick damage + case 9: + aurEff->SetAmount((_tick_amount + 1) * 3 / 2); // +1 prevent 0.5 damage possible lost at 1..4 ticks + break; + // 13 and 14 ticks (glyphed only), twice normal tick damage + case 13: + aurEff->SetAmount(_tick_amount * 2); + break; + } + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_warl_curse_of_agony::ApplyEffect, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_warl_curse_of_agony::HandleEffectPeriodicUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } +private: + uint32 _tick_amount; +}; + // -710 - Banish class spell_warl_banish : public SpellScriptLoader { @@ -475,7 +520,10 @@ class spell_warl_drain_soul : public SpellScriptLoader return ValidateSpellInfo( { SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_R1, - SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_PROC + SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_PROC, + SPELL_WARLOCK_CREATE_SOULSHARD, + SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_AURA, + SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_PROC }); } @@ -495,8 +543,26 @@ class spell_warl_drain_soul : public SpellScriptLoader caster->CastSpell(nullptr, SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_PROC, args); } + void HandleTick(AuraEffect const* aurEff) + { + Unit* caster = GetCaster(); + Unit* target = GetTarget(); + if (caster && caster->GetTypeId() == TYPEID_PLAYER && caster->ToPlayer()->isHonorOrXPTarget(target)) + { + if (roll_chance_i(20)) + { + caster->CastSpell(caster, SPELL_WARLOCK_CREATE_SOULSHARD, aurEff); + // Glyph of Drain Soul - chance to create an additional Soul Shard + if (AuraEffect* aur = caster->GetAuraEffect(SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_AURA, EFFECT_0)) + if (roll_chance_i(aur->GetMiscValue())) + caster->CastSpell(caster, SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_PROC, aur); + } + } + } + void Register() override { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_drain_soul_AuraScript::HandleTick, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); OnEffectProc += AuraEffectProcFn(spell_warl_drain_soul_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_PROC_TRIGGER_SPELL); } }; @@ -1504,6 +1570,7 @@ class spell_warl_unstable_affliction : public SpellScriptLoader void AddSC_warlock_spell_scripts() { + RegisterAuraScript(spell_warl_curse_of_agony); new spell_warl_banish(); new spell_warl_create_healthstone(); new spell_warl_curse_of_doom(); |