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); } |