aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp80
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);
}