diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/scripts/Spells/spell_priest.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 419e9f51a8d..756096edadb 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -190,9 +190,12 @@ enum PriestSpells SPELL_PRIEST_ULTIMATE_PENITENCE_DAMAGE = 421543, SPELL_PRIEST_ULTIMATE_PENITENCE_HEAL = 421544, SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL = 15290, + SPELL_PRIEST_VAMPIRIC_TOUCH = 34914, SPELL_PRIEST_VOID_SHIELD = 199144, SPELL_PRIEST_VOID_SHIELD_EFFECT = 199145, SPELL_PRIEST_WEAKENED_SOUL = 6788, + SPELL_PRIEST_WHISPERING_SHADOWS = 406777, + SPELL_PRIEST_WHISPERING_SHADOWS_DUMMY = 391286, SPELL_PVP_RULES_ENABLED_HARDCODED = 134735 }; @@ -3221,6 +3224,81 @@ class spell_pri_vampiric_touch : public AuraScript } }; +// 205385 - Shadow Crash +class spell_pri_whispering_shadows : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_PRIEST_WHISPERING_SHADOWS }); + } + + void HandleEffectHitTarget(SpellEffIndex effIndex) + { + if (!GetCaster()->HasAura(SPELL_PRIEST_WHISPERING_SHADOWS)) + PreventHitDefaultEffect(effIndex); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_pri_whispering_shadows::HandleEffectHitTarget, EFFECT_2, SPELL_EFFECT_TRIGGER_MISSILE); + } +}; + +// 391286 - Whispering Shadows (Dot Application) +class spell_pri_whispering_shadows_effect : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_PRIEST_VAMPIRIC_TOUCH }); + } + + void FilterTargets(std::list<WorldObject*>& targets) const + { + if (targets.size() <= GetSpellValue()->MaxAffectedTargets) + return; + + // prioritize targets without Vampiric Touch + targets.sort([&](WorldObject const* target1, WorldObject const* target2) + { + int32 duration1 = 0; + if (Aura const* aura1 = target1->ToUnit()->GetAura(SPELL_PRIEST_VAMPIRIC_TOUCH, GetCaster()->GetGUID())) + duration1 = aura1->GetDuration(); + int32 duration2 = 0; + if (Aura const* aura2 = target2->ToUnit()->GetAura(SPELL_PRIEST_VAMPIRIC_TOUCH, GetCaster()->GetGUID())) + duration2 = aura2->GetDuration(); + return duration1 < duration2; + }); + + bool needRandomization = false; + auto firstVtTarget = std::find_if(targets.begin(), targets.end(), [&, noVtTargets = 0u](WorldObject const* target) mutable + { + if (target->ToUnit()->HasAura(SPELL_PRIEST_VAMPIRIC_TOUCH, GetCaster()->GetGUID())) + return true; + needRandomization = ++noVtTargets > GetSpellValue()->MaxAffectedTargets; + return false; + }); + + if (needRandomization) + { + targets.erase(firstVtTarget, targets.end()); + // actual randomization done in Spell code before adding targets + } + } + + void HandleEffectHitTarget(SpellEffIndex /*effIndex*/) const + { + GetCaster()->CastSpell(GetHitUnit(), SPELL_PRIEST_VAMPIRIC_TOUCH, CastSpellExtraArgs() + .SetTriggeringSpell(GetSpell()) + .SetTriggerFlags(TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD | TRIGGERED_IGNORE_POWER_AND_REAGENT_COST | TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_CAST_DIRECTLY | TRIGGERED_DONT_REPORT_CAST_ERROR)); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_whispering_shadows_effect::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_pri_whispering_shadows_effect::HandleEffectHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + void AddSC_priest_spell_scripts() { RegisterSpellScript(spell_pri_angelic_feather_trigger); @@ -3305,4 +3383,6 @@ void AddSC_priest_spell_scripts() RegisterSpellScript(spell_pri_vampiric_embrace); RegisterSpellScript(spell_pri_vampiric_embrace_target); RegisterSpellScript(spell_pri_vampiric_touch); + RegisterSpellScript(spell_pri_whispering_shadows); + RegisterSpellScript(spell_pri_whispering_shadows_effect); } |
