diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Spells/spell_paladin.cpp | 88 |
1 files changed, 37 insertions, 51 deletions
diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 1e1ada38b7a..e6c980a7731 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -1804,65 +1804,51 @@ class spell_pal_light_s_beacon : public SpellScriptLoader }; // 31789 - Righteous Defense -class spell_pal_righteous_defense : public SpellScriptLoader +class spell_pal_righteous_defense : public SpellScript { - public: - spell_pal_righteous_defense() : SpellScriptLoader("spell_pal_righteous_defense") { } - - class spell_pal_righteous_defense_SpellScript : public SpellScript - { - PrepareSpellScript(spell_pal_righteous_defense_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT }); - } + PrepareSpellScript(spell_pal_righteous_defense); - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - if (caster->GetTypeId() != TYPEID_PLAYER) - return SPELL_FAILED_DONT_REPORT; + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT }); + } - if (Unit* target = GetExplTargetUnit()) - { - if (!target->IsFriendlyTo(caster) || target->getAttackers().empty()) - return SPELL_FAILED_BAD_TARGETS; - } - else - return SPELL_FAILED_BAD_TARGETS; + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + if (caster->GetTypeId() != TYPEID_PLAYER) + return SPELL_FAILED_DONT_REPORT; - return SPELL_CAST_OK; - } + if (Unit* target = GetExplTargetUnit()) + { + if (!target->IsFriendlyTo(caster) || target == caster || target->getAttackers().empty()) + return SPELL_FAILED_BAD_TARGETS; + } + else + return SPELL_FAILED_BAD_TARGETS; - void HandleTriggerSpellLaunch(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - } + return SPELL_CAST_OK; + } - void HandleTriggerSpellHit(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT, true); - } + void HandleDummy(SpellEffIndex effIndex) + { + if (Unit* target = GetHitUnit()) + { + auto const& attackers = target->getAttackers(); - void Register() override - { - OnCheckCast += SpellCheckCastFn(spell_pal_righteous_defense_SpellScript::CheckCast); - //! WORKAROUND - //! target select will be executed in hitphase of effect 0 - //! so we must handle trigger spell also in hit phase (default execution in launch phase) - //! see issue #3718 - OnEffectLaunchTarget += SpellEffectFn(spell_pal_righteous_defense_SpellScript::HandleTriggerSpellLaunch, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); - OnEffectHitTarget += SpellEffectFn(spell_pal_righteous_defense_SpellScript::HandleTriggerSpellHit, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); - } - }; + std::vector<Unit*> list(attackers.cbegin(), attackers.cend()); + Trinity::Containers::RandomResize(list, 3); - SpellScript* GetSpellScript() const override - { - return new spell_pal_righteous_defense_SpellScript(); + for (Unit* attacker : list) + GetCaster()->CastSpell(attacker, SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT, TRIGGERED_FULL_MASK); } + } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_pal_righteous_defense::CheckCast); + OnEffectHitTarget += SpellEffectFn(spell_pal_righteous_defense::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } }; // -53380 - Righteous Vengeance @@ -2454,7 +2440,7 @@ void AddSC_paladin_spell_scripts() new spell_pal_judgements_of_the_wise(); new spell_pal_lay_on_hands(); new spell_pal_light_s_beacon(); - new spell_pal_righteous_defense(); + RegisterSpellScript(spell_pal_righteous_defense); new spell_pal_righteous_vengeance(); new spell_pal_sacred_shield(); new spell_pal_sacred_shield_dummy(); |