aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp4
-rw-r--r--src/server/scripts/Spells/spell_dk.cpp1275
2 files changed, 411 insertions, 868 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 5297703cbae..f9ed7acb3eb 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -4041,10 +4041,6 @@ Aura* Unit::GetAuraOfRankedSpell(uint32 spellId, ObjectGuid casterGUID, ObjectGu
void Unit::GetDispellableAuraList(Unit* caster, uint32 dispelMask, DispelChargesList& dispelList)
{
- // we should not be able to dispel diseases if the target is affected by unholy blight
- if (dispelMask & (1 << DISPEL_DISEASE) && HasAura(50536))
- dispelMask &= ~(1 << DISPEL_DISEASE);
-
AuraMap const& auras = GetOwnedAuras();
for (AuraMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
{
diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp
index 5a54243679f..96ced5c7017 100644
--- a/src/server/scripts/Spells/spell_dk.cpp
+++ b/src/server/scripts/Spells/spell_dk.cpp
@@ -29,218 +29,240 @@
enum DeathKnightSpells
{
- SPELL_DK_ANTI_MAGIC_SHELL_TALENT = 51052,
- SPELL_DK_BLACK_ICE_R1 = 49140,
- SPELL_DK_BLOOD_BOIL_TRIGGERED = 65658,
- SPELL_DK_BLOOD_GORGED_HEAL = 50454,
+ SPELL_DK_ARMY_FLESH_BEAST_TRANSFORM = 127533,
+ SPELL_DK_ARMY_GEIST_TRANSFORM = 127534,
+ SPELL_DK_ARMY_NORTHREND_SKELETON_TRANSFORM = 127528,
+ SPELL_DK_ARMY_SKELETON_TRANSFORM = 127527,
+ SPELL_DK_ARMY_SPIKED_GHOUL_TRANSFORM = 127525,
+ SPELL_DK_ARMY_SUPER_ZOMBIE_TRANSFORM = 127526,
SPELL_DK_BLOOD_PLAGUE = 55078,
SPELL_DK_BLOOD_PRESENCE = 48263,
- SPELL_DK_BLOOD_PRESENCE_TRIGGERED = 61261,
SPELL_DK_BLOOD_SHIELD_MASTERY = 77513,
SPELL_DK_BLOOD_SHIELD_ABSORB = 77535,
- SPELL_DK_BUTCHERY = 50163,
+ SPELL_DK_CHAINS_OF_ICE = 45524,
SPELL_DK_CORPSE_EXPLOSION_TRIGGERED = 43999,
SPELL_DK_DEATH_AND_DECAY_DAMAGE = 52212,
+ SPELL_DK_DEATH_AND_DECAY_SLOW = 143375,
+ SPELL_DK_DEATH_COIL_BARRIER = 115635,
SPELL_DK_DEATH_COIL_DAMAGE = 47632,
SPELL_DK_DEATH_COIL_HEAL = 47633,
SPELL_DK_DEATH_STRIKE_HEAL = 45470,
- SPELL_DK_DEATH_STRIKE_ENABLER = 89832,
+ SPELL_DK_ENHANCED_DEATH_COIL = 157343,
SPELL_DK_FROST_FEVER = 55095,
- SPELL_DK_FROST_PRESENCE = 48266,
SPELL_DK_GHOUL_EXPLODE = 47496,
- SPELL_DK_GLYPH_OF_ICEBOUND_FORTITUDE = 58625,
- SPELL_DK_GLYPH_OF_DISEASE = 63334,
- SPELL_DK_IMPROVED_BLOOD_PRESENCE_R1 = 50365,
- SPELL_DK_IMPROVED_DEATH_STRIKE = 62905,
- SPELL_DK_IMPROVED_FROST_PRESENCE_R1 = 50384,
- SPELL_DK_IMPROVED_FROST_PRESENCE_TRIGGERED = 63621,
- SPELL_DK_IMPROVED_UNHOLY_PRESENCE_R1 = 50391,
- SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED = 63622,
- SPELL_DK_ITEM_SIGIL_VENGEFUL_HEART = 64962,
- SPELL_DK_ITEM_T8_MELEE_4P_BONUS = 64736,
- SPELL_DK_MASTER_OF_GHOULS = 52143,
- SPELL_DK_RAISE_DEAD_USE_REAGENT = 48289,
+ SPELL_DK_GLYPH_OF_ABSORB_MAGIC = 159415,
+ SPELL_DK_GLYPH_OF_ANTI_MAGIC_SHELL = 58623,
+ SPELL_DK_GLYPH_OF_ARMY_OF_THE_DEAD = 58669,
+ SPELL_DK_GLYPH_OF_DEATH_COIL = 63333,
+ SPELL_DK_GLYPH_OF_DEATH_AND_DECAY = 58629,
+ SPELL_DK_GLYPH_OF_FOUL_MENAGERIE = 58642,
+ SPELL_DK_GLYPH_OF_REGENERATIVE_MAGIC = 146648,
+ SPELL_DK_GLYPH_OF_RUNIC_POWER_TRIGGERED = 159430,
+ SPELL_DK_GLYPH_OF_SWIFT_DEATH = 146645,
+ SPELL_DK_GLYPH_OF_THE_GEIST = 58640,
+ SPELL_DK_GLYPH_OF_THE_SKELETON = 146652,
+ SPELL_DK_IMPROVED_BLOOD_PRESENCE = 50371,
+ SPELL_DK_IMPROVED_SOUL_REAPER = 157342,
SPELL_DK_RUNIC_POWER_ENERGIZE = 49088,
- SPELL_DK_RUNE_TAP = 48982,
- SPELL_DK_SCENT_OF_BLOOD = 50422,
+ SPELL_DK_SCENT_OF_BLOOD = 49509,
+ SPELL_DK_SCENT_OF_BLOOD_TRIGGERED = 50421,
SPELL_DK_SCOURGE_STRIKE_TRIGGERED = 70890,
+ SPELL_DK_SHADOW_OF_DEATH = 164047,
+ SPELL_DK_SOUL_REAPER_DAMAGE = 114867,
+ SPELL_DK_SOUL_REAPER_HASTE = 114868,
+ SPELL_DK_T15_DPS_4P_BONUS = 138347,
SPELL_DK_UNHOLY_PRESENCE = 48265,
- SPELL_DK_WILL_OF_THE_NECROPOLIS = 96171
+ SPELL_DK_WILL_OF_THE_NECROPOLIS = 157335
};
-// 50462 - Anti-Magic Shell (on raid member)
-class spell_dk_anti_magic_shell_raid : public SpellScriptLoader
+// 48707 - Anti-Magic Shell
+/// 6.x
+class spell_dk_anti_magic_shell : public SpellScriptLoader
{
public:
- spell_dk_anti_magic_shell_raid() : SpellScriptLoader("spell_dk_anti_magic_shell_raid") { }
+ spell_dk_anti_magic_shell() : SpellScriptLoader("spell_dk_anti_magic_shell") { }
- class spell_dk_anti_magic_shell_raid_AuraScript : public AuraScript
+ class spell_dk_anti_magic_shell_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_dk_anti_magic_shell_raid_AuraScript);
+ PrepareAuraScript(spell_dk_anti_magic_shell_AuraScript);
public:
- spell_dk_anti_magic_shell_raid_AuraScript()
+ spell_dk_anti_magic_shell_AuraScript()
{
absorbPct = 0;
+ maxHealth = 0;
+ absorbedAmount = 0;
}
- private:
- uint32 absorbPct;
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_RUNIC_POWER_ENERGIZE))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_GLYPH_OF_ABSORB_MAGIC))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_GLYPH_OF_REGENERATIVE_MAGIC))
+ return false;
+ return true;
+ }
bool Load() override
{
absorbPct = GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue(GetCaster());
+ maxHealth = GetCaster()->GetMaxHealth();
+ absorbedAmount = 0;
return true;
}
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
{
- /// @todo this should absorb limited amount of damage, but no info on calculation formula
- amount = -1;
+ amount = maxHealth;
+
+ /// todo, check if AMS has basepoints for EFFECT_2. in that case, this function should be rewritten.
+ if (!GetUnitOwner()->HasAura(SPELL_DK_GLYPH_OF_ABSORB_MAGIC))
+ amount /= 2;
}
- void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount)
+ void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount)
{
- absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct);
+ // we may only absorb a certain percentage of incoming damage.
+ absorbAmount = dmgInfo.GetDamage() * uint32(absorbPct) / 100;
+ }
+
+ void Trigger(AuraEffect* aurEff, DamageInfo& /*dmgInfo*/, uint32& absorbAmount)
+ {
+ absorbedAmount += absorbAmount;
+
+ if (!GetTarget()->HasAura(SPELL_DK_GLYPH_OF_ABSORB_MAGIC))
+ {
+ // Patch 6.0.2 (October 14, 2014): Anti-Magic Shell now restores 2 Runic Power per 1% of max health absorbed.
+ int32 bp = 2 * absorbAmount * 100 / maxHealth;
+ GetTarget()->CastCustomSpell(SPELL_DK_RUNIC_POWER_ENERGIZE, SPELLVALUE_BASE_POINT0, bp, GetTarget(), true, nullptr, aurEff);
+ }
+ }
+
+ void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Player* player = GetTarget()->ToPlayer())
+ if (AuraEffect const* glyph = player->GetAuraEffect(SPELL_DK_GLYPH_OF_REGENERATIVE_MAGIC, EFFECT_0)) // reduce cooldown of AMS if player has glyph
+ {
+ // Cannot reduce cooldown by more than 50%
+ int32 val = std::min(glyph->GetAmount(), int32(absorbedAmount) * 100 / maxHealth);
+ player->ModifySpellCooldown(GetId(), -int32(player->GetSpellCooldownDelay(GetId()) * val / 100));
+ }
}
void Register() override
{
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_shell_raid_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_raid_AuraScript::Absorb, EFFECT_0);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_shell_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_AuraScript::Absorb, EFFECT_0);
+ AfterEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_AuraScript::Trigger, EFFECT_0);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_dk_anti_magic_shell_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL);
}
+
+ private:
+ int32 absorbPct;
+ int32 maxHealth;
+ uint32 absorbedAmount;
};
AuraScript* GetAuraScript() const override
{
- return new spell_dk_anti_magic_shell_raid_AuraScript();
+ return new spell_dk_anti_magic_shell_AuraScript();
}
};
-// 48707 - Anti-Magic Shell (on self)
-class spell_dk_anti_magic_shell_self : public SpellScriptLoader
+// 43264 - Periodic Taunt
+/// 6.x, does this belong here or in spell_generic? apply this in creature_template_addon? sniffs say this is always cast army of the dead ghouls.
+class spell_dk_army_periodic_taunt : public SpellScriptLoader
{
public:
- spell_dk_anti_magic_shell_self() : SpellScriptLoader("spell_dk_anti_magic_shell_self") { }
+ spell_dk_army_periodic_taunt() : SpellScriptLoader("spell_dk_army_periodic_taunt") { }
- class spell_dk_anti_magic_shell_self_AuraScript : public AuraScript
+ class spell_dk_army_periodic_taunt_SpellScript : public SpellScript
{
- PrepareAuraScript(spell_dk_anti_magic_shell_self_AuraScript);
+ PrepareSpellScript(spell_dk_army_periodic_taunt_SpellScript);
- public:
- spell_dk_anti_magic_shell_self_AuraScript()
- {
- absorbPct = 0;
- hpPct = 0;
- }
-
- private:
- uint32 absorbPct, hpPct;
bool Load() override
{
- absorbPct = GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue(GetCaster());
- hpPct = GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue(GetCaster());
- return true;
- }
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_DK_RUNIC_POWER_ENERGIZE))
- return false;
- return true;
- }
-
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
- {
- amount = GetCaster()->CountPctFromMaxHealth(hpPct);
+ return GetCaster()->IsGuardian();
}
- void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount)
+ SpellCastResult CheckCast()
{
- absorbAmount = std::min(CalculatePct(dmgInfo.GetDamage(), absorbPct), GetTarget()->CountPctFromMaxHealth(hpPct));
- }
+ if (Unit* owner = GetCaster()->GetOwner())
+ if (!owner->HasAura(SPELL_DK_GLYPH_OF_ARMY_OF_THE_DEAD))
+ return SPELL_CAST_OK;
- void Trigger(AuraEffect* aurEff, DamageInfo& /*dmgInfo*/, uint32& absorbAmount)
- {
- // damage absorbed by Anti-Magic Shell energizes the DK with additional runic power.
- // This, if I'm not mistaken, shows that we get back ~20% of the absorbed damage as runic power.
- int32 bp = CalculatePct(absorbAmount, 20);
- GetTarget()->CastCustomSpell(SPELL_DK_RUNIC_POWER_ENERGIZE, SPELLVALUE_BASE_POINT0, bp, GetTarget(), true, NULL, aurEff);
+ return SPELL_FAILED_SPELL_UNAVAILABLE;
}
void Register() override
{
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_shell_self_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_self_AuraScript::Absorb, EFFECT_0);
- AfterEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_self_AuraScript::Trigger, EFFECT_0);
+ OnCheckCast += SpellCheckCastFn(spell_dk_army_periodic_taunt_SpellScript::CheckCast);
}
};
- AuraScript* GetAuraScript() const override
+ SpellScript* GetSpellScript() const override
{
- return new spell_dk_anti_magic_shell_self_AuraScript();
+ return new spell_dk_army_periodic_taunt_SpellScript();
}
};
-// 50461 - Anti-Magic Zone
-class spell_dk_anti_magic_zone : public SpellScriptLoader
+static const uint32 ArmyTransforms[6]
+{
+ SPELL_DK_ARMY_FLESH_BEAST_TRANSFORM,
+ SPELL_DK_ARMY_GEIST_TRANSFORM,
+ SPELL_DK_ARMY_NORTHREND_SKELETON_TRANSFORM,
+ SPELL_DK_ARMY_SKELETON_TRANSFORM,
+ SPELL_DK_ARMY_SPIKED_GHOUL_TRANSFORM,
+ SPELL_DK_ARMY_SUPER_ZOMBIE_TRANSFORM
+};
+
+// 127517 - Army Transform
+/// 6.x, does this belong here or in spell_generic? where do we cast this? sniffs say this is only cast when caster has glyph of foul menagerie.
+class spell_dk_army_transform : public SpellScriptLoader
{
public:
- spell_dk_anti_magic_zone() : SpellScriptLoader("spell_dk_anti_magic_zone") { }
+ spell_dk_army_transform() : SpellScriptLoader("spell_dk_army_transform") { }
- class spell_dk_anti_magic_zone_AuraScript : public AuraScript
+ class spell_dk_army_transform_SpellScript : public SpellScript
{
- PrepareAuraScript(spell_dk_anti_magic_zone_AuraScript);
-
- public:
- spell_dk_anti_magic_zone_AuraScript()
- {
- absorbPct = 0;
- }
-
- private:
- uint32 absorbPct;
+ PrepareSpellScript(spell_dk_army_transform_SpellScript);
bool Load() override
{
- absorbPct = GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue(GetCaster());
- return true;
+ return GetCaster()->IsGuardian();
}
- bool Validate(SpellInfo const* /*spellInfo*/) override
+ SpellCastResult CheckCast()
{
- if (!sSpellMgr->GetSpellInfo(SPELL_DK_ANTI_MAGIC_SHELL_TALENT))
- return false;
- return true;
- }
+ if (Unit* owner = GetCaster()->GetOwner())
+ if (owner->HasAura(SPELL_DK_GLYPH_OF_FOUL_MENAGERIE))
+ return SPELL_CAST_OK;
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
- {
- SpellInfo const* talentSpell = sSpellMgr->EnsureSpellInfo(SPELL_DK_ANTI_MAGIC_SHELL_TALENT);
- amount = talentSpell->GetEffect(EFFECT_0)->CalcValue(GetCaster());
- if (Player* player = GetCaster()->ToPlayer())
- amount += int32(2 * player->GetTotalAttackPowerValue(BASE_ATTACK));
+ return SPELL_FAILED_SPELL_UNAVAILABLE;
}
- void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount)
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
- absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct);
+ GetCaster()->CastSpell(GetCaster(), ArmyTransforms[urand(0, 5)], true);
}
void Register() override
{
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_zone_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_zone_AuraScript::Absorb, EFFECT_0);
+ OnCheckCast += SpellCheckCastFn(spell_dk_army_transform_SpellScript::CheckCast);
+ OnEffectHitTarget += SpellEffectFn(spell_dk_army_transform_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
- AuraScript* GetAuraScript() const override
+ SpellScript* GetSpellScript() const override
{
- return new spell_dk_anti_magic_zone_AuraScript();
+ return new spell_dk_army_transform_SpellScript();
}
};
-// 48721 - Blood Boil
+// 50842 - Blood Boil
+/// 6.x
class spell_dk_blood_boil : public SpellScriptLoader
{
public:
@@ -253,136 +275,127 @@ class spell_dk_blood_boil : public SpellScriptLoader
public:
spell_dk_blood_boil_SpellScript()
{
- _executed = false;
+ bpDuration = 0;
+ ffDuration = 0;
}
- private:
bool Validate(SpellInfo const* /*spellInfo*/) override
{
- if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_BOIL_TRIGGERED))
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_SCENT_OF_BLOOD_TRIGGERED))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_SCENT_OF_BLOOD))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PLAGUE))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_FROST_FEVER))
return false;
return true;
}
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCaster()->getClass() == CLASS_DEATH_KNIGHT;
- }
-
- void HandleAfterHit()
+ void FilterTargets(std::list<WorldObject*>& targets)
{
- if (_executed || !GetHitUnit())
+ if (targets.empty())
return;
- _executed = true;
- GetCaster()->CastSpell(GetCaster(), SPELL_DK_BLOOD_BOIL_TRIGGERED, true);
- }
-
- void Register() override
- {
- AfterHit += SpellHitFn(spell_dk_blood_boil_SpellScript::HandleAfterHit);
- }
-
- bool _executed;
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_dk_blood_boil_SpellScript();
- }
-};
+ Unit* caster = GetCaster();
-// 50453 - Bloodworms Health Leech
-class spell_dk_blood_gorged : public SpellScriptLoader
-{
- public:
- spell_dk_blood_gorged() : SpellScriptLoader("spell_dk_blood_gorged") { }
+ if (caster->HasAura(SPELL_DK_SCENT_OF_BLOOD))
+ return;
- class spell_dk_blood_gorged_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_dk_blood_gorged_AuraScript);
+ for (auto target : targets)
+ {
+ if (bpDuration && ffDuration)
+ break;
- public:
- spell_dk_blood_gorged_AuraScript()
- {
- _procTarget = nullptr;
+ if (Unit* unit = target->ToUnit())
+ {
+ if (Aura const* bp = unit->GetAura(SPELL_DK_BLOOD_PLAGUE, caster->GetGUID()))
+ bpDuration = bp->GetDuration();
+ if (Aura const* ff = unit->GetAura(SPELL_DK_FROST_FEVER, caster->GetGUID()))
+ ffDuration = ff->GetDuration();
+ }
+ }
}
- private:
- bool Validate(SpellInfo const* /*spellInfo*/) override
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_GORGED_HEAL))
- return false;
- return true;
- }
+ Unit* caster = GetCaster();
+ Unit* target = GetHitUnit();
- bool CheckProc(ProcEventInfo& /*eventInfo*/)
- {
- _procTarget = GetTarget()->GetOwner();
- return _procTarget != nullptr;
+ if (ffDuration)
+ caster->CastSpell(target, SPELL_DK_FROST_FEVER, true);
+ if (bpDuration)
+ caster->CastSpell(target, SPELL_DK_BLOOD_PLAGUE, true);
+
+ if (!caster->HasAura(SPELL_DK_SCENT_OF_BLOOD))
+ {
+ if (Aura* bp = target->GetAura(SPELL_DK_BLOOD_PLAGUE, caster->GetGUID()))
+ {
+ bp->SetDuration(bpDuration);
+ bp->SetMaxDuration(bpDuration);
+ }
+ if (Aura* ff = target->GetAura(SPELL_DK_FROST_FEVER, caster->GetGUID()))
+ {
+ ff->SetDuration(ffDuration);
+ ff->SetMaxDuration(ffDuration);
+ }
+ }
}
- void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ void HandleEnergize(SpellEffIndex /*effIndex*/)
{
- int32 heal = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), 150));
- GetTarget()->CastCustomSpell(SPELL_DK_BLOOD_GORGED_HEAL, SPELLVALUE_BASE_POINT0, heal, _procTarget, true, NULL, aurEff);
+ Unit* caster = GetCaster();
+
+ if (caster->HasAura(SPELL_DK_SCENT_OF_BLOOD))
+ caster->CastSpell(caster, SPELL_DK_SCENT_OF_BLOOD_TRIGGERED, true);
}
void Register() override
{
- DoCheckProc += AuraCheckProcFn(spell_dk_blood_gorged_AuraScript::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_dk_blood_gorged_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_blood_boil_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
+ OnEffectHitTarget += SpellEffectFn(spell_dk_blood_boil_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnEffectHitTarget += SpellEffectFn(spell_dk_blood_boil_SpellScript::HandleEnergize, EFFECT_1, SPELL_EFFECT_ENERGIZE);
}
private:
- Unit* _procTarget;
+ int32 bpDuration;
+ int32 ffDuration;
};
- AuraScript* GetAuraScript() const override
+ SpellScript* GetSpellScript() const override
{
- return new spell_dk_blood_gorged_AuraScript();
+ return new spell_dk_blood_boil_SpellScript();
}
};
-// -48979 - Butchery
-class spell_dk_butchery : public SpellScriptLoader
+// 43265 - Death and Decay
+/// 6.x
+class spell_dk_death_and_decay : public SpellScriptLoader
{
public:
- spell_dk_butchery() : SpellScriptLoader("spell_dk_butchery") { }
+ spell_dk_death_and_decay() : SpellScriptLoader("spell_dk_death_and_decay") { }
- class spell_dk_blood_gorged_AuraScript : public AuraScript
+ class spell_dk_death_and_decay_SpellScript : public SpellScript
{
- PrepareAuraScript(spell_dk_blood_gorged_AuraScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_DK_BUTCHERY))
- return false;
- return true;
- }
+ PrepareSpellScript(spell_dk_death_and_decay_SpellScript);
- void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
- PreventDefaultAction();
- GetTarget()->CastCustomSpell(SPELL_DK_BUTCHERY, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff);
+ if (GetCaster()->HasAura(SPELL_DK_GLYPH_OF_DEATH_AND_DECAY))
+ if (WorldLocation const* pos = GetExplTargetDest())
+ GetCaster()->CastSpell(pos->GetPositionX(), pos->GetPositionY(), pos->GetPositionZ(), SPELL_DK_DEATH_AND_DECAY_SLOW, true);
}
void Register() override
{
- OnEffectProc += AuraEffectProcFn(spell_dk_blood_gorged_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ OnEffectHitTarget += SpellEffectFn(spell_dk_death_and_decay_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
- AuraScript* GetAuraScript() const override
+ SpellScript* GetSpellScript() const override
{
- return new spell_dk_blood_gorged_AuraScript();
+ return new spell_dk_death_and_decay_SpellScript();
}
-};
-
-class spell_dk_death_and_decay : public SpellScriptLoader
-{
- public:
- spell_dk_death_and_decay() : SpellScriptLoader("spell_dk_death_and_decay") { }
class spell_dk_death_and_decay_AuraScript : public AuraScript
{
@@ -396,7 +409,7 @@ class spell_dk_death_and_decay : public SpellScriptLoader
void Register() override
{
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_dk_death_and_decay_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_dk_death_and_decay_AuraScript::HandleDummyTick, EFFECT_2, SPELL_AURA_PERIODIC_DUMMY);
}
};
@@ -406,6 +419,8 @@ class spell_dk_death_and_decay : public SpellScriptLoader
}
};
+// 47541 - Death Coil
+/// 6.x
class spell_dk_death_coil : public SpellScriptLoader
{
public:
@@ -417,29 +432,39 @@ class spell_dk_death_coil : public SpellScriptLoader
bool Validate(SpellInfo const* /*spell*/) override
{
- if (!sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_COIL_DAMAGE) || !sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_COIL_HEAL))
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_COIL_DAMAGE) || !sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_COIL_HEAL) || !sSpellMgr->GetSpellInfo(SPELL_DK_GLYPH_OF_DEATH_COIL))
return false;
return true;
}
void HandleDummy(SpellEffIndex /*effIndex*/)
{
- int32 damage = GetEffectValue();
Unit* caster = GetCaster();
if (Unit* target = GetHitUnit())
{
if (caster->IsFriendlyTo(target))
{
- int32 bp = int32(damage * 1.5f);
- caster->CastCustomSpell(target, SPELL_DK_DEATH_COIL_HEAL, &bp, NULL, NULL, true);
+ if (target->GetCreatureType() == CREATURE_TYPE_UNDEAD) // Any undead ally, including caster if he has lichborne.
+ {
+ caster->CastSpell(target, SPELL_DK_DEATH_COIL_HEAL, true);
+ }
+ else if (target != caster) // Any non undead ally except caster and only if caster has glyph of death coil.
+ {
+ SpellInfo const* DCD = sSpellMgr->EnsureSpellInfo(SPELL_DK_DEATH_COIL_DAMAGE);
+ SpellEffectInfo const* eff = DCD->GetEffect(EFFECT_0);
+ int32 bp = caster->SpellDamageBonusDone(target, DCD, eff->CalcValue(caster), DIRECT_DAMAGE, eff);
+
+ caster->CastCustomSpell(target, SPELL_DK_DEATH_COIL_BARRIER, &bp, nullptr, nullptr, true);
+ }
}
- else
+ else // Any enemy target.
{
- if (AuraEffect const* auraEffect = caster->GetAuraEffect(SPELL_DK_ITEM_SIGIL_VENGEFUL_HEART, EFFECT_1))
- damage += auraEffect->GetBaseAmount();
- caster->CastCustomSpell(target, SPELL_DK_DEATH_COIL_DAMAGE, &damage, NULL, NULL, true);
+ caster->CastSpell(target, SPELL_DK_DEATH_COIL_DAMAGE, true);
}
}
+
+ if (caster->HasAura(SPELL_DK_ENHANCED_DEATH_COIL))
+ caster->CastSpell(caster, SPELL_DK_SHADOW_OF_DEATH, true);
}
SpellCastResult CheckCast()
@@ -450,7 +475,7 @@ class spell_dk_death_coil : public SpellScriptLoader
if (!caster->IsFriendlyTo(target) && !caster->isInFront(target))
return SPELL_FAILED_UNIT_NOT_INFRONT;
- if (target->IsFriendlyTo(caster) && target->GetCreatureType() != CREATURE_TYPE_UNDEAD)
+ if (target->IsFriendlyTo(caster) && target->GetCreatureType() != CREATURE_TYPE_UNDEAD && !caster->HasAura(SPELL_DK_GLYPH_OF_DEATH_COIL))
return SPELL_FAILED_BAD_TARGETS;
}
else
@@ -548,62 +573,36 @@ class spell_dk_death_grip : public SpellScriptLoader
};
// 48743 - Death Pact
+/// 6.x
class spell_dk_death_pact : public SpellScriptLoader
{
public:
spell_dk_death_pact() : SpellScriptLoader("spell_dk_death_pact") { }
- class spell_dk_death_pact_SpellScript : public SpellScript
+ class spell_dk_death_pact_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_dk_death_pact_SpellScript);
-
- SpellCastResult CheckCast()
- {
- // Check if we have valid targets, otherwise skip spell casting here
- if (Player* player = GetCaster()->ToPlayer())
- for (Unit::ControlList::const_iterator itr = player->m_Controlled.begin(); itr != player->m_Controlled.end(); ++itr)
- if (Creature* undeadPet = (*itr)->ToCreature())
- if (undeadPet->IsAlive() &&
- undeadPet->GetOwnerGUID() == player->GetGUID() &&
- undeadPet->GetCreatureType() == CREATURE_TYPE_UNDEAD &&
- undeadPet->IsWithinDist(player, 100.0f, false))
- return SPELL_CAST_OK;
-
- return SPELL_FAILED_NO_PET;
- }
+ PrepareAuraScript(spell_dk_death_pact_AuraScript);
- void FilterTargets(std::list<WorldObject*>& targetList)
+ void HandleCalcAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
{
- Unit* target = NULL;
- for (std::list<WorldObject*>::iterator itr = targetList.begin(); itr != targetList.end(); ++itr)
- {
- if (Unit* unit = (*itr)->ToUnit())
- if (unit->GetOwnerGUID() == GetCaster()->GetGUID() && unit->GetCreatureType() == CREATURE_TYPE_UNDEAD)
- {
- target = unit;
- break;
- }
- }
-
- targetList.clear();
- if (target)
- targetList.push_back(target);
+ if (Unit* caster = GetCaster())
+ amount = int32(caster->CountPctFromMaxHealth(amount));
}
void Register() override
{
- OnCheckCast += SpellCheckCastFn(spell_dk_death_pact_SpellScript::CheckCast);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_death_pact_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ALLY);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_death_pact_AuraScript::HandleCalcAmount, EFFECT_1, SPELL_AURA_SCHOOL_HEAL_ABSORB);
}
};
- SpellScript* GetSpellScript() const override
+ AuraScript* GetAuraScript() const override
{
- return new spell_dk_death_pact_SpellScript();
+ return new spell_dk_death_pact_AuraScript();
}
};
// 49998 - Death Strike
+/// 6.x
class spell_dk_death_strike : public SpellScriptLoader
{
public:
@@ -615,38 +614,30 @@ class spell_dk_death_strike : public SpellScriptLoader
bool Validate(SpellInfo const* /*spellInfo*/) override
{
- if (!sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_STRIKE_ENABLER) ||
- !sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_STRIKE_HEAL) ||
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_STRIKE_HEAL) ||
!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_SHIELD_MASTERY) ||
!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_SHIELD_ABSORB))
return false;
return true;
}
- void HandleDummy(SpellEffIndex /*effIndex*/)
+ void HandleHeal(SpellEffIndex /*effIndex*/)
{
- if (AuraEffect* enabler = GetCaster()->GetAuraEffect(SPELL_DK_DEATH_STRIKE_ENABLER, EFFECT_0, GetCaster()->GetGUID()))
- {
- // Call CalculateAmount() to constantly fire the AuraEffect's HandleCalcAmount method
- int32 heal = CalculatePct(enabler->CalculateAmount(GetCaster()), GetSpellInfo()->GetEffect(EFFECT_0)->ChainAmplitude);
-
- if (AuraEffect const* aurEff = GetCaster()->GetAuraEffectOfRankedSpell(SPELL_DK_IMPROVED_DEATH_STRIKE, EFFECT_2))
- heal = AddPct(heal, aurEff->GetAmount());
-
- heal = std::max(heal, int32(GetCaster()->CountPctFromMaxHealth(GetEffectValue())));
- GetCaster()->CastCustomSpell(SPELL_DK_DEATH_STRIKE_HEAL, SPELLVALUE_BASE_POINT0, heal, GetCaster(), true);
- }
+ Unit* caster = GetCaster();
+ int32 heal = caster->GetTotalAttackPowerValue(BASE_ATTACK) * 4; /// todo, add versatality bonus as it will probably not apply to the heal due to its damageclass SPELL_DAMAGE_CLASS_NONE.
+ caster->CastCustomSpell(SPELL_DK_DEATH_STRIKE_HEAL, SPELLVALUE_BASE_POINT0, heal, caster, true);
- if (!GetCaster()->HasAura(SPELL_DK_BLOOD_PRESENCE))
+ if (!caster->HasAura(SPELL_DK_BLOOD_PRESENCE) || !caster->HasAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE))
return;
- if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_DK_BLOOD_SHIELD_MASTERY, EFFECT_0))
- GetCaster()->CastCustomSpell(SPELL_DK_BLOOD_SHIELD_ABSORB, SPELLVALUE_BASE_POINT0, GetCaster()->CountPctFromMaxHealth(aurEff->GetAmount()), GetCaster());
+ /// todo, if SPELL_AURA_MOD_ABSORB_PERCENTAGE will not apply to SPELL_DAMAGE_CLASS_NONE, resolve must be applied here.
+ if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_BLOOD_SHIELD_MASTERY, EFFECT_0))
+ caster->CastCustomSpell(SPELL_DK_BLOOD_SHIELD_ABSORB, SPELLVALUE_BASE_POINT0, CalculatePct(heal, aurEff->GetAmount()), caster);
}
void Register() override
{
- OnEffectHitTarget += SpellEffectFn(spell_dk_death_strike_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY);
+ OnEffectHitTarget += SpellEffectFn(spell_dk_death_strike_SpellScript::HandleHeal, EFFECT_1, SPELL_EFFECT_WEAPON_PERCENT_DAMAGE);
}
};
@@ -656,77 +647,65 @@ class spell_dk_death_strike : public SpellScriptLoader
}
};
-// 89832 - Death Strike (Save damage taken in last 5 sec)
-class spell_dk_death_strike_enabler : public SpellScriptLoader
+// 85948 - Festering Strike
+/// 6.x
+class spell_dk_festering_strike : public SpellScriptLoader
{
public:
- spell_dk_death_strike_enabler() : SpellScriptLoader("spell_dk_death_strike_enabler") { }
+ spell_dk_festering_strike() : SpellScriptLoader("spell_dk_festering_strike") { }
- class spell_dk_death_strike_enabler_AuraScript : public AuraScript
+ class spell_dk_festering_strike_SpellScript : public SpellScript
{
- PrepareAuraScript(spell_dk_death_strike_enabler_AuraScript);
+ PrepareSpellScript(spell_dk_festering_strike_SpellScript);
- bool Load() override
- {
- for (uint8 i = 0; i < 5; ++i)
- _damagePerSecond[i] = 0;
- return true;
- }
+ public:
+ spell_dk_festering_strike_SpellScript() { }
- bool CheckProc(ProcEventInfo& eventInfo)
+ private:
+ bool Validate(SpellInfo const* spellInfo) override
{
- return eventInfo.GetDamageInfo() != nullptr;
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_FROST_FEVER) || !sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PLAGUE) || !sSpellMgr->GetSpellInfo(SPELL_DK_CHAINS_OF_ICE))
+ return false;
+ return false;
}
- void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo)
+ void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
- if (!GetUnitOwner()->HasAura(SPELL_DK_BLOOD_PRESENCE))
+ int32 extraDuration = GetSpellInfo()->GetEffect(EFFECT_2)->CalcValue();
+ Unit* target = GetHitUnit();
+ ObjectGuid casterGUID = GetCaster()->GetGUID();
+
+ if (Aura* ff = target->GetAura(SPELL_DK_FROST_FEVER, casterGUID))
{
- for (uint8 i = 0; i < 5; ++i)
- _damagePerSecond[i] = 0;
+ int32 newDuration = std::min(ff->GetDuration() + extraDuration, 2 * MINUTE * IN_MILLISECONDS); // caps at 2min.
+ ff->SetDuration(newDuration);
+ ff->SetMaxDuration(newDuration);
}
- else
- _damagePerSecond[0] += eventInfo.GetDamageInfo()->GetDamage();
- }
- // Cheap hack to have update calls
- void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude)
- {
- isPeriodic = true;
- amplitude = 1000;
- }
-
- void Update(AuraEffect* /*aurEff*/)
- {
- // Move backwards all datas by one
- for (uint8 i = 4; i > 0; --i)
- _damagePerSecond[i] = _damagePerSecond[i - 1];
- _damagePerSecond[0] = 0;
- }
+ if (Aura* bp = target->GetAura(SPELL_DK_BLOOD_PLAGUE, casterGUID))
+ {
+ int32 newDuration = std::min(bp->GetDuration() + extraDuration, 2 * MINUTE * IN_MILLISECONDS); // caps at 2min.
+ bp->SetDuration(newDuration);
+ bp->SetMaxDuration(newDuration);
+ }
- void HandleCalcAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
- {
- canBeRecalculated = true;
- amount = 0;
- for (uint8 i = 0; i < 5; ++i)
- amount += int32(_damagePerSecond[i]);
+ if (Aura* coi = target->GetAura(SPELL_DK_CHAINS_OF_ICE, casterGUID))
+ {
+ int32 newDuration = std::min(coi->GetDuration() + extraDuration, 20 * IN_MILLISECONDS); // is 20sec cap? couldnt manage to get runes up to pass 20.
+ coi->SetDuration(newDuration);
+ coi->SetMaxDuration(newDuration);
+ }
}
void Register() override
{
- DoCheckProc += AuraCheckProcFn(spell_dk_death_strike_enabler_AuraScript::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_dk_death_strike_enabler_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_dk_death_strike_enabler_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_dk_death_strike_enabler_AuraScript::Update, EFFECT_0, SPELL_AURA_DUMMY);
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_death_strike_enabler_AuraScript::HandleCalcAmount, EFFECT_0, SPELL_AURA_DUMMY);
+ OnEffectHitTarget += SpellEffectFn(spell_dk_festering_strike_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT);
}
-
- uint32 _damagePerSecond[5];
};
- AuraScript* GetAuraScript() const override
+ SpellScript* GetSpellScript() const override
{
- return new spell_dk_death_strike_enabler_AuraScript();
+ return new spell_dk_festering_strike_SpellScript();
}
};
@@ -768,450 +747,177 @@ class spell_dk_ghoul_explode : public SpellScriptLoader
}
};
-// 48792 - Icebound Fortitude
-class spell_dk_icebound_fortitude : public SpellScriptLoader
-{
- public:
- spell_dk_icebound_fortitude() : SpellScriptLoader("spell_dk_icebound_fortitude") { }
-
- class spell_dk_icebound_fortitude_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_dk_icebound_fortitude_AuraScript);
-
- bool Load() override
- {
- Unit* caster = GetCaster();
- return caster && caster->GetTypeId() == TYPEID_PLAYER;
- }
-
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
- {
- if (Unit* caster = GetCaster())
- {
- int32 value = amount;
- uint32 defValue = uint32(caster->ToPlayer()->GetSkillValue(SKILL_DEFENSE) + caster->ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));
-
- if (defValue > 400)
- value -= int32((defValue - 400) * 0.15);
-
- // Glyph of Icebound Fortitude
- if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_GLYPH_OF_ICEBOUND_FORTITUDE, EFFECT_0))
- {
- int32 valMax = -aurEff->GetAmount();
- if (value > valMax)
- value = valMax;
- }
- amount = value;
- }
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_icebound_fortitude_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN);
- }
- };
-
- AuraScript* GetAuraScript() const override
- {
- return new spell_dk_icebound_fortitude_AuraScript();
- }
-};
-
-// -50365 - Improved Blood Presence
-class spell_dk_improved_blood_presence : public SpellScriptLoader
+// 58677 - Glyph of Death's Embrace
+/// 6.x
+class spell_dk_glyph_of_deaths_embrace : public SpellScriptLoader
{
public:
- spell_dk_improved_blood_presence() : SpellScriptLoader("spell_dk_improved_blood_presence") { }
+ spell_dk_glyph_of_deaths_embrace() : SpellScriptLoader("spell_dk_glyph_of_deaths_embrace") { }
- class spell_dk_improved_blood_presence_AuraScript : public AuraScript
+ class spell_dk_glyph_of_deaths_embrace_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_dk_improved_blood_presence_AuraScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_FROST_PRESENCE)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_UNHOLY_PRESENCE)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE_TRIGGERED))
- return false;
- return true;
- }
-
- void HandleModDamagePctTaken(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- if ((target->HasAura(SPELL_DK_FROST_PRESENCE) || target->HasAura(SPELL_DK_UNHOLY_PRESENCE)) && !target->HasAura(SPELL_DK_BLOOD_PRESENCE_TRIGGERED))
- target->CastCustomSpell(SPELL_DK_BLOOD_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, -aurEff->GetAmount(), target, true, NULL, aurEff);
- }
-
- void HandleModAttackerMeleeCritChance(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- if (target->HasAura(SPELL_DK_BLOOD_PRESENCE))
- if (AuraEffect* triggeredEff = target->GetAuraEffect(SPELL_DK_BLOOD_PRESENCE_TRIGGERED, EFFECT_1))
- triggeredEff->SetAmount(aurEff->GetAmount());
- }
-
- void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
-
- if (target->HasAura(SPELL_DK_BLOOD_PRESENCE))
- {
- if (AuraEffect* triggeredEff = target->GetAuraEffect(SPELL_DK_BLOOD_PRESENCE_TRIGGERED, EFFECT_1))
- triggeredEff->SetAmount(0);
- }
- else
- target->RemoveAura(SPELL_DK_BLOOD_PRESENCE_TRIGGERED);
- }
+ PrepareAuraScript(spell_dk_glyph_of_deaths_embrace_AuraScript);
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_blood_presence_AuraScript::HandleModDamagePctTaken, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_blood_presence_AuraScript::HandleModAttackerMeleeCritChance, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_blood_presence_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
- };
-
- AuraScript* GetAuraScript() const override
- {
- return new spell_dk_improved_blood_presence_AuraScript();
- }
-};
-
-// -50384 - Improved Frost Presence
-class spell_dk_improved_frost_presence : public SpellScriptLoader
-{
- public:
- spell_dk_improved_frost_presence() : SpellScriptLoader("spell_dk_improved_frost_presence") { }
-
- class spell_dk_improved_frost_presence_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_dk_improved_frost_presence_AuraScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_UNHOLY_PRESENCE)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_FROST_PRESENCE_TRIGGERED))
- return false;
- return true;
- }
-
- void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- if ((target->HasAura(SPELL_DK_BLOOD_PRESENCE) || target->HasAura(SPELL_DK_UNHOLY_PRESENCE)) && !target->HasAura(SPELL_DK_IMPROVED_FROST_PRESENCE_TRIGGERED))
- {
- CustomSpellValues val;
- val.AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount());
- val.AddSpellMod(SPELLVALUE_BASE_POINT1, aurEff->GetAmount());
- target->CastCustomSpell(SPELL_DK_IMPROVED_FROST_PRESENCE_TRIGGERED, val, target, TRIGGERED_FULL_MASK, nullptr, aurEff);
- }
- }
-
- void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ bool CheckProc(ProcEventInfo& eventInfo)
{
- GetTarget()->RemoveAura(SPELL_DK_IMPROVED_FROST_PRESENCE_TRIGGERED);
+ return (GetTarget()->GetCreatureType() == CREATURE_TYPE_UNDEAD && GetTarget()->GetOwner());
}
void Register() override
{
- AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_frost_presence_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_frost_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ DoCheckProc += AuraCheckProcFn(spell_dk_glyph_of_deaths_embrace_AuraScript::CheckProc);
}
};
AuraScript* GetAuraScript() const override
{
- return new spell_dk_improved_frost_presence_AuraScript();
+ return new spell_dk_glyph_of_deaths_embrace_AuraScript();
}
};
-// -50391 - Improved Unholy Presence
-class spell_dk_improved_unholy_presence : public SpellScriptLoader
+// 159429 - Glyph of Runic Power
+/// 6.x
+class spell_dk_glyph_of_runic_power : public SpellScriptLoader
{
public:
- spell_dk_improved_unholy_presence() : SpellScriptLoader("spell_dk_improved_unholy_presence") { }
+ spell_dk_glyph_of_runic_power() : SpellScriptLoader("spell_dk_glyph_of_runic_power") { }
- class spell_dk_improved_unholy_presence_AuraScript : public AuraScript
+ class spell_dk_glyph_of_runic_power_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_dk_improved_unholy_presence_AuraScript);
+ PrepareAuraScript(spell_dk_glyph_of_runic_power_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
- if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_FROST_PRESENCE)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED))
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_GLYPH_OF_RUNIC_POWER_TRIGGERED))
return false;
return true;
}
- void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
+ bool CheckProc(ProcEventInfo& eventInfo)
{
- Unit* target = GetTarget();
- if ((target->HasAura(SPELL_DK_BLOOD_PRESENCE) || target->HasAura(SPELL_DK_FROST_PRESENCE)) && !target->HasAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED))
- target->CastCustomSpell(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), target, true, NULL, aurEff);
+ return eventInfo.GetSpellInfo() && (eventInfo.GetSpellInfo()->GetAllEffectsMechanicMask() & (1 << MECHANIC_SNARE | 1 << MECHANIC_ROOT | 1 << MECHANIC_FREEZE));
}
- void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ void HandleProc(ProcEventInfo& eventInfo)
{
- GetTarget()->RemoveAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED);
+ if (Unit* target = eventInfo.GetProcTarget())
+ if (target->getClass() == CLASS_DEATH_KNIGHT)
+ target->CastSpell(target, SPELL_DK_GLYPH_OF_RUNIC_POWER_TRIGGERED, true);
}
void Register() override
{
- AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_unholy_presence_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_unholy_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ DoCheckProc += AuraCheckProcFn(spell_dk_glyph_of_runic_power_AuraScript::CheckProc);
+ OnProc += AuraProcFn(spell_dk_glyph_of_runic_power_AuraScript::HandleProc);
}
};
AuraScript* GetAuraScript() const override
{
- return new spell_dk_improved_unholy_presence_AuraScript();
+ return new spell_dk_glyph_of_runic_power_AuraScript();
}
};
-// 73975 - Necrotic Strike
-class spell_dk_necrotic_strike : public SpellScriptLoader
+// 48792 - Icebound Fortitude
+/// 6.x
+class spell_dk_icebound_fortitude : public SpellScriptLoader
{
public:
- spell_dk_necrotic_strike() : SpellScriptLoader("spell_dk_necrotic_strike") { }
+ spell_dk_icebound_fortitude() : SpellScriptLoader("spell_dk_icebound_fortitude") { }
- class spell_dk_necrotic_strike_AuraScript : public AuraScript
+ class spell_dk_icebound_fortitude_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_dk_necrotic_strike_AuraScript);
+ PrepareAuraScript(spell_dk_icebound_fortitude_AuraScript);
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool & /*canBeRecalculated*/)
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
{
- if (Unit* caster = GetCaster())
- amount = int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.7f);
+ if (GetUnitOwner()->HasAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE))
+ amount += 30; /// todo, figure out how tooltip is updated
}
void Register() override
{
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_necrotic_strike_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_HEAL_ABSORB);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_icebound_fortitude_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN);
}
};
AuraScript* GetAuraScript() const override
{
- return new spell_dk_necrotic_strike_AuraScript();
+ return new spell_dk_icebound_fortitude_AuraScript();
}
};
-// ID - 50842 Pestilence
-class spell_dk_pestilence : public SpellScriptLoader
+// 121916 - Glyph of the Geist (Unholy)
+/// 6.x, does this belong here or in spell_generic? apply this in creature_template_addon? sniffs say this is always cast on raise dead.
+class spell_dk_pet_geist_transform : public SpellScriptLoader
{
public:
- spell_dk_pestilence() : SpellScriptLoader("spell_dk_pestilence") { }
+ spell_dk_pet_geist_transform() : SpellScriptLoader("spell_dk_pet_geist_transform") { }
- class spell_dk_pestilence_SpellScript : public SpellScript
+ class spell_dk_pet_geist_transform_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_dk_pestilence_SpellScript);
+ PrepareSpellScript(spell_dk_pet_geist_transform_SpellScript);
- bool Validate(SpellInfo const* /*spellInfo*/) override
+ bool Load() override
{
- if (!sSpellMgr->GetSpellInfo(SPELL_DK_GLYPH_OF_DISEASE)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PLAGUE)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_FROST_FEVER))
- return false;
- return true;
+ return GetCaster()->IsPet();
}
- void OnHit(SpellEffIndex /*effIndex*/)
+ SpellCastResult CheckCast()
{
- Unit* caster = GetCaster();
- Unit* hitUnit = GetHitUnit();
- Unit* victim = GetExplTargetUnit();
-
- if (!victim)
- return;
-
- if (victim != hitUnit || caster->HasAura(SPELL_DK_GLYPH_OF_DISEASE))
- {
- if (Aura* aurOld = victim->GetAura(SPELL_DK_BLOOD_PLAGUE, caster->GetGUID())) // Check Blood Plague application on victim.
- {
- if (AuraEffect* aurEffOld = aurOld->GetEffect(EFFECT_0))
- {
- float donePct = aurEffOld->GetDonePct();
- float critChance = aurEffOld->GetCritChance();
-
- caster->CastSpell(hitUnit, SPELL_DK_BLOOD_PLAGUE, true); // Spread the disease to hitUnit.
-
- if (Aura* aurNew = hitUnit->GetAura(SPELL_DK_BLOOD_PLAGUE, caster->GetGUID())) // Check Blood Plague application on hitUnit.
- {
- if (AuraEffect* aurEffNew = aurNew->GetEffect(EFFECT_0))
- {
- aurEffNew->SetCritChance(critChance); // Blood Plague can crit if caster has T9.
- aurEffNew->SetDonePct(donePct);
- aurEffNew->SetDamage(caster->SpellDamageBonusDone(hitUnit, aurEffNew->GetSpellInfo(), std::max(aurEffNew->GetAmount(), 0), DOT, aurEffNew->GetSpellEffectInfo()) * donePct);
- }
- }
- }
- }
+ if (Unit* owner = GetCaster()->GetOwner())
+ if (owner->HasAura(SPELL_DK_GLYPH_OF_THE_GEIST))
+ return SPELL_CAST_OK;
- if (Aura* aurOld = victim->GetAura(SPELL_DK_FROST_FEVER, caster->GetGUID())) // Check Frost Fever application on victim.
- {
- if (AuraEffect* aurEffOld = aurOld->GetEffect(EFFECT_0))
- {
- float donePct = aurEffOld->GetDonePct();
-
- caster->CastSpell(hitUnit, SPELL_DK_FROST_FEVER, true); // Spread the disease to hitUnit.
-
- if (Aura* aurNew = hitUnit->GetAura(SPELL_DK_FROST_FEVER, caster->GetGUID())) // Check Frost Fever application on hitUnit.
- {
- if (AuraEffect* aurEffNew = aurNew->GetEffect(EFFECT_0))
- {
- aurEffNew->SetDonePct(donePct);
- aurEffNew->SetDamage(caster->SpellDamageBonusDone(hitUnit, aurEffNew->GetSpellInfo(), std::max(aurEffNew->GetAmount(), 0), DOT, aurEffNew->GetSpellEffectInfo()) * donePct);
- }
- }
- }
- }
- }
+ return SPELL_FAILED_SPELL_UNAVAILABLE;
}
void Register() override
{
- OnEffectHitTarget += SpellEffectFn(spell_dk_pestilence_SpellScript::OnHit, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT);
+ OnCheckCast += SpellCheckCastFn(spell_dk_pet_geist_transform_SpellScript::CheckCast);
}
};
SpellScript* GetSpellScript() const override
{
- return new spell_dk_pestilence_SpellScript();
+ return new spell_dk_pet_geist_transform_SpellScript();
}
};
-// 48266 - Blood Presence
-// 48263 - Frost Presence
-// 48265 - Unholy Presence
-class spell_dk_presence : public SpellScriptLoader
+// 147157 Glyph of the Skeleton (Unholy)
+/// 6.x, does this belong here or in spell_generic? apply this in creature_template_addon? sniffs say this is always cast on raise dead.
+class spell_dk_pet_skeleton_transform : public SpellScriptLoader
{
public:
- spell_dk_presence() : SpellScriptLoader("spell_dk_presence") { }
+ spell_dk_pet_skeleton_transform() : SpellScriptLoader("spell_dk_pet_skeleton_transform") { }
- class spell_dk_presence_AuraScript : public AuraScript
+ class spell_dk_pet_skeleton_transform_SpellScript : public SpellScript
{
- PrepareAuraScript(spell_dk_presence_AuraScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_FROST_PRESENCE)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_UNHOLY_PRESENCE)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_BLOOD_PRESENCE_R1)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_FROST_PRESENCE_R1)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_R1)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE_TRIGGERED)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_FROST_PRESENCE_TRIGGERED))
- return false;
-
- return true;
- }
-
- void HandleImprovedBloodPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- /// @todo: rune regg (effect 2)
- Unit* target = GetTarget();
- if (Aura const* aura = target->GetAuraOfRankedSpell(SPELL_DK_IMPROVED_BLOOD_PRESENCE_R1))
- {
- CustomSpellValues val;
- if (GetSpellInfo()->Id == SPELL_DK_BLOOD_PRESENCE)
- {
- if (AuraEffect const* impAurEff = aura->GetEffect(EFFECT_1))
- val.AddSpellMod(SPELLVALUE_BASE_POINT1, impAurEff->GetAmount());
- }
- else
- {
- if (AuraEffect const* impAurEff = aura->GetEffect(EFFECT_0))
- val.AddSpellMod(SPELLVALUE_BASE_POINT0, -impAurEff->GetAmount());
- }
-
- if (!target->HasAura(SPELL_DK_BLOOD_PRESENCE_TRIGGERED))
- target->CastCustomSpell(SPELL_DK_BLOOD_PRESENCE_TRIGGERED, val, target, TRIGGERED_FULL_MASK, NULL, aurEff);
- }
- else if (GetSpellInfo()->Id == SPELL_DK_BLOOD_PRESENCE)
- target->CastSpell(target, SPELL_DK_BLOOD_PRESENCE_TRIGGERED, true, NULL, aurEff);
- }
-
- void HandleImprovedFrostPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- if (GetSpellInfo()->Id != SPELL_DK_BLOOD_PRESENCE && GetSpellInfo()->Id != SPELL_DK_UNHOLY_PRESENCE)
- return;
+ PrepareSpellScript(spell_dk_pet_skeleton_transform_SpellScript);
- Unit* target = GetTarget();
- if (AuraEffect const* impAurEff = target->GetAuraEffectOfRankedSpell(SPELL_DK_IMPROVED_FROST_PRESENCE_R1, EFFECT_0))
- if (!target->HasAura(SPELL_DK_IMPROVED_FROST_PRESENCE_TRIGGERED))
- {
- CustomSpellValues val;
- val.AddSpellMod(SPELLVALUE_BASE_POINT0, impAurEff->GetAmount());
- val.AddSpellMod(SPELLVALUE_BASE_POINT1, impAurEff->GetAmount());
- target->CastCustomSpell(SPELL_DK_IMPROVED_FROST_PRESENCE_TRIGGERED, val, target, TRIGGERED_FULL_MASK, nullptr, aurEff);
- }
- }
-
- void HandleImprovedUnholyPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
+ SpellCastResult CheckCast()
{
- if (GetSpellInfo()->Id != SPELL_DK_BLOOD_PRESENCE && GetSpellInfo()->Id != SPELL_DK_FROST_PRESENCE)
- return;
+ if (Unit* owner = GetCaster()->GetOwner())
+ if (owner->HasAura(SPELL_DK_GLYPH_OF_THE_SKELETON))
+ return SPELL_CAST_OK;
- Unit* target = GetTarget();
- if (AuraEffect const* impAurEff = target->GetAuraEffectOfRankedSpell(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_R1, EFFECT_0))
- if (!target->HasAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED))
- target->CastCustomSpell(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, impAurEff->GetAmount(), target, true, NULL, aurEff);
- }
-
- void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- target->RemoveAura(SPELL_DK_BLOOD_PRESENCE_TRIGGERED);
- target->RemoveAura(SPELL_DK_IMPROVED_FROST_PRESENCE_TRIGGERED);
- target->RemoveAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED);
+ return SPELL_FAILED_SPELL_UNAVAILABLE;
}
void Register() override
{
- AfterEffectApply += AuraEffectApplyFn(spell_dk_presence_AuraScript::HandleImprovedBloodPresence, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectApply += AuraEffectApplyFn(spell_dk_presence_AuraScript::HandleImprovedFrostPresence, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectApply += AuraEffectApplyFn(spell_dk_presence_AuraScript::HandleImprovedUnholyPresence, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_dk_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL);
+ OnCheckCast += SpellCheckCastFn(spell_dk_pet_skeleton_transform_SpellScript::CheckCast);
}
};
- AuraScript* GetAuraScript() const override
- {
- return new spell_dk_presence_AuraScript();
- }
-};
-
-class RaiseDeadCheck
-{
-public:
- explicit RaiseDeadCheck(Player const* caster) : _caster(caster) { }
-
- bool operator()(WorldObject* obj) const
- {
- if (Unit* target = obj->ToUnit())
+ SpellScript* GetSpellScript() const override
{
- if (!target->IsAlive()
- && _caster->isHonorOrXPTarget(target)
- && target->GetCreatureType() == CREATURE_TYPE_HUMANOID
- && target->GetDisplayId() == target->GetNativeDisplayId())
- return false;
+ return new spell_dk_pet_skeleton_transform_SpellScript();
}
-
- return true;
- }
-
-private:
- Player const* _caster;
};
-
// 46584 - Raise Dead
+/// 6.x
class spell_dk_raise_dead : public SpellScriptLoader
{
public:
@@ -1222,19 +928,12 @@ class spell_dk_raise_dead : public SpellScriptLoader
PrepareSpellScript(spell_dk_raise_dead_SpellScript);
public:
- spell_dk_raise_dead_SpellScript()
- {
- _result = SPELL_CAST_OK;
- _corpse = false;
- }
+ spell_dk_raise_dead_SpellScript() { }
private:
bool Validate(SpellInfo const* spellInfo) override
{
- if (!spellInfo->GetEffect(EFFECT_0) || !sSpellMgr->GetSpellInfo(spellInfo->GetEffect(EFFECT_0)->CalcValue())
- || spellInfo->GetEffect(EFFECT_1) || !sSpellMgr->GetSpellInfo(spellInfo->GetEffect(EFFECT_1)->CalcValue())
- || !sSpellMgr->GetSpellInfo(SPELL_DK_RAISE_DEAD_USE_REAGENT)
- || !sSpellMgr->GetSpellInfo(SPELL_DK_MASTER_OF_GHOULS))
+ if (!spellInfo->GetEffect(EFFECT_0) || !sSpellMgr->GetSpellInfo(spellInfo->GetEffect(EFFECT_0)->CalcValue()))
return false;
return false;
}
@@ -1244,104 +943,15 @@ class spell_dk_raise_dead : public SpellScriptLoader
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
- SpellCastResult CheckCast()
- {
- /// process spell target selection before cast starts
- /// targets of effect_1 are used to check cast
- GetSpell()->SelectSpellTargets();
- /// cleanup spell target map, and fill it again on normal way
- GetSpell()->CleanupTargetList();
- /// _result is set in spell target selection
- return _result;
- }
-
- SpellCastResult CheckReagents()
- {
- /// @workaround: there is no access to castresult of other spells, check it manually
- SpellInfo const* reagentSpell = sSpellMgr->GetSpellInfo(SPELL_DK_RAISE_DEAD_USE_REAGENT);
- Player* player = GetCaster()->ToPlayer();
- if (!player->CanNoReagentCast(reagentSpell))
- {
- for (uint32 i = 0; i < MAX_SPELL_REAGENTS; i++)
- {
- if (reagentSpell->Reagent[i] <= 0)
- continue;
-
- if (!player->HasItemCount(reagentSpell->Reagent[i], reagentSpell->ReagentCount[i]))
- {
- Spell::SendCastResult(player, reagentSpell, 0, SPELL_FAILED_REAGENTS);
- return SPELL_FAILED_DONT_REPORT;
- }
- }
- }
- return SPELL_CAST_OK;
- }
-
- void CheckTargets(std::list<WorldObject*>& targets)
- {
- targets.remove_if(RaiseDeadCheck(GetCaster()->ToPlayer()));
-
- if (targets.empty())
- {
- if (GetSpell()->getState() == SPELL_STATE_PREPARING)
- _result = CheckReagents();
-
- return;
- }
-
- WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
- targets.clear();
- targets.push_back(target);
- _corpse = true;
- }
-
- void CheckTarget(WorldObject*& target)
- {
- // Don't add caster to target map, if we found a corpse to raise dead
- if (_corpse)
- target = NULL;
- }
-
- void ConsumeReagents()
- {
- // No corpse found, take reagents
- if (!_corpse)
- GetCaster()->CastSpell(GetCaster(), SPELL_DK_RAISE_DEAD_USE_REAGENT, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST));
- }
-
- uint32 GetGhoulSpellId()
- {
- // Do we have talent Master of Ghouls?
- //if (GetCaster()->HasAura(SPELL_DK_MASTER_OF_GHOULS))
- // summon as geist
- // return GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue();
-
- // or pet
- return GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue();
- }
-
- void HandleRaiseDead(SpellEffIndex /*effIndex*/)
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(GetGhoulSpellId());
- SpellCastTargets targets;
- targets.SetDst(*GetHitUnit());
-
- GetCaster()->CastSpell(targets, spellInfo, NULL, TRIGGERED_FULL_MASK);
+ GetCaster()->CastSpell(((Unit*)nullptr), GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue(), true);
}
void Register() override
{
- OnCheckCast += SpellCheckCastFn(spell_dk_raise_dead_SpellScript::CheckCast);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_raise_dead_SpellScript::CheckTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY);
- OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dk_raise_dead_SpellScript::CheckTarget, EFFECT_2, TARGET_UNIT_CASTER);
- OnCast += SpellCastFn(spell_dk_raise_dead_SpellScript::ConsumeReagents);
- OnEffectHitTarget += SpellEffectFn(spell_dk_raise_dead_SpellScript::HandleRaiseDead, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
- OnEffectHitTarget += SpellEffectFn(spell_dk_raise_dead_SpellScript::HandleRaiseDead, EFFECT_2, SPELL_EFFECT_DUMMY);
+ OnEffectHitTarget += SpellEffectFn(spell_dk_raise_dead_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
-
- private:
- SpellCastResult _result;
- bool _corpse;
};
SpellScript* GetSpellScript() const override
@@ -1350,135 +960,84 @@ class spell_dk_raise_dead : public SpellScriptLoader
}
};
-// 59754 Rune Tap - Party
-class spell_dk_rune_tap_party : public SpellScriptLoader
+// 114866 - Soul Reaper, 130735 - Soul Reaper, 130736 - Soul Reaper
+/// 6.x
+class spell_dk_soul_reaper: public SpellScriptLoader
{
public:
- spell_dk_rune_tap_party() : SpellScriptLoader("spell_dk_rune_tap_party") { }
+ spell_dk_soul_reaper() : SpellScriptLoader("spell_dk_soul_reaper") { }
- class spell_dk_rune_tap_party_SpellScript : public SpellScript
+ class spell_dk_soul_reaper_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_dk_rune_tap_party_SpellScript);
+ PrepareAuraScript(spell_dk_soul_reaper_AuraScript);
- void CheckTargets(std::list<WorldObject*>& targets)
+ void HandlePeriodicDummy(AuraEffect const* aurEff)
{
- targets.remove(GetCaster());
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_rune_tap_party_SpellScript::CheckTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_dk_rune_tap_party_SpellScript();
- }
-};
+ Unit* caster = GetCaster();
+ Unit* target = GetUnitOwner();
-// 50421 - Scent of Blood
-class spell_dk_scent_of_blood : public SpellScriptLoader
-{
- public:
- spell_dk_scent_of_blood() : SpellScriptLoader("spell_dk_scent_of_blood") { }
+ if (!caster || !target)
+ return;
- class spell_dk_scent_of_blood_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_dk_scent_of_blood_AuraScript);
+ float pct = target->GetHealthPct();
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_DK_SCENT_OF_BLOOD))
- return false;
- return true;
+ if (pct < 35.f || (pct < 45.f && (caster->HasAura(SPELL_DK_IMPROVED_SOUL_REAPER) || caster->HasAura(SPELL_DK_T15_DPS_4P_BONUS))))
+ caster->CastSpell(target, SPELL_DK_SOUL_REAPER_DAMAGE, true, nullptr, aurEff);
}
- void OnProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
- PreventDefaultAction();
- GetTarget()->CastSpell(GetTarget(), SPELL_DK_SCENT_OF_BLOOD, true, NULL, aurEff);
- GetTarget()->RemoveAuraFromStack(GetId());
+ if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH)
+ return;
+
+ if (Unit* caster = GetCaster())
+ caster->CastSpell(caster, SPELL_DK_SOUL_REAPER_HASTE, true);
}
void Register() override
{
- OnEffectProc += AuraEffectProcFn(spell_dk_scent_of_blood_AuraScript::OnProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_dk_soul_reaper_AuraScript::HandlePeriodicDummy, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY);
+ AfterEffectRemove += AuraEffectApplyFn(spell_dk_soul_reaper_AuraScript::HandleRemove, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const override
{
- return new spell_dk_scent_of_blood_AuraScript();
+ return new spell_dk_soul_reaper_AuraScript();
}
};
-// 55090 - Scourge Strike (55265, 55270, 55271)
-class spell_dk_scourge_strike : public SpellScriptLoader
+// 115994 - Unholy Blight
+/// 6.x
+class spell_dk_unholy_blight : public SpellScriptLoader
{
public:
- spell_dk_scourge_strike() : SpellScriptLoader("spell_dk_scourge_strike") { }
+ spell_dk_unholy_blight() : SpellScriptLoader("spell_dk_unholy_blight") { }
- class spell_dk_scourge_strike_SpellScript : public SpellScript
+ class spell_dk_unholy_blight_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_dk_scourge_strike_SpellScript);
-
- public:
- spell_dk_scourge_strike_SpellScript()
- {
- multiplier = 1.0f;
- }
-
- private:
- float multiplier;
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_DK_SCOURGE_STRIKE_TRIGGERED))
- return false;
- return true;
- }
+ PrepareSpellScript(spell_dk_unholy_blight_SpellScript);
void HandleDummy(SpellEffIndex /*effIndex*/)
{
- Unit* caster = GetCaster();
- if (Unit* unitTarget = GetHitUnit())
- {
- multiplier = (GetEffectValue() * unitTarget->GetDiseasesByCaster(caster->GetGUID()) / 100.f);
- // Death Knight T8 Melee 4P Bonus
- if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_ITEM_T8_MELEE_4P_BONUS, EFFECT_0))
- AddPct(multiplier, aurEff->GetAmount());
- }
- }
-
- void HandleAfterHit()
- {
- Unit* caster = GetCaster();
- if (Unit* unitTarget = GetHitUnit())
- {
- int32 bp = GetHitDamage() * multiplier;
-
- if (AuraEffect* aurEff = caster->GetAuraEffectOfRankedSpell(SPELL_DK_BLACK_ICE_R1, EFFECT_0))
- AddPct(bp, aurEff->GetAmount());
-
- caster->CastCustomSpell(unitTarget, SPELL_DK_SCOURGE_STRIKE_TRIGGERED, &bp, NULL, NULL, true);
- }
+ GetCaster()->CastSpell(GetHitUnit(), SPELL_DK_FROST_FEVER, true);
+ GetCaster()->CastSpell(GetHitUnit(), SPELL_DK_BLOOD_PLAGUE, true);
}
void Register() override
{
- OnEffectHitTarget += SpellEffectFn(spell_dk_scourge_strike_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY);
- AfterHit += SpellHitFn(spell_dk_scourge_strike_SpellScript::HandleAfterHit);
+ OnEffectHitTarget += SpellEffectFn(spell_dk_unholy_blight_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const override
{
- return new spell_dk_scourge_strike_SpellScript();
+ return new spell_dk_unholy_blight_SpellScript();
}
};
// 55233 - Vampiric Blood
+/// 6.x
class spell_dk_vampiric_blood : public SpellScriptLoader
{
public:
@@ -1505,7 +1064,8 @@ class spell_dk_vampiric_blood : public SpellScriptLoader
}
};
-// -52284 - Will of the Necropolis
+// 81164 - Will of the Necropolis
+/// 6.x
class spell_dk_will_of_the_necropolis : public SpellScriptLoader
{
public:
@@ -1524,29 +1084,21 @@ class spell_dk_will_of_the_necropolis : public SpellScriptLoader
bool CheckProc(ProcEventInfo& eventInfo)
{
- //! HACK due to currenct proc system implementation
- if (Player* player = GetTarget()->ToPlayer())
- if (player->HasSpellCooldown(GetId()))
- return false;
+ if (GetTarget()->HasAura(SPELL_DK_WILL_OF_THE_NECROPOLIS))
+ return false;
return GetTarget()->HealthBelowPctDamaged(30, eventInfo.GetDamageInfo()->GetDamage());
}
void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
{
- GetTarget()->CastSpell(GetTarget(), SPELL_DK_WILL_OF_THE_NECROPOLIS, true, NULL, aurEff);
-
- if (Player* player = GetTarget()->ToPlayer())
- {
- player->RemoveSpellCooldown(SPELL_DK_RUNE_TAP, true);
- player->AddSpellCooldown(GetId(), 0, time(NULL) + 45);
- }
+ GetTarget()->CastSpell(GetTarget(), SPELL_DK_WILL_OF_THE_NECROPOLIS, true, nullptr, aurEff);
}
void Register() override
{
DoCheckProc += AuraCheckProcFn(spell_dk_will_of_the_necropolis_AuraScript::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_dk_will_of_the_necropolis_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE);
+ OnEffectProc += AuraEffectProcFn(spell_dk_will_of_the_necropolis_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
}
};
@@ -1558,31 +1110,26 @@ class spell_dk_will_of_the_necropolis : public SpellScriptLoader
void AddSC_deathknight_spell_scripts()
{
- new spell_dk_anti_magic_shell_raid();
- new spell_dk_anti_magic_shell_self();
- new spell_dk_anti_magic_zone();
+ new spell_dk_anti_magic_shell();
+ new spell_dk_army_periodic_taunt();
+ new spell_dk_army_transform();
new spell_dk_blood_boil();
- new spell_dk_blood_gorged();
- new spell_dk_butchery();
new spell_dk_death_and_decay();
new spell_dk_death_coil();
new spell_dk_death_gate();
new spell_dk_death_grip();
new spell_dk_death_pact();
new spell_dk_death_strike();
- new spell_dk_death_strike_enabler();
+ new spell_dk_festering_strike();
new spell_dk_ghoul_explode();
+ new spell_dk_glyph_of_deaths_embrace();
+ new spell_dk_glyph_of_runic_power();
new spell_dk_icebound_fortitude();
- new spell_dk_improved_blood_presence();
- new spell_dk_improved_frost_presence();
- new spell_dk_improved_unholy_presence();
- new spell_dk_necrotic_strike();
- new spell_dk_pestilence();
- new spell_dk_presence();
+ new spell_dk_pet_geist_transform();
+ new spell_dk_pet_skeleton_transform();
new spell_dk_raise_dead();
- new spell_dk_rune_tap_party();
- new spell_dk_scent_of_blood();
- new spell_dk_scourge_strike();
+ new spell_dk_soul_reaper();
+ new spell_dk_unholy_blight();
new spell_dk_vampiric_blood();
new spell_dk_will_of_the_necropolis();
}