diff options
author | My name is Mud <95978183+aquadeus@users.noreply.github.com> | 2022-01-10 00:28:50 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-10 00:28:50 +0100 |
commit | 043d1cf254339e082138347f6afce10fbbab4bec (patch) | |
tree | 19fbccdf0ca6595e25046ea04b336bc1c92f8ad7 | |
parent | 9dc11391c570ebc75a580aceed0c7eeaa1dedcf0 (diff) |
Scripts/Spells: Fix priest Shadow Mend damage (#27525)
-rw-r--r-- | sql/updates/world/master/2022_01_09_03_world_priest_shadow_mend.sql | 2 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_priest.cpp | 73 |
2 files changed, 69 insertions, 6 deletions
diff --git a/sql/updates/world/master/2022_01_09_03_world_priest_shadow_mend.sql b/sql/updates/world/master/2022_01_09_03_world_priest_shadow_mend.sql new file mode 100644 index 00000000000..6c4db49e415 --- /dev/null +++ b/sql/updates/world/master/2022_01_09_03_world_priest_shadow_mend.sql @@ -0,0 +1,2 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_pri_shadow_mend_periodic_damage'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (187464, 'spell_pri_shadow_mend_periodic_damage'); diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 903db5c42b8..6a0f4e2a879 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -66,6 +66,8 @@ enum PriestSpells SPELL_PRIEST_RENEW = 139, SPELL_PRIEST_RENEWED_HOPE = 197469, SPELL_PRIEST_RENEWED_HOPE_EFFECT = 197470, + SPELL_PRIEST_SHADOW_MEND_DAMAGE = 186439, + SPELL_PRIEST_SHADOW_MEND_PERIODIC_DUMMY = 187464, SPELL_PRIEST_SHIELD_DISCIPLINE_ENERGIZE = 47755, SPELL_PRIEST_SHIELD_DISCIPLINE_PASSIVE = 197045, SPELL_PRIEST_SMITE = 585, @@ -973,28 +975,86 @@ class spell_pri_shadow_mend : public SpellScript bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo({ SPELL_PRIEST_ATONEMENT, SPELL_PRIEST_ATONEMENT_TRIGGERED, SPELL_PRIEST_TRINITY, SPELL_PRIEST_MASOCHISM_TALENT, SPELL_PRIEST_MASOCHISM_PERIODIC_HEAL }); + return ValidateSpellInfo + ({ + SPELL_PRIEST_ATONEMENT, + SPELL_PRIEST_ATONEMENT_TRIGGERED, + SPELL_PRIEST_TRINITY, + SPELL_PRIEST_MASOCHISM_TALENT, + SPELL_PRIEST_MASOCHISM_PERIODIC_HEAL, + SPELL_PRIEST_SHADOW_MEND_PERIODIC_DUMMY + }); } - void HandleEffectHit(SpellEffIndex /*effIndex*/) + void HandleEffectHit() { if (Unit* target = GetHitUnit()) { Unit* caster = GetCaster(); + int32 periodicAmount = GetHitHeal() / 20; + int32 damageForAuraRemoveAmount = periodicAmount * 10; if (caster->HasAura(SPELL_PRIEST_ATONEMENT) && !caster->HasAura(SPELL_PRIEST_TRINITY)) - caster->CastSpell(target, SPELL_PRIEST_ATONEMENT_TRIGGERED, true); + caster->CastSpell(target, SPELL_PRIEST_ATONEMENT_TRIGGERED, GetSpell()); // Handle Masochism talent - int32 periodicAmount = GetHitHeal() / 20; if (caster->HasAura(SPELL_PRIEST_MASOCHISM_TALENT) && caster->GetGUID() == target->GetGUID()) - caster->CastSpell(caster, SPELL_PRIEST_MASOCHISM_PERIODIC_HEAL, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, periodicAmount)); + caster->CastSpell(caster, SPELL_PRIEST_MASOCHISM_PERIODIC_HEAL, CastSpellExtraArgs(GetSpell()).AddSpellMod(SPELLVALUE_BASE_POINT0, periodicAmount)); + else if (target->IsInCombat() && periodicAmount) + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SetTriggeringSpell(GetSpell()); + args.AddSpellMod(SPELLVALUE_BASE_POINT0, periodicAmount); + args.AddSpellMod(SPELLVALUE_BASE_POINT1, damageForAuraRemoveAmount); + caster->CastSpell(target, SPELL_PRIEST_SHADOW_MEND_PERIODIC_DUMMY, args); + } } } void Register() override { - OnEffectHitTarget += SpellEffectFn(spell_pri_shadow_mend::HandleEffectHit, EFFECT_0, SPELL_EFFECT_HEAL); + AfterHit += SpellHitFn(spell_pri_shadow_mend::HandleEffectHit); + } +}; + +// 187464 - Shadow Mend (Damage) +class spell_pri_shadow_mend_periodic_damage : public AuraScript +{ + PrepareAuraScript(spell_pri_shadow_mend_periodic_damage); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_PRIEST_SHADOW_MEND_DAMAGE }); + } + + void HandleDummyTick(AuraEffect const* aurEff) + { + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.SetOriginalCaster(GetCasterGUID()); + args.SetTriggeringAura(aurEff); + args.AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount()); + GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_SHADOW_MEND_DAMAGE, args); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetDamageInfo() != nullptr; + } + + void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) + { + int32 newAmount = aurEff->GetAmount() - eventInfo.GetDamageInfo()->GetDamage(); + + aurEff->ChangeAmount(newAmount); + if (newAmount < 0) + Remove(); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_pri_shadow_mend_periodic_damage::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + DoCheckProc += AuraCheckProcFn(spell_pri_shadow_mend_periodic_damage::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pri_shadow_mend_periodic_damage::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); } }; @@ -1371,6 +1431,7 @@ void AddSC_priest_spell_scripts() RegisterSpellScript(spell_pri_prayer_of_mending_jump); RegisterAuraScript(spell_pri_spirit_of_redemption); RegisterSpellScript(spell_pri_shadow_mend); + RegisterAuraScript(spell_pri_shadow_mend_periodic_damage); new spell_pri_t3_4p_bonus(); new spell_pri_t5_heal_2p_bonus(); new spell_pri_t10_heal_2p_bonus(); |