aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2021_02_21_00_world_priest_prayer_of_mending.sql5
-rw-r--r--src/server/game/Spells/SpellScript.h2
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp150
3 files changed, 130 insertions, 27 deletions
diff --git a/sql/updates/world/master/2021_02_21_00_world_priest_prayer_of_mending.sql b/sql/updates/world/master/2021_02_21_00_world_priest_prayer_of_mending.sql
new file mode 100644
index 00000000000..21fe90c99b5
--- /dev/null
+++ b/sql/updates/world/master/2021_02_21_00_world_priest_prayer_of_mending.sql
@@ -0,0 +1,5 @@
+DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_pri_prayer_of_mending_heal','spell_pri_prayer_of_mending','spell_pri_prayer_of_mending_aura','spell_pri_prayer_of_mending_jump');
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(33076, 'spell_pri_prayer_of_mending'),
+(41635, 'spell_pri_prayer_of_mending_aura'),
+(155793, 'spell_pri_prayer_of_mending_jump');
diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h
index 8637994d86c..1c0e5d3aba7 100644
--- a/src/server/game/Spells/SpellScript.h
+++ b/src/server/game/Spells/SpellScript.h
@@ -856,7 +856,7 @@ class TC_GAME_API AuraScript : public _SpellScript
HookList<EffectProcHandler> OnEffectProc;
// executed after aura effect proced
// example: AfterEffectProc += AuraEffectProcFn(class::function, EffectIndexSpecifier, EffectAuraNameSpecifier);
- // where function is: void function (AuraEffect const* aurEff, ProcEventInfo& procInfo);
+ // where function is: void function (AuraEffect* aurEff, ProcEventInfo& procInfo);
HookList<EffectProcHandler> AfterEffectProc;
#define AuraEffectProcFn(F, I, N) EffectProcHandlerFunction(&F, I, N)
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index 12311b51d8d..8fa5aee07a4 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -85,7 +85,10 @@ enum PriestSpells
SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL = 15290,
SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL = 64085,
SPELL_PRIEST_VOID_SHIELD = 199144,
- SPELL_PRIEST_VOID_SHIELD_EFFECT = 199145
+ SPELL_PRIEST_VOID_SHIELD_EFFECT = 199145,
+ SPELL_PRIEST_PRAYER_OF_MENDING_AURA = 41635,
+ SPELL_PRIEST_PRAYER_OF_MENDING_HEAL = 33110,
+ SPELL_PRIEST_PRAYER_OF_MENDING_JUMP = 155793,
};
enum MiscSpells
@@ -396,7 +399,7 @@ public:
SpellCastResult CheckCast()
{
Unit* caster = GetCaster();
- Unit* target = GetExplTargetUnit();
+ Unit* target = GetHitUnit();
if (!target || (!caster->HasAura(SPELL_PRIEST_ABSOLUTION) && caster != target && target->IsFriendlyTo(caster)))
return SPELL_FAILED_BAD_TARGETS;
@@ -1122,39 +1125,132 @@ public:
}
};
-// 33110 - Prayer of Mending Heal
-class spell_pri_prayer_of_mending_heal : public SpellScriptLoader
+// Base class used by various prayer of mending spells
+class spell_pri_prayer_of_mending_SpellScriptBase : public SpellScript
{
- public:
- spell_pri_prayer_of_mending_heal() : SpellScriptLoader("spell_pri_prayer_of_mending_heal") { }
+public:
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_PRIEST_PRAYER_OF_MENDING_HEAL, SPELL_PRIEST_PRAYER_OF_MENDING_AURA })
+ && sSpellMgr->AssertSpellInfo(SPELL_PRIEST_PRAYER_OF_MENDING_HEAL, DIFFICULTY_NONE)->GetEffect(EFFECT_0);
+ }
+
+ bool Load() override
+ {
+ _spellInfoHeal = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_PRAYER_OF_MENDING_HEAL, DIFFICULTY_NONE);
+ _healEffectDummy = _spellInfoHeal->GetEffect(EFFECT_0);
+ return true;
+ }
+
+ void CastPrayerOfMendingAura(Unit* caster, Unit* target, uint8 stack)
+ {
+ uint32 basePoints = caster->SpellHealingBonusDone(target, _spellInfoHeal, _healEffectDummy->CalcValue(caster), HEAL, _healEffectDummy);
+ CustomSpellValues values;
+ values.AddSpellMod(SPELLVALUE_AURA_STACK, stack);
+ values.AddSpellMod(SPELLVALUE_BASE_POINT0, basePoints);
+ caster->CastCustomSpell(SPELL_PRIEST_PRAYER_OF_MENDING_AURA, values, target, TRIGGERED_FULL_MASK);
+ }
+
+protected:
+ SpellInfo const* _spellInfoHeal;
+ SpellEffectInfo const* _healEffectDummy;
+};
+
+// 33076 - Prayer of Mending
+class spell_pri_prayer_of_mending : public spell_pri_prayer_of_mending_SpellScriptBase
+{
+ PrepareSpellScript(spell_pri_prayer_of_mending);
+
+ void HandleEffectDummy(SpellEffIndex /*effIndex*/)
+ {
+ CastPrayerOfMendingAura(GetCaster(), GetHitUnit(), GetEffectValue());
+ }
+
+ void Register() override
+ {
+ OnEffectHit += SpellEffectFn(spell_pri_prayer_of_mending::HandleEffectDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 41635 - Prayer of Mending (Aura) - SPELL_PRIEST_PRAYER_OF_MENDING_AURA
+class spell_pri_prayer_of_mending_aura : public AuraScript
+{
+ PrepareAuraScript(spell_pri_prayer_of_mending_aura);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_PRIEST_PRAYER_OF_MENDING_HEAL, SPELL_PRIEST_PRAYER_OF_MENDING_JUMP });
+ }
- class spell_pri_prayer_of_mending_heal_SpellScript : public SpellScript
+ void HandleHeal(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ // Caster: player (priest) that cast the Prayer of Mending
+ // Target: player that currently has Prayer of Mending aura on him
+ Unit* target = GetTarget();
+ if (Unit* caster = GetCaster())
{
- PrepareSpellScript(spell_pri_prayer_of_mending_heal_SpellScript);
+ // Cast the spell to heal the owner
+ caster->CastSpell(target, SPELL_PRIEST_PRAYER_OF_MENDING_HEAL, true, nullptr, aurEff);
- 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);
- }
- }
- }
+ // Only cast jump if stack is higher than 0
+ int32 stackAmount = GetStackAmount();
+ if (stackAmount > 1)
+ target->CastCustomSpell(SPELL_PRIEST_PRAYER_OF_MENDING_JUMP, SPELLVALUE_BASE_POINT0, stackAmount - 1, target, true, nullptr, aurEff, caster->GetGUID());
- void Register() override
+ Remove();
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_pri_prayer_of_mending_aura::HandleHeal, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+};
+
+// 155793 - prayer of mending (Jump) - SPELL_PRIEST_PRAYER_OF_MENDING_JUMP
+class spell_pri_prayer_of_mending_jump : public spell_pri_prayer_of_mending_SpellScriptBase
+{
+ PrepareSpellScript(spell_pri_prayer_of_mending_jump);
+
+ void OnTargetSelect(std::list<WorldObject*>& targets)
+ {
+ // Find the best target - prefer players over pets
+ bool foundPlayer = false;
+ for (WorldObject* worldObject : targets)
+ {
+ if (worldObject->IsPlayer())
{
- OnEffectHitTarget += SpellEffectFn(spell_pri_prayer_of_mending_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL);
+ foundPlayer = true;
+ break;
}
- };
+ }
- SpellScript* GetSpellScript() const override
+ if (foundPlayer)
+ targets.remove_if(Trinity::ObjectTypeIdCheck(TYPEID_PLAYER, false));
+
+ // choose one random target from targets
+ if (targets.size() > 1)
{
- return new spell_pri_prayer_of_mending_heal_SpellScript();
+ WorldObject* selected = Trinity::Containers::SelectRandomContainerElement(targets);
+ targets.clear();
+ targets.push_back(selected);
}
+ }
+
+ void HandleJump(SpellEffIndex /*effIndex*/)
+ {
+ Unit* origCaster = GetOriginalCaster(); // the one that started the prayer of mending chain
+ Unit* target = GetHitUnit(); // the target we decided the aura should jump to
+
+ if (origCaster)
+ CastPrayerOfMendingAura(origCaster, target, GetEffectValue());
+ }
+
+ void Register() override
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_prayer_of_mending_jump::OnTargetSelect, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
+ OnEffectHitTarget += SpellEffectFn(spell_pri_prayer_of_mending_jump::HandleJump, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
};
// 15473 - Shadowform
@@ -1590,7 +1686,9 @@ void AddSC_priest_spell_scripts()
new spell_pri_penance();
new spell_pri_phantasm();
new spell_pri_power_word_shield();
- new spell_pri_prayer_of_mending_heal();
+ RegisterSpellScript(spell_pri_prayer_of_mending);
+ RegisterAuraScript(spell_pri_prayer_of_mending_aura);
+ RegisterSpellScript(spell_pri_prayer_of_mending_jump);
new spell_pri_shadowform();
RegisterAuraScript(spell_priest_spirit_of_redemption);
new spell_pri_t3_4p_bonus();