diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index a152a5a75..b22bea6ff 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -85,1252 +85,978 @@ enum Misc }; // 50526 - Wandering Plague -class spell_dk_wandering_plague : public SpellScriptLoader +class spell_dk_wandering_plague : public SpellScript { -public: - spell_dk_wandering_plague() : SpellScriptLoader("spell_dk_wandering_plague") { } + PrepareSpellScript(spell_dk_wandering_plague); - class spell_dk_wandering_plague_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_dk_wandering_plague_SpellScript); - - void FilterTargets(std::list& targets) + static const AuraType ccAuras[] = { - static const AuraType ccAuras[] = - { - SPELL_AURA_MOD_CONFUSE, - SPELL_AURA_MOD_FEAR, - SPELL_AURA_MOD_STUN, - SPELL_AURA_MOD_ROOT, - SPELL_AURA_TRANSFORM, - SPELL_AURA_NONE - }; + SPELL_AURA_MOD_CONFUSE, + SPELL_AURA_MOD_FEAR, + SPELL_AURA_MOD_STUN, + SPELL_AURA_MOD_ROOT, + SPELL_AURA_TRANSFORM, + SPELL_AURA_NONE + }; - for (std::list::iterator itr = targets.begin(); itr != targets.end();) + for (std::list::iterator itr = targets.begin(); itr != targets.end();) + { + Unit* target = (*itr)->ToUnit(); + if (!target) { - Unit* target = (*itr)->ToUnit(); - if (!target) + targets.erase(itr++); + continue; + } + + bool skip = false; + for (uint8 index = 0; !skip && ccAuras[index] != SPELL_AURA_NONE; ++index) + { + Unit::AuraEffectList const& auras = target->GetAuraEffectsByType(ccAuras[index]); + for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i) + if ((*i)->GetAmount()) + { + skip = true; + break; + } + } + + if (skip) + targets.erase(itr++); + else + ++itr; + } + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_wandering_plague::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + } +}; + +// 61999 - Raise Ally +class spell_dk_raise_ally : public SpellScript +{ + PrepareSpellScript(spell_dk_raise_ally); + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Player* unitTarget = GetHitPlayer()) + { + unitTarget->CastSpell(unitTarget, GetEffectValue(), true); + if (Unit* ghoul = unitTarget->GetCharm()) + { + //health, mana, armor and resistance + PetLevelInfo const* pInfo = sObjectMgr->GetPetLevelInfo(ghoul->GetEntry(), ghoul->getLevel()); + if (pInfo) // exist in DB + { + ghoul->SetCreateHealth(pInfo->health); + ghoul->SetModifierValue(UNIT_MOD_HEALTH, BASE_VALUE, pInfo->health); + ghoul->SetModifierValue(UNIT_MOD_ARMOR, BASE_VALUE, float(pInfo->armor)); + for (uint8 stat = 0; stat < MAX_STATS; ++stat) + ghoul->SetCreateStat(Stats(stat), float(pInfo->stats[stat])); + } + + ghoul->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(ghoul->getLevel() - (ghoul->getLevel() / 4))); + ghoul->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(ghoul->getLevel() + (ghoul->getLevel() / 4))); + + // Avoidance, Night of the Dead + if (Aura* aur = ghoul->AddAura(62137, ghoul)) + if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_DEATHKNIGHT, 2718, 0)) + if (aur->GetEffect(0)) + aur->GetEffect(0)->SetAmount(-aurEff->GetSpellInfo()->Effects[EFFECT_2].CalcValue()); + + // Hit / Expertise scalling, warlock / hunter pets have this by default + ghoul->AddAura(SPELL_HUNTER_PET_SCALING_04, ghoul); + + // DK Ghoul haste refresh + float val = (GetCaster()->m_modAttackSpeedPct[BASE_ATTACK] - 1.0f) * 100.0f; + ghoul->m_modAttackSpeedPct[BASE_ATTACK] = GetCaster()->m_modAttackSpeedPct[BASE_ATTACK]; + ghoul->SetFloatValue(UNIT_FIELD_BASEATTACKTIME, 2000.0f); + ghoul->ApplyPercentModFloatValue(UNIT_FIELD_BASEATTACKTIME, val, true); // we want to reduce attack time + + // Strength + Stamina + for (uint8 i = STAT_STRENGTH; i <= STAT_STAMINA; ++i) + { + Stats stat = Stats(i); + if (stat != STAT_STRENGTH && stat != STAT_STAMINA) + continue; + + float value = 0.0f; + float mod = (stat == STAT_STAMINA ? 0.3f : 0.7f); + + // Check just if owner has Ravenous Dead since it's effect is not an aura + AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, SPELLFAMILY_DEATHKNIGHT, 3010, 0); + if (aurEff) + { + SpellInfo const* spellInfo = aurEff->GetSpellInfo(); // Then get the SpellProto and add the dummy effect value + AddPct(mod, spellInfo->Effects[EFFECT_1].CalcValue()); // Ravenous Dead edits the original scale + } + // Glyph of the Ghoul + aurEff = GetCaster()->GetAuraEffect(SPELL_DK_GLYPH_OF_THE_GHOUL, EFFECT_0); + if (aurEff) + mod += CalculatePct(1.0f, aurEff->GetAmount()); // Glyph of the Ghoul adds a flat value to the scale mod + + value = float(GetCaster()->GetStat(stat)) * mod; + value = ghoul->GetTotalStatValue(stat, value); + ghoul->SetStat(stat, int32(value)); + ghoul->ApplyStatBuffMod(stat, value, true); + } + + // Attack Power + ghoul->SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, 589 + ghoul->GetStat(STAT_STRENGTH) + ghoul->GetStat(STAT_AGILITY)); + ghoul->SetInt32Value(UNIT_FIELD_ATTACK_POWER, (int32)ghoul->GetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE) * ghoul->GetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_PCT)); + ghoul->SetInt32Value(UNIT_FIELD_ATTACK_POWER_MODS, (int32)ghoul->GetModifierValue(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE)); + ghoul->SetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER, ghoul->GetModifierValue(UNIT_MOD_ATTACK_POWER, TOTAL_PCT) - 1.0f); + + // Health + ghoul->SetModifierValue(UNIT_MOD_HEALTH, TOTAL_VALUE, (ghoul->GetStat(STAT_STAMINA) - ghoul->GetCreateStat(STAT_STAMINA)) * 10.0f); + + // Power Energy + ghoul->SetModifierValue(UnitMods(UNIT_MOD_POWER_START + static_cast(POWER_ENERGY)), BASE_VALUE, ghoul->GetCreatePowers(POWER_ENERGY)); + ghoul->UpdateAllStats(); + ghoul->SetFullHealth(); + + // Aura Immunities + ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_MELEE_RANGED_HASTE, true, SPELL_BLOCK_TYPE_POSITIVE); + ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MELEE_SLOW, true, SPELL_BLOCK_TYPE_POSITIVE); + ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_STAT, true, SPELL_BLOCK_TYPE_POSITIVE); + ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); + ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER, true, SPELL_BLOCK_TYPE_POSITIVE); + ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); + } + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_dk_raise_ally::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 46619 - Raise Ally +class spell_dk_raise_ally_trigger : public AuraScript +{ + PrepareAuraScript(spell_dk_raise_ally_trigger); + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* charm = GetUnitOwner()->GetCharm()) + if (GetSpellInfo()->Effects[EFFECT_0].MiscValue >= 0 && charm->GetEntry() == uint32(GetSpellInfo()->Effects[EFFECT_0].MiscValue)) + charm->ToCreature()->DespawnOrUnsummon(); + } + + void Register() override + { + OnEffectRemove += AuraEffectRemoveFn(spell_dk_raise_ally_trigger::HandleEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 43263 - Ghoul Taunt +class spell_dk_aotd_taunt : public SpellScript +{ + PrepareSpellScript(spell_dk_aotd_taunt); + + void FilterTargets(std::list& targets) + { + for (std::list::iterator itr = targets.begin(); itr != targets.end();) + { + // ignore bosses + if (Creature* cr = (*itr)->ToCreature()) + if (cr->isWorldBoss()) { targets.erase(itr++); continue; } - bool skip = false; - for (uint8 index = 0; !skip && ccAuras[index] != SPELL_AURA_NONE; ++index) - { - Unit::AuraEffectList const& auras = target->GetAuraEffectsByType(ccAuras[index]); - for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i) - if ((*i)->GetAmount()) - { - skip = true; - break; - } - } - - if (skip) - targets.erase(itr++); - else - ++itr; - } + ++itr; } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_wandering_plague_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_dk_wandering_plague_SpellScript(); } -}; -// 61999 - Raise Ally -class spell_dk_raise_ally : public SpellScriptLoader -{ -public: - spell_dk_raise_ally() : SpellScriptLoader("spell_dk_raise_ally") { } - - class spell_dk_raise_ally_SpellScript : public SpellScript + void Register() override { - PrepareSpellScript(spell_dk_raise_ally_SpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Player* unitTarget = GetHitPlayer()) - { - unitTarget->CastSpell(unitTarget, GetEffectValue(), true); - if (Unit* ghoul = unitTarget->GetCharm()) - { - //health, mana, armor and resistance - PetLevelInfo const* pInfo = sObjectMgr->GetPetLevelInfo(ghoul->GetEntry(), ghoul->getLevel()); - if (pInfo) // exist in DB - { - ghoul->SetCreateHealth(pInfo->health); - ghoul->SetModifierValue(UNIT_MOD_HEALTH, BASE_VALUE, pInfo->health); - ghoul->SetModifierValue(UNIT_MOD_ARMOR, BASE_VALUE, float(pInfo->armor)); - for (uint8 stat = 0; stat < MAX_STATS; ++stat) - ghoul->SetCreateStat(Stats(stat), float(pInfo->stats[stat])); - } - - ghoul->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(ghoul->getLevel() - (ghoul->getLevel() / 4))); - ghoul->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(ghoul->getLevel() + (ghoul->getLevel() / 4))); - - // Avoidance, Night of the Dead - if (Aura* aur = ghoul->AddAura(62137, ghoul)) - if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_DEATHKNIGHT, 2718, 0)) - if (aur->GetEffect(0)) - aur->GetEffect(0)->SetAmount(-aurEff->GetSpellInfo()->Effects[EFFECT_2].CalcValue()); - - // Hit / Expertise scalling, warlock / hunter pets have this by default - ghoul->AddAura(SPELL_HUNTER_PET_SCALING_04, ghoul); - - // DK Ghoul haste refresh - float val = (GetCaster()->m_modAttackSpeedPct[BASE_ATTACK] - 1.0f) * 100.0f; - ghoul->m_modAttackSpeedPct[BASE_ATTACK] = GetCaster()->m_modAttackSpeedPct[BASE_ATTACK]; - ghoul->SetFloatValue(UNIT_FIELD_BASEATTACKTIME, 2000.0f); - ghoul->ApplyPercentModFloatValue(UNIT_FIELD_BASEATTACKTIME, val, true); // we want to reduce attack time - - // Strength + Stamina - for (uint8 i = STAT_STRENGTH; i <= STAT_STAMINA; ++i) - { - Stats stat = Stats(i); - if (stat != STAT_STRENGTH && stat != STAT_STAMINA) - continue; - - float value = 0.0f; - float mod = (stat == STAT_STAMINA ? 0.3f : 0.7f); - - // Check just if owner has Ravenous Dead since it's effect is not an aura - AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, SPELLFAMILY_DEATHKNIGHT, 3010, 0); - if (aurEff) - { - SpellInfo const* spellInfo = aurEff->GetSpellInfo(); // Then get the SpellProto and add the dummy effect value - AddPct(mod, spellInfo->Effects[EFFECT_1].CalcValue()); // Ravenous Dead edits the original scale - } - // Glyph of the Ghoul - aurEff = GetCaster()->GetAuraEffect(SPELL_DK_GLYPH_OF_THE_GHOUL, EFFECT_0); - if (aurEff) - mod += CalculatePct(1.0f, aurEff->GetAmount()); // Glyph of the Ghoul adds a flat value to the scale mod - - value = float(GetCaster()->GetStat(stat)) * mod; - value = ghoul->GetTotalStatValue(stat, value); - ghoul->SetStat(stat, int32(value)); - ghoul->ApplyStatBuffMod(stat, value, true); - } - - // Attack Power - ghoul->SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, 589 + ghoul->GetStat(STAT_STRENGTH) + ghoul->GetStat(STAT_AGILITY)); - ghoul->SetInt32Value(UNIT_FIELD_ATTACK_POWER, (int32)ghoul->GetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE) * ghoul->GetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_PCT)); - ghoul->SetInt32Value(UNIT_FIELD_ATTACK_POWER_MODS, (int32)ghoul->GetModifierValue(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE)); - ghoul->SetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER, ghoul->GetModifierValue(UNIT_MOD_ATTACK_POWER, TOTAL_PCT) - 1.0f); - - // Health - ghoul->SetModifierValue(UNIT_MOD_HEALTH, TOTAL_VALUE, (ghoul->GetStat(STAT_STAMINA) - ghoul->GetCreateStat(STAT_STAMINA)) * 10.0f); - - // Power Energy - ghoul->SetModifierValue(UnitMods(UNIT_MOD_POWER_START + static_cast(POWER_ENERGY)), BASE_VALUE, ghoul->GetCreatePowers(POWER_ENERGY)); - ghoul->UpdateAllStats(); - ghoul->SetFullHealth(); - - // Aura Immunities - ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_MELEE_RANGED_HASTE, true, SPELL_BLOCK_TYPE_POSITIVE); - ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MELEE_SLOW, true, SPELL_BLOCK_TYPE_POSITIVE); - ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_STAT, true, SPELL_BLOCK_TYPE_POSITIVE); - ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); - ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER, true, SPELL_BLOCK_TYPE_POSITIVE); - ghoul->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); - } - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_dk_raise_ally_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_dk_raise_ally_SpellScript(); - } -}; - -// 46619 - Raise Ally -class spell_dk_raise_ally_trigger : public SpellScriptLoader -{ -public: - spell_dk_raise_ally_trigger() : SpellScriptLoader("spell_dk_raise_ally_trigger") { } - - class spell_dk_raise_ally_trigger_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dk_raise_ally_trigger_AuraScript); - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* charm = GetUnitOwner()->GetCharm()) - if (GetSpellInfo()->Effects[EFFECT_0].MiscValue >= 0 && charm->GetEntry() == uint32(GetSpellInfo()->Effects[EFFECT_0].MiscValue)) - charm->ToCreature()->DespawnOrUnsummon(); - } - - void Register() override - { - OnEffectRemove += AuraEffectRemoveFn(spell_dk_raise_ally_trigger_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_dk_raise_ally_trigger_AuraScript(); - } -}; - -// 43263 - Ghoul Taunt -class spell_dk_aotd_taunt : public SpellScriptLoader -{ -public: - spell_dk_aotd_taunt() : SpellScriptLoader("spell_dk_aotd_taunt") { } - - class spell_dk_aotd_taunt_SpellScript : public SpellScript - { - PrepareSpellScript(spell_dk_aotd_taunt_SpellScript); - - void FilterTargets(std::list& targets) - { - for (std::list::iterator itr = targets.begin(); itr != targets.end();) - { - // ignore bosses - if (Creature* cr = (*itr)->ToCreature()) - if (cr->isWorldBoss()) - { - targets.erase(itr++); - continue; - } - - ++itr; - } - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_aotd_taunt_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_dk_aotd_taunt_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_aotd_taunt::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); } }; // -43265, 52212 - Death and Decay -class spell_dk_death_and_decay : public SpellScriptLoader +class spell_dk_death_and_decay : public SpellScript { -public: - spell_dk_death_and_decay() : SpellScriptLoader("spell_dk_death_and_decay") { } + PrepareSpellScript(spell_dk_death_and_decay); - class spell_dk_death_and_decay_SpellScript : public SpellScript + void RecalculateDamage() { - PrepareSpellScript(spell_dk_death_and_decay_SpellScript); + Unit* caster = GetCaster(); + Unit* target = GetHitUnit(); + int32 damage = GetHitDamage(); - void RecalculateDamage() - { - Unit* caster = GetCaster(); - Unit* target = GetHitUnit(); - int32 damage = GetHitDamage(); + // T10P2 bonus + if (AuraEffect* aurEff = caster->GetAuraEffectDummy(70650)) + AddPct(damage, aurEff->GetAmount()); + // Glyph of Death and Decay + if (AuraEffect* aurEff = caster->GetAuraEffect(58629, EFFECT_0)) + AddPct(damage, aurEff->GetAmount()); - // T10P2 bonus - if (AuraEffect* aurEff = caster->GetAuraEffectDummy(70650)) - AddPct(damage, aurEff->GetAmount()); - // Glyph of Death and Decay - if (AuraEffect* aurEff = caster->GetAuraEffect(58629, EFFECT_0)) - AddPct(damage, aurEff->GetAmount()); + // Xinef: include AOE damage reducing auras + if (target) + damage = target->CalculateAOEDamageReduction(damage, GetSpellInfo()->SchoolMask, caster); - // Xinef: include AOE damage reducing auras - if (target) - damage = target->CalculateAOEDamageReduction(damage, GetSpellInfo()->SchoolMask, caster); - - SetHitDamage(damage); - } - - void Register() override - { - if (m_scriptSpellId == SPELL_DK_DEATH_AND_DECAY_TRIGGER) - OnHit += SpellHitFn(spell_dk_death_and_decay_SpellScript::RecalculateDamage); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_dk_death_and_decay_SpellScript(); + SetHitDamage(damage); } - class spell_dk_death_and_decay_AuraScript : public AuraScript + void Register() override { - PrepareAuraScript(spell_dk_death_and_decay_AuraScript); + if (m_scriptSpellId == SPELL_DK_DEATH_AND_DECAY_TRIGGER) + OnHit += SpellHitFn(spell_dk_death_and_decay::RecalculateDamage); + } +}; - void HandlePeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (GetCaster() && GetTarget()) - { - int32 basePoints0 = aurEff->GetAmount(); - GetCaster()->CastCustomSpell(GetTarget(), SPELL_DK_DEATH_AND_DECAY_TRIGGER, &basePoints0, nullptr, nullptr, true, 0, aurEff); - } - } +class spell_dk_death_and_decay_aura : public AuraScript +{ + PrepareAuraScript(spell_dk_death_and_decay_aura); - void Register() override - { - if (m_scriptSpellId != SPELL_DK_DEATH_AND_DECAY_TRIGGER) - OnEffectPeriodic += AuraEffectPeriodicFn(spell_dk_death_and_decay_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void HandlePeriodic(AuraEffect const* aurEff) { - return new spell_dk_death_and_decay_AuraScript(); + PreventDefaultAction(); + if (GetCaster() && GetTarget()) + { + int32 basePoints0 = aurEff->GetAmount(); + GetCaster()->CastCustomSpell(GetTarget(), SPELL_DK_DEATH_AND_DECAY_TRIGGER, &basePoints0, nullptr, nullptr, true, 0, aurEff); + } + } + + void Register() override + { + if (m_scriptSpellId != SPELL_DK_DEATH_AND_DECAY_TRIGGER) + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dk_death_and_decay_aura::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; // 52143 - Master of Ghouls -class spell_dk_master_of_ghouls : public SpellScriptLoader +class spell_dk_master_of_ghouls : public AuraScript { -public: - spell_dk_master_of_ghouls() : SpellScriptLoader("spell_dk_master_of_ghouls") { } + PrepareAuraScript(spell_dk_master_of_ghouls); - class spell_dk_master_of_ghouls_AuraScript : public AuraScript + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_dk_master_of_ghouls_AuraScript); + Unit* target = GetTarget(); + if (target->GetTypeId() == TYPEID_PLAYER) + target->ToPlayer()->SetShowDKPet(true); + } - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_PLAYER) - target->ToPlayer()->SetShowDKPet(true); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (target->GetTypeId() == TYPEID_PLAYER) - target->ToPlayer()->SetShowDKPet(false); - } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_dk_master_of_ghouls_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_ADD_FLAT_MODIFIER, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_dk_master_of_ghouls_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_ADD_FLAT_MODIFIER, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_dk_master_of_ghouls_AuraScript(); + Unit* target = GetTarget(); + if (target->GetTypeId() == TYPEID_PLAYER) + target->ToPlayer()->SetShowDKPet(false); + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_dk_master_of_ghouls::HandleEffectApply, EFFECT_0, SPELL_AURA_ADD_FLAT_MODIFIER, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_dk_master_of_ghouls::HandleEffectRemove, EFFECT_0, SPELL_AURA_ADD_FLAT_MODIFIER, AURA_EFFECT_HANDLE_REAL); } }; // 45524 - Chains of Ice -class spell_dk_chains_of_ice : public SpellScriptLoader +class spell_dk_chains_of_ice : public SpellScript { -public: - spell_dk_chains_of_ice() : SpellScriptLoader("spell_dk_chains_of_ice") { } + PrepareSpellScript(spell_dk_chains_of_ice); - class spell_dk_chains_of_ice_SpellScript : public SpellScript + void HandleAfterCast() { - PrepareSpellScript(spell_dk_chains_of_ice_SpellScript); - - void HandleAfterCast() + if (Unit* target = GetExplTargetUnit()) { - if (Unit* target = GetExplTargetUnit()) - { - std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); - for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) - if (ihit->missCondition == SPELL_MISS_NONE && ihit->targetGUID == target->GetGUID()) - GetCaster()->CastSpell(target, 55095 /*SPELL_FROST_FEVER*/, true); - } + std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); + for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) + if (ihit->missCondition == SPELL_MISS_NONE && ihit->targetGUID == target->GetGUID()) + GetCaster()->CastSpell(target, 55095 /*SPELL_FROST_FEVER*/, true); } - - void Register() override - { - AfterCast += SpellCastFn(spell_dk_chains_of_ice_SpellScript::HandleAfterCast); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_dk_chains_of_ice_SpellScript(); } - class spell_dk_chains_of_ice_AuraScript : public AuraScript + void Register() override { - PrepareAuraScript(spell_dk_chains_of_ice_AuraScript); + AfterCast += SpellCastFn(spell_dk_chains_of_ice::HandleAfterCast); + } +}; - void HandlePeriodic(AuraEffect* aurEff) - { - // Get 0 effect aura - if (AuraEffect* slow = GetAura()->GetEffect(0)) - { - int32 newAmount = slow->GetAmount() + aurEff->GetAmount(); - if (newAmount > 0) - newAmount = 0; - slow->ChangeAmount(newAmount); - } - } +class spell_dk_chains_of_ice_aura : public AuraScript +{ + PrepareAuraScript(spell_dk_chains_of_ice_aura); - void Register() override - { - OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_dk_chains_of_ice_AuraScript::HandlePeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void HandlePeriodic(AuraEffect* aurEff) { - return new spell_dk_chains_of_ice_AuraScript(); + // Get 0 effect aura + if (AuraEffect* slow = GetAura()->GetEffect(0)) + { + int32 newAmount = slow->GetAmount() + aurEff->GetAmount(); + if (newAmount > 0) + newAmount = 0; + slow->ChangeAmount(newAmount); + } + } + + void Register() override + { + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_dk_chains_of_ice_aura::HandlePeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); } }; // 50452 - Bloodworm -class spell_dk_bloodworms : public SpellScriptLoader +class spell_dk_bloodworms : public SpellScript { -public: - spell_dk_bloodworms() : SpellScriptLoader("spell_dk_bloodworms") { } + PrepareSpellScript(spell_dk_bloodworms); - class spell_dk_bloodworms_SpellScript : public SpellScript + void HandleSummon(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_dk_bloodworms_SpellScript); + SetEffectValue(irand(2, 4)); + } - void HandleSummon(SpellEffIndex /*effIndex*/) - { - SetEffectValue(irand(2, 4)); - } - - void Register() override - { - OnEffectHit += SpellEffectFn(spell_dk_bloodworms_SpellScript::HandleSummon, EFFECT_0, SPELL_EFFECT_SUMMON); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_dk_bloodworms_SpellScript(); + OnEffectHit += SpellEffectFn(spell_dk_bloodworms::HandleSummon, EFFECT_0, SPELL_EFFECT_SUMMON); } }; // 49206 - Summon Gargoyle -class spell_dk_summon_gargoyle : public SpellScriptLoader +class spell_dk_summon_gargoyle : public SpellScript { -public: - spell_dk_summon_gargoyle() : SpellScriptLoader("spell_dk_summon_gargoyle") { } + PrepareSpellScript(spell_dk_summon_gargoyle); - class spell_dk_summon_gargoyle_SpellScript : public SpellScript + void SetDest(SpellDestination& dest) { - PrepareSpellScript(spell_dk_summon_gargoyle_SpellScript); + // Adjust effect summon position + if (GetCaster()->IsWithinLOS(dest._position.GetPositionX(), dest._position.GetPositionY(), dest._position.GetPositionZ() + 15.0f)) + dest._position.m_positionZ += 15.0f; + } - void SetDest(SpellDestination& dest) - { - // Adjust effect summon position - if (GetCaster()->IsWithinLOS(dest._position.GetPositionX(), dest._position.GetPositionY(), dest._position.GetPositionZ() + 15.0f)) - dest._position.m_positionZ += 15.0f; - } - - void Register() override - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_dk_summon_gargoyle_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_FRONT_LEFT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_dk_summon_gargoyle_SpellScript(); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_dk_summon_gargoyle::SetDest, EFFECT_0, TARGET_DEST_CASTER_FRONT_LEFT); } }; // 63611 - Improved Blood Presence -class spell_dk_improved_blood_presence_proc : public SpellScriptLoader +class spell_dk_improved_blood_presence_proc : public AuraScript { -public: - spell_dk_improved_blood_presence_proc() : SpellScriptLoader("spell_dk_improved_blood_presence_proc") { } + PrepareAuraScript(spell_dk_improved_blood_presence_proc); - class spell_dk_improved_blood_presence_proc_AuraScript : public AuraScript + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_dk_improved_blood_presence_proc_AuraScript); + return eventInfo.GetDamageInfo()->GetDamage(); + } - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetDamageInfo()->GetDamage(); - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_dk_improved_blood_presence_proc_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_dk_improved_blood_presence_proc_AuraScript(); + DoCheckProc += AuraCheckProcFn(spell_dk_improved_blood_presence_proc::CheckProc); } }; // 49217 - Wandering Plague -class spell_dk_wandering_plague_aura : public SpellScriptLoader +class spell_dk_wandering_plague_aura : public AuraScript { -public: - spell_dk_wandering_plague_aura() : SpellScriptLoader("spell_dk_wandering_plague_aura") { } + PrepareAuraScript(spell_dk_wandering_plague_aura); - class spell_dk_wandering_plague_aura_AuraScript : public AuraScript + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_dk_wandering_plague_aura_AuraScript); + const SpellInfo* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo || !eventInfo.GetActionTarget() || !eventInfo.GetDamageInfo()) + return false; - bool CheckProc(ProcEventInfo& eventInfo) - { - const SpellInfo* spellInfo = eventInfo.GetSpellInfo(); - if (!spellInfo || !eventInfo.GetActionTarget() || !eventInfo.GetDamageInfo()) - return false; + if (!roll_chance_f(eventInfo.GetActor()->GetUnitCriticalChance(BASE_ATTACK, eventInfo.GetActionTarget()))) + return false; - if (!roll_chance_f(eventInfo.GetActor()->GetUnitCriticalChance(BASE_ATTACK, eventInfo.GetActionTarget()))) - return false; + return !eventInfo.GetActor()->HasSpellCooldown(SPELL_DK_WANDERING_PLAGUE_TRIGGER); + } - return !eventInfo.GetActor()->HasSpellCooldown(SPELL_DK_WANDERING_PLAGUE_TRIGGER); - } - - // xinef: prevent default proc with castItem passed, which applies 30 sec cooldown to procing of the aura - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - eventInfo.GetActor()->AddSpellCooldown(SPELL_DK_WANDERING_PLAGUE_TRIGGER, 0, 1000); - eventInfo.GetActor()->CastCustomSpell(SPELL_DK_WANDERING_PLAGUE_TRIGGER, SPELLVALUE_BASE_POINT0, CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()), eventInfo.GetActionTarget(), TRIGGERED_FULL_MASK); - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_dk_wandering_plague_aura_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_dk_wandering_plague_aura_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + // xinef: prevent default proc with castItem passed, which applies 30 sec cooldown to procing of the aura + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { - return new spell_dk_wandering_plague_aura_AuraScript(); + PreventDefaultAction(); + + eventInfo.GetActor()->AddSpellCooldown(SPELL_DK_WANDERING_PLAGUE_TRIGGER, 0, 1000); + eventInfo.GetActor()->CastCustomSpell(SPELL_DK_WANDERING_PLAGUE_TRIGGER, SPELLVALUE_BASE_POINT0, CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()), eventInfo.GetActionTarget(), TRIGGERED_FULL_MASK); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dk_wandering_plague_aura::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dk_wandering_plague_aura::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; // 53365 - Unholy Strength -class spell_dk_rune_of_the_fallen_crusader : public SpellScriptLoader +class spell_dk_rune_of_the_fallen_crusader : public SpellScript { -public: - spell_dk_rune_of_the_fallen_crusader() : SpellScriptLoader("spell_dk_rune_of_the_fallen_crusader") { } + PrepareSpellScript(spell_dk_rune_of_the_fallen_crusader); - class spell_dk_rune_of_the_fallen_crusader_SpellScript : public SpellScript + void RecalculateDamage() { - PrepareSpellScript(spell_dk_rune_of_the_fallen_crusader_SpellScript); + std::list* targetsInfo = GetSpell()->GetUniqueTargetInfo(); + for (std::list::iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) + if (ihit->targetGUID == GetCaster()->GetGUID()) + ihit->crit = roll_chance_f(GetCaster()->GetFloatValue(PLAYER_CRIT_PERCENTAGE)); + } - void RecalculateDamage() - { - std::list* targetsInfo = GetSpell()->GetUniqueTargetInfo(); - for (std::list::iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) - if (ihit->targetGUID == GetCaster()->GetGUID()) - ihit->crit = roll_chance_f(GetCaster()->GetFloatValue(PLAYER_CRIT_PERCENTAGE)); - } - - void Register() override - { - OnHit += SpellHitFn(spell_dk_rune_of_the_fallen_crusader_SpellScript::RecalculateDamage); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_dk_rune_of_the_fallen_crusader_SpellScript(); + OnHit += SpellHitFn(spell_dk_rune_of_the_fallen_crusader::RecalculateDamage); } }; // 49222 - Bone Shield -class spell_dk_bone_shield : public SpellScriptLoader +class spell_dk_bone_shield : public AuraScript { -public: - spell_dk_bone_shield() : SpellScriptLoader("spell_dk_bone_shield") { } + PrepareAuraScript(spell_dk_bone_shield); - class spell_dk_bone_shield_AuraScript : public AuraScript + void HandleProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_dk_bone_shield_AuraScript); + PreventDefaultAction(); + if (!eventInfo.GetSpellInfo() || !eventInfo.GetSpellInfo()->IsTargetingArea()) + DropCharge(); + } - void HandleProc(ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - if (!eventInfo.GetSpellInfo() || !eventInfo.GetSpellInfo()->IsTargetingArea()) - DropCharge(); - } - - void Register() override - { - OnProc += AuraProcFn(spell_dk_bone_shield_AuraScript::HandleProc); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_dk_bone_shield_AuraScript(); + OnProc += AuraProcFn(spell_dk_bone_shield::HandleProc); } }; // 51209 - Hungering Cold -class spell_dk_hungering_cold : public SpellScriptLoader +class spell_dk_hungering_cold : public AuraScript { -public: - spell_dk_hungering_cold() : SpellScriptLoader("spell_dk_hungering_cold") { } + PrepareAuraScript(spell_dk_hungering_cold); - class spell_dk_hungering_cold_AuraScript : public AuraScript + void HandleProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_dk_hungering_cold_AuraScript); + PreventDefaultAction(); + if (eventInfo.GetDamageInfo() && eventInfo.GetDamageInfo()->GetDamage() > 0 && (!eventInfo.GetSpellInfo() || eventInfo.GetSpellInfo()->Dispel != DISPEL_DISEASE)) + SetDuration(0); + } - void HandleProc(ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - if (eventInfo.GetDamageInfo() && eventInfo.GetDamageInfo()->GetDamage() > 0 && (!eventInfo.GetSpellInfo() || eventInfo.GetSpellInfo()->Dispel != DISPEL_DISEASE)) - SetDuration(0); - } - - void Register() override - { - OnProc += AuraProcFn(spell_dk_hungering_cold_AuraScript::HandleProc); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_dk_hungering_cold_AuraScript(); + OnProc += AuraProcFn(spell_dk_hungering_cold::HandleProc); } }; // -49219 - Blood-Caked Blade -class spell_dk_blood_caked_blade : public SpellScriptLoader +class spell_dk_blood_caked_blade : public AuraScript { -public: - spell_dk_blood_caked_blade() : SpellScriptLoader("spell_dk_blood_caked_blade") { } + PrepareAuraScript(spell_dk_blood_caked_blade); - class spell_dk_blood_caked_blade_AuraScript : public AuraScript + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_dk_blood_caked_blade_AuraScript); + return eventInfo.GetActionTarget() && eventInfo.GetActionTarget()->IsAlive(); + } - bool CheckProc(ProcEventInfo& eventInfo) + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), aurEff->GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true, nullptr, aurEff); + + // Xinef: Shadowmourne hack (blood-caked blade trigger proc disabled...) + if (roll_chance_i(75) && eventInfo.GetActor()->FindMap() && !eventInfo.GetActor()->FindMap()->IsBattlegroundOrArena() && eventInfo.GetActor()->HasAura(71903) && !eventInfo.GetActor()->HasAura(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) { - return eventInfo.GetActionTarget() && eventInfo.GetActionTarget()->IsAlive(); - } + eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_SHADOWMOURNE_SOUL_FRAGMENT, true); - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), aurEff->GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true, nullptr, aurEff); - - // Xinef: Shadowmourne hack (blood-caked blade trigger proc disabled...) - if (roll_chance_i(75) && eventInfo.GetActor()->FindMap() && !eventInfo.GetActor()->FindMap()->IsBattlegroundOrArena() && eventInfo.GetActor()->HasAura(71903) && !eventInfo.GetActor()->HasAura(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) + // this can't be handled in AuraScript of SoulFragments because we need to know victim + if (Aura* soulFragments = eventInfo.GetActor()->GetAura(SPELL_SHADOWMOURNE_SOUL_FRAGMENT)) { - eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_SHADOWMOURNE_SOUL_FRAGMENT, true); - - // this can't be handled in AuraScript of SoulFragments because we need to know victim - if (Aura* soulFragments = eventInfo.GetActor()->GetAura(SPELL_SHADOWMOURNE_SOUL_FRAGMENT)) + if (soulFragments->GetStackAmount() >= 10) { - if (soulFragments->GetStackAmount() >= 10) - { - eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, true, nullptr); - soulFragments->Remove(); - } + eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, true, nullptr); + soulFragments->Remove(); } } } + } - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_dk_blood_caked_blade_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_dk_blood_caked_blade_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_dk_blood_caked_blade_AuraScript(); + DoCheckProc += AuraCheckProcFn(spell_dk_blood_caked_blade::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dk_blood_caked_blade::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; // 49028 - Dancing Rune Weapon -class spell_dk_dancing_rune_weapon : public SpellScriptLoader +class spell_dk_dancing_rune_weapon : public AuraScript { -public: - spell_dk_dancing_rune_weapon() : SpellScriptLoader("spell_dk_dancing_rune_weapon") { } + PrepareAuraScript(spell_dk_dancing_rune_weapon); - class spell_dk_dancing_rune_weapon_AuraScript : public AuraScript + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_dk_dancing_rune_weapon_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - if (!eventInfo.GetActor() || !eventInfo.GetActionTarget() || !eventInfo.GetActionTarget()->IsAlive() || eventInfo.GetActor()->GetTypeId() != TYPEID_PLAYER) - return false; - - const SpellInfo* spellInfo = eventInfo.GetSpellInfo(); - if (!spellInfo) - return true; - - // Death Coil exception, Check if spell is from spellbook - if (spellInfo->Id != SPELL_DK_DEATH_COIL_DAMAGE && !eventInfo.GetActor()->ToPlayer()->HasActiveSpell(spellInfo->Id)) - return false; - - // Can't cast raise dead/ally, death grip, dark command, death pact, death and decay, anti-magic shell - if (spellInfo->SpellFamilyFlags.HasFlag(0x20A1220, 0x10000000, 0x0)) - return false; - - // AoE can be cast only once - if (spellInfo->IsTargetingArea() && eventInfo.GetActor() != eventInfo.GetActionTarget()) - return false; - - // No spells with summoning - if (spellInfo->HasEffect(SPELL_EFFECT_SUMMON)) - return false; - - // No Positive Spells - if (spellInfo->IsPositive()) - return false; + if (!eventInfo.GetActor() || !eventInfo.GetActionTarget() || !eventInfo.GetActionTarget()->IsAlive() || eventInfo.GetActor()->GetTypeId() != TYPEID_PLAYER) + return false; + const SpellInfo* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) return true; - } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); + // Death Coil exception, Check if spell is from spellbook + if (spellInfo->Id != SPELL_DK_DEATH_COIL_DAMAGE && !eventInfo.GetActor()->ToPlayer()->HasActiveSpell(spellInfo->Id)) + return false; - Unit* player = eventInfo.GetActor(); - Unit* target = eventInfo.GetActionTarget(); - Unit* dancingRuneWeapon = nullptr; - for (Unit::ControlSet::const_iterator itr = player->m_Controlled.begin(); itr != player->m_Controlled.end(); ++itr) - if (int32((*itr)->GetEntry()) == GetSpellInfo()->Effects[EFFECT_0].MiscValue) - { - dancingRuneWeapon = *itr; - break; - } + // Can't cast raise dead/ally, death grip, dark command, death pact, death and decay, anti-magic shell + if (spellInfo->SpellFamilyFlags.HasFlag(0x20A1220, 0x10000000, 0x0)) + return false; - if (!dancingRuneWeapon) - return; + // AoE can be cast only once + if (spellInfo->IsTargetingArea() && eventInfo.GetActor() != eventInfo.GetActionTarget()) + return false; - dancingRuneWeapon->SetOrientation(dancingRuneWeapon->GetAngle(target)); - if (const SpellInfo* procSpell = eventInfo.GetSpellInfo()) - { - // xinef: ugly hack - if (!procSpell->IsAffectingArea()) - GetUnitOwner()->SetFloatValue(UNIT_FIELD_COMBATREACH, 10.0f); - dancingRuneWeapon->CastSpell(target, procSpell->Id, true, nullptr, aurEff, dancingRuneWeapon->GetGUID()); - GetUnitOwner()->SetFloatValue(UNIT_FIELD_COMBATREACH, 0.01f); - } - else if (eventInfo.GetDamageInfo()) - { - target = player->GetMeleeHitRedirectTarget(target); - CalcDamageInfo damageInfo; - player->CalculateMeleeDamage(target, 0, &damageInfo, eventInfo.GetDamageInfo()->GetAttackType()); - Unit::DealDamageMods(target, damageInfo.damage, &damageInfo.absorb); - damageInfo.attacker = dancingRuneWeapon; - damageInfo.damage /= 2.0f; - dancingRuneWeapon->SendAttackStateUpdate(&damageInfo); - dancingRuneWeapon->DealMeleeDamage(&damageInfo, true); - } - } + // No spells with summoning + if (spellInfo->HasEffect(SPELL_EFFECT_SUMMON)) + return false; - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_dk_dancing_rune_weapon_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_dk_dancing_rune_weapon_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); - } - }; + // No Positive Spells + if (spellInfo->IsPositive()) + return false; - AuraScript* GetAuraScript() const override + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { - return new spell_dk_dancing_rune_weapon_AuraScript(); + PreventDefaultAction(); + + Unit* player = eventInfo.GetActor(); + Unit* target = eventInfo.GetActionTarget(); + Unit* dancingRuneWeapon = nullptr; + for (Unit::ControlSet::const_iterator itr = player->m_Controlled.begin(); itr != player->m_Controlled.end(); ++itr) + if (int32((*itr)->GetEntry()) == GetSpellInfo()->Effects[EFFECT_0].MiscValue) + { + dancingRuneWeapon = *itr; + break; + } + + if (!dancingRuneWeapon) + return; + + dancingRuneWeapon->SetOrientation(dancingRuneWeapon->GetAngle(target)); + if (const SpellInfo* procSpell = eventInfo.GetSpellInfo()) + { + // xinef: ugly hack + if (!procSpell->IsAffectingArea()) + GetUnitOwner()->SetFloatValue(UNIT_FIELD_COMBATREACH, 10.0f); + dancingRuneWeapon->CastSpell(target, procSpell->Id, true, nullptr, aurEff, dancingRuneWeapon->GetGUID()); + GetUnitOwner()->SetFloatValue(UNIT_FIELD_COMBATREACH, 0.01f); + } + else if (eventInfo.GetDamageInfo()) + { + target = player->GetMeleeHitRedirectTarget(target); + CalcDamageInfo damageInfo; + player->CalculateMeleeDamage(target, 0, &damageInfo, eventInfo.GetDamageInfo()->GetAttackType()); + Unit::DealDamageMods(target, damageInfo.damage, &damageInfo.absorb); + damageInfo.attacker = dancingRuneWeapon; + damageInfo.damage /= 2.0f; + dancingRuneWeapon->SendAttackStateUpdate(&damageInfo); + dancingRuneWeapon->DealMeleeDamage(&damageInfo, true); + } + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dk_dancing_rune_weapon::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dk_dancing_rune_weapon::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); } }; // 53160 - Dancing Rune Weapon Visual -class spell_dk_dancing_rune_weapon_visual : public SpellScriptLoader +class spell_dk_dancing_rune_weapon_visual : public AuraScript { -public: - spell_dk_dancing_rune_weapon_visual() : SpellScriptLoader("spell_dk_dancing_rune_weapon_visual") { } + PrepareAuraScript(spell_dk_dancing_rune_weapon_visual); - class spell_dk_dancing_rune_weapon_visual_AuraScript : public AuraScript + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_dk_dancing_rune_weapon_visual_AuraScript); - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + PreventDefaultAction(); + if (Unit* owner = GetUnitOwner()->ToTempSummon()->GetSummonerUnit()) { - PreventDefaultAction(); - if (Unit* owner = GetUnitOwner()->ToTempSummon()->GetSummonerUnit()) - { - GetUnitOwner()->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, owner->GetUInt32Value(PLAYER_VISIBLE_ITEM_16_ENTRYID)); - GetUnitOwner()->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, owner->GetUInt32Value(PLAYER_VISIBLE_ITEM_17_ENTRYID)); - GetUnitOwner()->SetFloatValue(UNIT_FIELD_COMBATREACH, 0.01f); - } + GetUnitOwner()->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, owner->GetUInt32Value(PLAYER_VISIBLE_ITEM_16_ENTRYID)); + GetUnitOwner()->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, owner->GetUInt32Value(PLAYER_VISIBLE_ITEM_17_ENTRYID)); + GetUnitOwner()->SetFloatValue(UNIT_FIELD_COMBATREACH, 0.01f); } + } - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_dk_dancing_rune_weapon_visual_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_dk_dancing_rune_weapon_visual_AuraScript(); + OnEffectApply += AuraEffectApplyFn(spell_dk_dancing_rune_weapon_visual::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; // -49004 - Scent of Blood -class spell_dk_scent_of_blood_trigger : public SpellScriptLoader +class spell_dk_scent_of_blood_trigger : public AuraScript { -public: - spell_dk_scent_of_blood_trigger() : SpellScriptLoader("spell_dk_scent_of_blood_trigger") { } + PrepareAuraScript(spell_dk_scent_of_blood_trigger); - class spell_dk_scent_of_blood_trigger_AuraScript : public AuraScript + bool CheckProc(ProcEventInfo& eventInfo) { - PrepareAuraScript(spell_dk_scent_of_blood_trigger_AuraScript); + return (eventInfo.GetHitMask() & (PROC_EX_DODGE | PROC_EX_PARRY)) || eventInfo.GetDamageInfo()->GetDamage(); + } - bool CheckProc(ProcEventInfo& eventInfo) - { - return (eventInfo.GetHitMask() & (PROC_EX_DODGE | PROC_EX_PARRY)) || eventInfo.GetDamageInfo()->GetDamage(); - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_dk_scent_of_blood_trigger_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_dk_scent_of_blood_trigger_AuraScript(); + DoCheckProc += AuraCheckProcFn(spell_dk_scent_of_blood_trigger::CheckProc); } }; /* 51996 - Death Knight Pet Scaling 02 54566 - Death Knight Pet Scaling 01 61697 - Death Knight Pet Scaling 03 */ -class spell_dk_pet_scaling : public SpellScriptLoader +class spell_dk_pet_scaling : public AuraScript { -public: - spell_dk_pet_scaling() : SpellScriptLoader("spell_dk_pet_scaling") { } + PrepareAuraScript(spell_dk_pet_scaling); - class spell_dk_pet_scaling_AuraScript : public AuraScript + void CalculateStatAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_dk_pet_scaling_AuraScript); + Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); - void CalculateStatAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + // xinef: dk ghoul inherits 70% of strength and 30% of stamina + if (GetUnitOwner()->GetEntry() != NPC_RISEN_GHOUL) { - Stats stat = Stats(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].MiscValue); + // xinef: ebon garogyle - inherit 30% of stamina + if (GetUnitOwner()->GetEntry() == NPC_EBON_GARGOYLE && stat == STAT_STAMINA) + if (Unit* owner = GetUnitOwner()->GetOwner()) + amount = CalculatePct(std::max(0, owner->GetStat(stat)), 30); + return; + } - // xinef: dk ghoul inherits 70% of strength and 30% of stamina - if (GetUnitOwner()->GetEntry() != NPC_RISEN_GHOUL) + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + int32 modifier = stat == STAT_STRENGTH ? 70 : 30; + + // Check just if owner has Ravenous Dead since it's effect is not an aura + if (AuraEffect const* rdEff = owner->GetAuraEffect(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, SPELLFAMILY_DEATHKNIGHT, 3010, 0)) { - // xinef: ebon garogyle - inherit 30% of stamina - if (GetUnitOwner()->GetEntry() == NPC_EBON_GARGOYLE && stat == STAT_STAMINA) - if (Unit* owner = GetUnitOwner()->GetOwner()) - amount = CalculatePct(std::max(0, owner->GetStat(stat)), 30); - return; + SpellInfo const* spellInfo = rdEff->GetSpellInfo(); // Then get the SpellProto and add the dummy effect value + AddPct(modifier, spellInfo->Effects[EFFECT_1].CalcValue()); // Ravenous Dead edits the original scale } - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 modifier = stat == STAT_STRENGTH ? 70 : 30; + // xinef: Glyph of the Ghoul + if (AuraEffect const* glyphEff = owner->GetAuraEffect(SPELL_DK_GLYPH_OF_THE_GHOUL, EFFECT_0)) + modifier += glyphEff->GetAmount(); - // Check just if owner has Ravenous Dead since it's effect is not an aura - if (AuraEffect const* rdEff = owner->GetAuraEffect(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, SPELLFAMILY_DEATHKNIGHT, 3010, 0)) + amount = CalculatePct(std::max(0, owner->GetStat(stat)), modifier); + } + } + + void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: dk gargoyle inherits 33% of SP + if (GetUnitOwner()->GetEntry() != NPC_EBON_GARGOYLE) + return; + + if (Unit* owner = GetUnitOwner()->GetOwner()) + { + int32 modifier = 33; + + // xinef: impurity + if (owner->GetDummyAuraEffect(SPELLFAMILY_DEATHKNIGHT, 1986, 0)) + modifier = 40; + + amount = CalculatePct(std::max(0, owner->GetTotalAttackPowerValue(BASE_ATTACK)), modifier); + + // xinef: Update appropriate player field + if (owner->GetTypeId() == TYPEID_PLAYER) + owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); + } + } + + void CalculateHasteAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // xinef: scale haste with owners melee haste + if (Unit* owner = GetUnitOwner()->GetOwner()) + if (owner->m_modAttackSpeedPct[BASE_ATTACK] < 1.0f) // inherit haste only + amount = std::min(100, int32(((1.0f / owner->m_modAttackSpeedPct[BASE_ATTACK]) - 1.0f) * 100.0f)); + } + + void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (aurEff->GetAuraType() != SPELL_AURA_MELEE_SLOW) + return; + + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, true, SPELL_BLOCK_TYPE_POSITIVE); + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_MELEE_RANGED_HASTE, true, SPELL_BLOCK_TYPE_POSITIVE); + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MELEE_SLOW, true, SPELL_BLOCK_TYPE_POSITIVE); + + if (GetUnitOwner()->IsPet()) + return; + + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_STAT, true, SPELL_BLOCK_TYPE_POSITIVE); + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER, true, SPELL_BLOCK_TYPE_POSITIVE); + GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); + } + + void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) + { + if (!GetUnitOwner()->IsPet()) + return; + + isPeriodic = true; + amplitude = 2 * IN_MILLISECONDS; + } + + void HandlePeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT && (aurEff->GetMiscValue() == STAT_STAMINA || aurEff->GetMiscValue() == STAT_INTELLECT)) + { + int32 currentAmount = aurEff->GetAmount(); + int32 newAmount = GetEffect(aurEff->GetEffIndex())->CalculateAmount(GetCaster()); + if (newAmount != currentAmount) + { + if (aurEff->GetMiscValue() == STAT_STAMINA) { - SpellInfo const* spellInfo = rdEff->GetSpellInfo(); // Then get the SpellProto and add the dummy effect value - AddPct(modifier, spellInfo->Effects[EFFECT_1].CalcValue()); // Ravenous Dead edits the original scale + uint32 actStat = GetUnitOwner()->GetHealth(); + GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); + GetUnitOwner()->SetHealth(std::min(GetUnitOwner()->GetMaxHealth(), actStat)); } - - // xinef: Glyph of the Ghoul - if (AuraEffect const* glyphEff = owner->GetAuraEffect(SPELL_DK_GLYPH_OF_THE_GHOUL, EFFECT_0)) - modifier += glyphEff->GetAmount(); - - amount = CalculatePct(std::max(0, owner->GetStat(stat)), modifier); - } - } - - void CalculateSPAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - // xinef: dk gargoyle inherits 33% of SP - if (GetUnitOwner()->GetEntry() != NPC_EBON_GARGOYLE) - return; - - if (Unit* owner = GetUnitOwner()->GetOwner()) - { - int32 modifier = 33; - - // xinef: impurity - if (owner->GetDummyAuraEffect(SPELLFAMILY_DEATHKNIGHT, 1986, 0)) - modifier = 40; - - amount = CalculatePct(std::max(0, owner->GetTotalAttackPowerValue(BASE_ATTACK)), modifier); - - // xinef: Update appropriate player field - if (owner->GetTypeId() == TYPEID_PLAYER) - owner->SetUInt32Value(PLAYER_PET_SPELL_POWER, (uint32)amount); - } - } - - void CalculateHasteAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - // xinef: scale haste with owners melee haste - if (Unit* owner = GetUnitOwner()->GetOwner()) - if (owner->m_modAttackSpeedPct[BASE_ATTACK] < 1.0f) // inherit haste only - amount = std::min(100, int32(((1.0f / owner->m_modAttackSpeedPct[BASE_ATTACK]) - 1.0f) * 100.0f)); - } - - void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (aurEff->GetAuraType() != SPELL_AURA_MELEE_SLOW) - return; - - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, true, SPELL_BLOCK_TYPE_POSITIVE); - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_MELEE_RANGED_HASTE, true, SPELL_BLOCK_TYPE_POSITIVE); - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MELEE_SLOW, true, SPELL_BLOCK_TYPE_POSITIVE); - - if (GetUnitOwner()->IsPet()) - return; - - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_STAT, true, SPELL_BLOCK_TYPE_POSITIVE); - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, true, SPELL_BLOCK_TYPE_POSITIVE); - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER, true, SPELL_BLOCK_TYPE_POSITIVE); - GetUnitOwner()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_ATTACK_POWER_PCT, true, SPELL_BLOCK_TYPE_POSITIVE); - } - - void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) - { - if (!GetUnitOwner()->IsPet()) - return; - - isPeriodic = true; - amplitude = 2 * IN_MILLISECONDS; - } - - void HandlePeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (aurEff->GetAuraType() == SPELL_AURA_MOD_STAT && (aurEff->GetMiscValue() == STAT_STAMINA || aurEff->GetMiscValue() == STAT_INTELLECT)) - { - int32 currentAmount = aurEff->GetAmount(); - int32 newAmount = GetEffect(aurEff->GetEffIndex())->CalculateAmount(GetCaster()); - if (newAmount != currentAmount) + else { - if (aurEff->GetMiscValue() == STAT_STAMINA) - { - uint32 actStat = GetUnitOwner()->GetHealth(); - GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); - GetUnitOwner()->SetHealth(std::min(GetUnitOwner()->GetMaxHealth(), actStat)); - } - else - { - uint32 actStat = GetUnitOwner()->GetPower(POWER_MANA); - GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); - GetUnitOwner()->SetPower(POWER_MANA, std::min(GetUnitOwner()->GetMaxPower(POWER_MANA), actStat)); - } + uint32 actStat = GetUnitOwner()->GetPower(POWER_MANA); + GetEffect(aurEff->GetEffIndex())->ChangeAmount(newAmount, false); + GetUnitOwner()->SetPower(POWER_MANA, std::min(GetUnitOwner()->GetMaxPower(POWER_MANA), actStat)); } } - else - GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); } + else + GetEffect(aurEff->GetEffIndex())->RecalculateAmount(); + } - void Register() override - { - if (m_scriptSpellId == 54566) - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_pet_scaling_AuraScript::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_pet_scaling_AuraScript::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); - } - - if (m_scriptSpellId == 51996) - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_pet_scaling_AuraScript::CalculateHasteAmount, EFFECT_ALL, SPELL_AURA_MELEE_SLOW); - - OnEffectApply += AuraEffectApplyFn(spell_dk_pet_scaling_AuraScript::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_dk_pet_scaling_AuraScript::CalcPeriodic, EFFECT_ALL, SPELL_AURA_ANY); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_dk_pet_scaling_AuraScript::HandlePeriodic, EFFECT_ALL, SPELL_AURA_ANY); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_dk_pet_scaling_AuraScript(); + if (m_scriptSpellId == 54566) + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_pet_scaling::CalculateStatAmount, EFFECT_ALL, SPELL_AURA_MOD_STAT); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_pet_scaling::CalculateSPAmount, EFFECT_ALL, SPELL_AURA_MOD_DAMAGE_DONE); + } + + if (m_scriptSpellId == 51996) + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_pet_scaling::CalculateHasteAmount, EFFECT_ALL, SPELL_AURA_MELEE_SLOW); + + OnEffectApply += AuraEffectApplyFn(spell_dk_pet_scaling::HandleEffectApply, EFFECT_ALL, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_dk_pet_scaling::CalcPeriodic, EFFECT_ALL, SPELL_AURA_ANY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dk_pet_scaling::HandlePeriodic, EFFECT_ALL, SPELL_AURA_ANY); } }; // 50462 - Anti-Magic Zone (on raid member) -class spell_dk_anti_magic_shell_raid : public SpellScriptLoader +class spell_dk_anti_magic_shell_raid : public AuraScript { -public: - spell_dk_anti_magic_shell_raid() : SpellScriptLoader("spell_dk_anti_magic_shell_raid") { } + PrepareAuraScript(spell_dk_anti_magic_shell_raid); - class spell_dk_anti_magic_shell_raid_AuraScript : public AuraScript + uint32 absorbPct; + + bool Load() override { - PrepareAuraScript(spell_dk_anti_magic_shell_raid_AuraScript); + absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + return true; + } - uint32 absorbPct; - - bool Load() override - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - return true; - } - - 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; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) - { - absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); - } - - 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); - } - }; - - AuraScript* GetAuraScript() const override + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - return new spell_dk_anti_magic_shell_raid_AuraScript(); + // TODO: this should absorb limited amount of damage, but no info on calculation formula + amount = -1; + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_shell_raid::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_raid::Absorb, EFFECT_0); } }; // 48707 - Anti-Magic Shell (on self) -class spell_dk_anti_magic_shell_self : public SpellScriptLoader +class spell_dk_anti_magic_shell_self : public AuraScript { -public: - spell_dk_anti_magic_shell_self() : SpellScriptLoader("spell_dk_anti_magic_shell_self") { } + PrepareAuraScript(spell_dk_anti_magic_shell_self); - class spell_dk_anti_magic_shell_self_AuraScript : public AuraScript + uint32 absorbPct, hpPct; + bool Load() override { - PrepareAuraScript(spell_dk_anti_magic_shell_self_AuraScript); + absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + hpPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster()); + return true; + } - uint32 absorbPct, hpPct; - bool Load() override - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - hpPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster()); - return true; - } - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DK_RUNIC_POWER_ENERGIZE }); - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - amount = GetCaster()->CountPctFromMaxHealth(hpPct); - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) - { - absorbAmount = std::min(CalculatePct(dmgInfo.GetDamage(), absorbPct), GetTarget()->CountPctFromMaxHealth(hpPct)); - } - - 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, nullptr, aurEff); - } - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->ApplySpellImmune(GetId(), IMMUNITY_ID, 33786, true); // cyclone - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->ApplySpellImmune(GetId(), IMMUNITY_ID, 33786, false); // cyclone - } - - 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); - - OnEffectApply += AuraEffectApplyFn(spell_dk_anti_magic_shell_self_AuraScript::HandleEffectApply, EFFECT_1, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_dk_anti_magic_shell_self_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + bool Validate(SpellInfo const* /*spellInfo*/) override { - return new spell_dk_anti_magic_shell_self_AuraScript(); + return ValidateSpellInfo({ SPELL_DK_RUNIC_POWER_ENERGIZE }); + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + amount = GetCaster()->CountPctFromMaxHealth(hpPct); + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + absorbAmount = std::min(CalculatePct(dmgInfo.GetDamage(), absorbPct), GetTarget()->CountPctFromMaxHealth(hpPct)); + } + + 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, nullptr, aurEff); + } + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->ApplySpellImmune(GetId(), IMMUNITY_ID, 33786, true); // cyclone + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->ApplySpellImmune(GetId(), IMMUNITY_ID, 33786, false); // cyclone + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_shell_self::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_self::Absorb, EFFECT_0); + AfterEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_self::Trigger, EFFECT_0); + + OnEffectApply += AuraEffectApplyFn(spell_dk_anti_magic_shell_self::HandleEffectApply, EFFECT_1, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_dk_anti_magic_shell_self::HandleEffectRemove, EFFECT_1, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, AURA_EFFECT_HANDLE_REAL); } }; // 50461 - Anti-Magic Zone -class spell_dk_anti_magic_zone : public SpellScriptLoader +class spell_dk_anti_magic_zone : public AuraScript { -public: - spell_dk_anti_magic_zone() : SpellScriptLoader("spell_dk_anti_magic_zone") { } + PrepareAuraScript(spell_dk_anti_magic_zone); - class spell_dk_anti_magic_zone_AuraScript : public AuraScript + uint32 absorbPct; + + bool Load() override { - PrepareAuraScript(spell_dk_anti_magic_zone_AuraScript); + absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + return true; + } - uint32 absorbPct; - - bool Load() override - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - return true; - } - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DK_ANTI_MAGIC_SHELL_TALENT }); - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - SpellInfo const* talentSpell = sSpellMgr->AssertSpellInfo(SPELL_DK_ANTI_MAGIC_SHELL_TALENT); - - Unit* owner = GetCaster()->GetOwner(); - if (!owner) - { - return; - } - - amount = talentSpell->Effects[EFFECT_0].CalcValue(owner); - if (Player* player = owner->ToPlayer()) - { - amount += int32(2 * player->GetTotalAttackPowerValue(BASE_ATTACK)); - } - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) - { - absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); - } - - 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); - } - }; - - AuraScript* GetAuraScript() const override + bool Validate(SpellInfo const* /*spellInfo*/) override { - return new spell_dk_anti_magic_zone_AuraScript(); + return ValidateSpellInfo({ SPELL_DK_ANTI_MAGIC_SHELL_TALENT }); + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + SpellInfo const* talentSpell = sSpellMgr->AssertSpellInfo(SPELL_DK_ANTI_MAGIC_SHELL_TALENT); + + Unit* owner = GetCaster()->GetOwner(); + if (!owner) + { + return; + } + + amount = talentSpell->Effects[EFFECT_0].CalcValue(owner); + if (Player* player = owner->ToPlayer()) + { + amount += int32(2 * player->GetTotalAttackPowerValue(BASE_ATTACK)); + } + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_zone::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_zone::Absorb, EFFECT_0); } }; // -48721 - Blood Boil -class spell_dk_blood_boil : public SpellScriptLoader +class spell_dk_blood_boil : public SpellScript { -public: - spell_dk_blood_boil() : SpellScriptLoader("spell_dk_blood_boil") { } + PrepareSpellScript(spell_dk_blood_boil); - class spell_dk_blood_boil_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_dk_blood_boil_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DK_BLOOD_BOIL_TRIGGERED }); - } - - bool Load() override - { - _executed = false; - return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCaster()->getClass() == CLASS_DEATH_KNIGHT; - } - - void HandleAfterHit() - { - if (_executed || !GetHitUnit()) - 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(); + return ValidateSpellInfo({ SPELL_DK_BLOOD_BOIL_TRIGGERED }); } + + bool Load() override + { + _executed = false; + return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCaster()->getClass() == CLASS_DEATH_KNIGHT; + } + + void HandleAfterHit() + { + if (_executed || !GetHitUnit()) + return; + + _executed = true; + GetCaster()->CastSpell(GetCaster(), SPELL_DK_BLOOD_BOIL_TRIGGERED, true); + } + + void Register() override + { + AfterHit += SpellHitFn(spell_dk_blood_boil::HandleAfterHit); + } + + bool _executed; }; // 50453 - Bloodworms Health Leech -class spell_dk_blood_gorged : public SpellScriptLoader +class spell_dk_blood_gorged : public AuraScript { -public: - spell_dk_blood_gorged() : SpellScriptLoader("spell_dk_blood_gorged") { } + PrepareAuraScript(spell_dk_blood_gorged); - class spell_dk_blood_gorged_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_dk_blood_gorged_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DK_BLOOD_GORGED_HEAL }); - } - - bool Load() override - { - _procTarget = nullptr; - return true; - } - - bool CheckProc(ProcEventInfo& /*eventInfo*/) - { - _procTarget = GetTarget()->GetOwner(); - return _procTarget; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - - if (!damageInfo || !damageInfo->GetDamage()) - { - return; - } - - int32 bp = static_cast(damageInfo->GetDamage() * 1.5f); - GetTarget()->CastCustomSpell(SPELL_DK_BLOOD_GORGED_HEAL, SPELLVALUE_BASE_POINT0, bp, _procTarget, true, nullptr, aurEff); - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_dk_blood_gorged_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_dk_blood_gorged_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - - private: - Unit* _procTarget; - }; - - AuraScript* GetAuraScript() const override - { - return new spell_dk_blood_gorged_AuraScript(); + return ValidateSpellInfo({ SPELL_DK_BLOOD_GORGED_HEAL }); } + + bool Load() override + { + _procTarget = nullptr; + return true; + } + + bool CheckProc(ProcEventInfo& /*eventInfo*/) + { + _procTarget = GetTarget()->GetOwner(); + return _procTarget; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + + if (!damageInfo || !damageInfo->GetDamage()) + { + return; + } + + int32 bp = static_cast(damageInfo->GetDamage() * 1.5f); + GetTarget()->CastCustomSpell(SPELL_DK_BLOOD_GORGED_HEAL, SPELLVALUE_BASE_POINT0, bp, _procTarget, true, nullptr, aurEff); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dk_blood_gorged::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dk_blood_gorged::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + +private: + Unit* _procTarget; }; class CorpseExplosionCheck @@ -1357,834 +1083,691 @@ private: }; // -49158 - Corpse Explosion -class spell_dk_corpse_explosion : public SpellScriptLoader +class spell_dk_corpse_explosion : public SpellScript { -public: - spell_dk_corpse_explosion() : SpellScriptLoader("spell_dk_corpse_explosion") { } + PrepareSpellScript(spell_dk_corpse_explosion); - class spell_dk_corpse_explosion_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_dk_corpse_explosion_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_DK_CORPSE_EXPLOSION_TRIGGERED, - SPELL_DK_GHOUL_EXPLODE, - SPELL_DK_CORPSE_EXPLOSION_VISUAL, - }); - } - - bool Load() override - { - _target = nullptr; - return true; - } - - void CheckTarget(WorldObject*& target) - { - if (CorpseExplosionCheck(GetCaster()->GetGUID(), true)(target)) - target = nullptr; - - _target = target; - } - - void CheckTargets(std::list& targets) - { - WorldObject* target = _target; - if (!target) + return ValidateSpellInfo( { - targets.remove_if(CorpseExplosionCheck(GetCaster()->GetGUID(), false)); - if (targets.empty()) - { - FinishCast(SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW); - return; - } - target = Acore::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } - else - targets.clear(); - } - - void HandleDamage(SpellEffIndex effIndex, Unit* target) - { - if (effIndex == EFFECT_0) - GetCaster()->CastCustomSpell(GetSpellInfo()->Effects[EFFECT_1].CalcValue(), SPELLVALUE_BASE_POINT0, GetEffectValue(), target, true); - else if (effIndex == EFFECT_1) - GetCaster()->CastCustomSpell(GetEffectValue(), SPELLVALUE_BASE_POINT0, GetSpell()->CalculateSpellDamage(EFFECT_0, nullptr), target, true); - } - - void HandleCorpseExplosion(SpellEffIndex effIndex) - { - if (Unit* unitTarget = GetHitUnit()) - { - if (unitTarget->IsAlive()) // Living ghoul as a target - { - unitTarget->ToCreature()->m_CreatureSpellCooldowns.clear(); - if (CharmInfo* charmInfo = unitTarget->GetCharmInfo()) - charmInfo->GetGlobalCooldownMgr().CancelGlobalCooldown(sSpellMgr->GetSpellInfo(SPELL_DK_GHOUL_EXPLODE)); - - unitTarget->StopMoving(); - unitTarget->CastSpell(unitTarget, SPELL_DK_GHOUL_EXPLODE, false); - // Corpse Explosion (Suicide) and Set corpse look handled in SpellScript of SPELL_DK_GHOUL_EXPLODE - } - else // Some corpse - { - HandleDamage(effIndex, unitTarget); - // Corpse Explosion (Suicide) - unitTarget->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_TRIGGERED, true); - // Set corpse look - GetCaster()->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_VISUAL, true); - } - } - } - - void Register() override - { - OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dk_corpse_explosion_SpellScript::CheckTarget, EFFECT_0, TARGET_UNIT_TARGET_ANY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_corpse_explosion_SpellScript::CheckTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_dk_corpse_explosion_SpellScript::HandleCorpseExplosion, EFFECT_0, SPELL_EFFECT_DUMMY); - OnEffectHitTarget += SpellEffectFn(spell_dk_corpse_explosion_SpellScript::HandleCorpseExplosion, EFFECT_1, SPELL_EFFECT_DUMMY); - } - - private: - WorldObject* _target; - }; - - SpellScript* GetSpellScript() const override - { - return new spell_dk_corpse_explosion_SpellScript(); + SPELL_DK_CORPSE_EXPLOSION_TRIGGERED, + SPELL_DK_GHOUL_EXPLODE, + SPELL_DK_CORPSE_EXPLOSION_VISUAL, + }); } -}; -// -62900, -47541, 52375, 59134 - Death Coil -class spell_dk_death_coil : public SpellScriptLoader -{ -public: - spell_dk_death_coil() : SpellScriptLoader("spell_dk_death_coil") { } - - class spell_dk_death_coil_SpellScript : public SpellScript + bool Load() override { - PrepareSpellScript(spell_dk_death_coil_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_DK_DEATH_COIL_DAMAGE, SPELL_DK_DEATH_COIL_HEAL }); - } - - 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, nullptr, nullptr, true); - } - else - { - 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, nullptr, nullptr, true); - } - } - } - - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - if (Unit* target = GetExplTargetUnit()) - { - if (!caster->IsFriendlyTo(target) && !caster->isInFront(target)) - return SPELL_FAILED_UNIT_NOT_INFRONT; - - if (target->IsFriendlyTo(caster) && target->GetCreatureType() != CREATURE_TYPE_UNDEAD) - return SPELL_FAILED_BAD_TARGETS; - } - else - return SPELL_FAILED_BAD_TARGETS; - - return SPELL_CAST_OK; - } - - void Register() override - { - OnCheckCast += SpellCheckCastFn(spell_dk_death_coil_SpellScript::CheckCast); - OnEffectHitTarget += SpellEffectFn(spell_dk_death_coil_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_dk_death_coil_SpellScript(); + _target = nullptr; + return true; } -}; -// 52751 - Death Gate -class spell_dk_death_gate : public SpellScriptLoader -{ -public: - spell_dk_death_gate() : SpellScriptLoader("spell_dk_death_gate") { } - - class spell_dk_death_gate_SpellScript : public SpellScript + void CheckTarget(WorldObject*& target) { - PrepareSpellScript(spell_dk_death_gate_SpellScript); + if (CorpseExplosionCheck(GetCaster()->GetGUID(), true)(target)) + target = nullptr; - SpellCastResult CheckClass() - { - if (GetCaster()->getClass() != CLASS_DEATH_KNIGHT) - { - SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_BE_DEATH_KNIGHT); - return SPELL_FAILED_CUSTOM_ERROR; - } - - return SPELL_CAST_OK; - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(target, GetEffectValue(), false); - } - - void Register() override - { - OnCheckCast += SpellCheckCastFn(spell_dk_death_gate_SpellScript::CheckClass); - OnEffectHitTarget += SpellEffectFn(spell_dk_death_gate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_dk_death_gate_SpellScript(); + _target = target; } -}; -// 49560, 49576 - Death Grip -class spell_dk_death_grip : public SpellScriptLoader -{ -public: - spell_dk_death_grip() : SpellScriptLoader("spell_dk_death_grip") { } - - class spell_dk_death_grip_SpellScript : public SpellScript + void CheckTargets(std::list& targets) { - PrepareSpellScript(spell_dk_death_grip_SpellScript); - - SpellCastResult CheckCast() + WorldObject* target = _target; + if (!target) { - Unit* caster = GetCaster(); - Unit* target = GetExplTargetUnit(); - - if (target->GetTypeId() == TYPEID_PLAYER && caster->GetExactDist(target) < 8.0f) // xinef: should be 8.0f, but we have to add target size (1.5f) - return SPELL_FAILED_TOO_CLOSE; - - if (caster->HasUnitState(UNIT_STATE_JUMPING) || caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING)) - return SPELL_FAILED_MOVING; - - return SPELL_CAST_OK; - } - - uint32 EntryCheck(uint32 entry) - { - Creature* targetCreature = GetHitCreature(); - - switch (targetCreature->GetEntry()) + targets.remove_if(CorpseExplosionCheck(GetCaster()->GetGUID(), false)); + if (targets.empty()) { - //Alliance Faction Champions - case 34461: - case 34460: - case 34469: - case 34467: - case 34468: - case 34465: - case 34471: - case 34466: - case 34473: - case 34472: - case 34470: - case 34463: - case 34474: - case 34475: - - //Horde Faction Champions - case 34458: - case 34451: - case 34459: - case 34448: - case 34449: - case 34445: - case 34456: - case 34447: - case 34441: - case 34454: - case 34444: - case 34455: - case 34450: - case 34453: - return entry; - break; + FinishCast(SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW); + return; } - return 0; + target = Acore::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); } - - void HandleBaseDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - Unit* target = GetHitUnit(); - Unit* baseTarget = GetExplTargetUnit(); - Creature* targetCreature = GetHitCreature(); - - if (caster != target) - { - if (targetCreature && (targetCreature->isWorldBoss() || targetCreature->IsDungeonBoss()) && targetCreature->GetEntry() != EntryCheck(targetCreature->GetEntry())) - { - return; - } - else - { - caster->CastSpell(target, 49560, true); - const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(1766); // Rogue kick - if (!target->IsImmunedToSpellEffect(spellInfo, EFFECT_0)) - target->InterruptNonMeleeSpells(true); - } - } - else - baseTarget->CastSpell(caster, 49560, true); - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - float casterZ = GetCaster()->GetPositionZ(); // for Ring of Valor - WorldLocation gripPos = *GetExplTargetDest(); - if (Unit* target = GetHitUnit()) - if (!target->HasAuraType(SPELL_AURA_DEFLECT_SPELLS) || target->HasUnitState(UNIT_STATE_STUNNED)) // Deterrence - { - if (target != GetCaster()) - { - const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(1766); // Rogue kick - if (!target->IsImmunedToSpellEffect(spellInfo, EFFECT_0)) - target->InterruptNonMeleeSpells(false, 0, false); - } - - if (target->GetMapId() == 618) // for Ring of Valor - gripPos.m_positionZ = std::max(casterZ + 0.2f, 28.5f); - - target->CastSpell(gripPos.GetPositionX(), gripPos.GetPositionY(), gripPos.GetPositionZ(), 57604, true); - } - } - - void Register() override - { - if (m_scriptSpellId == 49576) // xinef: base death grip, add pvp range restriction - { - OnCheckCast += SpellCheckCastFn(spell_dk_death_grip_SpellScript::CheckCast); - OnEffectHitTarget += SpellEffectFn(spell_dk_death_grip_SpellScript::HandleBaseDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - else - OnEffectHitTarget += SpellEffectFn(spell_dk_death_grip_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_dk_death_grip_SpellScript(); + else + targets.clear(); } -}; -// 48743 - Death Pact -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 + void HandleDamage(SpellEffIndex effIndex, Unit* target) { - 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::ControlSet::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; - } - - void FilterTargets(std::list& targetList) - { - Unit* target = nullptr; - for (std::list::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) - { - // xinef: remove all auras preventing effect execution - target->RemoveAllAurasOnDeath(); - targetList.push_back(target); - } - } - - 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); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_dk_death_pact_SpellScript(); + if (effIndex == EFFECT_0) + GetCaster()->CastCustomSpell(GetSpellInfo()->Effects[EFFECT_1].CalcValue(), SPELLVALUE_BASE_POINT0, GetEffectValue(), target, true); + else if (effIndex == EFFECT_1) + GetCaster()->CastCustomSpell(GetEffectValue(), SPELLVALUE_BASE_POINT0, GetSpell()->CalculateSpellDamage(EFFECT_0, nullptr), target, true); } -}; -// -49998 - Death Strike -class spell_dk_death_strike : public SpellScriptLoader -{ -public: - spell_dk_death_strike() : SpellScriptLoader("spell_dk_death_strike") { } - - class spell_dk_death_strike_SpellScript : public SpellScript + void HandleCorpseExplosion(SpellEffIndex effIndex) { - PrepareSpellScript(spell_dk_death_strike_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override + if (Unit* unitTarget = GetHitUnit()) { - return ValidateSpellInfo({ SPELL_DK_DEATH_STRIKE_HEAL }); - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) + if (unitTarget->IsAlive()) // Living ghoul as a target { - uint32 count = target->GetDiseasesByCaster(caster->GetGUID()); - int32 bp = int32(count * caster->CountPctFromMaxHealth(int32(GetSpellInfo()->Effects[EFFECT_0].DamageMultiplier))); - // Improved Death Strike - if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DEATHKNIGHT, DK_ICON_ID_IMPROVED_DEATH_STRIKE, 0)) - AddPct(bp, caster->CalculateSpellDamage(caster, aurEff->GetSpellInfo(), 2)); - caster->CastCustomSpell(caster, SPELL_DK_DEATH_STRIKE_HEAL, &bp, nullptr, nullptr, false); + unitTarget->ToCreature()->m_CreatureSpellCooldowns.clear(); + if (CharmInfo* charmInfo = unitTarget->GetCharmInfo()) + charmInfo->GetGlobalCooldownMgr().CancelGlobalCooldown(sSpellMgr->GetSpellInfo(SPELL_DK_GHOUL_EXPLODE)); + + unitTarget->StopMoving(); + unitTarget->CastSpell(unitTarget, SPELL_DK_GHOUL_EXPLODE, false); + // Corpse Explosion (Suicide) and Set corpse look handled in SpellScript of SPELL_DK_GHOUL_EXPLODE } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_dk_death_strike_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_dk_death_strike_SpellScript(); - } -}; - -// 47496 - Explode -class spell_dk_ghoul_explode : public SpellScriptLoader -{ -public: - spell_dk_ghoul_explode() : SpellScriptLoader("spell_dk_ghoul_explode") { } - - class spell_dk_ghoul_explode_SpellScript : public SpellScript - { - PrepareSpellScript(spell_dk_ghoul_explode_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DK_CORPSE_EXPLOSION_TRIGGERED }); - } - - void HandleDamage(SpellEffIndex /*effIndex*/) - { - int32 value = int32(GetCaster()->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue(GetCaster()))); - SetEffectValue(value); - } - - void Suicide(SpellEffIndex /*effIndex*/) - { - if (Unit* unitTarget = GetHitUnit()) + else // Some corpse { + HandleDamage(effIndex, unitTarget); // Corpse Explosion (Suicide) unitTarget->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_TRIGGERED, true); // Set corpse look GetCaster()->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_VISUAL, true); } } + } - void Register() override - { - OnEffectLaunchTarget += SpellEffectFn(spell_dk_ghoul_explode_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - OnEffectHitTarget += SpellEffectFn(spell_dk_ghoul_explode_SpellScript::Suicide, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_dk_ghoul_explode_SpellScript(); + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dk_corpse_explosion::CheckTarget, EFFECT_0, TARGET_UNIT_TARGET_ANY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_corpse_explosion::CheckTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_dk_corpse_explosion::HandleCorpseExplosion, EFFECT_0, SPELL_EFFECT_DUMMY); + OnEffectHitTarget += SpellEffectFn(spell_dk_corpse_explosion::HandleCorpseExplosion, EFFECT_1, SPELL_EFFECT_DUMMY); + } + +private: + WorldObject* _target; +}; + +// -62900, -47541, 52375, 59134 - Death Coil +class spell_dk_death_coil : public SpellScript +{ + PrepareSpellScript(spell_dk_death_coil); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_DK_DEATH_COIL_DAMAGE, SPELL_DK_DEATH_COIL_HEAL }); + } + + 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, nullptr, nullptr, true); + } + else + { + 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, nullptr, nullptr, true); + } + } + } + + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + if (Unit* target = GetExplTargetUnit()) + { + if (!caster->IsFriendlyTo(target) && !caster->isInFront(target)) + return SPELL_FAILED_UNIT_NOT_INFRONT; + + if (target->IsFriendlyTo(caster) && target->GetCreatureType() != CREATURE_TYPE_UNDEAD) + return SPELL_FAILED_BAD_TARGETS; + } + else + return SPELL_FAILED_BAD_TARGETS; + + return SPELL_CAST_OK; + } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_dk_death_coil::CheckCast); + OnEffectHitTarget += SpellEffectFn(spell_dk_death_coil::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 52751 - Death Gate +class spell_dk_death_gate : public SpellScript +{ + PrepareSpellScript(spell_dk_death_gate); + + SpellCastResult CheckClass() + { + if (GetCaster()->getClass() != CLASS_DEATH_KNIGHT) + { + SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_BE_DEATH_KNIGHT); + return SPELL_FAILED_CUSTOM_ERROR; + } + + return SPELL_CAST_OK; + } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, GetEffectValue(), false); + } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_dk_death_gate::CheckClass); + OnEffectHitTarget += SpellEffectFn(spell_dk_death_gate::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 49560, 49576 - Death Grip +class spell_dk_death_grip : public SpellScript +{ + PrepareSpellScript(spell_dk_death_grip); + + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + Unit* target = GetExplTargetUnit(); + + if (target->GetTypeId() == TYPEID_PLAYER && caster->GetExactDist(target) < 8.0f) // xinef: should be 8.0f, but we have to add target size (1.5f) + return SPELL_FAILED_TOO_CLOSE; + + if (caster->HasUnitState(UNIT_STATE_JUMPING) || caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING)) + return SPELL_FAILED_MOVING; + + return SPELL_CAST_OK; + } + + uint32 EntryCheck(uint32 entry) + { + Creature* targetCreature = GetHitCreature(); + + switch (targetCreature->GetEntry()) + { + //Alliance Faction Champions + case 34461: + case 34460: + case 34469: + case 34467: + case 34468: + case 34465: + case 34471: + case 34466: + case 34473: + case 34472: + case 34470: + case 34463: + case 34474: + case 34475: + + //Horde Faction Champions + case 34458: + case 34451: + case 34459: + case 34448: + case 34449: + case 34445: + case 34456: + case 34447: + case 34441: + case 34454: + case 34444: + case 34455: + case 34450: + case 34453: + return entry; + break; + } + return 0; + } + + void HandleBaseDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + Unit* target = GetHitUnit(); + Unit* baseTarget = GetExplTargetUnit(); + Creature* targetCreature = GetHitCreature(); + + if (caster != target) + { + if (targetCreature && (targetCreature->isWorldBoss() || targetCreature->IsDungeonBoss()) && targetCreature->GetEntry() != EntryCheck(targetCreature->GetEntry())) + { + return; + } + else + { + caster->CastSpell(target, 49560, true); + const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(1766); // Rogue kick + if (!target->IsImmunedToSpellEffect(spellInfo, EFFECT_0)) + target->InterruptNonMeleeSpells(true); + } + } + else + baseTarget->CastSpell(caster, 49560, true); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + float casterZ = GetCaster()->GetPositionZ(); // for Ring of Valor + WorldLocation gripPos = *GetExplTargetDest(); + if (Unit* target = GetHitUnit()) + if (!target->HasAuraType(SPELL_AURA_DEFLECT_SPELLS) || target->HasUnitState(UNIT_STATE_STUNNED)) // Deterrence + { + if (target != GetCaster()) + { + const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(1766); // Rogue kick + if (!target->IsImmunedToSpellEffect(spellInfo, EFFECT_0)) + target->InterruptNonMeleeSpells(false, 0, false); + } + + if (target->GetMapId() == 618) // for Ring of Valor + gripPos.m_positionZ = std::max(casterZ + 0.2f, 28.5f); + + target->CastSpell(gripPos.GetPositionX(), gripPos.GetPositionY(), gripPos.GetPositionZ(), 57604, true); + } + } + + void Register() override + { + if (m_scriptSpellId == 49576) // xinef: base death grip, add pvp range restriction + { + OnCheckCast += SpellCheckCastFn(spell_dk_death_grip::CheckCast); + OnEffectHitTarget += SpellEffectFn(spell_dk_death_grip::HandleBaseDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + else + OnEffectHitTarget += SpellEffectFn(spell_dk_death_grip::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 48743 - Death Pact +class spell_dk_death_pact : public SpellScript +{ + PrepareSpellScript(spell_dk_death_pact); + + SpellCastResult CheckCast() + { + // Check if we have valid targets, otherwise skip spell casting here + if (Player* player = GetCaster()->ToPlayer()) + for (Unit::ControlSet::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; + } + + void FilterTargets(std::list& targetList) + { + Unit* target = nullptr; + for (std::list::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) + { + // xinef: remove all auras preventing effect execution + target->RemoveAllAurasOnDeath(); + targetList.push_back(target); + } + } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_dk_death_pact::CheckCast); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_death_pact::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ALLY); + } +}; + +// -49998 - Death Strike +class spell_dk_death_strike : public SpellScript +{ + PrepareSpellScript(spell_dk_death_strike); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DK_DEATH_STRIKE_HEAL }); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) + { + uint32 count = target->GetDiseasesByCaster(caster->GetGUID()); + int32 bp = int32(count * caster->CountPctFromMaxHealth(int32(GetSpellInfo()->Effects[EFFECT_0].DamageMultiplier))); + // Improved Death Strike + if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DEATHKNIGHT, DK_ICON_ID_IMPROVED_DEATH_STRIKE, 0)) + AddPct(bp, caster->CalculateSpellDamage(caster, aurEff->GetSpellInfo(), 2)); + caster->CastCustomSpell(caster, SPELL_DK_DEATH_STRIKE_HEAL, &bp, nullptr, nullptr, false); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_dk_death_strike::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY); + } +}; + +// 47496 - Explode +class spell_dk_ghoul_explode : public SpellScript +{ + PrepareSpellScript(spell_dk_ghoul_explode); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DK_CORPSE_EXPLOSION_TRIGGERED }); + } + + void HandleDamage(SpellEffIndex /*effIndex*/) + { + int32 value = int32(GetCaster()->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue(GetCaster()))); + SetEffectValue(value); + } + + void Suicide(SpellEffIndex /*effIndex*/) + { + if (Unit* unitTarget = GetHitUnit()) + { + // Corpse Explosion (Suicide) + unitTarget->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_TRIGGERED, true); + // Set corpse look + GetCaster()->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_VISUAL, true); + } + } + + void Register() override + { + OnEffectLaunchTarget += SpellEffectFn(spell_dk_ghoul_explode::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + OnEffectHitTarget += SpellEffectFn(spell_dk_ghoul_explode::Suicide, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE); } }; // 48792 - Icebound Fortitude -class spell_dk_icebound_fortitude : public SpellScriptLoader +class spell_dk_icebound_fortitude : public AuraScript { -public: - spell_dk_icebound_fortitude() : SpellScriptLoader("spell_dk_icebound_fortitude") { } + PrepareAuraScript(spell_dk_icebound_fortitude); - class spell_dk_icebound_fortitude_AuraScript : public AuraScript + bool Load() override { - PrepareAuraScript(spell_dk_icebound_fortitude_AuraScript); + Unit* caster = GetCaster(); + return caster && caster->GetTypeId() == TYPEID_PLAYER; + } - bool Load() override + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + if (Unit* caster = GetCaster()) { - Unit* caster = GetCaster(); - return caster && caster->GetTypeId() == TYPEID_PLAYER; - } + int32 value = amount; + uint32 defValue = uint32(caster->ToPlayer()->GetSkillValue(SKILL_DEFENSE) + caster->ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL)); - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - if (Unit* caster = GetCaster()) + 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 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; + 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 + void Register() override { - return new spell_dk_icebound_fortitude_AuraScript(); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_icebound_fortitude::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN); } }; // -50365 - Improved Blood Presence -class spell_dk_improved_blood_presence : public SpellScriptLoader +class spell_dk_improved_blood_presence : public AuraScript { -public: - spell_dk_improved_blood_presence() : SpellScriptLoader("spell_dk_improved_blood_presence") { } + PrepareAuraScript(spell_dk_improved_blood_presence); - class spell_dk_improved_blood_presence_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_dk_improved_blood_presence_AuraScript); + return ValidateSpellInfo( + { + SPELL_DK_BLOOD_PRESENCE, + SPELL_DK_FROST_PRESENCE, + SPELL_DK_UNHOLY_PRESENCE, + SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED + }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_DK_BLOOD_PRESENCE, - SPELL_DK_FROST_PRESENCE, - SPELL_DK_UNHOLY_PRESENCE, - SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED - }); - } - - void HandleEffectApply(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_IMPROVED_BLOOD_PRESENCE_TRIGGERED)) - target->CastCustomSpell(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT1, aurEff->GetAmount(), target, true, nullptr, aurEff); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (!target->HasAura(SPELL_DK_BLOOD_PRESENCE)) - target->RemoveAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED); - } - - void Register() override - { - AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_blood_presence_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_blood_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - return new spell_dk_improved_blood_presence_AuraScript(); + Unit* target = GetTarget(); + if ((target->HasAura(SPELL_DK_FROST_PRESENCE) || target->HasAura(SPELL_DK_UNHOLY_PRESENCE)) && !target->HasAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED)) + target->CastCustomSpell(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT1, aurEff->GetAmount(), target, true, nullptr, aurEff); + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (!target->HasAura(SPELL_DK_BLOOD_PRESENCE)) + target->RemoveAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_blood_presence::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_blood_presence::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; // -50384 - Improved Frost Presence -class spell_dk_improved_frost_presence : public SpellScriptLoader +class spell_dk_improved_frost_presence : public AuraScript { -public: - spell_dk_improved_frost_presence() : SpellScriptLoader("spell_dk_improved_frost_presence") { } + PrepareAuraScript(spell_dk_improved_frost_presence); - class spell_dk_improved_frost_presence_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_dk_improved_frost_presence_AuraScript); + return ValidateSpellInfo( + { + SPELL_DK_BLOOD_PRESENCE, + SPELL_DK_FROST_PRESENCE, + SPELL_DK_UNHOLY_PRESENCE, + SPELL_DK_FROST_PRESENCE_TRIGGERED + }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_DK_BLOOD_PRESENCE, - SPELL_DK_FROST_PRESENCE, - SPELL_DK_UNHOLY_PRESENCE, - SPELL_DK_FROST_PRESENCE_TRIGGERED - }); - } - - 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_FROST_PRESENCE_TRIGGERED)) - target->CastCustomSpell(SPELL_DK_FROST_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), target, true, nullptr, aurEff); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (!target->HasAura(SPELL_DK_FROST_PRESENCE)) - target->RemoveAura(SPELL_DK_FROST_PRESENCE_TRIGGERED); - } - - 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); - } - }; - - AuraScript* GetAuraScript() const override + void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - return new spell_dk_improved_frost_presence_AuraScript(); + Unit* target = GetTarget(); + if ((target->HasAura(SPELL_DK_BLOOD_PRESENCE) || target->HasAura(SPELL_DK_UNHOLY_PRESENCE)) && !target->HasAura(SPELL_DK_FROST_PRESENCE_TRIGGERED)) + target->CastCustomSpell(SPELL_DK_FROST_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), target, true, nullptr, aurEff); + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (!target->HasAura(SPELL_DK_FROST_PRESENCE)) + target->RemoveAura(SPELL_DK_FROST_PRESENCE_TRIGGERED); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_frost_presence::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_frost_presence::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; // -50391 - Improved Unholy Presence -class spell_dk_improved_unholy_presence : public SpellScriptLoader +class spell_dk_improved_unholy_presence : public AuraScript { -public: - spell_dk_improved_unholy_presence() : SpellScriptLoader("spell_dk_improved_unholy_presence") { } + PrepareAuraScript(spell_dk_improved_unholy_presence); - class spell_dk_improved_unholy_presence_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_dk_improved_unholy_presence_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_DK_BLOOD_PRESENCE, - SPELL_DK_FROST_PRESENCE, - SPELL_DK_UNHOLY_PRESENCE, - SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED, - SPELL_DK_UNHOLY_PRESENCE_TRIGGERED - }); - } - - void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (target->HasAura(SPELL_DK_UNHOLY_PRESENCE) && !target->HasAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED)) + return ValidateSpellInfo( { - // Not listed as any effect, only base points set in dbc - int32 basePoints = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - target->CastCustomSpell(target, SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED, &basePoints, &basePoints, &basePoints, true, nullptr, aurEff); - } + SPELL_DK_BLOOD_PRESENCE, + SPELL_DK_FROST_PRESENCE, + SPELL_DK_UNHOLY_PRESENCE, + SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED, + SPELL_DK_UNHOLY_PRESENCE_TRIGGERED + }); + } - if ((target->HasAura(SPELL_DK_BLOOD_PRESENCE) || target->HasAura(SPELL_DK_FROST_PRESENCE)) && !target->HasAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED)) - target->CastCustomSpell(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), target, true, nullptr, aurEff); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - - target->RemoveAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED); - - if (!target->HasAura(SPELL_DK_UNHOLY_PRESENCE)) - target->RemoveAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED); - } - - 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); - } - }; - - AuraScript* GetAuraScript() const override + void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - return new spell_dk_improved_unholy_presence_AuraScript(); + Unit* target = GetTarget(); + if (target->HasAura(SPELL_DK_UNHOLY_PRESENCE) && !target->HasAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED)) + { + // Not listed as any effect, only base points set in dbc + int32 basePoints = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + target->CastCustomSpell(target, SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED, &basePoints, &basePoints, &basePoints, true, nullptr, aurEff); + } + + if ((target->HasAura(SPELL_DK_BLOOD_PRESENCE) || target->HasAura(SPELL_DK_FROST_PRESENCE)) && !target->HasAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED)) + target->CastCustomSpell(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), target, true, nullptr, aurEff); + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + + target->RemoveAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED); + + if (!target->HasAura(SPELL_DK_UNHOLY_PRESENCE)) + target->RemoveAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_unholy_presence::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_unholy_presence::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; // 50842 - Pestilence -class spell_dk_pestilence : public SpellScriptLoader +class spell_dk_pestilence : public SpellScript { -public: - spell_dk_pestilence() : SpellScriptLoader("spell_dk_pestilence") { } + PrepareSpellScript(spell_dk_pestilence); - class spell_dk_pestilence_SpellScript : public SpellScript + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_dk_pestilence_SpellScript); + Unit* caster = GetCaster(); + Unit* hitUnit = GetHitUnit(); + Unit* target = GetExplTargetUnit(); + if (!target) + return; - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + if (target != hitUnit || caster->GetAura(SPELL_DK_GLYPH_OF_DISEASE)) { - Unit* caster = GetCaster(); - Unit* hitUnit = GetHitUnit(); - Unit* target = GetExplTargetUnit(); - if (!target) - return; + // xinef: checked in target selection + //if (!m_targets.GetUnitTarget()->IsWithinLOSInMap(unitTarget)) + // return; - if (target != hitUnit || caster->GetAura(SPELL_DK_GLYPH_OF_DISEASE)) - { - // xinef: checked in target selection - //if (!m_targets.GetUnitTarget()->IsWithinLOSInMap(unitTarget)) - // return; - - // And spread them on target - // Blood Plague - if (target->GetAura(SPELL_DK_BLOOD_PLAGUE, caster->GetGUID())) - caster->CastSpell(hitUnit, SPELL_DK_BLOOD_PLAGUE, true); - // Frost Fever - if (target->GetAura(SPELL_DK_FROST_FEVER, caster->GetGUID())) - caster->CastSpell(hitUnit, SPELL_DK_FROST_FEVER, true); - } + // And spread them on target + // Blood Plague + if (target->GetAura(SPELL_DK_BLOOD_PLAGUE, caster->GetGUID())) + caster->CastSpell(hitUnit, SPELL_DK_BLOOD_PLAGUE, true); + // Frost Fever + if (target->GetAura(SPELL_DK_FROST_FEVER, caster->GetGUID())) + caster->CastSpell(hitUnit, SPELL_DK_FROST_FEVER, true); } + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_dk_pestilence_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_dk_pestilence_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_dk_pestilence::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); } }; /* 48266 - Blood Presence 48263 - Frost Presence 48265 - Unholy Presence */ -class spell_dk_presence : public SpellScriptLoader +class spell_dk_presence : public AuraScript { -public: - spell_dk_presence() : SpellScriptLoader("spell_dk_presence") { } + PrepareAuraScript(spell_dk_presence); - class spell_dk_presence_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_dk_presence_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_DK_BLOOD_PRESENCE, - SPELL_DK_FROST_PRESENCE, - SPELL_DK_UNHOLY_PRESENCE, - SPELL_DK_IMPROVED_BLOOD_PRESENCE_R1, - SPELL_DK_IMPROVED_FROST_PRESENCE_R1, - SPELL_DK_IMPROVED_UNHOLY_PRESENCE_R1, - SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED, - SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED, - SPELL_DK_FROST_PRESENCE_TRIGGERED, - SPELL_DK_UNHOLY_PRESENCE_TRIGGERED - }); - } - - void HandleImprovedBloodPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - - if (GetId() == SPELL_DK_BLOOD_PRESENCE) - target->CastSpell(target, SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED, true); - else if (AuraEffect const* impAurEff = target->GetAuraEffectOfRankedSpell(SPELL_DK_IMPROVED_BLOOD_PRESENCE_R1, EFFECT_0)) - if (!target->HasAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED)) - target->CastCustomSpell(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT1, impAurEff->GetAmount(), target, true, nullptr, aurEff); - } - - void HandleImprovedFrostPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - - if (GetId() == SPELL_DK_FROST_PRESENCE) - target->CastSpell(target, SPELL_DK_FROST_PRESENCE_TRIGGERED, true); - else if (AuraEffect const* impAurEff = target->GetAuraEffectOfRankedSpell(SPELL_DK_IMPROVED_FROST_PRESENCE_R1, EFFECT_0)) - if (!target->HasAura(SPELL_DK_FROST_PRESENCE_TRIGGERED)) - target->CastCustomSpell(SPELL_DK_FROST_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, impAurEff->GetAmount(), target, true, nullptr, aurEff); - } - - void HandleImprovedUnholyPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - - if (GetId() == SPELL_DK_UNHOLY_PRESENCE) - target->CastSpell(target, SPELL_DK_UNHOLY_PRESENCE_TRIGGERED, true); - - if (AuraEffect const* impAurEff = target->GetAuraEffectOfRankedSpell(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_R1, EFFECT_0)) + return ValidateSpellInfo( { - if (GetId() == SPELL_DK_UNHOLY_PRESENCE) - { - // Not listed as any effect, only base points set - int32 bp = impAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - target->CastCustomSpell(target, SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED, &bp, &bp, &bp, true, nullptr, aurEff); - } - else if (!target->HasAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED)) - target->CastCustomSpell(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, impAurEff->GetAmount(), target, true, nullptr, aurEff); - } - } + SPELL_DK_BLOOD_PRESENCE, + SPELL_DK_FROST_PRESENCE, + SPELL_DK_UNHOLY_PRESENCE, + SPELL_DK_IMPROVED_BLOOD_PRESENCE_R1, + SPELL_DK_IMPROVED_FROST_PRESENCE_R1, + SPELL_DK_IMPROVED_UNHOLY_PRESENCE_R1, + SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED, + SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED, + SPELL_DK_FROST_PRESENCE_TRIGGERED, + SPELL_DK_UNHOLY_PRESENCE_TRIGGERED + }); + } - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->RemoveAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED); - target->RemoveAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED); - target->RemoveAura(SPELL_DK_FROST_PRESENCE_TRIGGERED); - target->RemoveAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED); - } - - 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); - } - }; - - AuraScript* GetAuraScript() const override + void HandleImprovedBloodPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - return new spell_dk_presence_AuraScript(); + Unit* target = GetTarget(); + + if (GetId() == SPELL_DK_BLOOD_PRESENCE) + target->CastSpell(target, SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED, true); + else if (AuraEffect const* impAurEff = target->GetAuraEffectOfRankedSpell(SPELL_DK_IMPROVED_BLOOD_PRESENCE_R1, EFFECT_0)) + if (!target->HasAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED)) + target->CastCustomSpell(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT1, impAurEff->GetAmount(), target, true, nullptr, aurEff); + } + + void HandleImprovedFrostPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + + if (GetId() == SPELL_DK_FROST_PRESENCE) + target->CastSpell(target, SPELL_DK_FROST_PRESENCE_TRIGGERED, true); + else if (AuraEffect const* impAurEff = target->GetAuraEffectOfRankedSpell(SPELL_DK_IMPROVED_FROST_PRESENCE_R1, EFFECT_0)) + if (!target->HasAura(SPELL_DK_FROST_PRESENCE_TRIGGERED)) + target->CastCustomSpell(SPELL_DK_FROST_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, impAurEff->GetAmount(), target, true, nullptr, aurEff); + } + + void HandleImprovedUnholyPresence(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + + if (GetId() == SPELL_DK_UNHOLY_PRESENCE) + target->CastSpell(target, SPELL_DK_UNHOLY_PRESENCE_TRIGGERED, true); + + if (AuraEffect const* impAurEff = target->GetAuraEffectOfRankedSpell(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_R1, EFFECT_0)) + { + if (GetId() == SPELL_DK_UNHOLY_PRESENCE) + { + // Not listed as any effect, only base points set + int32 bp = impAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + target->CastCustomSpell(target, SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED, &bp, &bp, &bp, true, nullptr, aurEff); + } + else if (!target->HasAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED)) + target->CastCustomSpell(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED, SPELLVALUE_BASE_POINT0, impAurEff->GetAmount(), target, true, nullptr, aurEff); + } + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->RemoveAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED); + target->RemoveAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED); + target->RemoveAura(SPELL_DK_FROST_PRESENCE_TRIGGERED); + target->RemoveAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_dk_presence::HandleImprovedBloodPresence, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + AfterEffectApply += AuraEffectApplyFn(spell_dk_presence::HandleImprovedFrostPresence, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + AfterEffectApply += AuraEffectApplyFn(spell_dk_presence::HandleImprovedUnholyPresence, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_dk_presence::HandleEffectRemove, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL); } }; @@ -2212,466 +1795,389 @@ private: }; // 46584 - Raise Dead -class spell_dk_raise_dead : public SpellScriptLoader +class spell_dk_raise_dead : public SpellScript { -public: - spell_dk_raise_dead() : SpellScriptLoader("spell_dk_raise_dead") { } + PrepareSpellScript(spell_dk_raise_dead); - class spell_dk_raise_dead_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_dk_raise_dead_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_DK_RAISE_DEAD_USE_REAGENT, - SPELL_DK_MASTER_OF_GHOULS - }); - } - - bool Load() override - { - _result = SPELL_CAST_OK; - _corpse = false; - 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)) + return ValidateSpellInfo( { - for (uint32 i = 0; i < MAX_SPELL_REAGENTS; i++) - { - if (reagentSpell->Reagent[i] <= 0) - continue; + SPELL_DK_RAISE_DEAD_USE_REAGENT, + SPELL_DK_MASTER_OF_GHOULS + }); + } - if (!player->HasItemCount(reagentSpell->Reagent[i], reagentSpell->ReagentCount[i])) - { - Spell::SendCastResult(player, reagentSpell, 0, SPELL_FAILED_REAGENTS); - return SPELL_FAILED_DONT_REPORT; - } + bool Load() override + { + _result = SPELL_CAST_OK; + _corpse = false; + 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& targets) - { - targets.remove_if(RaiseDeadCheck(GetCaster()->ToPlayer())); - - if (targets.empty()) - { - if (GetSpell()->getState() == SPELL_STATE_PREPARING) - _result = CheckReagents(); - - return; - } - - WorldObject* target = Acore::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 = nullptr; - } - - 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 pet - return GetSpellInfo()->Effects[EFFECT_2].CalcValue(); - - // or guardian - return GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - } - - void HandleRaiseDead(SpellEffIndex /*effIndex*/) - { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(GetGhoulSpellId()); - SpellCastTargets targets; - targets.SetDst(*GetHitUnit()); - - GetCaster()->CastSpell(targets, spellInfo, nullptr, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCaster()->GetGUID()); - GetCaster()->ToPlayer()->RemoveSpellCooldown(GetSpellInfo()->Id, 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); - } - - private: - SpellCastResult _result; - bool _corpse; - }; - - SpellScript* GetSpellScript() const override - { - return new spell_dk_raise_dead_SpellScript(); + return SPELL_CAST_OK; } + + void CheckTargets(std::list& targets) + { + targets.remove_if(RaiseDeadCheck(GetCaster()->ToPlayer())); + + if (targets.empty()) + { + if (GetSpell()->getState() == SPELL_STATE_PREPARING) + _result = CheckReagents(); + + return; + } + + WorldObject* target = Acore::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 = nullptr; + } + + 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 pet + return GetSpellInfo()->Effects[EFFECT_2].CalcValue(); + + // or guardian + return GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + } + + void HandleRaiseDead(SpellEffIndex /*effIndex*/) + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(GetGhoulSpellId()); + SpellCastTargets targets; + targets.SetDst(*GetHitUnit()); + + GetCaster()->CastSpell(targets, spellInfo, nullptr, TRIGGERED_FULL_MASK, nullptr, nullptr, GetCaster()->GetGUID()); + GetCaster()->ToPlayer()->RemoveSpellCooldown(GetSpellInfo()->Id, true); + } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_dk_raise_dead::CheckCast); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_raise_dead::CheckTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dk_raise_dead::CheckTarget, EFFECT_2, TARGET_UNIT_CASTER); + OnCast += SpellCastFn(spell_dk_raise_dead::ConsumeReagents); + OnEffectHitTarget += SpellEffectFn(spell_dk_raise_dead::HandleRaiseDead, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_dk_raise_dead::HandleRaiseDead, EFFECT_2, SPELL_EFFECT_DUMMY); + } + +private: + SpellCastResult _result; + bool _corpse; }; // 59754 - Rune Tap -class spell_dk_rune_tap_party : public SpellScriptLoader +class spell_dk_rune_tap_party : public SpellScript { -public: - spell_dk_rune_tap_party() : SpellScriptLoader("spell_dk_rune_tap_party") { } + PrepareSpellScript(spell_dk_rune_tap_party); - class spell_dk_rune_tap_party_SpellScript : public SpellScript + void CheckTargets(std::list& targets) { - PrepareSpellScript(spell_dk_rune_tap_party_SpellScript); + targets.remove(GetCaster()); + } - void CheckTargets(std::list& targets) - { - 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 + void Register() override { - return new spell_dk_rune_tap_party_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_rune_tap_party::CheckTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY); } }; // 50421 - Scent of Blood -class spell_dk_scent_of_blood : public SpellScriptLoader +class spell_dk_scent_of_blood : public AuraScript { -public: - spell_dk_scent_of_blood() : SpellScriptLoader("spell_dk_scent_of_blood") { } + PrepareAuraScript(spell_dk_scent_of_blood); - class spell_dk_scent_of_blood_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_dk_scent_of_blood_AuraScript); + return ValidateSpellInfo({ SPELL_DK_SCENT_OF_BLOOD }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DK_SCENT_OF_BLOOD }); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_DK_SCENT_OF_BLOOD, true, nullptr, aurEff); - GetTarget()->RemoveAuraFromStack(GetSpellInfo()->Id); - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_dk_scent_of_blood_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) { - return new spell_dk_scent_of_blood_AuraScript(); + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), SPELL_DK_SCENT_OF_BLOOD, true, nullptr, aurEff); + GetTarget()->RemoveAuraFromStack(GetSpellInfo()->Id); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dk_scent_of_blood::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); } }; // -55090 - Scourge Strike -class spell_dk_scourge_strike : public SpellScriptLoader +class spell_dk_scourge_strike : public SpellScript { -public: - spell_dk_scourge_strike() : SpellScriptLoader("spell_dk_scourge_strike") { } + PrepareSpellScript(spell_dk_scourge_strike); + float multiplier; + ObjectGuid guid; - class spell_dk_scourge_strike_SpellScript : public SpellScript + bool Load() override { - PrepareSpellScript(spell_dk_scourge_strike_SpellScript); - float multiplier; - ObjectGuid guid; + multiplier = 1.0f; + guid.Clear(); + return true; + } - bool Load() override + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DK_SCOURGE_STRIKE_TRIGGERED }); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* unitTarget = GetHitUnit()) { - multiplier = 1.0f; - guid.Clear(); - return true; + uint8 mode = caster->GetAuraEffectDummy(SPELL_DK_GLYPH_OF_SCOURGE_STRIKE) ? 2 : 0; + float disease_amt = GetEffectValue(); + + // Death Knight T8 Melee 4P Bonus + if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_ITEM_T8_MELEE_4P_BONUS, EFFECT_0)) + AddPct(disease_amt, aurEff->GetAmount()); + + multiplier = disease_amt * unitTarget->GetDiseasesByCaster(caster->GetGUID(), mode) / 100.0f; + guid = unitTarget->GetGUID(); } + } - bool Validate(SpellInfo const* /*spellInfo*/) override + void HandleAfterHit() + { + Unit* caster = GetCaster(); + if (Unit* unitTarget = ObjectAccessor::GetUnit(*caster, guid)) { - return ValidateSpellInfo({ SPELL_DK_SCOURGE_STRIKE_TRIGGERED }); - } + int32 bp = GetHitDamage() * multiplier; + caster->CastCustomSpell(unitTarget, SPELL_DK_SCOURGE_STRIKE_TRIGGERED, &bp, nullptr, nullptr, true); - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* unitTarget = GetHitUnit()) + // Xinef: Shadowmourne hack (scourge strike trigger proc disabled...) + if (roll_chance_i(75) && caster->FindMap() && !caster->FindMap()->IsBattlegroundOrArena() && caster->HasAura(71903) && !caster->HasAura(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) { - uint8 mode = caster->GetAuraEffectDummy(SPELL_DK_GLYPH_OF_SCOURGE_STRIKE) ? 2 : 0; - float disease_amt = GetEffectValue(); + caster->CastSpell(caster, SPELL_SHADOWMOURNE_SOUL_FRAGMENT, true); - // Death Knight T8 Melee 4P Bonus - if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_ITEM_T8_MELEE_4P_BONUS, EFFECT_0)) - AddPct(disease_amt, aurEff->GetAmount()); - - multiplier = disease_amt * unitTarget->GetDiseasesByCaster(caster->GetGUID(), mode) / 100.0f; - guid = unitTarget->GetGUID(); - } - } - - void HandleAfterHit() - { - Unit* caster = GetCaster(); - if (Unit* unitTarget = ObjectAccessor::GetUnit(*caster, guid)) - { - int32 bp = GetHitDamage() * multiplier; - caster->CastCustomSpell(unitTarget, SPELL_DK_SCOURGE_STRIKE_TRIGGERED, &bp, nullptr, nullptr, true); - - // Xinef: Shadowmourne hack (scourge strike trigger proc disabled...) - if (roll_chance_i(75) && caster->FindMap() && !caster->FindMap()->IsBattlegroundOrArena() && caster->HasAura(71903) && !caster->HasAura(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) + // this can't be handled in AuraScript of SoulFragments because we need to know victim + if (Aura* soulFragments = caster->GetAura(SPELL_SHADOWMOURNE_SOUL_FRAGMENT)) { - caster->CastSpell(caster, SPELL_SHADOWMOURNE_SOUL_FRAGMENT, true); - - // this can't be handled in AuraScript of SoulFragments because we need to know victim - if (Aura* soulFragments = caster->GetAura(SPELL_SHADOWMOURNE_SOUL_FRAGMENT)) + if (soulFragments->GetStackAmount() >= 10) { - if (soulFragments->GetStackAmount() >= 10) - { - caster->CastSpell(caster, SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, true, nullptr); - soulFragments->Remove(); - } + caster->CastSpell(caster, SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, true, nullptr); + soulFragments->Remove(); } } } } + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_dk_scourge_strike_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY); - AfterHit += SpellHitFn(spell_dk_scourge_strike_SpellScript::HandleAfterHit); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_dk_scourge_strike_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_dk_scourge_strike::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY); + AfterHit += SpellHitFn(spell_dk_scourge_strike::HandleAfterHit); } }; // -49145 - Spell Deflection -class spell_dk_spell_deflection : public SpellScriptLoader +class spell_dk_spell_deflection : public AuraScript { -public: - spell_dk_spell_deflection() : SpellScriptLoader("spell_dk_spell_deflection") { } + PrepareAuraScript(spell_dk_spell_deflection); - class spell_dk_spell_deflection_AuraScript : public AuraScript + uint32 absorbPct; + + bool Load() override { - PrepareAuraScript(spell_dk_spell_deflection_AuraScript); + absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + return true; + } - uint32 absorbPct; - - bool Load() override - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) - { - // You have a chance equal to your Parry chance - float chance = GetTarget()->GetUnitParryChance(); - if (GetTarget()->IsNonMeleeSpellCast(false, false, true) || GetTarget()->HasUnitState(UNIT_STATE_CONTROLLED)) - chance = 0.0f; - - if ((dmgInfo.GetDamageType() == SPELL_DIRECT_DAMAGE) && roll_chance_f(chance)) - absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_spell_deflection_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_spell_deflection_AuraScript::Absorb, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const override + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - return new spell_dk_spell_deflection_AuraScript(); + // Set absorbtion amount to unlimited + amount = -1; + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + // You have a chance equal to your Parry chance + float chance = GetTarget()->GetUnitParryChance(); + if (GetTarget()->IsNonMeleeSpellCast(false, false, true) || GetTarget()->HasUnitState(UNIT_STATE_CONTROLLED)) + chance = 0.0f; + + if ((dmgInfo.GetDamageType() == SPELL_DIRECT_DAMAGE) && roll_chance_f(chance)) + absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_spell_deflection::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_spell_deflection::Absorb, EFFECT_0); } }; // 55233 - Vampiric Blood -class spell_dk_vampiric_blood : public SpellScriptLoader +class spell_dk_vampiric_blood : public AuraScript { -public: - spell_dk_vampiric_blood() : SpellScriptLoader("spell_dk_vampiric_blood") { } + PrepareAuraScript(spell_dk_vampiric_blood); - class spell_dk_vampiric_blood_AuraScript : public AuraScript + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_dk_vampiric_blood_AuraScript); + amount = GetUnitOwner()->CountPctFromMaxHealth(amount); + } - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - amount = GetUnitOwner()->CountPctFromMaxHealth(amount); - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_vampiric_blood_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_HEALTH); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_dk_vampiric_blood_AuraScript(); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_vampiric_blood::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_HEALTH); } }; // 52284 - Will of the Necropolis -class spell_dk_will_of_the_necropolis : public SpellScriptLoader +class spell_dk_will_of_the_necropolis : public AuraScript { -public: - spell_dk_will_of_the_necropolis() : SpellScriptLoader("spell_dk_will_of_the_necropolis") { } + PrepareAuraScript(spell_dk_will_of_the_necropolis); - class spell_dk_will_of_the_necropolis_AuraScript : public AuraScript + bool Validate(SpellInfo const* spellInfo) override { - PrepareAuraScript(spell_dk_will_of_the_necropolis_AuraScript); + SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_DK_WILL_OF_THE_NECROPOLIS_AURA_R1); + if (!firstRankSpellInfo) + return false; - bool Validate(SpellInfo const* spellInfo) override - { - SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_DK_WILL_OF_THE_NECROPOLIS_AURA_R1); - if (!firstRankSpellInfo) - return false; + // can't use other spell than will of the necropolis due to spell_ranks dependency + if (!spellInfo->IsRankOf(firstRankSpellInfo)) + return false; - // can't use other spell than will of the necropolis due to spell_ranks dependency - if (!spellInfo->IsRankOf(firstRankSpellInfo)) - return false; + uint8 rank = spellInfo->GetRank(); + if (!sSpellMgr->GetSpellWithRank(SPELL_DK_WILL_OF_THE_NECROPOLIS_TALENT_R1, rank, true)) + return false; - uint8 rank = spellInfo->GetRank(); - if (!sSpellMgr->GetSpellWithRank(SPELL_DK_WILL_OF_THE_NECROPOLIS_TALENT_R1, rank, true)) - return false; + return true; + } - return true; - } + uint32 absorbPct; - uint32 absorbPct; - - bool Load() override - { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); - return true; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) - { - // min pct of hp is stored in effect 0 of talent spell - uint8 rank = GetSpellInfo()->GetRank(); - SpellInfo const* talentProto = sSpellMgr->AssertSpellInfo(sSpellMgr->GetSpellWithRank(SPELL_DK_WILL_OF_THE_NECROPOLIS_TALENT_R1, rank)); - - int32 remainingHp = int32(GetTarget()->GetHealth() - dmgInfo.GetDamage()); - int32 minHp = int32(GetTarget()->CountPctFromMaxHealth(talentProto->Effects[EFFECT_0].CalcValue(GetCaster()))); - - // Damage that would take you below [effect0] health or taken while you are at [effect0] - if (remainingHp < minHp) - absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_will_of_the_necropolis_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_will_of_the_necropolis_AuraScript::Absorb, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const override + bool Load() override { - return new spell_dk_will_of_the_necropolis_AuraScript(); + absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + return true; + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // Set absorbtion amount to unlimited + amount = -1; + } + + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + // min pct of hp is stored in effect 0 of talent spell + uint8 rank = GetSpellInfo()->GetRank(); + SpellInfo const* talentProto = sSpellMgr->AssertSpellInfo(sSpellMgr->GetSpellWithRank(SPELL_DK_WILL_OF_THE_NECROPOLIS_TALENT_R1, rank)); + + int32 remainingHp = int32(GetTarget()->GetHealth() - dmgInfo.GetDamage()); + int32 minHp = int32(GetTarget()->CountPctFromMaxHealth(talentProto->Effects[EFFECT_0].CalcValue(GetCaster()))); + + // Damage that would take you below [effect0] health or taken while you are at [effect0] + if (remainingHp < minHp) + absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_will_of_the_necropolis::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_will_of_the_necropolis::Absorb, EFFECT_0); } }; void AddSC_deathknight_spell_scripts() { - new spell_dk_wandering_plague(); - new spell_dk_raise_ally(); - new spell_dk_raise_ally_trigger(); - new spell_dk_aotd_taunt(); - new spell_dk_death_and_decay(); - new spell_dk_master_of_ghouls(); - new spell_dk_chains_of_ice(); - new spell_dk_bloodworms(); - new spell_dk_summon_gargoyle(); - new spell_dk_improved_blood_presence_proc(); - new spell_dk_wandering_plague_aura(); - new spell_dk_rune_of_the_fallen_crusader(); - new spell_dk_bone_shield(); - new spell_dk_hungering_cold(); - new spell_dk_blood_caked_blade(); - new spell_dk_dancing_rune_weapon(); - new spell_dk_dancing_rune_weapon_visual(); - new spell_dk_scent_of_blood_trigger(); - new spell_dk_pet_scaling(); - new spell_dk_anti_magic_shell_raid(); - new spell_dk_anti_magic_shell_self(); - new spell_dk_anti_magic_zone(); - new spell_dk_blood_boil(); - new spell_dk_blood_gorged(); - new spell_dk_corpse_explosion(); - 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_ghoul_explode(); - 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_pestilence(); - new spell_dk_presence(); - 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_spell_deflection(); - new spell_dk_vampiric_blood(); - new spell_dk_will_of_the_necropolis(); + RegisterSpellScript(spell_dk_wandering_plague); + RegisterSpellScript(spell_dk_raise_ally); + RegisterSpellScript(spell_dk_raise_ally_trigger); + RegisterSpellScript(spell_dk_aotd_taunt); + RegisterSpellAndAuraScriptPair(spell_dk_death_and_decay, spell_dk_death_and_decay_aura); + RegisterSpellScript(spell_dk_master_of_ghouls); + RegisterSpellAndAuraScriptPair(spell_dk_chains_of_ice, spell_dk_chains_of_ice_aura); + RegisterSpellScript(spell_dk_bloodworms); + RegisterSpellScript(spell_dk_summon_gargoyle); + RegisterSpellScript(spell_dk_improved_blood_presence_proc); + RegisterSpellScript(spell_dk_wandering_plague_aura); + RegisterSpellScript(spell_dk_rune_of_the_fallen_crusader); + RegisterSpellScript(spell_dk_bone_shield); + RegisterSpellScript(spell_dk_hungering_cold); + RegisterSpellScript(spell_dk_blood_caked_blade); + RegisterSpellScript(spell_dk_dancing_rune_weapon); + RegisterSpellScript(spell_dk_dancing_rune_weapon_visual); + RegisterSpellScript(spell_dk_scent_of_blood_trigger); + RegisterSpellScript(spell_dk_pet_scaling); + RegisterSpellScript(spell_dk_anti_magic_shell_raid); + RegisterSpellScript(spell_dk_anti_magic_shell_self); + RegisterSpellScript(spell_dk_anti_magic_zone); + RegisterSpellScript(spell_dk_blood_boil); + RegisterSpellScript(spell_dk_blood_gorged); + RegisterSpellScript(spell_dk_corpse_explosion); + RegisterSpellScript(spell_dk_death_coil); + RegisterSpellScript(spell_dk_death_gate); + RegisterSpellScript(spell_dk_death_grip); + RegisterSpellScript(spell_dk_death_pact); + RegisterSpellScript(spell_dk_death_strike); + RegisterSpellScript(spell_dk_ghoul_explode); + RegisterSpellScript(spell_dk_icebound_fortitude); + RegisterSpellScript(spell_dk_improved_blood_presence); + RegisterSpellScript(spell_dk_improved_frost_presence); + RegisterSpellScript(spell_dk_improved_unholy_presence); + RegisterSpellScript(spell_dk_pestilence); + RegisterSpellScript(spell_dk_presence); + RegisterSpellScript(spell_dk_raise_dead); + RegisterSpellScript(spell_dk_rune_tap_party); + RegisterSpellScript(spell_dk_scent_of_blood); + RegisterSpellScript(spell_dk_scourge_strike); + RegisterSpellScript(spell_dk_spell_deflection); + RegisterSpellScript(spell_dk_vampiric_blood); + RegisterSpellScript(spell_dk_will_of_the_necropolis); }