diff options
author | aquadeus <95978183+aquadeus@users.noreply.github.com> | 2021-12-25 14:10:10 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-25 14:10:10 +0100 |
commit | 8ac0388870519a085115454783dafed873c1535f (patch) | |
tree | e76be96dc47c666bfc8cf68a90f4cbba63f3356e /src | |
parent | 90cdb1ed0d3c46ab046b2dd0c63768df63285ccd (diff) |
Scripts/Spells: Fix paladin talent Holy Prism (#27442)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Spells/spell_paladin.cpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 09def505e06..4365dac157f 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -24,8 +24,10 @@ #include "ScriptMgr.h" #include "AreaTrigger.h" #include "AreaTriggerAI.h" +#include "Containers.h" #include "DB2Stores.h" #include "Group.h" +#include "ObjectAccessor.h" #include "Player.h" #include "Random.h" #include "Spell.h" @@ -75,6 +77,10 @@ enum PaladinSpells SPELL_PALADIN_HOLY_POWER_ATTACK_POWER = 28791, SPELL_PALADIN_HOLY_POWER_SPELL_POWER = 28793, SPELL_PALADIN_HOLY_POWER_MP5 = 28795, + SPELL_PALADIN_HOLY_PRISM_AREA_BEAM_VISUAL = 121551, + SPELL_PALADIN_HOLY_PRISM_TARGET_ALLY = 114871, + SPELL_PALADIN_HOLY_PRISM_TARGET_ENEMY = 114852, + SPELL_PALADIN_HOLY_PRISM_TARGET_BEAM_VISUAL = 114862, SPELL_PALADIN_HOLY_SHOCK_R1 = 20473, SPELL_PALADIN_HOLY_SHOCK_R1_DAMAGE = 25912, SPELL_PALADIN_HOLY_SHOCK_R1_HEALING = 25914, @@ -729,6 +735,95 @@ class spell_pal_judgement : public SpellScript } }; +// 114165 - Holy Prism +class spell_pal_holy_prism : public SpellScript +{ + PrepareSpellScript(spell_pal_holy_prism); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo ({ SPELL_PALADIN_HOLY_PRISM_TARGET_ALLY, SPELL_PALADIN_HOLY_PRISM_TARGET_ENEMY, SPELL_PALADIN_HOLY_PRISM_TARGET_BEAM_VISUAL }); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (GetCaster()->IsFriendlyTo(GetHitUnit())) + GetCaster()->CastSpell(GetHitUnit(), SPELL_PALADIN_HOLY_PRISM_TARGET_ALLY, true); + else + GetCaster()->CastSpell(GetHitUnit(), SPELL_PALADIN_HOLY_PRISM_TARGET_ENEMY , true); + + GetCaster()->CastSpell(GetHitUnit(), SPELL_PALADIN_HOLY_PRISM_TARGET_BEAM_VISUAL, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_pal_holy_prism::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 114852 - Holy Prism (Damage) +// 114871 - Holy Prism (Heal) +class spell_pal_holy_prism_selector : public SpellScript +{ + PrepareSpellScript(spell_pal_holy_prism_selector); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo ({ SPELL_PALADIN_HOLY_PRISM_TARGET_ALLY, SPELL_PALADIN_HOLY_PRISM_AREA_BEAM_VISUAL }); + } + + void SaveTargetGuid(SpellEffIndex /*effIndex*/) + { + _targetGUID = GetHitUnit()->GetGUID(); + } + + void FilterTargets(std::list<WorldObject*>& targets) + { + uint8 const maxTargets = 5; + + if (targets.size() > maxTargets) + { + if (GetSpellInfo()->Id == SPELL_PALADIN_HOLY_PRISM_TARGET_ALLY) + { + targets.sort(Trinity::HealthPctOrderPred()); + targets.resize(maxTargets); + } + else + Trinity::Containers::RandomResize(targets, maxTargets); + } + + _sharedTargets = targets; + } + + void ShareTargets(std::list<WorldObject*>& targets) + { + targets = _sharedTargets; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Unit* initialTarget = ObjectAccessor::GetUnit(*GetCaster(), _targetGUID)) + initialTarget->CastSpell(GetHitUnit(), SPELL_PALADIN_HOLY_PRISM_AREA_BEAM_VISUAL, true); + } + + void Register() override + { + if (m_scriptSpellId == SPELL_PALADIN_HOLY_PRISM_TARGET_ENEMY) + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_holy_prism_selector::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ALLY); + else if (m_scriptSpellId == SPELL_PALADIN_HOLY_PRISM_TARGET_ALLY) + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_holy_prism_selector::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY); + + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_holy_prism_selector::ShareTargets, EFFECT_2, TARGET_UNIT_DEST_AREA_ENTRY); + + OnEffectHitTarget += SpellEffectFn(spell_pal_holy_prism_selector::SaveTargetGuid, EFFECT_0, SPELL_EFFECT_ANY); + OnEffectHitTarget += SpellEffectFn(spell_pal_holy_prism_selector::HandleScript, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); + } + +private: + std::list<WorldObject*> _sharedTargets; + ObjectGuid _targetGUID; +}; + // 20473 - Holy Shock class spell_pal_holy_shock : public SpellScript { @@ -1224,6 +1319,8 @@ void AddSC_paladin_spell_scripts() RegisterSpellScript(spell_pal_hammer_of_the_righteous); RegisterSpellScript(spell_pal_moment_of_glory); RegisterSpellScript(spell_pal_judgement); + RegisterSpellScript(spell_pal_holy_prism); + RegisterSpellScript(spell_pal_holy_prism_selector); RegisterSpellScript(spell_pal_holy_shock); RegisterAuraScript(spell_pal_item_healing_discount); RegisterAuraScript(spell_pal_item_t6_trinket); |