/* * Copyright (C) 2008-2016 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ /* * Scripts for spells with SPELLFAMILY_PRIEST and SPELLFAMILY_GENERIC spells used by priest players. * Ordered alphabetically using scriptname. * Scriptnames of files in this file should be prefixed with "spell_pri_". */ #include "Player.h" #include "ScriptMgr.h" #include "SpellScript.h" #include "SpellAuraEffects.h" #include "GridNotifiers.h" enum PriestSpells { SPELL_PRIEST_BLESSED_RECOVERY_R1 = 27813, SPELL_PRIEST_DIVINE_AEGIS = 47753, SPELL_PRIEST_EMPOWERED_RENEW = 63544, SPELL_PRIEST_GLYPH_OF_CIRCLE_OF_HEALING = 55675, SPELL_PRIEST_GLYPH_OF_LIGHTWELL = 55673, SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL = 56161, SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL = 48153, SPELL_PRIEST_ITEM_EFFICIENCY = 37595, SPELL_PRIEST_MANA_LEECH_PROC = 34650, SPELL_PRIEST_PENANCE_R1 = 47540, SPELL_PRIEST_PENANCE_R1_DAMAGE = 47758, SPELL_PRIEST_PENANCE_R1_HEAL = 47757, SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED = 33619, SPELL_PRIEST_REFLECTIVE_SHIELD_R1 = 33201, SPELL_PRIEST_SHADOW_WORD_DEATH = 32409, SPELL_PRIEST_T9_HEALING_2P = 67201, SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL = 64085, SPELL_PRIEST_GLYPH_OF_SHADOWFIEND_MANA = 58227, SPELL_REPLENISHMENT = 57669, SPELL_PRIEST_BODY_AND_SOUL_POISON_TRIGGER = 64136, SPELL_PRIEST_ABOLISH_DISEASE = 552, SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL = 15290, SPELL_PRIEST_DIVINE_BLESSING = 40440, SPELL_PRIEST_DIVINE_WRATH = 40441, SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC_HEAL = 56131, SPELL_PRIEST_ORACULAR_HEAL = 26170, SPELL_PRIEST_ARMOR_OF_FAITH = 28810, SPELL_PRIEST_BLESSED_HEALING = 70772, SPELL_PRIEST_MIND_BLAST_R1 = 8092, SPELL_PRIEST_SHADOW_WORD_DEATH_R1 = 32379, SPELL_PRIEST_MIND_FLAY_DAMAGE = 58381 }; enum PriestSpellIcons { PRIEST_ICON_ID_BORROWED_TIME = 2899, PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT = 3021, PRIEST_ICON_ID_PAIN_AND_SUFFERING = 2874, }; class PowerCheck { public: explicit PowerCheck(Powers const power) : _power(power) { } bool operator()(WorldObject* obj) const { if (Unit* target = obj->ToUnit()) return target->getPowerType() != _power; return true; } private: Powers const _power; }; class RaidCheck { public: explicit RaidCheck(Unit const* caster) : _caster(caster) { } bool operator()(WorldObject* obj) const { if (Unit* target = obj->ToUnit()) return !_caster->IsInRaidWith(target); return true; } private: Unit const* _caster; }; // 26169 - Oracle Healing Bonus class spell_pri_aq_3p_bonus : public SpellScriptLoader { public: spell_pri_aq_3p_bonus() : SpellScriptLoader("spell_pri_aq_3p_bonus") { } class spell_pri_aq_3p_bonus_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_aq_3p_bonus_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_ORACULAR_HEAL)) return false; return true; } void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { PreventDefaultAction(); Unit* caster = eventInfo.GetActor(); if (caster == eventInfo.GetProcTarget()) return; HealInfo* healInfo = eventInfo.GetHealInfo(); if (!healInfo || !healInfo->GetHeal()) return; int32 amount = CalculatePct(static_cast(healInfo->GetHeal()), 10); caster->CastCustomSpell(SPELL_PRIEST_ORACULAR_HEAL, SPELLVALUE_BASE_POINT0, amount, caster, true); } void Register() override { OnEffectProc += AuraEffectProcFn(spell_pri_aq_3p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; AuraScript* GetAuraScript() const override { return new spell_pri_aq_3p_bonus_AuraScript(); } }; // -27811 - Blessed Recovery class spell_pri_blessed_recovery : public SpellScriptLoader { public: spell_pri_blessed_recovery() : SpellScriptLoader("spell_pri_blessed_recovery") { } class spell_pri_blessed_recovery_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_blessed_recovery_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_BLESSED_RECOVERY_R1)) return false; return true; } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); DamageInfo* dmgInfo = eventInfo.GetDamageInfo(); if (!dmgInfo || !dmgInfo->GetDamage()) return; Unit* target = eventInfo.GetActionTarget(); uint32 triggerSpell = sSpellMgr->GetSpellWithRank(SPELL_PRIEST_BLESSED_RECOVERY_R1, aurEff->GetSpellInfo()->GetRank()); SpellInfo const* triggerInfo = sSpellMgr->AssertSpellInfo(triggerSpell); int32 bp = CalculatePct(static_cast(dmgInfo->GetDamage()), aurEff->GetAmount()); bp /= triggerInfo->GetMaxTicks(); bp += target->GetRemainingPeriodicAmount(target->GetGUID(), triggerSpell, SPELL_AURA_PERIODIC_HEAL); target->CastCustomSpell(triggerSpell, SPELLVALUE_BASE_POINT0, bp, target, true, nullptr, aurEff); } void Register() override { OnEffectProc += AuraEffectProcFn(spell_pri_blessed_recovery_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); } }; AuraScript* GetAuraScript() const override { return new spell_pri_blessed_recovery_AuraScript(); } }; // -64127 - Body and Soul class spell_pri_body_and_soul : public SpellScriptLoader { public: spell_pri_body_and_soul() : SpellScriptLoader("spell_pri_body_and_soul") { } class spell_pri_body_and_soul_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_body_and_soul_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_BODY_AND_SOUL_POISON_TRIGGER) || !sSpellMgr->GetSpellInfo(SPELL_PRIEST_ABOLISH_DISEASE)) return false; return true; } void HandleProcTriggerSpell(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { // Proc only on Power Word: Shield SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); if (!spellInfo || !(spellInfo->SpellFamilyFlags[0] & 0x00000001)) { PreventDefaultAction(); return; } } void HandleProcDummy(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); // Proc only on self casted abolish disease SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); if (!spellInfo) return; Unit* caster = eventInfo.GetActor(); if (spellInfo->Id != SPELL_PRIEST_ABOLISH_DISEASE || caster != eventInfo.GetProcTarget()) return; if (roll_chance_i(aurEff->GetAmount())) caster->CastSpell(caster, SPELL_PRIEST_BODY_AND_SOUL_POISON_TRIGGER, true); } void Register() override { OnEffectProc += AuraEffectProcFn(spell_pri_body_and_soul_AuraScript::HandleProcTriggerSpell, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); OnEffectProc += AuraEffectProcFn(spell_pri_body_and_soul_AuraScript::HandleProcDummy, EFFECT_1, SPELL_AURA_DUMMY); } }; AuraScript* GetAuraScript() const override { return new spell_pri_body_and_soul_AuraScript(); } }; // -34861 - Circle of Healing class spell_pri_circle_of_healing : public SpellScriptLoader { public: spell_pri_circle_of_healing() : SpellScriptLoader("spell_pri_circle_of_healing") { } class spell_pri_circle_of_healing_SpellScript : public SpellScript { PrepareSpellScript(spell_pri_circle_of_healing_SpellScript); bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_CIRCLE_OF_HEALING)) return false; return true; } void FilterTargets(std::list& targets) { targets.remove_if(RaidCheck(GetCaster())); uint32 const maxTargets = GetCaster()->HasAura(SPELL_PRIEST_GLYPH_OF_CIRCLE_OF_HEALING) ? 6 : 5; // Glyph of Circle of Healing if (targets.size() > maxTargets) { targets.sort(Trinity::HealthPctOrderPred()); targets.resize(maxTargets); } } void Register() override { OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_circle_of_healing_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); } }; SpellScript* GetSpellScript() const override { return new spell_pri_circle_of_healing_SpellScript(); } }; // -47509 - Divine Aegis class spell_pri_divine_aegis : public SpellScriptLoader { public: spell_pri_divine_aegis() : SpellScriptLoader("spell_pri_divine_aegis") { } class spell_pri_divine_aegis_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_divine_aegis_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_DIVINE_AEGIS)) return false; return true; } bool CheckProc(ProcEventInfo& eventInfo) { return eventInfo.GetProcTarget() != nullptr; } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); HealInfo* healInfo = eventInfo.GetHealInfo(); if (!healInfo || !healInfo->GetHeal()) return; int32 absorb = CalculatePct(healInfo->GetHeal(), aurEff->GetAmount()); // Multiple effects stack, so let's try to find this aura. if (AuraEffect const* aegis = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PRIEST_DIVINE_AEGIS, EFFECT_0)) absorb += aegis->GetAmount(); absorb = std::min(absorb, eventInfo.GetProcTarget()->getLevel() * 125); GetTarget()->CastCustomSpell(SPELL_PRIEST_DIVINE_AEGIS, SPELLVALUE_BASE_POINT0, absorb, eventInfo.GetProcTarget(), true, nullptr, aurEff); } void Register() override { DoCheckProc += AuraCheckProcFn(spell_pri_divine_aegis_AuraScript::CheckProc); OnEffectProc += AuraEffectProcFn(spell_pri_divine_aegis_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; AuraScript* GetAuraScript() const override { return new spell_pri_divine_aegis_AuraScript(); } }; // 64844 - Divine Hymn class spell_pri_divine_hymn : public SpellScriptLoader { public: spell_pri_divine_hymn() : SpellScriptLoader("spell_pri_divine_hymn") { } class spell_pri_divine_hymn_SpellScript : public SpellScript { PrepareSpellScript(spell_pri_divine_hymn_SpellScript); void FilterTargets(std::list& targets) { targets.remove_if(RaidCheck(GetCaster())); uint32 const maxTargets = 3; if (targets.size() > maxTargets) { targets.sort(Trinity::HealthPctOrderPred()); targets.resize(maxTargets); } } void Register() override { OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_divine_hymn_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY); } }; SpellScript* GetSpellScript() const override { return new spell_pri_divine_hymn_SpellScript(); } }; // 55677 - Glyph of Dispel Magic class spell_pri_glyph_of_dispel_magic : public SpellScriptLoader { public: spell_pri_glyph_of_dispel_magic() : SpellScriptLoader("spell_pri_glyph_of_dispel_magic") { } class spell_pri_glyph_of_dispel_magic_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_glyph_of_dispel_magic_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC_HEAL)) return false; return true; } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); // Dispel Magic shares spellfamilyflag with abolish disease SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); if (!spellInfo || spellInfo->SpellIconID != 74) return; Unit* caster = eventInfo.GetActor(); Unit* target = eventInfo.GetProcTarget(); int32 amount = static_cast(target->CountPctFromMaxHealth(aurEff->GetAmount())); caster->CastCustomSpell(SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC_HEAL, SPELLVALUE_BASE_POINT0, amount, target, true); } void Register() override { OnEffectProc += AuraEffectProcFn(spell_pri_glyph_of_dispel_magic_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; AuraScript* GetAuraScript() const override { return new spell_pri_glyph_of_dispel_magic_AuraScript(); } }; // 55680 - Glyph of Prayer of Healing class spell_pri_glyph_of_prayer_of_healing : public SpellScriptLoader { public: spell_pri_glyph_of_prayer_of_healing() : SpellScriptLoader("spell_pri_glyph_of_prayer_of_healing") { } class spell_pri_glyph_of_prayer_of_healing_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_glyph_of_prayer_of_healing_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL)) return false; return true; } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); HealInfo* healInfo = eventInfo.GetHealInfo(); if (!healInfo || !healInfo->GetHeal()) return; SpellInfo const* triggeredSpellInfo = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL); int32 heal = int32(CalculatePct(healInfo->GetHeal(), aurEff->GetAmount()) / triggeredSpellInfo->GetMaxTicks()); GetTarget()->CastCustomSpell(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL, SPELLVALUE_BASE_POINT0, heal, eventInfo.GetProcTarget(), true, nullptr, aurEff); } void Register() override { OnEffectProc += AuraEffectProcFn(spell_pri_glyph_of_prayer_of_healing_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; AuraScript* GetAuraScript() const override { return new spell_pri_glyph_of_prayer_of_healing_AuraScript(); } }; // 47788 - Guardian Spirit class spell_pri_guardian_spirit : public SpellScriptLoader { public: spell_pri_guardian_spirit() : SpellScriptLoader("spell_pri_guardian_spirit") { } class spell_pri_guardian_spirit_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_guardian_spirit_AuraScript); public: spell_pri_guardian_spirit_AuraScript() { healPct = 0; } private: uint32 healPct; bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL)) return false; return true; } bool Load() override { healPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); 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) { Unit* target = GetTarget(); if (dmgInfo.GetDamage() < target->GetHealth()) return; int32 healAmount = int32(target->CountPctFromMaxHealth(healPct)); // remove the aura now, we don't want 40% healing bonus Remove(AURA_REMOVE_BY_ENEMY_SPELL); target->CastCustomSpell(target, SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL, &healAmount, NULL, NULL, true); absorbAmount = dmgInfo.GetDamage(); } void Register() override { DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_guardian_spirit_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_SCHOOL_ABSORB); OnEffectAbsorb += AuraEffectAbsorbFn(spell_pri_guardian_spirit_AuraScript::Absorb, EFFECT_1); } }; AuraScript* GetAuraScript() const override { return new spell_pri_guardian_spirit_AuraScript(); } }; // 64904 - Hymn of Hope class spell_pri_hymn_of_hope : public SpellScriptLoader { public: spell_pri_hymn_of_hope() : SpellScriptLoader("spell_pri_hymn_of_hope") { } class spell_pri_hymn_of_hope_SpellScript : public SpellScript { PrepareSpellScript(spell_pri_hymn_of_hope_SpellScript); void FilterTargets(std::list& targets) { targets.remove_if(PowerCheck(POWER_MANA)); targets.remove_if(RaidCheck(GetCaster())); uint32 const maxTargets = 3; if (targets.size() > maxTargets) { targets.sort(Trinity::PowerPctOrderPred(POWER_MANA)); targets.resize(maxTargets); } } void Register() override { OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_hymn_of_hope_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY); } }; SpellScript* GetSpellScript() const override { return new spell_pri_hymn_of_hope_SpellScript(); } }; // -47569 - Improved Shadowform class spell_pri_imp_shadowform : public SpellScriptLoader { public: spell_pri_imp_shadowform() : SpellScriptLoader("spell_pri_imp_shadowform") { } class spell_pri_imp_shadowform_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_imp_shadowform_AuraScript); void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); if (roll_chance_i(aurEff->GetAmount())) eventInfo.GetActor()->RemoveMovementImpairingAuras(); } void Register() override { OnEffectProc += AuraEffectProcFn(spell_pri_imp_shadowform_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; AuraScript* GetAuraScript() const override { return new spell_pri_imp_shadowform_AuraScript(); } }; // -15337 - Improved Spirit Tap class spell_pri_improved_spirit_tap : public SpellScriptLoader { public: spell_pri_improved_spirit_tap() : SpellScriptLoader("spell_pri_improved_spirit_tap") { } class spell_pri_improved_spirit_tap_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_improved_spirit_tap_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_SHADOW_WORD_DEATH_R1) || !sSpellMgr->GetSpellInfo(SPELL_PRIEST_MIND_BLAST_R1)) return false; return true; } bool CheckProc(ProcEventInfo& eventInfo) { if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) { if (spellInfo->IsRankOf(sSpellMgr->AssertSpellInfo(SPELL_PRIEST_SHADOW_WORD_DEATH_R1)) || spellInfo->IsRankOf(sSpellMgr->AssertSpellInfo(SPELL_PRIEST_MIND_BLAST_R1))) return true; else if (spellInfo->Id == SPELL_PRIEST_MIND_FLAY_DAMAGE) return roll_chance_i(50); } return false; } void Register() override { DoCheckProc += AuraCheckProcFn(spell_pri_improved_spirit_tap_AuraScript::CheckProc); } }; AuraScript* GetAuraScript() const override { return new spell_pri_improved_spirit_tap_AuraScript(); } }; // 40438 - Priest Tier 6 Trinket class spell_pri_item_t6_trinket : public SpellScriptLoader { public: spell_pri_item_t6_trinket() : SpellScriptLoader("spell_pri_item_t6_trinket") { } class spell_pri_item_t6_trinket_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_item_t6_trinket_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_DIVINE_BLESSING) || !sSpellMgr->GetSpellInfo(SPELL_PRIEST_DIVINE_WRATH)) return false; return true; } void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { PreventDefaultAction(); Unit* caster = eventInfo.GetActor(); if (eventInfo.GetSpellTypeMask() & PROC_SPELL_TYPE_HEAL) caster->CastSpell((Unit*)nullptr, SPELL_PRIEST_DIVINE_BLESSING, true); if (eventInfo.GetSpellTypeMask() & PROC_SPELL_TYPE_DAMAGE) caster->CastSpell((Unit*)nullptr, SPELL_PRIEST_DIVINE_WRATH, true); } void Register() override { OnEffectProc += AuraEffectProcFn(spell_pri_item_t6_trinket_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; AuraScript* GetAuraScript() const override { return new spell_pri_item_t6_trinket_AuraScript(); } }; // -7001 - Lightwell Renew class spell_pri_lightwell_renew : public SpellScriptLoader { public: spell_pri_lightwell_renew() : SpellScriptLoader("spell_pri_lightwell_renew") { } class spell_pri_lightwell_renew_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_lightwell_renew_AuraScript); void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { if (Unit* caster = GetCaster()) { // Bonus from Glyph of Lightwell if (AuraEffect* modHealing = caster->GetAuraEffect(SPELL_PRIEST_GLYPH_OF_LIGHTWELL, EFFECT_0)) AddPct(amount, modHealing->GetAmount()); } } void Register() override { DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_lightwell_renew_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); } }; AuraScript* GetAuraScript() const override { return new spell_pri_lightwell_renew_AuraScript(); } }; // 8129 - Mana Burn class spell_pri_mana_burn : public SpellScriptLoader { public: spell_pri_mana_burn() : SpellScriptLoader("spell_pri_mana_burn") { } class spell_pri_mana_burn_SpellScript : public SpellScript { PrepareSpellScript(spell_pri_mana_burn_SpellScript); void HandleAfterHit() { if (Unit* unitTarget = GetHitUnit()) unitTarget->RemoveAurasWithMechanic((1 << MECHANIC_FEAR) | (1 << MECHANIC_POLYMORPH)); } void Register() override { AfterHit += SpellHitFn(spell_pri_mana_burn_SpellScript::HandleAfterHit); } }; SpellScript* GetSpellScript() const override { return new spell_pri_mana_burn_SpellScript; } }; // 28305 - Mana Leech (Passive) (Priest Pet Aura) class spell_pri_mana_leech : public SpellScriptLoader { public: spell_pri_mana_leech() : SpellScriptLoader("spell_pri_mana_leech") { } class spell_pri_mana_leech_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_mana_leech_AuraScript); public: spell_pri_mana_leech_AuraScript() { _procTarget = nullptr; } private: bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_MANA_LEECH_PROC)) return false; return true; } bool CheckProc(ProcEventInfo& /*eventInfo*/) { _procTarget = GetTarget()->GetOwner(); return _procTarget != nullptr; } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) { PreventDefaultAction(); GetTarget()->CastSpell(_procTarget, SPELL_PRIEST_MANA_LEECH_PROC, true, NULL, aurEff); } void Register() override { DoCheckProc += AuraCheckProcFn(spell_pri_mana_leech_AuraScript::CheckProc); OnEffectProc += AuraEffectProcFn(spell_pri_mana_leech_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } private: Unit* _procTarget; }; AuraScript* GetAuraScript() const override { return new spell_pri_mana_leech_AuraScript(); } }; // -49821 - Mind Sear class spell_pri_mind_sear : public SpellScriptLoader { public: spell_pri_mind_sear() : SpellScriptLoader("spell_pri_mind_sear") { } class spell_pri_mind_sear_SpellScript : public SpellScript { PrepareSpellScript(spell_pri_mind_sear_SpellScript); void FilterTargets(std::list& unitList) { unitList.remove_if(Trinity::ObjectGUIDCheck(GetCaster()->GetChannelObjectGuid())); } void Register() override { OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_mind_sear_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); } }; SpellScript* GetSpellScript() const override { return new spell_pri_mind_sear_SpellScript(); } }; // -47580 - Pain and Suffering (dummy aura) class spell_pri_pain_and_suffering_dummy : public SpellScriptLoader { public: spell_pri_pain_and_suffering_dummy() : SpellScriptLoader("spell_pri_pain_and_suffering_dummy") { } class spell_pri_pain_and_suffering_dummy_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_pain_and_suffering_dummy_AuraScript); bool CheckDummy(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) { return false; } void Register() override { DoCheckEffectProc += AuraCheckEffectProcFn(spell_pri_pain_and_suffering_dummy_AuraScript::CheckDummy, EFFECT_1, SPELL_AURA_DUMMY); } }; AuraScript* GetAuraScript() const override { return new spell_pri_pain_and_suffering_dummy_AuraScript; } }; // 47948 - Pain and Suffering (Proc) class spell_pri_pain_and_suffering_proc : public SpellScriptLoader { public: spell_pri_pain_and_suffering_proc() : SpellScriptLoader("spell_pri_pain_and_suffering_proc") { } class spell_pri_pain_and_suffering_proc_SpellScript : public SpellScript { PrepareSpellScript(spell_pri_pain_and_suffering_proc_SpellScript); void HandleEffectScriptEffect(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); // Refresh Shadow Word: Pain on target if (Unit* target = GetHitUnit()) { if (AuraEffect* aur = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x8000, 0, 0, caster->GetGUID())) { aur->SetBonusAmount(caster->SpellDamageBonusDone(target, aur->GetSpellInfo(), 0, DOT)); aur->CalculatePeriodic(caster, false, false); aur->GetBase()->RefreshDuration(); } } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_pri_pain_and_suffering_proc_SpellScript::HandleEffectScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; SpellScript* GetSpellScript() const override { return new spell_pri_pain_and_suffering_proc_SpellScript; } }; // -47540 - Penance class spell_pri_penance : public SpellScriptLoader { public: spell_pri_penance() : SpellScriptLoader("spell_pri_penance") { } class spell_pri_penance_SpellScript : public SpellScript { PrepareSpellScript(spell_pri_penance_SpellScript); bool Load() override { return GetCaster()->GetTypeId() == TYPEID_PLAYER; } bool Validate(SpellInfo const* spellInfo) override { SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_PRIEST_PENANCE_R1); if (!firstRankSpellInfo) return false; // can't use other spell than this penance due to spell_ranks dependency if (!spellInfo->IsRankOf(firstRankSpellInfo)) return false; uint8 rank = spellInfo->GetRank(); if (!sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_DAMAGE, rank, true)) return false; if (!sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_HEAL, rank, true)) return false; return true; } void HandleDummy(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); if (Unit* unitTarget = GetHitUnit()) { if (!unitTarget->IsAlive()) return; uint8 rank = GetSpellInfo()->GetRank(); if (caster->IsFriendlyTo(unitTarget)) caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_HEAL, rank), false); else caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_DAMAGE, rank), false); } } SpellCastResult CheckCast() { Player* caster = GetCaster()->ToPlayer(); if (Unit* target = GetExplTargetUnit()) if (!caster->IsFriendlyTo(target)) { if (!caster->IsValidAttackTarget(target)) return SPELL_FAILED_BAD_TARGETS; if (!caster->isInFront(target)) return SPELL_FAILED_UNIT_NOT_INFRONT; } return SPELL_CAST_OK; } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_pri_penance_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); OnCheckCast += SpellCheckCastFn(spell_pri_penance_SpellScript::CheckCast); } }; SpellScript* GetSpellScript() const override { return new spell_pri_penance_SpellScript; } }; // -17 - Power Word: Shield class spell_pri_power_word_shield : public SpellScriptLoader { public: spell_pri_power_word_shield() : SpellScriptLoader("spell_pri_power_word_shield") { } class spell_pri_power_word_shield_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_power_word_shield_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED)) return false; if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_R1)) return false; return true; } void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated) { canBeRecalculated = false; if (Unit* caster = GetCaster()) { // +80.68% from sp bonus float bonus = 0.8068f; // Borrowed Time if (AuraEffect const* borrowedTime = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_BORROWED_TIME, EFFECT_1)) bonus += CalculatePct(1.0f, borrowedTime->GetAmount()); bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()); // Improved PW: Shield: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :) // Improved PW: Shield is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus); bonus *= caster->CalculateLevelPenalty(GetSpellInfo()); amount += int32(bonus); // Twin Disciplines if (AuraEffect const* twinDisciplines = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_PRIEST, 0x400000, 0, 0, GetCasterGUID())) AddPct(amount, twinDisciplines->GetAmount()); // Focused Power amount *= caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_DONE_PERCENT); } } void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) { Unit* target = GetTarget(); if (dmgInfo.GetAttacker() == target) return; if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_PRIEST_REFLECTIVE_SHIELD_R1, EFFECT_0)) { int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount()); target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff); } } void Register() override { DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_power_word_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); AfterEffectAbsorb += AuraEffectAbsorbFn(spell_pri_power_word_shield_AuraScript::ReflectDamage, EFFECT_0); } }; AuraScript* GetAuraScript() const override { return new spell_pri_power_word_shield_AuraScript(); } }; // 33110 - Prayer of Mending Heal class spell_pri_prayer_of_mending_heal : public SpellScriptLoader { public: spell_pri_prayer_of_mending_heal() : SpellScriptLoader("spell_pri_prayer_of_mending_heal") { } class spell_pri_prayer_of_mending_heal_SpellScript : public SpellScript { PrepareSpellScript(spell_pri_prayer_of_mending_heal_SpellScript); void HandleHeal(SpellEffIndex /*effIndex*/) { if (Unit* caster = GetOriginalCaster()) { if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_PRIEST_T9_HEALING_2P, EFFECT_0)) { int32 heal = GetHitHeal(); AddPct(heal, aurEff->GetAmount()); SetHitHeal(heal); } } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_pri_prayer_of_mending_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); } }; SpellScript* GetSpellScript() const override { return new spell_pri_prayer_of_mending_heal_SpellScript(); } }; // -139 - Renew class spell_pri_renew : public SpellScriptLoader { public: spell_pri_renew() : SpellScriptLoader("spell_pri_renew") { } class spell_pri_renew_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_renew_AuraScript); bool Load() override { return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; } void HandleApplyEffect(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { if (Unit* caster = GetCaster()) { // Empowered Renew if (AuraEffect const* empoweredRenewAurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT, EFFECT_1)) { uint32 heal = caster->SpellHealingBonusDone(GetTarget(), GetSpellInfo(), GetEffect(EFFECT_0)->GetAmount(), DOT); heal = GetTarget()->SpellHealingBonusTaken(caster, GetSpellInfo(), heal, DOT); int32 basepoints0 = empoweredRenewAurEff->GetAmount() * GetEffect(EFFECT_0)->GetTotalTicks() * int32(heal) / 100; caster->CastCustomSpell(GetTarget(), SPELL_PRIEST_EMPOWERED_RENEW, &basepoints0, NULL, NULL, true, NULL, aurEff); } } } void Register() override { OnEffectApply += AuraEffectApplyFn(spell_pri_renew_AuraScript::HandleApplyEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); } }; AuraScript* GetAuraScript() const override { return new spell_pri_renew_AuraScript(); } }; // 57989 - Shadowfiend Death class spell_pri_shadowfiend_death : public SpellScriptLoader { public: spell_pri_shadowfiend_death() : SpellScriptLoader("spell_pri_shadowfiend_death") { } class spell_pri_shadowfiend_death_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_shadowfiend_death_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_SHADOWFIEND_MANA)) return false; return true; } bool CheckProc(ProcEventInfo& eventInfo) { DamageInfo* damageInfo = eventInfo.GetDamageInfo(); if (!damageInfo || !damageInfo->GetDamage()) return false; Unit* shadowfiend = eventInfo.GetActionTarget(); if (!shadowfiend->GetOwner()) return false; return shadowfiend->HealthBelowPctDamaged(1, damageInfo->GetDamage()); } void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { PreventDefaultAction(); Unit* caster = eventInfo.GetActionTarget()->GetOwner(); caster->CastSpell(caster, SPELL_PRIEST_GLYPH_OF_SHADOWFIEND_MANA, true); } void Register() override { DoCheckProc += AuraCheckProcFn(spell_pri_shadowfiend_death_AuraScript::CheckProc); OnEffectProc += AuraEffectProcFn(spell_pri_shadowfiend_death_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; AuraScript* GetAuraScript() const override { return new spell_pri_shadowfiend_death_AuraScript(); } }; // -32379 - Shadow Word Death class spell_pri_shadow_word_death : public SpellScriptLoader { public: spell_pri_shadow_word_death() : SpellScriptLoader("spell_pri_shadow_word_death") { } class spell_pri_shadow_word_death_SpellScript : public SpellScript { PrepareSpellScript(spell_pri_shadow_word_death_SpellScript); void HandleDamage() { int32 damage = GetHitDamage(); // Pain and Suffering reduces damage if (AuraEffect* aurEff = GetCaster()->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_PAIN_AND_SUFFERING, EFFECT_1)) AddPct(damage, aurEff->GetAmount()); GetCaster()->CastCustomSpell(GetCaster(), SPELL_PRIEST_SHADOW_WORD_DEATH, &damage, nullptr, nullptr, true); } void Register() override { OnHit += SpellHitFn(spell_pri_shadow_word_death_SpellScript::HandleDamage); } }; SpellScript* GetSpellScript() const override { return new spell_pri_shadow_word_death_SpellScript(); } }; // 15286 - Vampiric Embrace class spell_pri_vampiric_embrace : public SpellScriptLoader { public: spell_pri_vampiric_embrace() : SpellScriptLoader("spell_pri_vampiric_embrace") { } class spell_pri_vampiric_embrace_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_vampiric_embrace_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL)) return false; return true; } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); DamageInfo* damageInfo = eventInfo.GetDamageInfo(); if (!damageInfo || !damageInfo->GetDamage()) return; int32 selfHeal = CalculatePct(static_cast(damageInfo->GetDamage()), aurEff->GetAmount()); int32 partyHeal = selfHeal / 5; Unit* caster = eventInfo.GetActor(); caster->CastCustomSpell((Unit*)nullptr, SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL, &partyHeal, &selfHeal, nullptr, true); } void Register() override { OnEffectProc += AuraEffectProcFn(spell_pri_vampiric_embrace_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; AuraScript* GetAuraScript() const override { return new spell_pri_vampiric_embrace_AuraScript(); } }; // -34914 - Vampiric Touch class spell_pri_vampiric_touch : public SpellScriptLoader { public: spell_pri_vampiric_touch() : SpellScriptLoader("spell_pri_vampiric_touch") { } class spell_pri_vampiric_touch_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_vampiric_touch_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL) || !sSpellMgr->GetSpellInfo(SPELL_REPLENISHMENT)) return false; return true; } bool CheckDummy(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) { return false; } void HandleDispel(DispelInfo* /*dispelInfo*/) { if (Unit* caster = GetCaster()) { if (Unit* target = GetUnitOwner()) { if (AuraEffect const* aurEff = GetEffect(EFFECT_1)) { int32 damage = aurEff->GetAmount() * 8; // backfire damage caster->CastCustomSpell(target, SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL, &damage, NULL, NULL, true, NULL, aurEff); } } } } void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { PreventDefaultAction(); eventInfo.GetActor()->CastSpell((Unit*)nullptr, SPELL_REPLENISHMENT, true); } void Register() override { DoCheckEffectProc += AuraCheckEffectProcFn(spell_pri_vampiric_touch_AuraScript::CheckDummy, EFFECT_0, SPELL_AURA_DUMMY); AfterDispel += AuraDispelFn(spell_pri_vampiric_touch_AuraScript::HandleDispel); OnEffectProc += AuraEffectProcFn(spell_pri_vampiric_touch_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_DUMMY); } }; AuraScript* GetAuraScript() const override { return new spell_pri_vampiric_touch_AuraScript(); } }; // 28809 - Greater Heal class spell_pri_t3_4p_bonus : public SpellScriptLoader { public: spell_pri_t3_4p_bonus() : SpellScriptLoader("spell_pri_t3_4p_bonus") { } class spell_pri_t3_4p_bonus_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_t3_4p_bonus_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_ARMOR_OF_FAITH)) return false; return true; } void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { PreventDefaultAction(); eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_PRIEST_ARMOR_OF_FAITH, true); } void Register() override { OnEffectProc += AuraEffectProcFn(spell_pri_t3_4p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; AuraScript* GetAuraScript() const override { return new spell_pri_t3_4p_bonus_AuraScript(); } }; // 37594 - Greater Heal Refund class spell_pri_t5_heal_2p_bonus : public SpellScriptLoader { public: spell_pri_t5_heal_2p_bonus() : SpellScriptLoader("spell_pri_t5_heal_2p_bonus") { } class spell_pri_t5_heal_2p_bonus_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_t5_heal_2p_bonus_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_ITEM_EFFICIENCY)) return false; return true; } bool CheckProc(ProcEventInfo& eventInfo) { if (HealInfo* healInfo = eventInfo.GetHealInfo()) if (Unit* healTarget = healInfo->GetTarget()) if (healInfo->GetEffectiveHeal()) if (healTarget->GetHealth() >= healTarget->GetMaxHealth()) return true; return false; } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) { PreventDefaultAction(); GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_ITEM_EFFICIENCY, true, nullptr, aurEff); } void Register() override { DoCheckProc += AuraCheckProcFn(spell_pri_t5_heal_2p_bonus_AuraScript::CheckProc); OnEffectProc += AuraEffectProcFn(spell_pri_t5_heal_2p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); } }; AuraScript* GetAuraScript() const override { return new spell_pri_t5_heal_2p_bonus_AuraScript(); } }; // 70770 - Item - Priest T10 Healer 2P Bonus class spell_pri_t10_heal_2p_bonus : public SpellScriptLoader { public: spell_pri_t10_heal_2p_bonus() : SpellScriptLoader("spell_pri_t10_heal_2p_bonus") { } class spell_pri_t10_heal_2p_bonus_AuraScript : public AuraScript { PrepareAuraScript(spell_pri_t10_heal_2p_bonus_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_BLESSED_HEALING)) return false; return true; } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); HealInfo* healInfo = eventInfo.GetHealInfo(); if (!healInfo || !healInfo->GetHeal()) return; SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_BLESSED_HEALING); int32 amount = CalculatePct(static_cast(healInfo->GetHeal()), aurEff->GetAmount()); amount /= spellInfo->GetMaxTicks(); // Add remaining ticks to healing done Unit* caster = eventInfo.GetActor(); Unit* target = eventInfo.GetProcTarget(); amount += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_PRIEST_BLESSED_HEALING, SPELL_AURA_PERIODIC_HEAL); caster->CastCustomSpell(SPELL_PRIEST_BLESSED_HEALING, SPELLVALUE_BASE_POINT0, amount, target, true); } void Register() override { OnEffectProc += AuraEffectProcFn(spell_pri_t10_heal_2p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; AuraScript* GetAuraScript() const override { return new spell_pri_t10_heal_2p_bonus_AuraScript(); } }; void AddSC_priest_spell_scripts() { new spell_pri_aq_3p_bonus(); new spell_pri_blessed_recovery(); new spell_pri_body_and_soul(); new spell_pri_circle_of_healing(); new spell_pri_divine_aegis(); new spell_pri_divine_hymn(); new spell_pri_glyph_of_dispel_magic(); new spell_pri_glyph_of_prayer_of_healing(); new spell_pri_guardian_spirit(); new spell_pri_hymn_of_hope(); new spell_pri_imp_shadowform(); new spell_pri_improved_spirit_tap(); new spell_pri_item_t6_trinket(); new spell_pri_lightwell_renew(); new spell_pri_mana_burn(); new spell_pri_mana_leech(); new spell_pri_mind_sear(); new spell_pri_pain_and_suffering_dummy(); new spell_pri_pain_and_suffering_proc(); new spell_pri_penance(); new spell_pri_power_word_shield(); new spell_pri_prayer_of_mending_heal(); new spell_pri_renew(); new spell_pri_shadowfiend_death(); new spell_pri_shadow_word_death(); new spell_pri_vampiric_embrace(); new spell_pri_vampiric_touch(); new spell_pri_t3_4p_bonus(); new spell_pri_t5_heal_2p_bonus(); new spell_pri_t10_heal_2p_bonus(); }