diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/scripts/Spells/spell_warrior.cpp | 1153 | 
1 files changed, 445 insertions, 708 deletions
diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index 98c816dc22..473fd17717 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -75,32 +75,20 @@ enum MiscSpells      SPELL_GEN_DAMAGE_REDUCTION_AURA                 = 68066,  }; -// Ours -class spell_warr_mocking_blow : public SpellScriptLoader +class spell_warr_mocking_blow : public SpellScript  { -public: -    spell_warr_mocking_blow() : SpellScriptLoader("spell_warr_mocking_blow") { } +    PrepareSpellScript(spell_warr_mocking_blow); -    class spell_warr_mocking_blow_SpellScript : public SpellScript +    void HandleOnHit()      { -        PrepareSpellScript(spell_warr_mocking_blow_SpellScript); - -        void HandleOnHit() -        { -            if (Unit* target = GetHitUnit()) -                if (target->IsImmunedToSpellEffect(GetSpellInfo(), EFFECT_1)) -                    SetHitDamage(0); -        } - -        void Register() override -        { -            OnHit += SpellHitFn(spell_warr_mocking_blow_SpellScript::HandleOnHit); -        } -    }; +        if (Unit* target = GetHitUnit()) +            if (target->IsImmunedToSpellEffect(GetSpellInfo(), EFFECT_1)) +                SetHitDamage(0); +    } -    SpellScript* GetSpellScript() const override +    void Register() override      { -        return new spell_warr_mocking_blow_SpellScript(); +        OnHit += SpellHitFn(spell_warr_mocking_blow::HandleOnHit);      }  }; @@ -109,971 +97,720 @@ enum VictoryRushEnum      SPELL_VICTORIOUS    = 32216  }; -class spell_warr_victory_rush : public SpellScriptLoader +class spell_warr_victory_rush : public SpellScript  { -public: -    spell_warr_victory_rush() : SpellScriptLoader("spell_warr_victory_rush") { } +    PrepareSpellScript(spell_warr_victory_rush); -    class spell_warr_victory_rush_SpellScript : public SpellScript +    void VictoryRushHit()      { -        PrepareSpellScript(spell_warr_victory_rush_SpellScript); - -        void VictoryRushHit() +        if (Unit* player = GetCaster())          { -            if (Unit* player = GetCaster()) +            if (Unit* victim = GetHitUnit())              { -                if (Unit* victim = GetHitUnit()) +                if (victim->isDead())                  { -                    if (victim->isDead()) -                    { -                        player->CastSpell(player, SPELL_VICTORIOUS, true); -                    } +                    player->CastSpell(player, SPELL_VICTORIOUS, true);                  }              }          } +    } -        void Register() override -        { -            AfterHit += SpellHitFn(spell_warr_victory_rush_SpellScript::VictoryRushHit); -        } -    }; - -    SpellScript* GetSpellScript() const override +    void Register() override      { -        return new spell_warr_victory_rush_SpellScript(); +        AfterHit += SpellHitFn(spell_warr_victory_rush::VictoryRushHit);      }  }; -class spell_warr_intervene : public SpellScriptLoader +class spell_warr_intervene : public SpellScript  { -public: -    spell_warr_intervene() : SpellScriptLoader("spell_warr_intervene") { } +    PrepareSpellScript(spell_warr_intervene); -    class spell_warr_intervene_SpellScript : public SpellScript +    void HandleApplyAura(SpellEffIndex /*effIndex*/)      { -        PrepareSpellScript(spell_warr_intervene_SpellScript); - -        void HandleApplyAura(SpellEffIndex /*effIndex*/) -        { -            if (Unit* target = GetHitUnit()) -                target->CastSpell((Unit*)nullptr, SPELL_WARRIOR_INTERVENE_TRIGGER, true); -        } - -        void Register() override -        { -            OnEffectHitTarget += SpellEffectFn(spell_warr_intervene_SpellScript::HandleApplyAura, EFFECT_1, SPELL_EFFECT_APPLY_AURA); -        } -    }; +        if (Unit* target = GetHitUnit()) +            target->CastSpell((Unit*)nullptr, SPELL_WARRIOR_INTERVENE_TRIGGER, true); +    } -    SpellScript* GetSpellScript() const override +    void Register() override      { -        return new spell_warr_intervene_SpellScript(); +        OnEffectHitTarget += SpellEffectFn(spell_warr_intervene::HandleApplyAura, EFFECT_1, SPELL_EFFECT_APPLY_AURA);      }  }; -class spell_warr_improved_spell_reflection : public SpellScriptLoader +class spell_warr_improved_spell_reflection : public AuraScript  { -public: -    spell_warr_improved_spell_reflection() : SpellScriptLoader("spell_warr_improved_spell_reflection") { } +    PrepareAuraScript(spell_warr_improved_spell_reflection); -    class spell_warr_improved_spell_reflection_AuraScript : public AuraScript +    bool CheckProc(ProcEventInfo& eventInfo)      { -        PrepareAuraScript(spell_warr_improved_spell_reflection_AuraScript); - -        bool CheckProc(ProcEventInfo& eventInfo) -        { -            return eventInfo.GetSpellInfo() && eventInfo.GetSpellInfo()->Id == SPELL_WARRIOR_SPELL_REFLECTION; -        } - -        void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) -        { -            PreventDefaultAction(); -            CustomSpellValues values; -            values.AddSpellMod(SPELLVALUE_MAX_TARGETS, aurEff->GetAmount()); -            values.AddSpellMod(SPELLVALUE_RADIUS_MOD, 2000); // Base range = 100, final range = 20 value / 10000.0f = 0.2f -            eventInfo.GetActor()->CastCustomSpell(SPELL_WARRIOR_IMPROVED_SPELL_REFLECTION_TRIGGER, values, eventInfo.GetActor(), TRIGGERED_FULL_MASK, nullptr); -        } +        return eventInfo.GetSpellInfo() && eventInfo.GetSpellInfo()->Id == SPELL_WARRIOR_SPELL_REFLECTION; +    } -        void Register() override -        { -            DoCheckProc += AuraCheckProcFn(spell_warr_improved_spell_reflection_AuraScript::CheckProc); -            OnEffectProc += AuraEffectProcFn(spell_warr_improved_spell_reflection_AuraScript::OnProc, EFFECT_1, SPELL_AURA_DUMMY); -        } -    }; +    void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +    { +        PreventDefaultAction(); +        CustomSpellValues values; +        values.AddSpellMod(SPELLVALUE_MAX_TARGETS, aurEff->GetAmount()); +        values.AddSpellMod(SPELLVALUE_RADIUS_MOD, 2000); // Base range = 100, final range = 20 value / 10000.0f = 0.2f +        eventInfo.GetActor()->CastCustomSpell(SPELL_WARRIOR_IMPROVED_SPELL_REFLECTION_TRIGGER, values, eventInfo.GetActor(), TRIGGERED_FULL_MASK, nullptr); +    } -    AuraScript* GetAuraScript() const override +    void Register() override      { -        return new spell_warr_improved_spell_reflection_AuraScript(); +        DoCheckProc += AuraCheckProcFn(spell_warr_improved_spell_reflection::CheckProc); +        OnEffectProc += AuraEffectProcFn(spell_warr_improved_spell_reflection::OnProc, EFFECT_1, SPELL_AURA_DUMMY);      }  }; -class spell_warr_improved_spell_reflection_trigger : public SpellScriptLoader +class spell_warr_improved_spell_reflection_trigger : public SpellScript  { -public: -    spell_warr_improved_spell_reflection_trigger() : SpellScriptLoader("spell_warr_improved_spell_reflection_trigger") { } +    PrepareSpellScript(spell_warr_improved_spell_reflection_trigger); -    class spell_warr_improved_spell_reflection_trigger_SpellScript : public SpellScript +    void FilterTargets(std::list<WorldObject*>& unitList)      { -        PrepareSpellScript(spell_warr_improved_spell_reflection_trigger_SpellScript); - -        void FilterTargets(std::list<WorldObject*>& unitList) -        { -            GetCaster()->RemoveAurasDueToSpell(SPELL_WARRIOR_SPELL_REFLECTION); -            unitList.sort(Acore::ObjectDistanceOrderPred(GetCaster())); -            while (unitList.size() > GetSpellValue()->MaxAffectedTargets) -                unitList.pop_back(); -        } - -        void Register() override -        { -            OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_improved_spell_reflection_trigger_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY); -        } -    }; +        GetCaster()->RemoveAurasDueToSpell(SPELL_WARRIOR_SPELL_REFLECTION); +        unitList.sort(Acore::ObjectDistanceOrderPred(GetCaster())); +        while (unitList.size() > GetSpellValue()->MaxAffectedTargets) +            unitList.pop_back(); +    } -    SpellScript* GetSpellScript() const override +    void Register() override      { -        return new spell_warr_improved_spell_reflection_trigger_SpellScript(); +        OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_improved_spell_reflection_trigger::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY);      } +}; -    class spell_warr_improved_spell_reflection_trigger_AuraScript : public AuraScript -    { -        PrepareAuraScript(spell_warr_improved_spell_reflection_trigger_AuraScript); +class spell_warr_improved_spell_reflection_trigger_aura : public AuraScript +{ +    PrepareAuraScript(spell_warr_improved_spell_reflection_trigger_aura); -        void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes  /*mode*/) +    void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes  /*mode*/) +    { +        if (!IsExpired())          { -            if (!IsExpired()) +            // aura remove - remove auras from all party members +            std::list<Unit*> PartyMembers; +            GetUnitOwner()->GetPartyMembers(PartyMembers); +            for (std::list<Unit*>::iterator itr = PartyMembers.begin(); itr != PartyMembers.end(); ++itr)              { -                // aura remove - remove auras from all party members -                std::list<Unit*> PartyMembers; -                GetUnitOwner()->GetPartyMembers(PartyMembers); -                for (std::list<Unit*>::iterator itr = PartyMembers.begin(); itr != PartyMembers.end(); ++itr) -                { -                    if ((*itr)->GetGUID() != GetOwner()->GetGUID()) -                        if (Aura* aur = (*itr)->GetAura(59725, GetCasterGUID())) -                        { -                            aur->SetDuration(0); -                            aur->Remove(); -                        } -                } +                if ((*itr)->GetGUID() != GetOwner()->GetGUID()) +                    if (Aura* aur = (*itr)->GetAura(59725, GetCasterGUID())) +                    { +                        aur->SetDuration(0); +                        aur->Remove(); +                    }              }          } +    } -        void Register() override -        { -            AfterEffectRemove += AuraEffectRemoveFn(spell_warr_improved_spell_reflection_trigger_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_REFLECT_SPELLS, AURA_EFFECT_HANDLE_REAL); -        } -    }; - -    AuraScript* GetAuraScript() const override +    void Register() override      { -        return new spell_warr_improved_spell_reflection_trigger_AuraScript(); +        AfterEffectRemove += AuraEffectRemoveFn(spell_warr_improved_spell_reflection_trigger_aura::HandleRemove, EFFECT_0, SPELL_AURA_REFLECT_SPELLS, AURA_EFFECT_HANDLE_REAL);      }  }; -// Theirs  // 12975 - Last Stand -class spell_warr_last_stand : public SpellScriptLoader +class spell_warr_last_stand : public SpellScript  { -public: -    spell_warr_last_stand() : SpellScriptLoader("spell_warr_last_stand") { } +    PrepareSpellScript(spell_warr_last_stand); -    class spell_warr_last_stand_SpellScript : public SpellScript +    bool Validate(SpellInfo const* /*spellInfo*/) override      { -        PrepareSpellScript(spell_warr_last_stand_SpellScript); - -        bool Validate(SpellInfo const* /*spellInfo*/) override -        { -            return ValidateSpellInfo({ SPELL_WARRIOR_LAST_STAND_TRIGGERED }); -        } - -        void HandleDummy(SpellEffIndex /*effIndex*/) -        { -            Unit* caster = GetCaster(); -            int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(GetEffectValue())); -            caster->CastCustomSpell(caster, SPELL_WARRIOR_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, nullptr, nullptr, true, nullptr); -        } +        return ValidateSpellInfo({ SPELL_WARRIOR_LAST_STAND_TRIGGERED }); +    } -        void Register() override -        { -            OnEffectHit += SpellEffectFn(spell_warr_last_stand_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); -        } -    }; +    void HandleDummy(SpellEffIndex /*effIndex*/) +    { +        Unit* caster = GetCaster(); +        int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(GetEffectValue())); +        caster->CastCustomSpell(caster, SPELL_WARRIOR_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, nullptr, nullptr, true, nullptr); +    } -    SpellScript* GetSpellScript() const override +    void Register() override      { -        return new spell_warr_last_stand_SpellScript(); +        OnEffectHit += SpellEffectFn(spell_warr_last_stand::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);      }  };  // -12162 - Deep Wounds -class spell_warr_deep_wounds : public SpellScriptLoader +class spell_warr_deep_wounds : public SpellScript  { -public: -    spell_warr_deep_wounds() : SpellScriptLoader("spell_warr_deep_wounds") { } +    PrepareSpellScript(spell_warr_deep_wounds); -    class spell_warr_deep_wounds_SpellScript : public SpellScript +    bool Validate(SpellInfo const* /*spellInfo*/) override      { -        PrepareSpellScript(spell_warr_deep_wounds_SpellScript); - -        bool Validate(SpellInfo const* /*spellInfo*/) override -        { -            return ValidateSpellInfo( -                { -                    SPELL_WARRIOR_DEEP_WOUNDS_RANK_1, -                    SPELL_WARRIOR_DEEP_WOUNDS_RANK_2, -                    SPELL_WARRIOR_DEEP_WOUNDS_RANK_3 -                }); -        } - -        void HandleDummy(SpellEffIndex /*effIndex*/) -        { -            int32 damage = std::max(GetEffectValue(), 0); -            Unit* caster = GetCaster(); -            if (Unit* target = GetHitUnit()) +        return ValidateSpellInfo(              { -                // include target dependant auras -                damage = target->MeleeDamageBonusTaken(caster, damage, BASE_ATTACK, GetSpellInfo()); -                // apply percent damage mods -                ApplyPct(damage, 16.0f * GetSpellInfo()->GetRank() / 6.0f); -                target->CastDelayedSpellWithPeriodicAmount(caster, SPELL_WARRIOR_DEEP_WOUNDS_RANK_PERIODIC, SPELL_AURA_PERIODIC_DAMAGE, damage, EFFECT_0); - -                //caster->CastCustomSpell(target, SPELL_WARRIOR_DEEP_WOUNDS_RANK_PERIODIC, &damage, nullptr, nullptr, true); -            } -        } +                SPELL_WARRIOR_DEEP_WOUNDS_RANK_1, +                SPELL_WARRIOR_DEEP_WOUNDS_RANK_2, +                SPELL_WARRIOR_DEEP_WOUNDS_RANK_3 +            }); +    } -        void Register() override +    void HandleDummy(SpellEffIndex /*effIndex*/) +    { +        int32 damage = std::max(GetEffectValue(), 0); +        Unit* caster = GetCaster(); +        if (Unit* target = GetHitUnit())          { -            OnEffectHitTarget += SpellEffectFn(spell_warr_deep_wounds_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +            // include target dependant auras +            damage = target->MeleeDamageBonusTaken(caster, damage, BASE_ATTACK, GetSpellInfo()); +            // apply percent damage mods +            ApplyPct(damage, 16.0f * GetSpellInfo()->GetRank() / 6.0f); +            target->CastDelayedSpellWithPeriodicAmount(caster, SPELL_WARRIOR_DEEP_WOUNDS_RANK_PERIODIC, SPELL_AURA_PERIODIC_DAMAGE, damage, EFFECT_0); + +            //caster->CastCustomSpell(target, SPELL_WARRIOR_DEEP_WOUNDS_RANK_PERIODIC, &damage, nullptr, nullptr, true);          } -    }; +    } -    SpellScript* GetSpellScript() const override +    void Register() override      { -        return new spell_warr_deep_wounds_SpellScript(); +        OnEffectHitTarget += SpellEffectFn(spell_warr_deep_wounds::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);      }  };  // -100 - Charge -class spell_warr_charge : public SpellScriptLoader +class spell_warr_charge : public SpellScript  { -public: -    spell_warr_charge() : SpellScriptLoader("spell_warr_charge") { } +    PrepareSpellScript(spell_warr_charge); -    class spell_warr_charge_SpellScript : public SpellScript +    bool Validate(SpellInfo const* /*spellInfo*/) override      { -        PrepareSpellScript(spell_warr_charge_SpellScript); - -        bool Validate(SpellInfo const* /*spellInfo*/) override -        { -            return ValidateSpellInfo( -                { -                    SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT, -                    SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF, -                    SPELL_WARRIOR_CHARGE -                }); -        } - -        void HandleDummy(SpellEffIndex /*effIndex*/) -        { -            int32 chargeBasePoints0 = GetEffectValue(); -            Unit* caster = GetCaster(); -            caster->CastCustomSpell(caster, SPELL_WARRIOR_CHARGE, &chargeBasePoints0, nullptr, nullptr, true); +        return ValidateSpellInfo( +            { +                SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT, +                SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF, +                SPELL_WARRIOR_CHARGE +            }); +    } -            // Juggernaut crit bonus -            if (caster->HasAura(SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT)) -                caster->CastSpell(caster, SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF, true); -        } +    void HandleDummy(SpellEffIndex /*effIndex*/) +    { +        int32 chargeBasePoints0 = GetEffectValue(); +        Unit* caster = GetCaster(); +        caster->CastCustomSpell(caster, SPELL_WARRIOR_CHARGE, &chargeBasePoints0, nullptr, nullptr, true); -        void Register() override -        { -            OnEffectHitTarget += SpellEffectFn(spell_warr_charge_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); -        } -    }; +        // Juggernaut crit bonus +        if (caster->HasAura(SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT)) +            caster->CastSpell(caster, SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF, true); +    } -    SpellScript* GetSpellScript() const override +    void Register() override      { -        return new spell_warr_charge_SpellScript(); +        OnEffectHitTarget += SpellEffectFn(spell_warr_charge::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY);      }  };  // -1464 - Slam -class spell_warr_slam : public SpellScriptLoader +class spell_warr_slam : public SpellScript  { -public: -    spell_warr_slam() : SpellScriptLoader("spell_warr_slam") { } +    PrepareSpellScript(spell_warr_slam); -    class spell_warr_slam_SpellScript : public SpellScript +    bool Validate(SpellInfo const* /*spellInfo*/) override      { -        PrepareSpellScript(spell_warr_slam_SpellScript); - -        bool Validate(SpellInfo const* /*spellInfo*/) override -        { -            return ValidateSpellInfo({ SPELL_WARRIOR_SLAM }); -        } +        return ValidateSpellInfo({ SPELL_WARRIOR_SLAM }); +    } -        void SendMiss(SpellMissInfo missInfo) +    void SendMiss(SpellMissInfo missInfo) +    { +        if (missInfo != SPELL_MISS_NONE)          { -            if (missInfo != SPELL_MISS_NONE) +            if (Unit* caster = GetCaster())              { -                if (Unit* caster = GetCaster()) +                if (Unit* target = GetHitUnit())                  { -                    if (Unit* target = GetHitUnit()) -                    { -                        caster->SendSpellMiss(target, SPELL_WARRIOR_SLAM, missInfo); -                    } +                    caster->SendSpellMiss(target, SPELL_WARRIOR_SLAM, missInfo);                  }              }          } +    } -        void HandleDummy(SpellEffIndex /*effIndex*/) -        { -            if (GetHitUnit()) -                GetCaster()->CastCustomSpell(SPELL_WARRIOR_SLAM, SPELLVALUE_BASE_POINT0, GetEffectValue(), GetHitUnit(), TRIGGERED_FULL_MASK); -        } - -        void Register() override -        { -            BeforeHit += BeforeSpellHitFn(spell_warr_slam_SpellScript::SendMiss); -            OnEffectHitTarget += SpellEffectFn(spell_warr_slam_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); -        } -    }; +    void HandleDummy(SpellEffIndex /*effIndex*/) +    { +        if (GetHitUnit()) +            GetCaster()->CastCustomSpell(SPELL_WARRIOR_SLAM, SPELLVALUE_BASE_POINT0, GetEffectValue(), GetHitUnit(), TRIGGERED_FULL_MASK); +    } -    SpellScript* GetSpellScript() const override +    void Register() override      { -        return new spell_warr_slam_SpellScript(); +        BeforeHit += BeforeSpellHitFn(spell_warr_slam::SendMiss); +        OnEffectHitTarget += SpellEffectFn(spell_warr_slam::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);      }  };  // -58872 - Damage Shield -class spell_warr_damage_shield : public SpellScriptLoader +class spell_warr_damage_shield : public AuraScript  { -public: -    spell_warr_damage_shield() : SpellScriptLoader("spell_warr_damage_shield") { } +    PrepareAuraScript(spell_warr_damage_shield); -    class spell_warr_damage_shield_AuraScript : public AuraScript +    bool Validate(SpellInfo const* /*spellInfo*/) override      { -        PrepareAuraScript(spell_warr_damage_shield_AuraScript); - -        bool Validate(SpellInfo const* /*spellInfo*/) override -        { -            return ValidateSpellInfo({ SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE }); -        } - -        void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) -        { -            PreventDefaultAction(); +        return ValidateSpellInfo({ SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE }); +    } -            // % of amount blocked -            int32 damage = CalculatePct(int32(GetTarget()->GetShieldBlockValue()), aurEff->GetAmount()); -            GetTarget()->CastCustomSpell(SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetProcTarget(), true, nullptr, aurEff); -        } +    void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +    { +        PreventDefaultAction(); -        void Register() override -        { -            OnEffectProc += AuraEffectProcFn(spell_warr_damage_shield_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); -        } -    }; +        // % of amount blocked +        int32 damage = CalculatePct(int32(GetTarget()->GetShieldBlockValue()), aurEff->GetAmount()); +        GetTarget()->CastCustomSpell(SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetProcTarget(), true, nullptr, aurEff); +    } -    AuraScript* GetAuraScript() const override +    void Register() override      { -        return new spell_warr_damage_shield_AuraScript(); +        OnEffectProc += AuraEffectProcFn(spell_warr_damage_shield::OnProc, EFFECT_0, SPELL_AURA_DUMMY);      }  };  // -5308 - Execute -class spell_warr_execute : public SpellScriptLoader +class spell_warr_execute : public SpellScript  { -public: -    spell_warr_execute() : SpellScriptLoader("spell_warr_execute") { } +    PrepareSpellScript(spell_warr_execute); -    class spell_warr_execute_SpellScript : public SpellScript +    bool Validate(SpellInfo const* /*spellInfo*/) override      { -        PrepareSpellScript(spell_warr_execute_SpellScript); - -        bool Validate(SpellInfo const* /*spellInfo*/) override -        { -            return ValidateSpellInfo({ SPELL_WARRIOR_EXECUTE, SPELL_WARRIOR_GLYPH_OF_EXECUTION }); -        } +        return ValidateSpellInfo({ SPELL_WARRIOR_EXECUTE, SPELL_WARRIOR_GLYPH_OF_EXECUTION }); +    } -        void SendMiss(SpellMissInfo missInfo) +    void SendMiss(SpellMissInfo missInfo) +    { +        if (missInfo != SPELL_MISS_NONE)          { -            if (missInfo != SPELL_MISS_NONE) +            if (Unit* caster = GetCaster())              { -                if (Unit* caster = GetCaster()) +                if (Unit* target = GetHitUnit())                  { -                    if (Unit* target = GetHitUnit()) -                    { -                        caster->SendSpellMiss(target, SPELL_WARRIOR_EXECUTE, missInfo); -                    } +                    caster->SendSpellMiss(target, SPELL_WARRIOR_EXECUTE, missInfo);                  }              }          } +    } -        void HandleEffect(SpellEffIndex effIndex) +    void HandleEffect(SpellEffIndex effIndex) +    { +        Unit* caster = GetCaster(); +        if (Unit* target = GetHitUnit())          { -            Unit* caster = GetCaster(); -            if (Unit* target = GetHitUnit()) -            { -                SpellInfo const* spellInfo = GetSpellInfo(); -                int32 rageUsed = std::min<int32>(300 - spellInfo->CalcPowerCost(caster, SpellSchoolMask(spellInfo->SchoolMask)), caster->GetPower(POWER_RAGE)); -                int32 newRage = std::max<int32>(0, caster->GetPower(POWER_RAGE) - rageUsed); - -                // Sudden Death rage save -                if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_GENERIC, WARRIOR_ICON_ID_SUDDEN_DEATH, EFFECT_0)) -                { -                    int32 ragesave = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue() * 10; -                    newRage = std::max(newRage, ragesave); -                } +            SpellInfo const* spellInfo = GetSpellInfo(); +            int32 rageUsed = std::min<int32>(300 - spellInfo->CalcPowerCost(caster, SpellSchoolMask(spellInfo->SchoolMask)), caster->GetPower(POWER_RAGE)); +            int32 newRage = std::max<int32>(0, caster->GetPower(POWER_RAGE) - rageUsed); -                caster->SetPower(POWER_RAGE, uint32(newRage)); -                // Glyph of Execution bonus -                if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_WARRIOR_GLYPH_OF_EXECUTION, EFFECT_0)) -                    rageUsed += aurEff->GetAmount() * 10; - -                int32 bp = GetEffectValue() + int32(rageUsed * spellInfo->Effects[effIndex].DamageMultiplier + caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.2f); -                caster->CastCustomSpell(target, SPELL_WARRIOR_EXECUTE, &bp, nullptr, nullptr, true, nullptr, nullptr, GetOriginalCaster()->GetGUID()); +            // Sudden Death rage save +            if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_GENERIC, WARRIOR_ICON_ID_SUDDEN_DEATH, EFFECT_0)) +            { +                int32 ragesave = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue() * 10; +                newRage = std::max(newRage, ragesave);              } -        } -        void Register() override -        { -            BeforeHit += BeforeSpellHitFn(spell_warr_execute_SpellScript::SendMiss); -            OnEffectHitTarget += SpellEffectFn(spell_warr_execute_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_DUMMY); +            caster->SetPower(POWER_RAGE, uint32(newRage)); +            // Glyph of Execution bonus +            if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_WARRIOR_GLYPH_OF_EXECUTION, EFFECT_0)) +                rageUsed += aurEff->GetAmount() * 10; + +            int32 bp = GetEffectValue() + int32(rageUsed * spellInfo->Effects[effIndex].DamageMultiplier + caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.2f); +            caster->CastCustomSpell(target, SPELL_WARRIOR_EXECUTE, &bp, nullptr, nullptr, true, nullptr, nullptr, GetOriginalCaster()->GetGUID());          } -    }; +    } -    SpellScript* GetSpellScript() const override +    void Register() override      { -        return new spell_warr_execute_SpellScript(); +        BeforeHit += BeforeSpellHitFn(spell_warr_execute::SendMiss); +        OnEffectHitTarget += SpellEffectFn(spell_warr_execute::HandleEffect, EFFECT_0, SPELL_EFFECT_DUMMY);      }  };  // 12809 - Concussion Blow -class spell_warr_concussion_blow : public SpellScriptLoader +class spell_warr_concussion_blow : public SpellScript  { -public: -    spell_warr_concussion_blow() : SpellScriptLoader("spell_warr_concussion_blow") { } +    PrepareSpellScript(spell_warr_concussion_blow); -    class spell_warr_concussion_blow_SpellScript : public SpellScript +    void HandleDummy(SpellEffIndex /*effIndex*/)      { -        PrepareSpellScript(spell_warr_concussion_blow_SpellScript); - -        void HandleDummy(SpellEffIndex /*effIndex*/) -        { -            SetHitDamage(CalculatePct(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK), GetEffectValue())); -        } - -        void Register() override -        { -            OnEffectHitTarget += SpellEffectFn(spell_warr_concussion_blow_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY); -        } -    }; +        SetHitDamage(CalculatePct(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK), GetEffectValue())); +    } -    SpellScript* GetSpellScript() const override +    void Register() override      { -        return new spell_warr_concussion_blow_SpellScript(); +        OnEffectHitTarget += SpellEffectFn(spell_warr_concussion_blow::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY);      }  };  // 23881 - Bloodthirst -class spell_warr_bloodthirst : public SpellScriptLoader +class spell_warr_bloodthirst : public SpellScript  { -public: -    spell_warr_bloodthirst() : SpellScriptLoader("spell_warr_bloodthirst") { } +    PrepareSpellScript(spell_warr_bloodthirst); -    class spell_warr_bloodthirst_SpellScript : public SpellScript +    void HandleDamage(SpellEffIndex /*effIndex*/)      { -        PrepareSpellScript(spell_warr_bloodthirst_SpellScript); +        int32 damage = GetEffectValue(); +        ApplyPct(damage, GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK)); -        void HandleDamage(SpellEffIndex /*effIndex*/) +        if (Unit* target = GetHitUnit())          { -            int32 damage = GetEffectValue(); -            ApplyPct(damage, GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK)); - -            if (Unit* target = GetHitUnit()) -            { -                damage = GetCaster()->SpellDamageBonusDone(target, GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE); -                damage = target->SpellDamageBonusTaken(GetCaster(), GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE); -            } -            SetHitDamage(damage); -        } - -        void HandleDummy(SpellEffIndex /*effIndex*/) -        { -            int32 damage = GetEffectValue(); -            GetCaster()->CastCustomSpell(GetCaster(), SPELL_WARRIOR_BLOODTHIRST, &damage, nullptr, nullptr, true, nullptr); +            damage = GetCaster()->SpellDamageBonusDone(target, GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE); +            damage = target->SpellDamageBonusTaken(GetCaster(), GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE);          } +        SetHitDamage(damage); +    } -        void Register() override -        { -            OnEffectHitTarget += SpellEffectFn(spell_warr_bloodthirst_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); -            OnEffectHit += SpellEffectFn(spell_warr_bloodthirst_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); -        } -    }; +    void HandleDummy(SpellEffIndex /*effIndex*/) +    { +        int32 damage = GetEffectValue(); +        GetCaster()->CastCustomSpell(GetCaster(), SPELL_WARRIOR_BLOODTHIRST, &damage, nullptr, nullptr, true, nullptr); +    } -    SpellScript* GetSpellScript() const override +    void Register() override      { -        return new spell_warr_bloodthirst_SpellScript(); +        OnEffectHitTarget += SpellEffectFn(spell_warr_bloodthirst::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); +        OnEffectHit += SpellEffectFn(spell_warr_bloodthirst::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY);      }  };  // 23880 - Bloodthirst (Heal) -class spell_warr_bloodthirst_heal : public SpellScriptLoader +class spell_warr_bloodthirst_heal : public SpellScript  { -public: -    spell_warr_bloodthirst_heal() : SpellScriptLoader("spell_warr_bloodthirst_heal") { } +    PrepareSpellScript(spell_warr_bloodthirst_heal); -    class spell_warr_bloodthirst_heal_SpellScript : public SpellScript +    void HandleHeal(SpellEffIndex /*effIndex*/)      { -        PrepareSpellScript(spell_warr_bloodthirst_heal_SpellScript); - -        void HandleHeal(SpellEffIndex /*effIndex*/) -        { -            if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARRIOR_BLOODTHIRST_DAMAGE)) -                SetHitHeal(GetCaster()->CountPctFromMaxHealth(spellInfo->Effects[EFFECT_1].CalcValue(GetCaster()))); -        } - -        void Register() override -        { -            OnEffectHitTarget += SpellEffectFn(spell_warr_bloodthirst_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); -        } -    }; +        if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARRIOR_BLOODTHIRST_DAMAGE)) +            SetHitHeal(GetCaster()->CountPctFromMaxHealth(spellInfo->Effects[EFFECT_1].CalcValue(GetCaster()))); +    } -    SpellScript* GetSpellScript() const override +    void Register() override      { -        return new spell_warr_bloodthirst_heal_SpellScript(); +        OnEffectHitTarget += SpellEffectFn(spell_warr_bloodthirst_heal::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL);      }  };  // 7384, 7887, 11584, 11585 - Overpower -class spell_warr_overpower : public SpellScriptLoader +class spell_warr_overpower : public SpellScript  { -public: -    spell_warr_overpower() : SpellScriptLoader("spell_warr_overpower") { } +    PrepareSpellScript(spell_warr_overpower); -    class spell_warr_overpower_SpellScript : public SpellScript +    void HandleEffect(SpellEffIndex /*effIndex*/)      { -        PrepareSpellScript(spell_warr_overpower_SpellScript); +        uint32 spellId = 0; +        if (GetCaster()->HasAura(SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_1)) +            spellId = SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_1; +        else if (GetCaster()->HasAura(SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_2)) +            spellId = SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_2; -        void HandleEffect(SpellEffIndex /*effIndex*/) -        { -            uint32 spellId = 0; -            if (GetCaster()->HasAura(SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_1)) -                spellId = SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_1; -            else if (GetCaster()->HasAura(SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_2)) -                spellId = SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_2; - -            if (!spellId) -                return; - -            if (Player* target = GetHitPlayer()) -                if (target->HasUnitState(UNIT_STATE_CASTING)) -                    target->CastSpell(target, spellId, true, 0, 0, GetCaster()->GetGUID()); -        } +        if (!spellId) +            return; -        void Register() override -        { -            OnEffectHitTarget += SpellEffectFn(spell_warr_overpower_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_ANY); -        } -    }; +        if (Player* target = GetHitPlayer()) +            if (target->HasUnitState(UNIT_STATE_CASTING)) +                target->CastSpell(target, spellId, true, 0, 0, GetCaster()->GetGUID()); +    } -    SpellScript* GetSpellScript() const override +    void Register() override      { -        return new spell_warr_overpower_SpellScript(); +        OnEffectHitTarget += SpellEffectFn(spell_warr_overpower::HandleEffect, EFFECT_0, SPELL_EFFECT_ANY);      }  };  // 5246 - Intimidating Shout -class spell_warr_intimidating_shout : public SpellScriptLoader +class spell_warr_intimidating_shout : public SpellScript  { -public: -    spell_warr_intimidating_shout() : SpellScriptLoader("spell_warr_intimidating_shout") { } +    PrepareSpellScript(spell_warr_intimidating_shout); -    class spell_warr_intimidating_shout_SpellScript : public SpellScript +    void FilterTargets(std::list<WorldObject*>& unitList)      { -        PrepareSpellScript(spell_warr_intimidating_shout_SpellScript); - -        void FilterTargets(std::list<WorldObject*>& unitList) -        { -            unitList.remove(GetExplTargetWorldObject()); -        } - -        void Register() override -        { -            OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); -            OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout_SpellScript::FilterTargets, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY); -        } -    }; +        unitList.remove(GetExplTargetWorldObject()); +    } -    SpellScript* GetSpellScript() const override +    void Register() override      { -        return new spell_warr_intimidating_shout_SpellScript(); +        OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); +        OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout::FilterTargets, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY);      }  };  // -772 - Rend -class spell_warr_rend : public SpellScriptLoader +class spell_warr_rend : public AuraScript  { -public: -    spell_warr_rend() : SpellScriptLoader("spell_warr_rend") { } +    PrepareAuraScript(spell_warr_rend); -    class spell_warr_rend_AuraScript : public AuraScript +    void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated)      { -        PrepareAuraScript(spell_warr_rend_AuraScript); - -        void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated) +        if (Unit* caster = GetCaster())          { -            if (Unit* caster = GetCaster()) +            canBeRecalculated = false; + +            // $0.2 * (($MWB + $mwb) / 2 + $AP / 14 * $MWS) bonus per tick +            float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK); +            int32 mws = caster->GetAttackTime(BASE_ATTACK); +            float mwbMin = caster->GetWeaponDamageRange(BASE_ATTACK, MINDAMAGE); +            float mwbMax = caster->GetWeaponDamageRange(BASE_ATTACK, MAXDAMAGE); +            float mwb = ((mwbMin + mwbMax) / 2 + ap * mws / 14000) * 0.2f; +            amount += int32(caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), mwb)); + +            // "If used while your target is above 75% health, Rend does 35% more damage." +            // as for 3.1.3 only ranks above 9 (wrong tooltip?) +            if (GetSpellInfo()->GetRank() >= 9)              { -                canBeRecalculated = false; - -                // $0.2 * (($MWB + $mwb) / 2 + $AP / 14 * $MWS) bonus per tick -                float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK); -                int32 mws = caster->GetAttackTime(BASE_ATTACK); -                float mwbMin = caster->GetWeaponDamageRange(BASE_ATTACK, MINDAMAGE); -                float mwbMax = caster->GetWeaponDamageRange(BASE_ATTACK, MAXDAMAGE); -                float mwb = ((mwbMin + mwbMax) / 2 + ap * mws / 14000) * 0.2f; -                amount += int32(caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), mwb)); - -                // "If used while your target is above 75% health, Rend does 35% more damage." -                // as for 3.1.3 only ranks above 9 (wrong tooltip?) -                if (GetSpellInfo()->GetRank() >= 9) -                { -                    if (GetUnitOwner()->HasAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT, GetSpellInfo(), caster)) -                        AddPct(amount, GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster)); -                } +                if (GetUnitOwner()->HasAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT, GetSpellInfo(), caster)) +                    AddPct(amount, GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster));              }          } +    } -        void Register() override -        { -            DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warr_rend_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); -        } -    }; - -    AuraScript* GetAuraScript() const override +    void Register() override      { -        return new spell_warr_rend_AuraScript(); +        DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warr_rend::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);      }  };  // 64380, 65941 - Shattering Throw -class spell_warr_shattering_throw : public SpellScriptLoader +class spell_warr_shattering_throw : public SpellScript  { -public: -    spell_warr_shattering_throw() : SpellScriptLoader("spell_warr_shattering_throw") { } +    PrepareSpellScript(spell_warr_shattering_throw); -    class spell_warr_shattering_throw_SpellScript : public SpellScript +    void HandleScript(SpellEffIndex effIndex)      { -        PrepareSpellScript(spell_warr_shattering_throw_SpellScript); - -        void HandleScript(SpellEffIndex effIndex) -        { -            PreventHitDefaultEffect(effIndex); - -            // remove shields, will still display immune to damage part -            if (Unit* target = GetHitUnit()) -                target->RemoveAurasWithMechanic(1 << MECHANIC_IMMUNE_SHIELD, AURA_REMOVE_BY_ENEMY_SPELL); -        } +        PreventHitDefaultEffect(effIndex); -        void Register() override -        { -            OnEffectHitTarget += SpellEffectFn(spell_warr_shattering_throw_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); -        } -    }; +        // remove shields, will still display immune to damage part +        if (Unit* target = GetHitUnit()) +            target->RemoveAurasWithMechanic(1 << MECHANIC_IMMUNE_SHIELD, AURA_REMOVE_BY_ENEMY_SPELL); +    } -    SpellScript* GetSpellScript() const override +    void Register() override      { -        return new spell_warr_shattering_throw_SpellScript(); +        OnEffectHitTarget += SpellEffectFn(spell_warr_shattering_throw::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);      }  };  // 12328, 18765, 35429 - Sweeping Strikes -class spell_warr_sweeping_strikes : public SpellScriptLoader +class spell_warr_sweeping_strikes : public AuraScript  { -public: -    spell_warr_sweeping_strikes() : SpellScriptLoader("spell_warr_sweeping_strikes") { } +    PrepareAuraScript(spell_warr_sweeping_strikes); -    class spell_warr_sweeping_strikes_AuraScript : public AuraScript +    bool Validate(SpellInfo const* /*spellInfo*/) override      { -        PrepareAuraScript(spell_warr_sweeping_strikes_AuraScript); - -        bool Validate(SpellInfo const* /*spellInfo*/) override -        { -            return ValidateSpellInfo({ SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK }); -        } - -        bool Load() override -        { -            _procTarget = nullptr; -            return true; -        } +        return ValidateSpellInfo({ SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK }); +    } -        bool CheckProc(ProcEventInfo& eventInfo) -        { -            _procTarget = eventInfo.GetActor()->SelectNearbyNoTotemTarget(eventInfo.GetProcTarget()); +    bool Load() override +    { +        _procTarget = nullptr; +        return true; +    } -            DamageInfo* damageInfo = eventInfo.GetDamageInfo(); +    bool CheckProc(ProcEventInfo& eventInfo) +    { +        _procTarget = eventInfo.GetActor()->SelectNearbyNoTotemTarget(eventInfo.GetProcTarget()); -            if (!damageInfo || !damageInfo->GetSpellInfo()) -            { -                return false; -            } +        DamageInfo* damageInfo = eventInfo.GetDamageInfo(); -            return _procTarget && !damageInfo->GetSpellInfo(); -        } - -        void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +        if (!damageInfo || !damageInfo->GetSpellInfo())          { -            PreventDefaultAction(); -            if (DamageInfo* damageInfo = eventInfo.GetDamageInfo()) -            { -                int32 damage = damageInfo->GetUnmitigatedDamage(); -                GetTarget()->CastCustomSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK, &damage, 0, 0, true, nullptr, aurEff); -            } +            return false;          } -        void Register() override +        return _procTarget && !damageInfo->GetSpellInfo(); +    } + +    void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +    { +        PreventDefaultAction(); +        if (DamageInfo* damageInfo = eventInfo.GetDamageInfo())          { -            DoCheckProc += AuraCheckProcFn(spell_warr_sweeping_strikes_AuraScript::CheckProc); -            OnEffectProc += AuraEffectProcFn(spell_warr_sweeping_strikes_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); +            int32 damage = damageInfo->GetUnmitigatedDamage(); +            GetTarget()->CastCustomSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK, &damage, 0, 0, true, nullptr, aurEff);          } +    } -    private: -        Unit* _procTarget; -    }; - -    AuraScript* GetAuraScript() const override +    void Register() override      { -        return new spell_warr_sweeping_strikes_AuraScript(); +        DoCheckProc += AuraCheckProcFn(spell_warr_sweeping_strikes::CheckProc); +        OnEffectProc += AuraEffectProcFn(spell_warr_sweeping_strikes::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);      } + +private: +    Unit* _procTarget;  };  // 50720 - Vigilance -class spell_warr_vigilance : public SpellScriptLoader +class spell_warr_vigilance : public AuraScript  { -public: -    spell_warr_vigilance() : SpellScriptLoader("spell_warr_vigilance") { } +    PrepareAuraScript(spell_warr_vigilance); -    class spell_warr_vigilance_AuraScript : public AuraScript +    bool Validate(SpellInfo const* /*spellInfo*/) override      { -        PrepareAuraScript(spell_warr_vigilance_AuraScript); - -        bool Validate(SpellInfo const* /*spellInfo*/) override -        { -            return ValidateSpellInfo( -                { -                    SPELL_WARRIOR_GLYPH_OF_VIGILANCE, -                    SPELL_WARRIOR_VIGILANCE_PROC, -                    SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT, -                    SPELL_GEN_DAMAGE_REDUCTION_AURA -                }); -        } - -        bool Load() override -        { -            _procTarget = nullptr; -            return true; -        } +        return ValidateSpellInfo( +            { +                SPELL_WARRIOR_GLYPH_OF_VIGILANCE, +                SPELL_WARRIOR_VIGILANCE_PROC, +                SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT, +                SPELL_GEN_DAMAGE_REDUCTION_AURA +            }); +    } -        void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) -        { -            Unit* target = GetTarget(); -            target->CastSpell(target, SPELL_GEN_DAMAGE_REDUCTION_AURA, true); +    bool Load() override +    { +        _procTarget = nullptr; +        return true; +    } -            if (Unit* caster = GetCaster()) -                target->CastSpell(caster, SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT, true); -        } +    void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +    { +        Unit* target = GetTarget(); +        target->CastSpell(target, SPELL_GEN_DAMAGE_REDUCTION_AURA, true); -        void HandleAfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) -        { -            //! WORKAROUND -            //! this glyph is a proc -            if (Unit* caster = GetCaster()) -            { -                if (AuraEffect const* glyph = caster->GetAuraEffect(SPELL_WARRIOR_GLYPH_OF_VIGILANCE, EFFECT_0)) -                    GetTarget()->ModifyRedirectThreat(glyph->GetAmount()); -            } -        } +        if (Unit* caster = GetCaster()) +            target->CastSpell(caster, SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT, true); +    } -        void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +    void HandleAfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +    { +        //! WORKAROUND +        //! this glyph is a proc +        if (Unit* caster = GetCaster())          { -            Unit* target = GetTarget(); -            if (target->HasAura(SPELL_GEN_DAMAGE_REDUCTION_AURA) && -                    !(target->HasAura(SPELL_PALADIN_BLESSING_OF_SANCTUARY) || -                      target->HasAura(SPELL_PALADIN_GREATER_BLESSING_OF_SANCTUARY) || -                      target->HasAura(SPELL_PRIEST_RENEWED_HOPE))) -            { -                target->RemoveAurasDueToSpell(SPELL_GEN_DAMAGE_REDUCTION_AURA); -            } - -            target->ResetRedirectThreat(); +            if (AuraEffect const* glyph = caster->GetAuraEffect(SPELL_WARRIOR_GLYPH_OF_VIGILANCE, EFFECT_0)) +                GetTarget()->ModifyRedirectThreat(glyph->GetAmount());          } +    } -        bool CheckProc(ProcEventInfo& /*eventInfo*/) +    void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +    { +        Unit* target = GetTarget(); +        if (target->HasAura(SPELL_GEN_DAMAGE_REDUCTION_AURA) && +                !(target->HasAura(SPELL_PALADIN_BLESSING_OF_SANCTUARY) || +                    target->HasAura(SPELL_PALADIN_GREATER_BLESSING_OF_SANCTUARY) || +                    target->HasAura(SPELL_PRIEST_RENEWED_HOPE)))          { -            _procTarget = GetCaster(); -            return _procTarget; +            target->RemoveAurasDueToSpell(SPELL_GEN_DAMAGE_REDUCTION_AURA);          } -        void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) -        { -            PreventDefaultAction(); -            GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_VIGILANCE_PROC, true, nullptr, aurEff); -        } +        target->ResetRedirectThreat(); +    } -        void Register() override -        { -            OnEffectApply += AuraEffectApplyFn(spell_warr_vigilance_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); -            AfterEffectApply += AuraEffectApplyFn(spell_warr_vigilance_AuraScript::HandleAfterApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); -            OnEffectRemove += AuraEffectRemoveFn(spell_warr_vigilance_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); -            DoCheckProc += AuraCheckProcFn(spell_warr_vigilance_AuraScript::CheckProc); -            OnEffectProc += AuraEffectProcFn(spell_warr_vigilance_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); -        } +    bool CheckProc(ProcEventInfo& /*eventInfo*/) +    { +        _procTarget = GetCaster(); +        return _procTarget; +    } -    private: -        Unit* _procTarget; -    }; +    void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) +    { +        PreventDefaultAction(); +        GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_VIGILANCE_PROC, true, nullptr, aurEff); +    } -    AuraScript* GetAuraScript() const override +    void Register() override      { -        return new spell_warr_vigilance_AuraScript(); +        OnEffectApply += AuraEffectApplyFn(spell_warr_vigilance::HandleApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); +        AfterEffectApply += AuraEffectApplyFn(spell_warr_vigilance::HandleAfterApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); +        OnEffectRemove += AuraEffectRemoveFn(spell_warr_vigilance::HandleRemove, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); +        DoCheckProc += AuraCheckProcFn(spell_warr_vigilance::CheckProc); +        OnEffectProc += AuraEffectProcFn(spell_warr_vigilance::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);      } + +private: +    Unit* _procTarget;  };  // 50725 - Vigilance -class spell_warr_vigilance_trigger : public SpellScriptLoader +class spell_warr_vigilance_trigger : public SpellScript  { -public: -    spell_warr_vigilance_trigger() : SpellScriptLoader("spell_warr_vigilance_trigger") { } +    PrepareSpellScript(spell_warr_vigilance_trigger); -    class spell_warr_vigilance_trigger_SpellScript : public SpellScript +    void HandleScript(SpellEffIndex effIndex)      { -        PrepareSpellScript(spell_warr_vigilance_trigger_SpellScript); - -        void HandleScript(SpellEffIndex effIndex) -        { -            PreventHitDefaultEffect(effIndex); +        PreventHitDefaultEffect(effIndex); -            // Remove Taunt cooldown -            if (Player* target = GetHitPlayer()) -                target->RemoveSpellCooldown(SPELL_WARRIOR_TAUNT, true); -        } - -        void Register() override -        { -            OnEffectHitTarget += SpellEffectFn(spell_warr_vigilance_trigger_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); -        } -    }; +        // Remove Taunt cooldown +        if (Player* target = GetHitPlayer()) +            target->RemoveSpellCooldown(SPELL_WARRIOR_TAUNT, true); +    } -    SpellScript* GetSpellScript() const override +    void Register() override      { -        return new spell_warr_vigilance_trigger_SpellScript(); +        OnEffectHitTarget += SpellEffectFn(spell_warr_vigilance_trigger::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);      }  };  // 58387 - Glyph of Sunder Armor -class spell_warr_glyph_of_sunder_armor : public SpellScriptLoader +class spell_warr_glyph_of_sunder_armor : public AuraScript  { -public: -    spell_warr_glyph_of_sunder_armor() : SpellScriptLoader("spell_warr_glyph_of_sunder_armor") { } +    PrepareAuraScript(spell_warr_glyph_of_sunder_armor); -    class spell_warr_glyph_of_sunder_armor_AuraScript : public AuraScript +    void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod)      { -        PrepareAuraScript(spell_warr_glyph_of_sunder_armor_AuraScript); - -        void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) +        if (!spellMod)          { -            if (!spellMod) -            { -                spellMod = new SpellModifier(aurEff->GetBase()); -                spellMod->op = SpellModOp(aurEff->GetMiscValue()); -                spellMod->type = SPELLMOD_FLAT; -                spellMod->spellId = GetId(); -                spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask; -            } - -            spellMod->value = aurEff->GetAmount(); +            spellMod = new SpellModifier(aurEff->GetBase()); +            spellMod->op = SpellModOp(aurEff->GetMiscValue()); +            spellMod->type = SPELLMOD_FLAT; +            spellMod->spellId = GetId(); +            spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask;          } -        void Register() override -        { -            DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_warr_glyph_of_sunder_armor_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY); -        } -    }; +        spellMod->value = aurEff->GetAmount(); +    } -    AuraScript* GetAuraScript() const override +    void Register() override      { -        return new spell_warr_glyph_of_sunder_armor_AuraScript(); +        DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_warr_glyph_of_sunder_armor::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY);      }  };  // 20230 - Retaliation -class spell_warr_retaliation : public SpellScriptLoader +class spell_warr_retaliation : public AuraScript  { -public: -    spell_warr_retaliation() : SpellScriptLoader("spell_warr_retaliation") { } +    PrepareAuraScript(spell_warr_retaliation); -    class spell_warr_retaliation_AuraScript : public AuraScript +    bool Validate(SpellInfo const* /*spellInfo*/) override      { -        PrepareAuraScript(spell_warr_retaliation_AuraScript); - -        bool Validate(SpellInfo const* /*spellInfo*/) override -        { -            return ValidateSpellInfo({ SPELL_WARRIOR_RETALIATION_DAMAGE }); -        } - -        bool CheckProc(ProcEventInfo& eventInfo) -        { -            // check attack comes not from behind and warrior is not stunned -            return GetTarget()->isInFront(eventInfo.GetActor(), M_PI) && !GetTarget()->HasUnitState(UNIT_STATE_STUNNED); -        } +        return ValidateSpellInfo({ SPELL_WARRIOR_RETALIATION_DAMAGE }); +    } -        void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) -        { -            PreventDefaultAction(); -            GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_WARRIOR_RETALIATION_DAMAGE, true, nullptr, aurEff); -        } +    bool CheckProc(ProcEventInfo& eventInfo) +    { +        // check attack comes not from behind and warrior is not stunned +        return GetTarget()->isInFront(eventInfo.GetActor(), M_PI) && !GetTarget()->HasUnitState(UNIT_STATE_STUNNED); +    } -        void Register() override -        { -            DoCheckProc += AuraCheckProcFn(spell_warr_retaliation_AuraScript::CheckProc); -            OnEffectProc += AuraEffectProcFn(spell_warr_retaliation_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); -        } -    }; +    void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) +    { +        PreventDefaultAction(); +        GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_WARRIOR_RETALIATION_DAMAGE, true, nullptr, aurEff); +    } -    AuraScript* GetAuraScript() const override +    void Register() override      { -        return new spell_warr_retaliation_AuraScript(); +        DoCheckProc += AuraCheckProcFn(spell_warr_retaliation::CheckProc); +        OnEffectProc += AuraEffectProcFn(spell_warr_retaliation::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);      }  };  void AddSC_warrior_spell_scripts()  { -    // Ours -    new spell_warr_mocking_blow(); -    new spell_warr_intervene(); -    new spell_warr_improved_spell_reflection(); -    new spell_warr_improved_spell_reflection_trigger(); -    new spell_warr_victory_rush(); - -    // Theirs -    new spell_warr_bloodthirst(); -    new spell_warr_bloodthirst_heal(); -    new spell_warr_charge(); -    new spell_warr_concussion_blow(); -    new spell_warr_damage_shield(); -    new spell_warr_deep_wounds(); -    new spell_warr_execute(); -    new spell_warr_glyph_of_sunder_armor(); -    new spell_warr_intimidating_shout(); -    new spell_warr_last_stand(); -    new spell_warr_overpower(); -    new spell_warr_rend(); -    new spell_warr_retaliation(); -    new spell_warr_shattering_throw(); -    new spell_warr_slam(); -    new spell_warr_sweeping_strikes(); -    new spell_warr_vigilance(); -    new spell_warr_vigilance_trigger(); +    RegisterSpellScript(spell_warr_mocking_blow); +    RegisterSpellScript(spell_warr_intervene); +    RegisterSpellScript(spell_warr_improved_spell_reflection); +    RegisterSpellAndAuraScriptPair(spell_warr_improved_spell_reflection_trigger, spell_warr_improved_spell_reflection_trigger_aura); +    RegisterSpellScript(spell_warr_victory_rush); +    RegisterSpellScript(spell_warr_bloodthirst); +    RegisterSpellScript(spell_warr_bloodthirst_heal); +    RegisterSpellScript(spell_warr_charge); +    RegisterSpellScript(spell_warr_concussion_blow); +    RegisterSpellScript(spell_warr_damage_shield); +    RegisterSpellScript(spell_warr_deep_wounds); +    RegisterSpellScript(spell_warr_execute); +    RegisterSpellScript(spell_warr_glyph_of_sunder_armor); +    RegisterSpellScript(spell_warr_intimidating_shout); +    RegisterSpellScript(spell_warr_last_stand); +    RegisterSpellScript(spell_warr_overpower); +    RegisterSpellScript(spell_warr_rend); +    RegisterSpellScript(spell_warr_retaliation); +    RegisterSpellScript(spell_warr_shattering_throw); +    RegisterSpellScript(spell_warr_slam); +    RegisterSpellScript(spell_warr_sweeping_strikes); +    RegisterSpellScript(spell_warr_vigilance); +    RegisterSpellScript(spell_warr_vigilance_trigger);  }  | 
