/src/server/scripts/Spells/spell_priest.cpp

https://gitlab.com/tkrokli/TrinityCore_434 · C++ · 1265 lines · 992 code · 210 blank · 63 comment · 75 complexity · ee45969e31dfc1c059e25c796a70d203 MD5 · raw file

  1. /*
  2. * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
  3. *
  4. * This program is free software; you can redistribute it and/or modify it
  5. * under the terms of the GNU General Public License as published by the
  6. * Free Software Foundation; either version 2 of the License, or (at your
  7. * option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * You should have received a copy of the GNU General Public License along
  15. * with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. /*
  18. * Scripts for spells with SPELLFAMILY_PRIEST and SPELLFAMILY_GENERIC spells used by priest players.
  19. * Ordered alphabetically using scriptname.
  20. * Scriptnames of files in this file should be prefixed with "spell_pri_".
  21. */
  22. #include "Player.h"
  23. #include "ScriptMgr.h"
  24. #include "SpellScript.h"
  25. #include "SpellAuraEffects.h"
  26. #include "GridNotifiers.h"
  27. enum PriestSpells
  28. {
  29. SPELL_PRIEST_ABSOLUTION = 33167,
  30. SPELL_PRIEST_BODY_AND_SOUL_DISPEL = 64136,
  31. SPELL_PRIEST_BODY_AND_SOUL_SPEED = 65081,
  32. SPELL_PRIEST_CURE_DISEASE = 528,
  33. SPELL_PRIEST_DISPEL_MAGIC_FRIENDLY = 97690,
  34. SPELL_PRIEST_DISPEL_MAGIC_HOSTILE = 97691,
  35. SPELL_PRIEST_DIVINE_AEGIS = 47753,
  36. SPELL_PRIEST_DIVINE_TOUCH = 63544,
  37. SPELL_PRIEST_GLYPH_OF_CIRCLE_OF_HEALING = 55675,
  38. SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC = 55677,
  39. SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC_HEAL = 56131,
  40. SPELL_PRIEST_GLYPH_OF_LIGHTWELL = 55673,
  41. SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL = 56161,
  42. SPELL_PRIEST_GLYPH_OF_SHADOW = 107906,
  43. SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL = 48153,
  44. SPELL_PRIEST_ITEM_EFFICIENCY = 37595,
  45. SPELL_PRIEST_LEAP_OF_FAITH = 73325,
  46. SPELL_PRIEST_LEAP_OF_FAITH_EFFECT = 92832,
  47. SPELL_PRIEST_LEAP_OF_FAITH_EFFECT_TRIGGER = 92833,
  48. SPELL_PRIEST_LEAP_OF_FAITH_TRIGGERED = 92572,
  49. SPELL_PRIEST_MANA_LEECH_PROC = 34650,
  50. SPELL_PRIEST_PENANCE_R1 = 47540,
  51. SPELL_PRIEST_PENANCE_R1_DAMAGE = 47758,
  52. SPELL_PRIEST_PENANCE_R1_HEAL = 47757,
  53. SPELL_PRIEST_REFLECTIVE_SHIELD_R1 = 33201,
  54. SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED = 33619,
  55. SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH = 107903,
  56. SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH = 107904,
  57. SPELL_PRIEST_SHADOW_WORD_DEATH = 32409,
  58. SPELL_PRIEST_TWIN_DISCIPLINES_RANK_1 = 47586,
  59. SPELL_PRIEST_T9_HEALING_2P = 67201,
  60. SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL = 15290,
  61. SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL = 64085
  62. };
  63. enum PriestSpellIcons
  64. {
  65. PRIEST_ICON_ID_BORROWED_TIME = 2899,
  66. PRIEST_ICON_ID_DIVINE_TOUCH_TALENT = 3021,
  67. PRIEST_ICON_ID_PAIN_AND_SUFFERING = 2874
  68. };
  69. enum MiscSpells
  70. {
  71. SPELL_GEN_REPLENISHMENT = 57669
  72. };
  73. class PowerCheck
  74. {
  75. public:
  76. explicit PowerCheck(Powers const power) : _power(power) { }
  77. bool operator()(WorldObject* obj) const
  78. {
  79. if (Unit* target = obj->ToUnit())
  80. return target->getPowerType() != _power;
  81. return true;
  82. }
  83. private:
  84. Powers const _power;
  85. };
  86. class RaidCheck
  87. {
  88. public:
  89. explicit RaidCheck(Unit const* caster) : _caster(caster) { }
  90. bool operator()(WorldObject* obj) const
  91. {
  92. if (Unit* target = obj->ToUnit())
  93. return !_caster->IsInRaidWith(target);
  94. return true;
  95. }
  96. private:
  97. Unit const* _caster;
  98. };
  99. class spell_pri_body_and_soul : public SpellScriptLoader
  100. {
  101. public:
  102. spell_pri_body_and_soul() : SpellScriptLoader("spell_pri_body_and_soul") { }
  103. class spell_pri_body_and_soul_AuraScript : public AuraScript
  104. {
  105. PrepareAuraScript(spell_pri_body_and_soul_AuraScript);
  106. bool Validate(SpellInfo const* /*spellInfo*/) override
  107. {
  108. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_CURE_DISEASE) ||
  109. !sSpellMgr->GetSpellInfo(SPELL_PRIEST_BODY_AND_SOUL_DISPEL))
  110. return false;
  111. return true;
  112. }
  113. void HandleEffectSpeedProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
  114. {
  115. PreventDefaultAction();
  116. // Proc only with Power Word: Shield or Leap of Faith
  117. if (!(eventInfo.GetDamageInfo()->GetSpellInfo()->SpellFamilyFlags[0] & 0x1 || eventInfo.GetDamageInfo()->GetSpellInfo()->SpellFamilyFlags[2] & 0x80000))
  118. return;
  119. GetTarget()->CastCustomSpell(SPELL_PRIEST_BODY_AND_SOUL_SPEED, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), eventInfo.GetProcTarget(), true, NULL, aurEff);
  120. }
  121. void HandleEffectDispelProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
  122. {
  123. PreventDefaultAction();
  124. // Proc only with Cure Disease
  125. if (eventInfo.GetDamageInfo()->GetSpellInfo()->Id != SPELL_PRIEST_CURE_DISEASE || eventInfo.GetProcTarget() != GetTarget())
  126. return;
  127. if (roll_chance_i(aurEff->GetAmount()))
  128. GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_PRIEST_BODY_AND_SOUL_DISPEL, true, NULL, aurEff);
  129. }
  130. void Register() override
  131. {
  132. OnEffectProc += AuraEffectProcFn(spell_pri_body_and_soul_AuraScript::HandleEffectSpeedProc, EFFECT_0, SPELL_AURA_DUMMY);
  133. OnEffectProc += AuraEffectProcFn(spell_pri_body_and_soul_AuraScript::HandleEffectDispelProc, EFFECT_1, SPELL_AURA_DUMMY);
  134. }
  135. };
  136. AuraScript* GetAuraScript() const override
  137. {
  138. return new spell_pri_body_and_soul_AuraScript();
  139. }
  140. };
  141. // 34861 - Circle of Healing
  142. class spell_pri_circle_of_healing : public SpellScriptLoader
  143. {
  144. public:
  145. spell_pri_circle_of_healing() : SpellScriptLoader("spell_pri_circle_of_healing") { }
  146. class spell_pri_circle_of_healing_SpellScript : public SpellScript
  147. {
  148. PrepareSpellScript(spell_pri_circle_of_healing_SpellScript);
  149. bool Validate(SpellInfo const* /*spellInfo*/) override
  150. {
  151. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_CIRCLE_OF_HEALING))
  152. return false;
  153. return true;
  154. }
  155. void FilterTargets(std::list<WorldObject*>& targets)
  156. {
  157. targets.remove_if(RaidCheck(GetCaster()));
  158. uint32 const maxTargets = GetCaster()->HasAura(SPELL_PRIEST_GLYPH_OF_CIRCLE_OF_HEALING) ? 6 : 5; // Glyph of Circle of Healing
  159. if (targets.size() > maxTargets)
  160. {
  161. targets.sort(Trinity::HealthPctOrderPred());
  162. targets.resize(maxTargets);
  163. }
  164. }
  165. void Register() override
  166. {
  167. OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_circle_of_healing_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
  168. }
  169. };
  170. SpellScript* GetSpellScript() const override
  171. {
  172. return new spell_pri_circle_of_healing_SpellScript();
  173. }
  174. };
  175. // 527 - Dispel magic
  176. class spell_pri_dispel_magic : public SpellScriptLoader
  177. {
  178. public:
  179. spell_pri_dispel_magic() : SpellScriptLoader("spell_pri_dispel_magic") { }
  180. class spell_pri_dispel_magic_SpellScript : public SpellScript
  181. {
  182. PrepareSpellScript(spell_pri_dispel_magic_SpellScript);
  183. bool Validate(SpellInfo const* /*spellInfo*/)
  184. {
  185. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_ABSOLUTION))
  186. return false;
  187. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC_HEAL))
  188. return false;
  189. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC))
  190. return false;
  191. return true;
  192. }
  193. SpellCastResult CheckCast()
  194. {
  195. Unit* caster = GetCaster();
  196. Unit* target = GetExplTargetUnit();
  197. if (!target || (!caster->HasAura(SPELL_PRIEST_ABSOLUTION) && caster != target && target->IsFriendlyTo(caster)))
  198. return SPELL_FAILED_BAD_TARGETS;
  199. return SPELL_CAST_OK;
  200. }
  201. void AfterEffectHit(SpellEffIndex /*effIndex*/)
  202. {
  203. if (GetHitUnit()->IsFriendlyTo(GetCaster()))
  204. {
  205. GetCaster()->CastSpell(GetHitUnit(), SPELL_PRIEST_DISPEL_MAGIC_FRIENDLY, true);
  206. if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffect(SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC, EFFECT_0))
  207. {
  208. int32 heal = GetHitUnit()->CountPctFromMaxHealth(aurEff->GetAmount());
  209. GetCaster()->CastCustomSpell(SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC_HEAL, SPELLVALUE_BASE_POINT0, heal, GetHitUnit());
  210. }
  211. }
  212. else
  213. GetCaster()->CastSpell(GetHitUnit(), SPELL_PRIEST_DISPEL_MAGIC_HOSTILE, true);
  214. }
  215. void Register()
  216. {
  217. OnCheckCast += SpellCheckCastFn(spell_pri_dispel_magic_SpellScript::CheckCast);
  218. OnEffectHitTarget += SpellEffectFn(spell_pri_dispel_magic_SpellScript::AfterEffectHit, EFFECT_0, SPELL_EFFECT_DUMMY);
  219. }
  220. };
  221. SpellScript* GetSpellScript() const
  222. {
  223. return new spell_pri_dispel_magic_SpellScript();
  224. }
  225. };
  226. // -47509 - Divine Aegis
  227. class spell_pri_divine_aegis : public SpellScriptLoader
  228. {
  229. public:
  230. spell_pri_divine_aegis() : SpellScriptLoader("spell_pri_divine_aegis") { }
  231. class spell_pri_divine_aegis_AuraScript : public AuraScript
  232. {
  233. PrepareAuraScript(spell_pri_divine_aegis_AuraScript);
  234. bool Validate(SpellInfo const* /*spellInfo*/) override
  235. {
  236. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_DIVINE_AEGIS))
  237. return false;
  238. return true;
  239. }
  240. bool CheckProc(ProcEventInfo& eventInfo)
  241. {
  242. return eventInfo.GetProcTarget() != nullptr;
  243. }
  244. void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
  245. {
  246. PreventDefaultAction();
  247. int32 absorb = CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount());
  248. // Multiple effects stack, so let's try to find this aura.
  249. if (AuraEffect const* aegis = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PRIEST_DIVINE_AEGIS, EFFECT_0))
  250. absorb += aegis->GetAmount();
  251. absorb = std::min(absorb, eventInfo.GetProcTarget()->getLevel() * 125);
  252. GetTarget()->CastCustomSpell(SPELL_PRIEST_DIVINE_AEGIS, SPELLVALUE_BASE_POINT0, absorb, eventInfo.GetProcTarget(), true, NULL, aurEff);
  253. }
  254. void Register() override
  255. {
  256. DoCheckProc += AuraCheckProcFn(spell_pri_divine_aegis_AuraScript::CheckProc);
  257. OnEffectProc += AuraEffectProcFn(spell_pri_divine_aegis_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
  258. }
  259. };
  260. AuraScript* GetAuraScript() const override
  261. {
  262. return new spell_pri_divine_aegis_AuraScript();
  263. }
  264. };
  265. // 64844 - Divine Hymn
  266. class spell_pri_divine_hymn : public SpellScriptLoader
  267. {
  268. public:
  269. spell_pri_divine_hymn() : SpellScriptLoader("spell_pri_divine_hymn") { }
  270. class spell_pri_divine_hymn_SpellScript : public SpellScript
  271. {
  272. PrepareSpellScript(spell_pri_divine_hymn_SpellScript);
  273. void FilterTargets(std::list<WorldObject*>& targets)
  274. {
  275. targets.remove_if(RaidCheck(GetCaster()));
  276. uint32 const maxTargets = 3;
  277. if (targets.size() > maxTargets)
  278. {
  279. targets.sort(Trinity::HealthPctOrderPred());
  280. targets.resize(maxTargets);
  281. }
  282. }
  283. void Register() override
  284. {
  285. OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_divine_hymn_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY);
  286. }
  287. };
  288. SpellScript* GetSpellScript() const override
  289. {
  290. return new spell_pri_divine_hymn_SpellScript();
  291. }
  292. };
  293. // 55680 - Glyph of Prayer of Healing
  294. class spell_pri_glyph_of_prayer_of_healing : public SpellScriptLoader
  295. {
  296. public:
  297. spell_pri_glyph_of_prayer_of_healing() : SpellScriptLoader("spell_pri_glyph_of_prayer_of_healing") { }
  298. class spell_pri_glyph_of_prayer_of_healing_AuraScript : public AuraScript
  299. {
  300. PrepareAuraScript(spell_pri_glyph_of_prayer_of_healing_AuraScript);
  301. bool Validate(SpellInfo const* /*spellInfo*/) override
  302. {
  303. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL))
  304. return false;
  305. return true;
  306. }
  307. void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
  308. {
  309. PreventDefaultAction();
  310. SpellInfo const* triggeredSpellInfo = sSpellMgr->EnsureSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL);
  311. int32 heal = int32(CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount()) / triggeredSpellInfo->GetMaxTicks());
  312. GetTarget()->CastCustomSpell(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL, SPELLVALUE_BASE_POINT0, heal, eventInfo.GetProcTarget(), true, NULL, aurEff);
  313. }
  314. void Register() override
  315. {
  316. OnEffectProc += AuraEffectProcFn(spell_pri_glyph_of_prayer_of_healing_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
  317. }
  318. };
  319. AuraScript* GetAuraScript() const override
  320. {
  321. return new spell_pri_glyph_of_prayer_of_healing_AuraScript();
  322. }
  323. };
  324. class spell_pri_improved_power_word_shield : public SpellScriptLoader
  325. {
  326. public:
  327. spell_pri_improved_power_word_shield() : SpellScriptLoader("spell_pri_improved_power_word_shield") { }
  328. class spell_pri_improved_power_word_shield_AuraScript : public AuraScript
  329. {
  330. PrepareAuraScript(spell_pri_improved_power_word_shield_AuraScript);
  331. void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod)
  332. {
  333. if (!spellMod)
  334. {
  335. spellMod = new SpellModifier(GetAura());
  336. spellMod->op = SpellModOp(aurEff->GetMiscValue());
  337. spellMod->type = SPELLMOD_PCT;
  338. spellMod->spellId = GetId();
  339. spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask;
  340. }
  341. spellMod->value = aurEff->GetAmount();
  342. }
  343. void Register() override
  344. {
  345. DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_pri_improved_power_word_shield_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY);
  346. }
  347. };
  348. AuraScript* GetAuraScript() const override
  349. {
  350. return new spell_pri_improved_power_word_shield_AuraScript();
  351. }
  352. };
  353. // 37594 - Greater Heal Refund
  354. class spell_pri_item_greater_heal_refund : public SpellScriptLoader
  355. {
  356. public:
  357. spell_pri_item_greater_heal_refund() : SpellScriptLoader("spell_pri_item_greater_heal_refund") { }
  358. class spell_pri_item_greater_heal_refund_AuraScript : public AuraScript
  359. {
  360. PrepareAuraScript(spell_pri_item_greater_heal_refund_AuraScript);
  361. bool Validate(SpellInfo const* /*spellInfo*/) override
  362. {
  363. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_ITEM_EFFICIENCY))
  364. return false;
  365. return true;
  366. }
  367. void OnProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
  368. {
  369. PreventDefaultAction();
  370. GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_ITEM_EFFICIENCY, true, NULL, aurEff);
  371. }
  372. void Register() override
  373. {
  374. OnEffectProc += AuraEffectProcFn(spell_pri_item_greater_heal_refund_AuraScript::OnProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
  375. }
  376. };
  377. AuraScript* GetAuraScript() const override
  378. {
  379. return new spell_pri_item_greater_heal_refund_AuraScript();
  380. }
  381. };
  382. // 47788 - Guardian Spirit
  383. class spell_pri_guardian_spirit : public SpellScriptLoader
  384. {
  385. public:
  386. spell_pri_guardian_spirit() : SpellScriptLoader("spell_pri_guardian_spirit") { }
  387. class spell_pri_guardian_spirit_AuraScript : public AuraScript
  388. {
  389. PrepareAuraScript(spell_pri_guardian_spirit_AuraScript);
  390. public:
  391. spell_pri_guardian_spirit_AuraScript()
  392. {
  393. healPct = 0;
  394. }
  395. private:
  396. uint32 healPct;
  397. bool Validate(SpellInfo const* /*spellInfo*/) override
  398. {
  399. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL))
  400. return false;
  401. return true;
  402. }
  403. bool Load() override
  404. {
  405. healPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue();
  406. return true;
  407. }
  408. void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
  409. {
  410. // Set absorbtion amount to unlimited
  411. amount = -1;
  412. }
  413. void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount)
  414. {
  415. Unit* target = GetTarget();
  416. if (dmgInfo.GetDamage() < target->GetHealth())
  417. return;
  418. int32 healAmount = int32(target->CountPctFromMaxHealth(healPct));
  419. // remove the aura now, we don't want 40% healing bonus
  420. Remove(AURA_REMOVE_BY_ENEMY_SPELL);
  421. target->CastCustomSpell(target, SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL, &healAmount, NULL, NULL, true);
  422. absorbAmount = dmgInfo.GetDamage();
  423. }
  424. void Register() override
  425. {
  426. DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_guardian_spirit_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_SCHOOL_ABSORB);
  427. OnEffectAbsorb += AuraEffectAbsorbFn(spell_pri_guardian_spirit_AuraScript::Absorb, EFFECT_1);
  428. }
  429. };
  430. AuraScript* GetAuraScript() const override
  431. {
  432. return new spell_pri_guardian_spirit_AuraScript();
  433. }
  434. };
  435. // 64904 - Hymn of Hope
  436. class spell_pri_hymn_of_hope : public SpellScriptLoader
  437. {
  438. public:
  439. spell_pri_hymn_of_hope() : SpellScriptLoader("spell_pri_hymn_of_hope") { }
  440. class spell_pri_hymn_of_hope_SpellScript : public SpellScript
  441. {
  442. PrepareSpellScript(spell_pri_hymn_of_hope_SpellScript);
  443. void FilterTargets(std::list<WorldObject*>& targets)
  444. {
  445. targets.remove_if(PowerCheck(POWER_MANA));
  446. targets.remove_if(RaidCheck(GetCaster()));
  447. uint32 const maxTargets = 3;
  448. if (targets.size() > maxTargets)
  449. {
  450. targets.sort(Trinity::PowerPctOrderPred(POWER_MANA));
  451. targets.resize(maxTargets);
  452. }
  453. }
  454. void Register() override
  455. {
  456. OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_hymn_of_hope_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY);
  457. }
  458. };
  459. SpellScript* GetSpellScript() const override
  460. {
  461. return new spell_pri_hymn_of_hope_SpellScript();
  462. }
  463. };
  464. // 92833 - Leap of Faith
  465. class spell_pri_leap_of_faith_effect_trigger : public SpellScriptLoader
  466. {
  467. public:
  468. spell_pri_leap_of_faith_effect_trigger() : SpellScriptLoader("spell_pri_leap_of_faith_effect_trigger") { }
  469. class spell_pri_leap_of_faith_effect_trigger_SpellScript : public SpellScript
  470. {
  471. PrepareSpellScript(spell_pri_leap_of_faith_effect_trigger_SpellScript);
  472. bool Validate(SpellInfo const* /*spellInfo*/) override
  473. {
  474. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_LEAP_OF_FAITH_EFFECT))
  475. return false;
  476. return true;
  477. }
  478. void HandleEffectDummy(SpellEffIndex /*effIndex*/)
  479. {
  480. Position destPos = GetHitDest()->GetPosition();
  481. SpellCastTargets targets;
  482. targets.SetDst(destPos);
  483. targets.SetUnitTarget(GetCaster());
  484. GetHitUnit()->CastSpell(targets, sSpellMgr->GetSpellInfo(GetEffectValue()), NULL);
  485. }
  486. void Register() override
  487. {
  488. OnEffectHitTarget += SpellEffectFn(spell_pri_leap_of_faith_effect_trigger_SpellScript::HandleEffectDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  489. }
  490. };
  491. SpellScript* GetSpellScript() const override
  492. {
  493. return new spell_pri_leap_of_faith_effect_trigger_SpellScript();
  494. }
  495. };
  496. // 7001 - Lightwell Renew
  497. class spell_pri_lightwell_renew : public SpellScriptLoader
  498. {
  499. public:
  500. spell_pri_lightwell_renew() : SpellScriptLoader("spell_pri_lightwell_renew") { }
  501. class spell_pri_lightwell_renew_AuraScript : public AuraScript
  502. {
  503. PrepareAuraScript(spell_pri_lightwell_renew_AuraScript);
  504. void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
  505. {
  506. if (Unit* caster = GetCaster())
  507. {
  508. // Bonus from Glyph of Lightwell
  509. if (AuraEffect* modHealing = caster->GetAuraEffect(SPELL_PRIEST_GLYPH_OF_LIGHTWELL, EFFECT_0))
  510. AddPct(amount, modHealing->GetAmount());
  511. }
  512. }
  513. void Register() override
  514. {
  515. DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_lightwell_renew_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL);
  516. }
  517. };
  518. AuraScript* GetAuraScript() const override
  519. {
  520. return new spell_pri_lightwell_renew_AuraScript();
  521. }
  522. };
  523. // 8129 - Mana Burn
  524. class spell_pri_mana_burn : public SpellScriptLoader
  525. {
  526. public:
  527. spell_pri_mana_burn() : SpellScriptLoader("spell_pri_mana_burn") { }
  528. class spell_pri_mana_burn_SpellScript : public SpellScript
  529. {
  530. PrepareSpellScript(spell_pri_mana_burn_SpellScript);
  531. void HandleAfterHit()
  532. {
  533. if (Unit* unitTarget = GetHitUnit())
  534. unitTarget->RemoveAurasWithMechanic((1 << MECHANIC_FEAR) | (1 << MECHANIC_POLYMORPH));
  535. }
  536. void Register() override
  537. {
  538. AfterHit += SpellHitFn(spell_pri_mana_burn_SpellScript::HandleAfterHit);
  539. }
  540. };
  541. SpellScript* GetSpellScript() const override
  542. {
  543. return new spell_pri_mana_burn_SpellScript;
  544. }
  545. };
  546. // 28305 - Mana Leech (Passive) (Priest Pet Aura)
  547. class spell_pri_mana_leech : public SpellScriptLoader
  548. {
  549. public:
  550. spell_pri_mana_leech() : SpellScriptLoader("spell_pri_mana_leech") { }
  551. class spell_pri_mana_leech_AuraScript : public AuraScript
  552. {
  553. PrepareAuraScript(spell_pri_mana_leech_AuraScript);
  554. public:
  555. spell_pri_mana_leech_AuraScript()
  556. {
  557. _procTarget = nullptr;
  558. }
  559. private:
  560. bool Validate(SpellInfo const* /*spellInfo*/) override
  561. {
  562. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_MANA_LEECH_PROC))
  563. return false;
  564. return true;
  565. }
  566. bool CheckProc(ProcEventInfo& /*eventInfo*/)
  567. {
  568. _procTarget = GetTarget()->GetOwner();
  569. return _procTarget != nullptr;
  570. }
  571. void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
  572. {
  573. PreventDefaultAction();
  574. GetTarget()->CastSpell(_procTarget, SPELL_PRIEST_MANA_LEECH_PROC, true, NULL, aurEff);
  575. }
  576. void Register() override
  577. {
  578. DoCheckProc += AuraCheckProcFn(spell_pri_mana_leech_AuraScript::CheckProc);
  579. OnEffectProc += AuraEffectProcFn(spell_pri_mana_leech_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
  580. }
  581. private:
  582. Unit* _procTarget;
  583. };
  584. AuraScript* GetAuraScript() const override
  585. {
  586. return new spell_pri_mana_leech_AuraScript();
  587. }
  588. };
  589. // 49821 - Mind Sear
  590. class spell_pri_mind_sear : public SpellScriptLoader
  591. {
  592. public:
  593. spell_pri_mind_sear() : SpellScriptLoader("spell_pri_mind_sear") { }
  594. class spell_pri_mind_sear_SpellScript : public SpellScript
  595. {
  596. PrepareSpellScript(spell_pri_mind_sear_SpellScript);
  597. void FilterTargets(std::list<WorldObject*>& unitList)
  598. {
  599. unitList.remove_if(Trinity::ObjectGUIDCheck(GetCaster()->GetChannelObjectGuid()));
  600. }
  601. void Register() override
  602. {
  603. OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_mind_sear_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
  604. }
  605. };
  606. SpellScript* GetSpellScript() const override
  607. {
  608. return new spell_pri_mind_sear_SpellScript();
  609. }
  610. };
  611. // 47948 - Pain and Suffering (Proc)
  612. class spell_pri_pain_and_suffering_proc : public SpellScriptLoader
  613. {
  614. public:
  615. spell_pri_pain_and_suffering_proc() : SpellScriptLoader("spell_pri_pain_and_suffering_proc") { }
  616. class spell_pri_pain_and_suffering_proc_SpellScript : public SpellScript
  617. {
  618. PrepareSpellScript(spell_pri_pain_and_suffering_proc_SpellScript);
  619. void HandleEffectScriptEffect(SpellEffIndex /*effIndex*/)
  620. {
  621. Unit* caster = GetCaster();
  622. // Refresh Shadow Word: Pain on target
  623. if (Unit* target = GetHitUnit())
  624. if (AuraEffect* aur = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x8000, 0, 0, caster->GetGUID()))
  625. {
  626. aur->SetBonusAmount(caster->SpellDamageBonusDone(target, aur->GetSpellInfo(), 0, DOT));
  627. aur->CalculatePeriodic(caster, false, false);
  628. aur->GetBase()->RefreshDuration();
  629. }
  630. }
  631. void Register() override
  632. {
  633. OnEffectHitTarget += SpellEffectFn(spell_pri_pain_and_suffering_proc_SpellScript::HandleEffectScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
  634. }
  635. };
  636. SpellScript* GetSpellScript() const override
  637. {
  638. return new spell_pri_pain_and_suffering_proc_SpellScript;
  639. }
  640. };
  641. // 47540 - Penance
  642. class spell_pri_penance : public SpellScriptLoader
  643. {
  644. public:
  645. spell_pri_penance() : SpellScriptLoader("spell_pri_penance") { }
  646. class spell_pri_penance_SpellScript : public SpellScript
  647. {
  648. PrepareSpellScript(spell_pri_penance_SpellScript);
  649. bool Load() override
  650. {
  651. return GetCaster()->GetTypeId() == TYPEID_PLAYER;
  652. }
  653. bool Validate(SpellInfo const* spellInfo) override
  654. {
  655. SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_PRIEST_PENANCE_R1);
  656. if (!firstRankSpellInfo)
  657. return false;
  658. // can't use other spell than this penance due to spell_ranks dependency
  659. if (!spellInfo->IsRankOf(firstRankSpellInfo))
  660. return false;
  661. uint8 rank = spellInfo->GetRank();
  662. if (!sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_DAMAGE, rank, true))
  663. return false;
  664. if (!sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_HEAL, rank, true))
  665. return false;
  666. return true;
  667. }
  668. void HandleDummy(SpellEffIndex /*effIndex*/)
  669. {
  670. Unit* caster = GetCaster();
  671. if (Unit* unitTarget = GetHitUnit())
  672. {
  673. if (!unitTarget->IsAlive())
  674. return;
  675. uint8 rank = GetSpellInfo()->GetRank();
  676. if (caster->IsFriendlyTo(unitTarget))
  677. caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_HEAL, rank), false);
  678. else
  679. caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_DAMAGE, rank), false);
  680. }
  681. }
  682. SpellCastResult CheckCast()
  683. {
  684. Player* caster = GetCaster()->ToPlayer();
  685. if (Unit* target = GetExplTargetUnit())
  686. if (!caster->IsFriendlyTo(target) && !caster->IsValidAttackTarget(target))
  687. return SPELL_FAILED_BAD_TARGETS;
  688. return SPELL_CAST_OK;
  689. }
  690. void Register() override
  691. {
  692. OnEffectHitTarget += SpellEffectFn(spell_pri_penance_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  693. OnCheckCast += SpellCheckCastFn(spell_pri_penance_SpellScript::CheckCast);
  694. }
  695. };
  696. SpellScript* GetSpellScript() const override
  697. {
  698. return new spell_pri_penance_SpellScript;
  699. }
  700. };
  701. // -47569 - Phantasm
  702. class spell_pri_phantasm : public SpellScriptLoader
  703. {
  704. public:
  705. spell_pri_phantasm() : SpellScriptLoader("spell_pri_phantasm") { }
  706. class spell_pri_phantasm_AuraScript : public AuraScript
  707. {
  708. PrepareAuraScript(spell_pri_phantasm_AuraScript);
  709. bool CheckProc(ProcEventInfo& /*eventInfo*/)
  710. {
  711. return roll_chance_i(GetEffect(EFFECT_0)->GetAmount());
  712. }
  713. void HandleEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
  714. {
  715. PreventDefaultAction();
  716. GetTarget()->RemoveMovementImpairingAuras();
  717. }
  718. void Register() override
  719. {
  720. DoCheckProc += AuraCheckProcFn(spell_pri_phantasm_AuraScript::CheckProc);
  721. OnEffectProc += AuraEffectProcFn(spell_pri_phantasm_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
  722. }
  723. };
  724. AuraScript* GetAuraScript() const override
  725. {
  726. return new spell_pri_phantasm_AuraScript();
  727. }
  728. };
  729. // 17 - Power Word: Shield
  730. class spell_pri_power_word_shield : public SpellScriptLoader
  731. {
  732. public:
  733. spell_pri_power_word_shield() : SpellScriptLoader("spell_pri_power_word_shield") { }
  734. class spell_pri_power_word_shield_AuraScript : public AuraScript
  735. {
  736. PrepareAuraScript(spell_pri_power_word_shield_AuraScript);
  737. bool Validate(SpellInfo const* /*spellInfo*/) override
  738. {
  739. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED))
  740. return false;
  741. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_R1))
  742. return false;
  743. return true;
  744. }
  745. void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated)
  746. {
  747. canBeRecalculated = false;
  748. if (Unit* caster = GetCaster())
  749. {
  750. // +87% from sp bonus
  751. float bonus = 0.87f;
  752. // Borrowed Time
  753. if (AuraEffect const* borrowedTime = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_BORROWED_TIME, EFFECT_1))
  754. bonus += CalculatePct(1.0f, borrowedTime->GetAmount());
  755. bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
  756. // Improved PW: Shield: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :)
  757. // Improved PW: Shield is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage
  758. bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus);
  759. bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
  760. amount += int32(bonus);
  761. // Twin Disciplines
  762. if (AuraEffect const* twinDisciplines = caster->GetAuraEffectOfRankedSpell(SPELL_PRIEST_TWIN_DISCIPLINES_RANK_1, EFFECT_1))
  763. AddPct(amount, twinDisciplines->GetAmount());
  764. // Focused Power
  765. amount *= caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_DONE_PERCENT);
  766. }
  767. }
  768. void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount)
  769. {
  770. Unit* target = GetTarget();
  771. if (dmgInfo.GetAttacker() == target)
  772. return;
  773. if (AuraEffect const* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_PRIEST_REFLECTIVE_SHIELD_R1, EFFECT_0))
  774. {
  775. int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount());
  776. target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
  777. }
  778. }
  779. void Register() override
  780. {
  781. DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_power_word_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
  782. AfterEffectAbsorb += AuraEffectAbsorbFn(spell_pri_power_word_shield_AuraScript::ReflectDamage, EFFECT_0);
  783. }
  784. };
  785. AuraScript* GetAuraScript() const override
  786. {
  787. return new spell_pri_power_word_shield_AuraScript();
  788. }
  789. };
  790. // 33110 - Prayer of Mending Heal
  791. class spell_pri_prayer_of_mending_heal : public SpellScriptLoader
  792. {
  793. public:
  794. spell_pri_prayer_of_mending_heal() : SpellScriptLoader("spell_pri_prayer_of_mending_heal") { }
  795. class spell_pri_prayer_of_mending_heal_SpellScript : public SpellScript
  796. {
  797. PrepareSpellScript(spell_pri_prayer_of_mending_heal_SpellScript);
  798. void HandleHeal(SpellEffIndex /*effIndex*/)
  799. {
  800. if (Unit* caster = GetOriginalCaster())
  801. {
  802. if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_PRIEST_T9_HEALING_2P, EFFECT_0))
  803. {
  804. int32 heal = GetHitHeal();
  805. AddPct(heal, aurEff->GetAmount());
  806. SetHitHeal(heal);
  807. }
  808. }
  809. }
  810. void Register() override
  811. {
  812. OnEffectHitTarget += SpellEffectFn(spell_pri_prayer_of_mending_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL);
  813. }
  814. };
  815. SpellScript* GetSpellScript() const override
  816. {
  817. return new spell_pri_prayer_of_mending_heal_SpellScript();
  818. }
  819. };
  820. // 139 - Renew
  821. class spell_pri_renew : public SpellScriptLoader
  822. {
  823. public:
  824. spell_pri_renew() : SpellScriptLoader("spell_pri_renew") { }
  825. class spell_pri_renew_AuraScript : public AuraScript
  826. {
  827. PrepareAuraScript(spell_pri_renew_AuraScript);
  828. bool Validate(SpellInfo const* /*spellInfo*/) override
  829. {
  830. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_DIVINE_TOUCH))
  831. return false;
  832. return true;
  833. }
  834. bool Load() override
  835. {
  836. return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;
  837. }
  838. void HandleApplyEffect(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
  839. {
  840. if (Unit* caster = GetCaster())
  841. {
  842. // Divine Touch
  843. if (AuraEffect const* empoweredRenewAurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_DIVINE_TOUCH_TALENT, EFFECT_0))
  844. {
  845. uint32 heal = caster->SpellHealingBonusDone(GetTarget(), GetSpellInfo(), aurEff->GetAmount(), DOT);
  846. heal = GetTarget()->SpellHealingBonusTaken(caster, GetSpellInfo(), heal, DOT);
  847. int32 basepoints0 = CalculatePct(int32(heal) * aurEff->GetTotalTicks(), empoweredRenewAurEff->GetAmount());
  848. caster->CastCustomSpell(GetTarget(), SPELL_PRIEST_DIVINE_TOUCH, &basepoints0, NULL, NULL, true, NULL, aurEff);
  849. }
  850. }
  851. }
  852. void Register() override
  853. {
  854. OnEffectApply += AuraEffectApplyFn(spell_pri_renew_AuraScript::HandleApplyEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
  855. }
  856. };
  857. AuraScript* GetAuraScript() const override
  858. {
  859. return new spell_pri_renew_AuraScript();
  860. }
  861. };
  862. // 32379 - Shadow Word Death
  863. class spell_pri_shadow_word_death : public SpellScriptLoader
  864. {
  865. public:
  866. spell_pri_shadow_word_death() : SpellScriptLoader("spell_pri_shadow_word_death") { }
  867. class spell_pri_shadow_word_death_SpellScript : public SpellScript
  868. {
  869. PrepareSpellScript(spell_pri_shadow_word_death_SpellScript);
  870. void HandleDamage()
  871. {
  872. int32 damage = GetHitDamage();
  873. // Pain and Suffering reduces damage
  874. if (AuraEffect* aurEff = GetCaster()->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_PAIN_AND_SUFFERING, EFFECT_1))
  875. AddPct(damage, aurEff->GetAmount());
  876. GetCaster()->CastCustomSpell(GetCaster(), SPELL_PRIEST_SHADOW_WORD_DEATH, &damage, nullptr, nullptr, true);
  877. }
  878. void Register() override
  879. {
  880. OnHit += SpellHitFn(spell_pri_shadow_word_death_SpellScript::HandleDamage);
  881. }
  882. };
  883. SpellScript* GetSpellScript() const override
  884. {
  885. return new spell_pri_shadow_word_death_SpellScript();
  886. }
  887. };
  888. // 15473 - Shadowform
  889. class spell_pri_shadowform : public SpellScriptLoader
  890. {
  891. public:
  892. spell_pri_shadowform() : SpellScriptLoader("spell_pri_shadowform") { }
  893. class spell_pri_shadowform_AuraScript : public AuraScript
  894. {
  895. PrepareAuraScript(spell_pri_shadowform_AuraScript);
  896. bool Validate(SpellInfo const* /*spellInfo*/) override
  897. {
  898. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH) ||
  899. !sSpellMgr->GetSpellInfo(SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH))
  900. return false;
  901. return true;
  902. }
  903. void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  904. {
  905. GetTarget()->CastSpell(GetTarget(), GetTarget()->HasAura(SPELL_PRIEST_GLYPH_OF_SHADOW) ? SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH : SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH, true);
  906. }
  907. void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  908. {
  909. GetTarget()->RemoveAurasDueToSpell(GetTarget()->HasAura(SPELL_PRIEST_GLYPH_OF_SHADOW) ? SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH : SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH);
  910. }
  911. void Register() override
  912. {
  913. AfterEffectApply += AuraEffectApplyFn(spell_pri_shadowform_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_MOD_SHAPESHIFT, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
  914. AfterEffectRemove += AuraEffectRemoveFn(spell_pri_shadowform_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_SHAPESHIFT, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
  915. }
  916. };
  917. AuraScript* GetAuraScript() const override
  918. {
  919. return new spell_pri_shadowform_AuraScript();
  920. }
  921. };
  922. // 15286 - Vampiric Embrace
  923. class spell_pri_vampiric_embrace : public SpellScriptLoader
  924. {
  925. public:
  926. spell_pri_vampiric_embrace() : SpellScriptLoader("spell_pri_vampiric_embrace") { }
  927. class spell_pri_vampiric_embrace_AuraScript : public AuraScript
  928. {
  929. PrepareAuraScript(spell_pri_vampiric_embrace_AuraScript);
  930. bool Validate(SpellInfo const* /*spellInfo*/) override
  931. {
  932. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL))
  933. return false;
  934. return true;
  935. }
  936. bool CheckProc(ProcEventInfo& eventInfo)
  937. {
  938. // Not proc from Mind Sear
  939. return !(eventInfo.GetDamageInfo()->GetSpellInfo()->SpellFamilyFlags[1] & 0x80000);
  940. }
  941. void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
  942. {
  943. PreventDefaultAction();
  944. int32 self = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()));
  945. int32 team = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount() / 2));
  946. GetTarget()->CastCustomSpell((Unit*)NULL, SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL, &team, &self, NULL, true, NULL, aurEff);
  947. }
  948. void Register() override
  949. {
  950. DoCheckProc += AuraCheckProcFn(spell_pri_vampiric_embrace_AuraScript::CheckProc);
  951. OnEffectProc += AuraEffectProcFn(spell_pri_vampiric_embrace_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
  952. }
  953. };
  954. AuraScript* GetAuraScript() const override
  955. {
  956. return new spell_pri_vampiric_embrace_AuraScript();
  957. }
  958. };
  959. // 15290 - Vampiric Embrace (heal)
  960. class spell_pri_vampiric_embrace_target : public SpellScriptLoader
  961. {
  962. public:
  963. spell_pri_vampiric_embrace_target() : SpellScriptLoader("spell_pri_vampiric_embrace_target") { }
  964. class spell_pri_vampiric_embrace_target_SpellScript : public SpellScript
  965. {
  966. PrepareSpellScript(spell_pri_vampiric_embrace_target_SpellScript);
  967. void FilterTargets(std::list<WorldObject*>& unitList)
  968. {
  969. unitList.remove(GetCaster());
  970. }
  971. void Register() override
  972. {
  973. OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_vampiric_embrace_target_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY);
  974. }
  975. };
  976. SpellScript* GetSpellScript() const override
  977. {
  978. return new spell_pri_vampiric_embrace_target_SpellScript();
  979. }
  980. };
  981. // 34914 - Vampiric Touch
  982. class spell_pri_vampiric_touch : public SpellScriptLoader
  983. {
  984. public:
  985. spell_pri_vampiric_touch() : SpellScriptLoader("spell_pri_vampiric_touch") { }
  986. class spell_pri_vampiric_touch_AuraScript : public AuraScript
  987. {
  988. PrepareAuraScript(spell_pri_vampiric_touch_AuraScript);
  989. bool Validate(SpellInfo const* /*spellInfo*/) override
  990. {
  991. if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL) ||
  992. !sSpellMgr->GetSpellInfo(SPELL_GEN_REPLENISHMENT))
  993. return false;
  994. return true;
  995. }
  996. void HandleDispel(DispelInfo* /*dispelInfo*/)
  997. {
  998. if (Unit* caster = GetCaster())
  999. if (Unit* target = GetUnitOwner())
  1000. if (AuraEffect const* aurEff = GetEffect(EFFECT_1))
  1001. {
  1002. int32 damage = aurEff->GetAmount() * 8;
  1003. // backfire damage
  1004. caster->CastCustomSpell(target, SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL, &damage, NULL, NULL, true, NULL, aurEff);
  1005. }
  1006. }
  1007. bool CheckProc(ProcEventInfo& eventInfo)
  1008. {
  1009. return eventInfo.GetProcTarget() == GetCaster();
  1010. }
  1011. void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
  1012. {
  1013. eventInfo.GetProcTarget()->CastSpell((Unit*)NULL, SPELL_GEN_REPLENISHMENT, true, NULL, aurEff);
  1014. }
  1015. void Register() override
  1016. {
  1017. AfterDispel += AuraDispelFn(spell_pri_vampiric_touch_AuraScript::HandleDispel);
  1018. DoCheckProc += AuraCheckProcFn(spell_pri_vampiric_touch_AuraScript::CheckProc);
  1019. OnEffectProc += AuraEffectProcFn(spell_pri_vampiric_touch_AuraScript::HandleEffectProc, EFFECT_2, SPELL_AURA_DUMMY);
  1020. }
  1021. };
  1022. AuraScript* GetAuraScript() const override
  1023. {
  1024. return new spell_pri_vampiric_touch_AuraScript();
  1025. }
  1026. };
  1027. void AddSC_priest_spell_scripts()
  1028. {
  1029. new spell_pri_body_and_soul();
  1030. new spell_pri_circle_of_healing();
  1031. new spell_pri_dispel_magic();
  1032. new spell_pri_divine_aegis();
  1033. new spell_pri_divine_hymn();
  1034. new spell_pri_glyph_of_prayer_of_healing();
  1035. new spell_pri_hymn_of_hope();
  1036. new spell_pri_improved_power_word_shield();
  1037. new spell_pri_item_greater_heal_refund();
  1038. new spell_pri_guardian_spirit();
  1039. new spell_pri_leap_of_faith_effect_trigger();
  1040. new spell_pri_lightwell_renew();
  1041. new spell_pri_mana_burn();
  1042. new spell_pri_mana_leech();
  1043. new spell_pri_mind_sear();
  1044. new spell_pri_pain_and_suffering_proc();
  1045. new spell_pri_penance();
  1046. new spell_pri_phantasm();
  1047. new spell_pri_power_word_shield();
  1048. new spell_pri_prayer_of_mending_heal();
  1049. new spell_pri_renew();
  1050. new spell_pri_shadow_word_death();
  1051. new spell_pri_shadowform();
  1052. new spell_pri_vampiric_embrace();
  1053. new spell_pri_vampiric_embrace_target();
  1054. new spell_pri_vampiric_touch();
  1055. }