aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/3.3.5/2018_11_04_00_world.sql3
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp31
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp69
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();