diff --git a/sql/updates/world/master/2026_01_31_13_world.sql b/sql/updates/world/master/2026_01_31_13_world.sql new file mode 100644 index 0000000000..52d148a94f --- /dev/null +++ b/sql/updates/world/master/2026_01_31_13_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_pri_void_volley'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(1242173,'spell_pri_void_volley'); diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 5c68853387..02be1c8f64 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -254,6 +254,7 @@ enum PriestSpells SPELL_PRIEST_UNFURLING_DARKNESS_DEBUFF = 341291, SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL = 15290, SPELL_PRIEST_VAMPIRIC_TOUCH = 34914, + SPELL_PRIEST_VOID_VOLLEY_DAMAGE = 1242189, SPELL_PRIEST_VOID_SHIELD = 199144, SPELL_PRIEST_VOID_SHIELD_EFFECT = 199145, SPELL_PRIEST_VOICE_OF_HARMONY = 390994, @@ -5175,6 +5176,70 @@ class spell_pri_voice_of_harmony : public AuraScript } }; +// 1242173 - Void Volley +class spell_pri_void_volley : public SpellScript +{ + class BoltEvent : public BasicEvent + { + public: + static constexpr Milliseconds Period = 75ms; + + explicit BoltEvent(Unit* caster, ObjectGuid target, ObjectGuid originalCastId, int32 count) : + _caster(caster), _target(target), _originalCastId(originalCastId), _count(count) { } + + bool Execute(uint64 time, uint32) override + { + Unit* target = ObjectAccessor::GetUnit(*_caster, _target); + if (!target) + return true; + + _caster->CastSpell(target, SPELL_PRIEST_VOID_VOLLEY_DAMAGE, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .OriginalCastId = _originalCastId + }); + + if (--_count) + { + _caster->m_Events.AddEvent(this, Milliseconds(time) + Period); + return false; + } + return true; + } + + private: + Unit* _caster; + ObjectGuid _target; + ObjectGuid _originalCastId; + int32 _count; + }; + + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo({ SPELL_PRIEST_VOID_VOLLEY_DAMAGE }) + && ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } }); + } + + void HandleEffectHit(SpellEffIndex /*effIndex*/) const + { + Unit* caster = GetCaster(); + Unit* target = GetHitUnit(); + + caster->CastSpell(target, SPELL_PRIEST_VOID_VOLLEY_DAMAGE, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringSpell = GetSpell() + }); + + int32 bolts = target == GetExplTargetUnit() ? GetEffectValue() : GetEffectInfo(EFFECT_2).CalcValue(caster); + if (bolts > 1) + caster->m_Events.AddEventAtOffset(new BoltEvent(caster, target->GetGUID(), GetSpell()->m_originalCastId, bolts - 1), BoltEvent::Period); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_pri_void_volley::HandleEffectHit, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + // 205385 - Shadow Crash class spell_pri_whispering_shadows : public SpellScript { @@ -5381,6 +5446,7 @@ void AddSC_priest_spell_scripts() RegisterSpellScript(spell_pri_vampiric_embrace_target); RegisterSpellScript(spell_pri_vampiric_touch); RegisterSpellScript(spell_pri_voice_of_harmony); + RegisterSpellScript(spell_pri_void_volley); RegisterSpellScript(spell_pri_whispering_shadows); RegisterSpellScript(spell_pri_whispering_shadows_effect); }