TrinityCore
Loading...
Searching...
No Matches
spell_warrior.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18/*
19 * Scripts for spells with SPELLFAMILY_WARRIOR and SPELLFAMILY_GENERIC spells used by warrior players.
20 * Ordered alphabetically using scriptname.
21 * Scriptnames of files in this file should be prefixed with "spell_warr_".
22 */
23
24#include "ScriptMgr.h"
25#include "CellImpl.h"
26#include "GridNotifiers.h"
27#include "Map.h"
28#include "MoveSpline.h"
29#include "ObjectAccessor.h"
30#include "PathGenerator.h"
31#include "Player.h"
32#include "Spell.h"
33#include "SpellMgr.h"
34#include "SpellAuraEffects.h"
35#include "SpellHistory.h"
36#include "SpellScript.h"
37
39{
128};
129
134
139
140static void ApplyWhirlwindCleaveAura(Player* caster, Difficulty difficulty, Spell const* triggeringSpell)
141{
142 SpellInfo const* whirlwindCleaveAuraInfo = sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_WHIRLWIND_CLEAVE_AURA, difficulty);
143 int32 stackAmount = static_cast<int32>(whirlwindCleaveAuraInfo->StackAmount);
144 caster->ApplySpellMod(whirlwindCleaveAuraInfo, SpellModOp::MaxAuraStacks, stackAmount);
145
148 .TriggeringSpell = triggeringSpell,
149 .SpellValueOverrides = { { SPELLVALUE_AURA_STACK, stackAmount } }
150 });
151}
152
153// 152278 - Anger Management
155{
156 static bool ValidateProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo, ChrSpecialization spec)
157 {
158 if (aurEff->GetAmountAsInt() == 0)
159 return false;
160
161 Player const* player = eventInfo.GetActor()->ToPlayer();
162 if (!player)
163 return false;
164
165 Spell const* procSpell = eventInfo.GetProcSpell();
166 if (!procSpell)
167 return false;
168
169 if (procSpell->GetPowerTypeCostAmount(POWER_RAGE) <= 0)
170 return false;
171
172 return player->GetPrimarySpecialization() == spec;
173 }
174
175 static bool CheckArmsProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
176 {
177 if (!ValidateProc(aurEff, eventInfo, ChrSpecialization::WarriorArms))
178 return false;
179
180 // exclude non-attacks such as Ignore Pain
181 if (!eventInfo.GetSpellInfo()->IsAffected(SPELLFAMILY_WARRIOR, { 0x100, 0x0, 0x0, 0x0 }))
182 return false;
183
184 return true;
185 }
186
187 static bool CheckFuryProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
188 {
189 return ValidateProc(aurEff, eventInfo, ChrSpecialization::WarriorFury);
190 }
191
192 static bool CheckProtectionProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
193 {
194 return ValidateProc(aurEff, eventInfo, ChrSpecialization::WarriorProtection);
195 }
196
210
211 void HandleProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo, std::span<int32 const> spellIds) const
212 {
213 int32 rageCost = *eventInfo.GetProcSpell()->GetPowerTypeCostAmount(POWER_RAGE) / 10; // db values are 10x the actual rage cost
214 SpellEffectValue multiplier = static_cast<float>(rageCost) / aurEff->GetAmount();
215 Milliseconds cooldownMod = -duration_cast<Milliseconds>(multiplier * CooldownReduction);
216
217 for (int32 spellId : spellIds)
218 GetTarget()->GetSpellHistory()->ModifyCooldown(spellId, cooldownMod);
219 }
220
221 void OnProcArms(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const
222 {
223 HandleProc(aurEff, eventInfo, ArmsSpellIds);
224 }
225
226 void OnProcFury(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const
227 {
228 HandleProc(aurEff, eventInfo, FurySpellIds);
229 }
230
231 void OnProcProtection(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const
232 {
233 HandleProc(aurEff, eventInfo, ProtectionSpellIds);
234 }
235
246
250 static constexpr std::array<int32, 2> ProtectionSpellIds = { SPELL_WARRIOR_AVATAR, SPELL_WARRIOR_SHIELD_WALL };
251};
252
253// 392536 - Ashen Juggernaut
255{
256 static bool CheckProc(AuraScript const&, ProcEventInfo const& eventInfo)
257 {
258 // should only proc on primary target
259 return eventInfo.GetActionTarget() == eventInfo.GetProcSpell()->m_targets.GetUnitTarget();
260 }
261
266};
267
268// 107574 - Avatar
281
282// 384361 - Bloodsurge
284{
285 bool Validate(SpellInfo const* /*spellInfo*/) override
286 {
288 }
289
290 void HandlePeriodic(AuraEffect const* aurEff) const
291 {
292 Unit* caster = GetTarget();
293 float rends = 0.0f;
294 auto work = [&rends, warrior = caster->GetGUID()](Unit const* target)
295 {
296 if (target->HasAuraEffect(SPELL_WARRIOR_REND_AURA, EFFECT_0, warrior))
297 rends += 1.0f;
298 };
299 Trinity::UnitWorker worker(caster, work);
300 Cell::VisitAllObjects(caster, worker, 50.0f);
301
302 SpellEffectValue chance = std::sqrt(rends) * aurEff->GetAmount();
303 if (!roll_chance(chance))
304 return;
305
308 .TriggeringAura = aurEff
309 });
310 }
311
316};
317
318// 23881 - Bloodthirst
319// 335096 - Bloodbath
321{
322 bool Validate(SpellInfo const* /*spellInfo*/) override
323 {
325 }
326
338
343};
344
345// 23881 - Bloodthirst
346// 335096 - Bloodbath
348{
349 bool Validate(SpellInfo const* spellInfo) override
350 {
352 && ValidateSpellEffect({{ spellInfo->Id, EFFECT_2 }});
353 }
354
355 enum class EnrageResult
356 {
357 No,
358 Yes,
360 };
361
363 {
364 Unit const* caster = GetCaster();
365 Unit const* hitUnit = GetHitUnit();
366
367 if (hitUnit != GetExplTargetUnit())
368 return EnrageResult::No;
369
371 if (!hitUnit->HasAura(SPELL_WARRIOR_FRESH_MEAT_DEBUFF, caster->GetGUID()))
373
374 if (roll_chance(GetEffectInfo(EFFECT_2).CalcValue(caster)))
375 return EnrageResult::Yes;
376
377 return EnrageResult::No;
378 }
379
380 void Enrage(SpellEffIndex /*effIndex*/) const
381 {
382 EnrageResult procResult = CheckEnrageProc();
383 if (procResult == EnrageResult::No)
384 return;
385
386 Unit* caster = GetCaster();
387
390 .TriggeringSpell = GetSpell()
391 });
392
393 // Fresh Meat talent handling
394 if (procResult == EnrageResult::FreshMeat)
397 });
398 }
399
404};
405
406// 446085 - Brutal Finish (attached to 446035 - Bladestorm)
432
433// 384036 - Brutal Vitality
435{
436 bool Validate(SpellInfo const* /*spellInfo*/) override
437 {
439 }
440
441 void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
442 {
443 _damageAmount += CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount());
444 }
445
446 void HandleDummyTick(AuraEffect const* /*aurEff*/)
447 {
448 if (_damageAmount == 0)
449 return;
450
451 if (AuraEffect* ignorePainAura = GetTarget()->GetAuraEffect(SPELL_WARRIOR_IGNORE_PAIN, EFFECT_0))
452 ignorePainAura->ChangeAmount(ignorePainAura->GetAmount() + _damageAmount);
453
454 _damageAmount = 0;
455 }
456
462
463private:
465};
466
467// 100 - Charge
488
489// 126661 - Warrior Charge Drop Fire Periodic
491{
492 void DropFireVisual(AuraEffect const* aurEff)
493 {
495
496 Unit* target = GetTarget();
497 if (target->IsSplineEnabled())
498 {
499 Movement::Location from = target->movespline->ComputePosition();
500 Movement::Location to = target->movespline->ComputePosition(aurEff->GetPeriod());
501
502 int32 fireCount = std::lround((to - from).length());
503
504 for (int32 i = 0; i < fireCount; ++i)
505 {
506 int32 timeOffset = i * aurEff->GetPeriod() / fireCount;
507 Movement::Location loc = target->movespline->ComputePosition(timeOffset);
508 target->SendPlaySpellVisual(Position(loc.x, loc.y, loc.z), SPELL_VISUAL_BLAZING_CHARGE, 0, 0, 1.f, true);
509 }
510 }
511 }
512
517};
518
519// 198337 - Charge Effect
521{
522 bool Validate(SpellInfo const* /*spellInfo*/) override
523 {
524 return ValidateSpellInfo
525 ({
528 });
529 }
530
531 void HandleCharge(SpellEffIndex /*effIndex*/) const
532 {
533 Unit* caster = GetCaster();
534 Unit* target = GetHitUnit();
535
537 .TriggerFlags = TRIGGERED_FULL_MASK & ~TRIGGERED_CAST_DIRECTLY,
538 .TriggeringSpell = GetSpell()
539 };
540
543
544 caster->CastSpell(target, SPELL_WARRIOR_CHARGE_ROOT_EFFECT, args);
545 }
546
551};
552
553// 23881 - Bloodthirst
554// 335096 - Bloodbath
582
583// 167105 - Colossus Smash
584// 262161 - Warbreaker
586{
592
594 {
595 Unit* target = GetHitUnit();
596 Unit* caster = GetCaster();
597
599
601 {
602 if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARRIOR_IN_FOR_THE_KILL, DIFFICULTY_NONE))
603 {
604 if (target->HealthBelowPct(spellInfo->GetEffect(EFFECT_2).CalcValue(caster)))
605 _bonusHaste = true;
606 }
607 }
608 }
609
611 {
612 Unit* caster = GetCaster();
613 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARRIOR_IN_FOR_THE_KILL, DIFFICULTY_NONE);
614 if (!spellInfo)
615 return;
616
618 args.AddSpellBP0(spellInfo->GetEffect(EFFECT_0).CalcValue(caster));
619 if (_bonusHaste)
620 args.AddSpellBP0(spellInfo->GetEffect(EFFECT_1).CalcValue(caster));
621 caster->CastSpell(caster, SPELL_WARRIOR_IN_FOR_THE_KILL_HASTE, args);
622 }
623
629
630private:
631 bool _bonusHaste = false;
632};
633
634// 389306 - Critical Thinking
636{
637 bool Validate(SpellInfo const* /*spellInfo*/) override
638 {
640 }
641
642 void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
643 {
646 .AddSpellBP0(CalculatePct(*rageCost, aurEff->GetAmount())));
647 }
648
653};
654
655// 383295 - Deft Experience (attached to 23881 - Bloodthirst)
656// 383295 - Deft Experience (attached to 335096 - Bloodbath)
658{
659 bool Validate(SpellInfo const* /*spellInfo*/) override
660 {
662 }
663
664 bool Load() override
665 {
667 }
668
669 void HandleDeftExperience(SpellEffIndex /*effIndex*/) const
670 {
671 if (GetHitUnit() != GetExplTargetUnit())
672 return;
673
674 Unit const* caster = GetCaster();
675 if (Aura* enrageAura = caster->GetAura(SPELL_WARRIOR_ENRAGE))
677 enrageAura->SetDuration(enrageAura->GetDuration() + (aurEff->GetAmountAsInt() * (IsHitCrit() ? 2 : 1)));
678 }
679
684};
685
686// 236279 - Devastator
688{
689 bool Validate(SpellInfo const* spellInfo) override
690 {
692 }
693
694 void OnProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*eventInfo*/) const
695 {
696 if (GetTarget()->GetSpellHistory()->HasCooldown(SPELL_WARRIOR_SHIELD_SLAM))
697 {
698 if (roll_chance(GetEffectInfo(EFFECT_1).CalcValue()))
699 {
702 }
703 }
704 }
705
710};
711
712// 184361 - Enrage
714{
715 static bool CheckRampageProc(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
716 {
717 SpellInfo const* spellInfo = eventInfo.GetSpellInfo();
718 if (!spellInfo || !spellInfo->IsAffected(SPELLFAMILY_WARRIOR, { 0x0, 0x0, 0x0, 0x8000000 })) // Rampage
719 return false;
720
721 return true;
722 }
723
724 void HandleProc(ProcEventInfo const& eventInfo)
725 {
727
728 Unit* auraTarget = GetTarget();
729
732 .TriggeringSpell = eventInfo.GetProcSpell()
733 });
734 }
735
741};
742
743// 163201 - Execute (Arms, Protection)
744// 281000 - Massacre
745// 330334 - Condemn (Venthyr) (Arms)
746// 317349 - Condemn (Venthyr) (Protection)
748{
749 bool Validate(SpellInfo const* spellInfo) override
750 {
751 return ValidateSpellEffect({
753 { spellInfo->Id, EFFECT_0 }
754 }) && ValidateSpellInfo({
756 spellInfo->GetEffect(EFFECT_0).TriggerSpell
757 });
758 }
759
761 {
762 if (Aura* suddenDeathAura = GetCaster()->GetAura(SPELL_WARRIOR_SUDDEN_DEATH_BUFF))
763 if (GetSpell()->m_appliedMods.contains(suddenDeathAura))
764 if (AuraEffect const* suddenDeathTalentAura = GetCaster()->GetAuraEffect(SPELL_WARRIOR_SUDDEN_DEATH, EFFECT_0))
765 return suddenDeathTalentAura->GetAmountAsInt() * 10;
766
767 return {};
768 }
769
770 std::pair<int32, int32> GetRageCost() const
771 {
772 for (SpellPowerEntry const* powerCost : GetSpellInfo()->PowerCosts)
773 if (powerCost->PowerType == POWER_RAGE)
774 return { powerCost->ManaCost, powerCost->OptionalCost };
775
776 return { 0, 0 };
777 }
778
780 {
781 PreventHitDefaultEffect(spellEffIndex);
782
783 // Can't use SpellInfo::CalcPowerCost here since Sudden Death modifies the costs so it's free.
784 auto [baseCost, optionalCost] = GetRageCost();
785 int32 rageSpent = GetSpell()->GetPowerTypeCostAmount(POWER_RAGE).value_or(0);
786
787 GetCaster()->CastSpell(GetHitUnit(), GetEffectInfo(spellEffIndex).TriggerSpell, CastSpellExtraArgsInit{
789 .TriggeringSpell = GetSpell(),
790 .CustomArg = TriggerArgs{
791 .BaseRageCost = baseCost,
792 .OptionalRageCost = optionalCost,
793 .DamageRageSpent = GetSuddenDeathRageCost().value_or(rageSpent),
794 .RefundRage = CalculatePct(rageSpent, GetEffectInfo(EFFECT_1).CalcValueAsInt())
795 }
796 });
797 }
798
803
804public:
812};
813
814// 260798 - Execute (Arms, Protection)
815// 317483 - Condemn (Venthyr) (Arms, Protection)
817{
818 void CalculateExecuteDamage(SpellEffectInfo const& /*spellEffectInfo*/, Unit const* /*victim*/, int32 const& /*damageOrHealing*/, int32 const& /*flatMod*/, float& pctMod) const
819 {
820 spell_warr_execute::TriggerArgs const* triggerArgs = std::any_cast<spell_warr_execute::TriggerArgs>(&GetSpell()->m_customArg);
821 if (!triggerArgs)
822 return;
823
824 if (triggerArgs->OptionalRageCost <= 0)
825 return;
826
827 pctMod *= (static_cast<float>(triggerArgs->DamageRageSpent - triggerArgs->BaseRageCost) / static_cast<float>(triggerArgs->OptionalRageCost) + 1.0f);
828 }
829
834};
835
836// 260798 - Execute -> 316405 (Improved Execute (Arms))
838{
839 bool Load() override
840 {
842 }
843
844 void DetermineKillStatus(DamageInfo const& damageInfo, uint32& /*resistAmount*/, int32& /*absorbAmount*/) const
845 {
846 bool killed = damageInfo.GetDamage() >= damageInfo.GetVictim()->GetHealth();
847 if (killed)
848 return;
849
850 spell_warr_execute::TriggerArgs const* triggerArgs = std::any_cast<spell_warr_execute::TriggerArgs>(&GetSpell()->m_customArg);
851 if (!triggerArgs)
852 return;
853
854 GetCaster()->ModifyPower(POWER_RAGE, triggerArgs->RefundRage, false);
855 }
856
857 void Register() override
858 {
859 // abuse OnCalculateResistAbsorb to determine if this spell will kill target or not (its still not perfect - happens before absorbs are applied)
861 }
862};
863
864// 383848 - Frenzied Enrage (attached to 184362 - Enrage)
891
892// 392792 - Frothing Berserker
894{
895 bool Validate(SpellInfo const* /*spellInfo*/) override
896 {
898 }
899
900 static bool CheckProc(AuraScript const&, ProcEventInfo const& eventInfo)
901 {
902 Spell const* procSpell = eventInfo.GetProcSpell();
903 return procSpell && procSpell->GetPowerTypeCostAmount(POWER_RAGE) > 0;
904 }
905
906 template <ChrSpecialization Spec>
907 static bool CheckSpecialization(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
908 {
909 return eventInfo.GetActor()->IsPlayer() && eventInfo.GetActor()->ToPlayer()->GetPrimarySpecialization() == Spec;
910 }
911
912 static void HandleProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
913 {
914 Unit* target = eventInfo.GetActor();
915 Spell const* procSpell = eventInfo.GetProcSpell();
916 int32 spentRage = *procSpell->GetPowerTypeCostAmount(POWER_RAGE);
919 .TriggeringSpell = procSpell,
920 .TriggeringAura = aurEff,
921 .SpellValueOverrides = { { SPELLVALUE_BASE_POINT0, static_cast<SpellEffectValue>(CalculatePct(spentRage, aurEff->GetAmount())) } }
922 });
923 }
924
925 void Register() override
926 {
928 DoCheckEffectProc += AuraCheckEffectProcFn(spell_warr_frothing_berserker::CheckSpecialization<ChrSpecialization::WarriorArms>, EFFECT_0, SPELL_AURA_DUMMY);
929 DoCheckEffectProc += AuraCheckEffectProcFn(spell_warr_frothing_berserker::CheckSpecialization<ChrSpecialization::WarriorFury>, EFFECT_1, SPELL_AURA_DUMMY);
930 DoCheckEffectProc += AuraCheckEffectProcFn(spell_warr_frothing_berserker::CheckSpecialization<ChrSpecialization::WarriorProtection>, EFFECT_2, SPELL_AURA_DUMMY);
932 }
933};
934
935// 438590 - Keep Your Feet on the Ground
937{
938 static bool CheckProc(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
939 {
940 SpellInfo const* spellInfo = eventInfo.GetSpellInfo();
941 return spellInfo->HasLabel(SPELL_LABEL_THUNDER_BLAST);
942 }
943
948};
949
950// 400205 - Overpowering Finish (attached to 7384 - Overpower)
952{
953 bool Validate(SpellInfo const* /*spellInfo*/) override
954 {
956 }
957
958 bool Load() override
959 {
961 }
962
963 void CalculateDamage(SpellEffectInfo const& /*effectInfo*/, Unit const* victim, int32& /*damage*/, int32& /*flatMod*/, float& pctMod) const
964 {
966 if (!talent)
967 return;
968
969 AuraEffect const* healthPct = talent->GetEffect(EFFECT_1);
970 if (!healthPct || !victim->HealthBelowPct(healthPct->GetAmount()))
971 return;
972
973 if (AuraEffect const* dmgIncrease = talent->GetEffect(EFFECT_0))
974 AddPct(pctMod, dmgIncrease->GetAmount());
975 }
976
981};
982
983// 382551 - Pain and Gain (heal)
985{
986 static void CalculateHeal(SpellScript const&, SpellEffectInfo const& /*effInfo*/, Unit const* /*victim*/, int32& /*healing*/, int32& /*flatMod*/, float& pctMod)
987 {
988 pctMod *= 0.1f;
989 }
990
995};
996
997// 440277 - Powerful Enrage (attached to 184362 - Enrage)
1024
1025// 383103 - Fueled by Violence
1027{
1028 bool Validate(SpellInfo const* /*spellInfo*/) override
1029 {
1031 }
1032
1033 void HandleProc(ProcEventInfo& eventInfo)
1034 {
1036
1038 }
1039
1040 void HandlePeriodic(AuraEffect const* /*aurEff*/)
1041 {
1042 if (_nextHealAmount == 0)
1043 return;
1044
1045 Unit* target = GetTarget();
1048
1049 target->CastSpell(target, SPELL_WARRIOR_FUELED_BY_VIOLENCE_HEAL, args);
1050 _nextHealAmount = 0;
1051 }
1052
1058
1059private:
1061};
1062
1063// 6544 - Heroic leap
1065{
1066 bool Validate(SpellInfo const* /*spellInfo*/) override
1067 {
1069 }
1070
1072 {
1073 if (WorldLocation const* dest = GetExplTargetDest())
1074 {
1075 if (GetCaster()->HasUnitMovementFlag(MOVEMENTFLAG_ROOT))
1076 return SPELL_FAILED_ROOTED;
1077
1078 if (GetCaster()->GetMap()->Instanceable())
1079 {
1080 float range = GetSpellInfo()->GetMaxRange(true, GetCaster()) * 1.5f;
1081
1082 PathGenerator generatedPath(GetCaster());
1083 generatedPath.SetPathLengthLimit(range);
1084
1085 bool result = generatedPath.CalculatePath(dest->GetPositionX(), dest->GetPositionY(), dest->GetPositionZ(), false);
1086 if (generatedPath.GetPathType() & PATHFIND_SHORT)
1088
1089 if (!result || generatedPath.GetPathType() & PATHFIND_NOPATH)
1090 return SPELL_FAILED_NOPATH;
1091 }
1092 else if (dest->GetPositionZ() > GetCaster()->GetPositionZ() + 4.0f)
1093 return SPELL_FAILED_NOPATH;
1094
1095 return SPELL_CAST_OK;
1096 }
1097
1099 }
1100
1101 void HandleCast() const
1102 {
1103 if (Player* playerCaster = GetCaster()->ToPlayer())
1104 if (playerCaster->GetPrimarySpecialization() == ChrSpecialization::WarriorProtection)
1105 playerCaster->GetSpellHistory()->ResetCooldown(SPELL_WARRIOR_TAUNT);
1106 }
1107
1113};
1114
1115// 52174 - Heroic Leap (Damage)
1117{
1118 bool Validate(SpellInfo const* /*spellInfo*/) override
1119 {
1120 return ValidateSpellInfo(
1121 {
1124 });
1125 }
1126
1127 bool Load() override
1128 {
1130 }
1131
1138
1143};
1144
1145// 202168 - Impending Victory
1147{
1148 bool Validate(SpellInfo const* /*spellInfo*/) override
1149 {
1151 }
1152
1154 {
1155 Unit* caster = GetCaster();
1156 caster->CastSpell(caster, SPELL_WARRIOR_IMPENDING_VICTORY_HEAL, true);
1158 }
1159
1164};
1165
1166// 12950 - Improved Whirlwind (attached to 190411 - Whirlwind)
1168{
1174
1175 bool Load() override
1176 {
1178 }
1179
1180 void HandleHit(SpellEffIndex /*effIndex*/) const
1181 {
1182 int64 const targetsHit = GetUnitTargetCountForEffect(EFFECT_0);
1183 if (!targetsHit)
1184 return;
1185
1186 Player* caster = GetCaster()->ToPlayer();
1187 if (!caster)
1188 return;
1189
1190 int32 const ragePerTarget = GetEffectValueAsInt();
1191 int32 const baseRage = GetEffectInfo(EFFECT_0).CalcValueAsInt();
1192 int32 const maxRage = baseRage + (ragePerTarget * GetEffectInfo(EFFECT_2).CalcValueAsInt());
1193 int32 const rageGained = std::min<int32>(baseRage + (targetsHit * ragePerTarget), maxRage);
1194
1197 .TriggeringSpell = GetSpell(),
1198 .SpellValueOverrides = {{ SPELLVALUE_BASE_POINT0, SpellEffectValue(rageGained * 10) } }
1199 });
1200
1202 }
1203
1208};
1209
1246{
1247 bool Validate(SpellInfo const* spellInfo) override
1248 {
1250 && spellInfo->IsAffected(SPELLFAMILY_WARRIOR, sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_WHIRLWIND_CLEAVE_AURA, DIFFICULTY_NONE)->GetEffect(EFFECT_0).SpellClassMask);
1251 }
1252
1253 bool Load() override
1254 {
1256 }
1257
1258 void CalculateDamage(SpellEffectInfo const& spellEffectInfo, Unit const* victim, int32& /*damage*/, int32& /*flatMod*/, float& pctMod) const
1259 {
1260 int32 const targetIndex = GetUnitTargetIndexForEffect(victim->GetGUID(), spellEffectInfo.EffectIndex);
1261 if (targetIndex == 0)
1262 return; // nothing to do, it's the first target
1263
1264 if (AuraEffect const* damageEffect = GetCaster()->GetAuraEffect(SPELL_WARRIOR_WHIRLWIND_CLEAVE_AURA, EFFECT_1))
1265 ApplyPct(pctMod, damageEffect->GetAmount());
1266 }
1267
1272};
1273
1274// 3411 - Intervene
1276{
1277 bool Validate(SpellInfo const* /*spellInfo*/) override
1278 {
1280 }
1281
1282 void HandleDummy(SpellEffIndex /*effIndex*/) const
1283 {
1284 Unit* caster = GetCaster();
1285 Unit* target = GetHitUnit();
1287 if (caster->IsWithinCombatRange(target, 3.0f))
1289
1290 caster->CastSpell(target, spellId, CastSpellExtraArgsInit{
1292 .TriggeringSpell = GetSpell()
1293 });
1294 }
1295
1300};
1301
1302// 316531 - Intervene (charge)
1304{
1305 bool Validate(SpellInfo const* /*spellInfo*/) override
1306 {
1308 }
1309
1310 void HandleAura(SpellEffIndex /*effIndex*/) const
1311 {
1313 .TriggerFlags = TRIGGERED_FULL_MASK & ~TRIGGERED_CAST_DIRECTLY,
1314 .TriggeringSpell = GetSpell()
1315 });
1316 }
1317
1322};
1323
1324// 5246 - Intimidating Shout
1326{
1327 void FilterTargets(std::list<WorldObject*>& unitList) const
1328 {
1329 unitList.remove(GetExplTargetWorldObject());
1330 }
1331
1332 static void ClearTargets(SpellScript const&, std::list<WorldObject*>& unitList)
1333 {
1334 // This is used in effect 3, which is an AOE Root effect.
1335 // This doesn't seem to be a thing anymore, so we clear the targets list here.
1336 unitList.clear();
1337 }
1338
1344};
1345
1346// 316594 - Intimidating Shout (Menace Talent, knock back -> root)
1348{
1349 bool Validate(SpellInfo const* /*spellInfo*/) override
1350 {
1352 }
1353
1354 void FilterTargets(std::list<WorldObject*>& unitList) const
1355 {
1356 unitList.remove(GetExplTargetWorldObject());
1357 }
1358
1359 void HandleRoot(SpellEffIndex /*effIndex*/) const
1360 {
1363 .TriggeringSpell = GetSpell()
1364 };
1365
1366 GetCaster()->m_Events.AddEventAtOffset([caster = GetCaster(), targetGUID = GetHitUnit()->GetGUID(), castArgs = std::move(args)]()
1367 {
1368 if (Unit* targetUnit = ObjectAccessor::GetUnit(*caster, targetGUID))
1369 caster->CastSpell(targetUnit, SPELL_WARRIOR_INTIMIDATING_SHOUT_MENACE_AOE, castArgs);
1370 }, 500ms);
1371 }
1372
1378};
1379
1380// 385174 - Invigorating Fury (attached to 184364 - Enraged Regeneration)
1382{
1383 bool Validate(SpellInfo const* /*spellInfo*/) override
1384 {
1386 }
1387
1388 bool Load() override
1389 {
1391 }
1392
1400
1405};
1406
1407// 70844 - Item - Warrior T10 Protection 4P Bonus
1409{
1410 bool Validate(SpellInfo const* spellInfo) override
1411 {
1413 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
1414 }
1415
1416 void HandleProc(ProcEventInfo& eventInfo)
1417 {
1419
1420 Unit* target = eventInfo.GetActionTarget();
1421 SpellEffectValue bp0 = CalculatePct(target->GetMaxHealth(), GetEffectInfo(EFFECT_1).CalcValue());
1423 args.AddSpellBP0(bp0);
1424 target->CastSpell(nullptr, SPELL_WARRIOR_STOICISM, args);
1425 }
1426
1431};
1432
1433// 1265361 - Kill or Be Killed
1435{
1440
1441 void HandleAbsorb(AuraEffect const* /*aurEff*/, DamageInfo const& dmgInfo, uint32& absorbAmount) const
1442 {
1443 Unit* target = GetTarget();
1444
1446 return;
1447
1449 {
1450 absorbAmount = 0;
1451 return;
1452 }
1453
1456 };
1457
1458 SpellCastResult result = target->CastSpell(dmgInfo.GetAttacker(), SPELL_WARRIOR_KILL_OR_BE_KILLED_TARGET, castArgs);
1459 if (result != SPELL_FAILED_SUCCESS)
1460 {
1461 absorbAmount = 0;
1462 return;
1463 }
1464
1465 target->CastSpell(nullptr, SPELL_WARRIOR_KILL_OR_BE_KILLED_PROC, castArgs);
1466
1467 target->CastSpell(nullptr, SPELL_WARRIOR_KILL_OR_BE_KILLED_COOLDOWN, castArgs);
1468 }
1469
1474};
1475
1476// 1265641 - Kill or Be Killed (target)
1478{
1479 static void HandleProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& /*procEvent*/)
1480 {
1481 Unit* caster = aurEff->GetCaster();
1482 if (!caster || !caster->IsAlive())
1483 return;
1484
1486 }
1487
1492};
1493
1494// 1265600 - Kill or Be Killed (warrior)
1496{
1501
1502 void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) const
1503 {
1504 Unit* target = GetTarget();
1505 switch (GetTargetApplication()->GetRemoveMode())
1506 {
1510 });
1511 break;
1515 });
1516
1517 if (target->HealthBelowPct(aurEff->GetAmount()))
1518 target->SetHealth(target->CountPctFromMaxHealth(aurEff->GetAmount()));
1519 break;
1520 default:
1521 break;
1522 }
1523 }
1524
1529};
1530
1531// 280392 - Meat Cleaver (attached to 199667 - Whirlwind, 44949 - Whirlwind Off-Hand, 199852 - Whirlwind, 199851 - Whirlwind Off-Hand)
1533{
1534protected:
1535 bool Validate(SpellInfo const* /*spellInfo*/) override
1536 {
1538 }
1539
1540 bool Load() override
1541 {
1543 }
1544
1545 void HandleDamageBonus(SpellEffectInfo const& spellEffectInfo, Unit const* /*victim*/, int32& /*damage*/, int32& /*flatMod*/, float& pctMod) const
1546 {
1547 Unit const* caster = GetCaster();
1548 Aura const* meatCleaver = caster->GetAura(SPELL_WARRIOR_MEAT_CLEAVER_TALENT);
1549 if (!meatCleaver)
1550 return;
1551
1552 AuraEffect const* minTargetCount = meatCleaver->GetEffect(EFFECT_1);
1553 if (!minTargetCount)
1554 return;
1555
1556 int64 const targetCount = GetUnitTargetCountForEffect(spellEffectInfo.EffectIndex);
1557
1558 if (targetCount < minTargetCount->GetAmountAsInt())
1559 return;
1560
1561 if (AuraEffect const* aurEff = meatCleaver->GetEffect(EFFECT_0))
1562 AddPct(pctMod, aurEff->GetAmount());
1563 }
1564
1569};
1570
1571// 280392 - Meat Cleaver (attached to 6343 - Thunder Clap)
1572// 280392 - Meat Cleaver (attached to 435222 - Thunder Blast)
1587
1588// 12294 - Mortal Strike
1609
1610// 383854 - Improved Raging Blow (attached to 85288 - Raging Blow, 335097 - Crushing Blow)
1611// 392936 - Wrath and Fury (attached to 85288 - Raging Blow, 335097 - Crushing Blow)
1613{
1619
1620 bool Load() override
1621 {
1622 Unit const* caster = GetCaster();
1626 }
1627
1628 void HandleResetCooldown(SpellEffIndex /*effIndex*/) const
1629 {
1630 // it is currently impossible to have Wrath and Fury without having Improved Raging Blow, but we will check it anyway
1631 Unit* caster = GetCaster();
1632 SpellEffectValue value = 0;
1634 value = GetEffectValue();
1635
1636 if (AuraEffect const* auraEffect = caster->GetAuraEffect(SPELL_WARRIOR_WRATH_AND_FURY, EFFECT_0))
1637 value += auraEffect->GetAmount();
1638
1639 if (roll_chance(value))
1640 {
1643 .TriggeringSpell = GetSpell()
1644 });
1646 }
1647 }
1648
1653};
1654
1655// 97462 - Rallying Cry
1657{
1658 bool Validate(SpellInfo const* /*spellInfo*/) override
1659 {
1661 }
1662
1663 bool Load() override
1664 {
1665 return GetCaster()->GetTypeId() == TYPEID_PLAYER;
1666 }
1667
1675
1680};
1681
1682// 1265357 - Rampaging Ruin (attached to 184367 - Rampage)
1684{
1685 bool Validate(SpellInfo const* /*spellInfo*/) override
1686 {
1688 }
1689
1691 {
1692 Unit const* caster = GetCaster();
1694 PreventHitDefaultEffect(effIndex);
1695 }
1696
1698 {
1699 Unit const* caster = GetCaster();
1701 PreventHitDefaultEffect(effIndex);
1702 }
1703
1716};
1717
1718// 275339 - (attached to 46968 - Shockwave)
1720{
1721 bool Validate(SpellInfo const* /*spellInfo*/) override
1722 {
1724 }
1725
1726 bool Load() override
1727 {
1729 }
1730
1732 {
1733 Unit* caster = GetCaster();
1734 Aura const* rumblingEarth = caster->GetAura(SPELL_WARRIOR_RUMBLING_EARTH);
1735 if (!rumblingEarth)
1736 return;
1737
1738 AuraEffect const* minTargetCount = rumblingEarth->GetEffect(EFFECT_0);
1739 AuraEffect const* cooldownReduction = rumblingEarth->GetEffect(EFFECT_1);
1740 if (!minTargetCount || !cooldownReduction)
1741 return;
1742
1743 if (GetUnitTargetCountForEffect(EFFECT_0) >= minTargetCount->GetAmountAsInt())
1744 GetCaster()->GetSpellHistory()->ModifyCooldown(GetSpellInfo()->Id, -duration_cast<Milliseconds>(FloatSeconds(cooldownReduction->GetAmount())));
1745 }
1746
1751};
1752
1753// 2565 - Shield Block
1755{
1756 bool Validate(SpellInfo const* /*spellInfo*/) override
1757 {
1759 }
1760
1762 {
1764 }
1765
1770};
1771
1772// 385952 - Shield Charge
1774{
1775 bool Validate(SpellInfo const* /*spellInfo*/) override
1776 {
1778 }
1779
1784
1789};
1790
1791// 46968 - Shockwave
1793{
1794 bool Validate(SpellInfo const* /*spellInfo*/) override
1795 {
1797 }
1798
1806
1811};
1812
1813// 107570 - Storm Bolt
1815{
1816 bool Validate(SpellInfo const* /*spellInfo*/) override
1817 {
1819 }
1820
1821 void HandleOnHit(SpellEffIndex /*effIndex*/) const
1822 {
1824 }
1825
1830};
1831
1832// 107570 - Storm Bolt
1834{
1835 bool Validate(SpellInfo const* /*spellInfo*/) override
1836 {
1838 }
1839
1840 bool Load() override
1841 {
1843 }
1844
1845 void FilterTargets(std::list<WorldObject*>& targets) const
1846 {
1847 targets.clear();
1848
1849 if (Unit* target = GetExplTargetUnit())
1850 targets.push_back(target);
1851 }
1852
1857};
1858
1859// 384041 - Strategist
1861{
1862 bool Validate(SpellInfo const* /*spellInfo*/) override
1863 {
1865 }
1866
1867 static bool CheckProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& /*procEvent*/)
1868 {
1869 return roll_chance(aurEff->GetAmount());
1870 }
1871
1872 void HandleCooldown(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*procEvent*/) const
1873 {
1874 Unit* caster = GetTarget();
1877 }
1878
1884};
1885
1886// 29725 - Sudden Death
1888{
1889 bool Validate(SpellInfo const* /*spellInfo*/) override
1890 {
1892 }
1893
1894 void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*eventInfo*/) const
1895 {
1896 Unit* target = GetTarget();
1899 });
1900 }
1901
1906};
1907
1908// 1265359 - Surge of Adrenaline (talent) - attached to 280270 (Always Angry)
1934
1935// 12328, 18765, 35429 - Sweeping Strikes
1937{
1942
1943 bool CheckProc(ProcEventInfo& eventInfo)
1944 {
1945 _procTarget = eventInfo.GetActor()->SelectNearbyTarget(eventInfo.GetActionTarget());
1946 return _procTarget != nullptr;
1947 }
1948
1949 void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
1950 {
1952 if (DamageInfo* damageInfo = eventInfo.GetDamageInfo())
1953 {
1954 SpellInfo const* spellInfo = damageInfo->GetSpellInfo();
1956 {
1957 // If triggered by Execute (while target is not under 20% hp) or Bladestorm deals normalized weapon damage
1959 }
1960 else
1961 {
1962 CastSpellExtraArgs args(aurEff);
1963 args.AddSpellMod(SPELLVALUE_BASE_POINT0, damageInfo->GetDamage());
1965 }
1966 }
1967 }
1968
1974
1975 Unit* _procTarget = nullptr;
1976};
1977
1978// 184783 - Tactician
1980{
1981 bool Validate(SpellInfo const* /*spellInfo*/) override
1982 {
1984 && sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_OVERPOWER, DIFFICULTY_NONE)->ChargeCategoryId;
1985 }
1986
1987 static bool CheckEffectProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
1988 {
1989 SpellInfo const* procSpell = eventInfo.GetSpellInfo();
1990 if (!procSpell)
1991 return false;
1992
1993 if (!procSpell->CalcPowerCost(POWER_RAGE, false, eventInfo.GetActor(), SpellSchoolMask(procSpell->SchoolMask)))
1994 return false;
1995
1996 return roll_chance(aurEff->GetAmount());
1997 }
1998
1999 static void HandleProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
2000 {
2001 Unit* caster = eventInfo.GetActor();
2002 SpellInfo const* overpowerInfo = sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_OVERPOWER, DIFFICULTY_NONE);
2003 caster->GetSpellHistory()->RestoreCharge(overpowerInfo->ChargeCategoryId);
2006 .TriggeringSpell = eventInfo.GetProcSpell(),
2007 .TriggeringAura = aurEff
2008 });
2009 }
2010
2016};
2017
2018// 388933 - Tenderize
2020{
2025
2026 void HandleProc(ProcEventInfo const& eventInfo) const
2027 {
2030 .TriggeringSpell = eventInfo.GetProcSpell()
2031 });
2032 }
2033
2034 void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const
2035 {
2036 Unit* target = GetTarget();
2038 return;
2039
2042 .TriggeringSpell = eventInfo.GetProcSpell(),
2043 .SpellValueOverrides = { { SPELLVALUE_AURA_STACK, aurEff->GetAmountAsInt() } }
2044 });
2045 }
2046
2052};
2053
2054// 435607 - Thunder Blast
2069
2071{
2072 bool Validate(SpellInfo const* /*spellInfo*/) override
2073 {
2075 }
2076
2077 static bool CheckProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/)
2078 {
2079 return roll_chance(aurEff->GetAmount());
2080 }
2081
2082 void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*eventInfo*/) const
2083 {
2084 Unit* target = GetTarget();
2087 });
2088 }
2089
2095};
2096
2097// 6343 - Thunder Clap
2098// 435222 - Thunder Blast
2119
2120// 6343 - Thunder Clap (Rend)
2121// 435222 - Thunder Blast (Rend)
2123{
2124 bool Validate(SpellInfo const* /*spellInfo*/) override
2125 {
2127 }
2128
2129 bool Load() override
2130 {
2132 }
2133
2141
2146};
2147
2148// 394329 - Titanic Rage
2150{
2151 bool Validate(SpellInfo const* /*spellInfo*/) override
2152 {
2154 }
2155
2156 void HandleProc(ProcEventInfo const& eventInfo) const
2157 {
2158 Player* target = GetTarget()->ToPlayer();
2159 if (!target)
2160 return;
2161
2164 .TriggeringSpell = eventInfo.GetProcSpell()
2165 });
2166
2167 ApplyWhirlwindCleaveAura(target, GetCastDifficulty(), nullptr);
2168 }
2169
2170 void Register() override
2171 {
2173 }
2174};
2175
2176// 215538 - Trauma
2178{
2179 bool Validate(SpellInfo const* /*spellInfo*/) override
2180 {
2182 && sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_TRAUMA_EFFECT, DIFFICULTY_NONE)->GetEffect(EFFECT_0).GetPeriodicTickCount();
2183 }
2184
2185 void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
2186 {
2187 Unit* target = eventInfo.GetActionTarget();
2188 //Get 25% of damage from the spell casted (Slam & Whirlwind) plus Remaining Damage from Aura
2189 SpellEffectValue damage = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()) / sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_TRAUMA_EFFECT, GetCastDifficulty())->GetEffect(EFFECT_0).GetPeriodicTickCount();
2191 args.AddSpellMod(SPELLVALUE_BASE_POINT0, damage);
2193 }
2194
2199};
2200
2201// 28845 - Cheat Death
2203{
2204 bool CheckProc(ProcEventInfo& eventInfo)
2205 {
2206 if (eventInfo.GetActionTarget()->HealthBelowPct(20))
2207 return true;
2208
2209 DamageInfo* damageInfo = eventInfo.GetDamageInfo();
2210 if (damageInfo && damageInfo->GetDamage())
2211 if (GetTarget()->HealthBelowPctDamaged(20, damageInfo->GetDamage()))
2212 return true;
2213
2214 return false;
2215 }
2216
2221};
2222
2223// 389603 - Unbridled Ferocity
2225{
2226 bool Validate(SpellInfo const* spellInfo) override
2227 {
2229 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } })
2231 && spellInfo->GetEffect(EFFECT_1).IsAura(SPELL_AURA_DUMMY);
2232 }
2233
2243
2244 bool CheckProc(ProcEventInfo& /*eventInfo*/) const
2245 {
2246 return roll_chance(GetEffect(EFFECT_0)->GetAmount());
2247 }
2248
2254};
2255
2256// 383885 - Vicious Contempt (attached to 23881 - Bloodthirst)
2257// 383885 - Vicious Contempt (attached to 335096 - Bloodbath)
2259{
2260 bool Validate(SpellInfo const* /*spellInfo*/) override
2261 {
2263 }
2264
2265 bool Load() override
2266 {
2268 }
2269
2270 void CalculateDamage(SpellEffectInfo const& /*spellEffectInfo*/, Unit const* victim, int32& /*damage*/, int32& /*flatMod*/, float& pctMod) const
2271 {
2273 return;
2274
2275 if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_WARRIOR_VICIOUS_CONTEMPT, EFFECT_0))
2276 AddPct(pctMod, aurEff->GetAmount());
2277 }
2278
2283};
2284
2285// 32215 - Victorious State
2287{
2288 bool Validate(SpellInfo const* /*spellInfo*/) override
2289 {
2291 }
2292
2300
2305};
2306
2307// 34428 - Victory Rush
2309{
2310 bool Validate(SpellInfo const* /*spellInfo*/) override
2311 {
2312 return ValidateSpellInfo
2313 ({
2316 });
2317 }
2318
2320 {
2321 Unit* caster = GetCaster();
2322 caster->CastSpell(caster, SPELL_WARRIOR_VICTORY_RUSH_HEAL, true);
2324 }
2325
2330};
2331
2332// 21977 - Warrior's Wrath
2334{
2335 bool Validate(SpellInfo const* /*spellInfo*/) override
2336 {
2338 }
2339
2340 void HandleDummy(SpellEffIndex /*effIndex*/)
2341 {
2343 }
2344
2349};
2350
2352{
2423}
ChrSpecialization
Definition DBCEnums.h:400
Difficulty
Definition DBCEnums.h:935
@ DIFFICULTY_NONE
Definition DBCEnums.h:936
int64_t int64
Definition Define.h:149
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
std::chrono::duration< double, Seconds::period > FloatSeconds
Definition Duration.h:29
std::chrono::duration< double, Milliseconds::period > FloatMilliseconds
Definition Duration.h:25
@ MOVEMENTFLAG_ROOT
@ TYPEID_PLAYER
Definition ObjectGuid.h:44
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:25
@ PATHFIND_NOPATH
@ PATHFIND_SHORT
bool roll_chance(float chance, PseudoRandomDistributionState &state)
Definition Random.cpp:131
#define RegisterSpellAndAuraScriptPair(script_1, script_2)
Definition ScriptMgr.h:1381
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
SpellEffIndex
@ EFFECT_3
@ EFFECT_8
@ EFFECT_6
@ EFFECT_1
@ EFFECT_5
@ EFFECT_0
@ EFFECT_4
@ EFFECT_7
@ EFFECT_2
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_TRIGGER_SPELL
@ SPELL_EFFECT_CHARGE
@ SPELL_EFFECT_KNOCK_BACK
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ TARGET_UNIT_DEST_AREA_ENEMY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ TARGET_UNIT_CASTER
SpellSchoolMask
@ POWER_RAGE
SpellCastResult
@ SPELL_FAILED_ROOTED
@ SPELL_FAILED_OUT_OF_RANGE
@ SPELL_FAILED_SUCCESS
@ SPELL_CAST_OK
@ SPELL_FAILED_NO_VALID_TARGETS
@ SPELL_FAILED_NOPATH
@ AURA_STATE_WOUNDED_20_PERCENT
@ AURA_STATE_WOUNDED_35_PERCENT
#define EFFECT_ALL
@ SPELLFAMILY_WARRIOR
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ AURA_REMOVE_BY_DEFAULT
@ AURA_REMOVE_BY_EXPIRE
@ SPELL_AURA_DISABLE_CASTING_EXCEPT_ABILITIES
@ SPELL_AURA_ADD_PCT_MODIFIER
@ SPELL_AURA_MOD_INCREASE_SPEED
@ SPELL_AURA_PROC_TRIGGER_SPELL
@ SPELL_AURA_DUMMY
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_MOD_MELEE_RANGED_CASTING_HASTE
@ SPELLVALUE_AURA_STACK
@ SPELLVALUE_DURATION
double SpellEffectValue
This is a double instead of float to be able to store full range of int32.
@ PeriodicHealingAndDamage
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
@ TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD
Will ignore Spell and Category cooldowns.
@ TRIGGERED_IGNORE_CAST_IN_PROGRESS
Will not check if a current cast is in progress.
@ TRIGGERED_DONT_REPORT_CAST_ERROR
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
@ SPELLVALUE_BASE_POINT0
#define sSpellMgr
Definition SpellMgr.h:812
#define AuraProcFn(F)
#define SpellObjectTargetSelectFn(F, I, N)
#define SpellCheckCastFn(F)
#define AuraEffectProcFn(F, I, N)
#define SpellOnResistAbsorbCalculateFn(F)
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraCheckEffectProcFn(F, I, N)
#define SpellCalcDamageFn(F)
#define SpellCastFn(F)
#define AuraEffectAbsorbOverkillFn(F, I)
#define AuraCheckProcFn(F)
#define SpellHitFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
T AddPct(T &base, U pct)
Definition Util.h:85
T ApplyPct(T &base, U pct)
Definition Util.h:91
T CalculatePct(T base, U pct)
Definition Util.h:72
int32 GetAmountAsInt() const
int32 GetPeriod() const
Unit * GetCaster() const
SpellEffectValue GetAmount() const
void PreventDefaultAction()
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< CheckEffectProcHandler > DoCheckEffectProc
HookList< EffectPeriodicHandler > OnEffectPeriodic
HookList< EffectProcHandler > AfterEffectProc
Unit * GetCaster() const
SpellEffectInfo const & GetEffectInfo(SpellEffIndex effIndex) const
AuraEffect * GetEffect(uint8 effIndex) const
HookList< EffectAbsorbHandler > OnEffectAbsorb
Unit * GetTarget() const
Difficulty GetCastDifficulty() const
HookList< CheckProcHandler > DoCheckProc
HookList< EffectProcHandler > OnEffectProc
Unit * GetUnitOwner() const
HookList< AuraProcHandler > OnProc
AuraEffect * GetEffect(uint32 index) const
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
bool IsPlayer() const
Definition BaseEntity.h:173
TypeID GetTypeId() const
Definition BaseEntity.h:166
Unit * GetVictim() const
Definition Unit.h:461
Unit * GetAttacker() const
Definition Unit.h:460
uint32 GetDamage() const
Definition Unit.h:466
void AddEventAtOffset(BasicEvent *event, Milliseconds offset)
Player * ToPlayer()
Definition Object.h:126
PathType GetPathType() const
void SetPathLengthLimit(float distance)
bool CalculatePath(float srcX, float srcY, float srcZ, float destX, float destY, float destZ, bool forceDest=false)
ChrSpecialization GetPrimarySpecialization() const
Definition Player.h:1993
void ApplySpellMod(SpellInfo const *spellInfo, SpellModOp op, T &basevalue, Spell *spell=nullptr) const
Definition Player.cpp:22840
Unit * GetActionTarget() const
Definition Unit.h:514
Spell const * GetProcSpell() const
Definition Unit.h:527
SpellInfo const * GetSpellInfo() const
Definition Unit.cpp:281
DamageInfo * GetDamageInfo() const
Definition Unit.h:524
Unit * GetActor() const
Definition Unit.h:513
Unit * GetUnitTarget() const
Definition Spell.cpp:186
SpellEffectValue CalcValue(WorldObject const *caster=nullptr, SpellEffectValue const *basePoints=nullptr, Unit const *target=nullptr, float *variance=nullptr, uint32 castItemId=0, int32 itemLevel=-1) const
bool IsAura() const
int32 CalcValueAsInt(WorldObject const *caster=nullptr, SpellEffectValue const *basePoints=nullptr, Unit const *target=nullptr, float *variance=nullptr, uint32 castItemId=0, int32 itemLevel=-1) const
SpellEffIndex EffectIndex
Definition SpellInfo.h:214
void ResetCooldown(uint32 spellId, bool update=false)
void RestoreCharge(uint32 chargeCategoryId)
void ModifyCooldown(uint32 spellId, Duration cooldownMod, bool withoutCategoryCooldown=false)
std::array< SpellPowerEntry const *, MAX_POWERS_PER_SPELL > PowerCosts
Definition SpellInfo.h:391
bool IsAffected(uint32 familyName, flag128 const &familyFlags) const
Optional< SpellPowerCost > CalcPowerCost(Powers powerType, bool optionalCost, WorldObject const *caster, SpellSchoolMask schoolMask, Spell *spell=nullptr) const
float GetMaxRange(bool positive=false, WorldObject const *caster=nullptr, Spell *spell=nullptr) const
uint32 const Id
Definition SpellInfo.h:328
uint32 StackAmount
Definition SpellInfo.h:396
uint32 SchoolMask
Definition SpellInfo.h:419
uint32 ChargeCategoryId
Definition SpellInfo.h:420
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:590
bool HasLabel(uint32 labelId) const
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
static bool ValidateSpellEffect(std::initializer_list< std::pair< uint32, SpellEffIndex > > effects)
bool IsHitCrit() const
HookList< DamageAndHealingCalcHandler > CalcDamage
HookList< CastHandler > AfterCast
HookList< CheckCastHandler > OnCheckCast
Unit * GetCaster() const
SpellEffectValue GetEffectValue() const
int32 GetEffectValueAsInt() const
HookList< HitHandler > OnHit
HookList< EffectHandler > OnEffectHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
int64 GetUnitTargetCountForEffect(SpellEffIndex effect) const
Unit * GetHitUnit() const
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
HookList< ObjectTargetSelectHandler > OnObjectTargetSelect
HookList< CastHandler > OnCast
HookList< OnCalculateResistAbsorbHandler > OnCalculateResistAbsorb
Spell * GetSpell() const
WorldObject * GetExplTargetWorldObject() const
HookList< EffectHandler > OnEffectLaunchTarget
Difficulty GetCastDifficulty() const
int32 GetUnitTargetIndexForEffect(ObjectGuid const &target, SpellEffIndex effect) const
WorldLocation const * GetExplTargetDest() const
HookList< EffectHandler > OnEffectLaunch
HookList< DamageAndHealingCalcHandler > CalcHealing
Unit * GetExplTargetUnit() const
SpellInfo const * GetSpellInfo() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Definition Spell.h:277
SpellCastTargets m_targets
Definition Spell.h:651
Optional< int32 > GetPowerTypeCostAmount(Powers power) const
Definition Spell.cpp:8093
Definition Unit.h:647
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition Unit.cpp:8716
void SetHealth(uint64 val)
Definition Unit.cpp:10041
uint64 CountPctFromMaxHealth(float pct) const
Definition Unit.h:809
void SendPlaySpellVisual(Unit *target, uint32 spellVisualId, uint8 missReason, uint8 reflectStatus, float travelSpeed, bool speedAsTime=false, float launchDelay=0.0f)
Definition Unit.cpp:12400
bool IsWithinCombatRange(Unit const *obj, float dist2compare) const
Definition Unit.cpp:675
Unit * SelectNearbyTarget(Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
Definition Unit.cpp:10976
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:4622
bool IsSplineEnabled() const
Definition Unit.cpp:14358
bool IsAlive() const
Definition Unit.h:1205
virtual bool HasSpell(uint32) const
Definition Unit.h:1099
uint64 GetMaxHealth() const
Definition Unit.h:801
bool HasAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
Definition Unit.cpp:4792
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4718
uint64 GetHealth() const
Definition Unit.h:800
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition Unit.cpp:6165
bool HealthBelowPct(float pct) const
Definition Unit.h:804
std::unique_ptr< Movement::MoveSpline > movespline
Definition Unit.h:1854
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4822
SpellHistory * GetSpellHistory()
Definition Unit.h:1521
void RemoveMovementImpairingAuras(bool withRoot)
Definition Unit.cpp:4312
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3992
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2222
EventProcessor m_Events
Definition Object.h:561
void HandleProc(AuraEffect const *aurEff, ProcEventInfo const &eventInfo, std::span< int32 const > spellIds) const
static bool CheckProtectionProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
void OnProcFury(AuraEffect const *aurEff, ProcEventInfo const &eventInfo) const
static bool CheckArmsProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
static constexpr std::array< int32, 2 > ProtectionSpellIds
static constexpr std::array< int32, 4 > ArmsSpellIds
static bool CheckFuryProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
void OnProcArms(AuraEffect const *aurEff, ProcEventInfo const &eventInfo) const
static constexpr FloatMilliseconds CooldownReduction
static constexpr std::array< int32, 3 > FurySpellIds
static bool ValidateProc(AuraEffect const *aurEff, ProcEventInfo const &eventInfo, ChrSpecialization spec)
void OnProcProtection(AuraEffect const *aurEff, ProcEventInfo const &eventInfo) const
static bool CheckProc(AuraScript const &, ProcEventInfo const &eventInfo)
void HandleRemoveImpairingAuras(SpellEffIndex) const
void Register() override
void Register() override
bool Validate(SpellInfo const *) override
void HandlePeriodic(AuraEffect const *aurEff) const
void Enrage(SpellEffIndex) const
bool Validate(SpellInfo const *spellInfo) override
EnrageResult CheckEnrageProc() const
bool Validate(SpellInfo const *) override
void CastHeal(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void HandleEffectRemove(AuraEffect const *, AuraEffectHandleModes) const
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
void HandleDummyTick(AuraEffect const *)
void DropFireVisual(AuraEffect const *aurEff)
void HandleCharge(SpellEffIndex) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleDummy(SpellEffIndex) const
void Register() override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
void HandleDeftExperience(SpellEffIndex) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *spellInfo) override
void Register() override
void OnProc(AuraEffect const *, ProcEventInfo const &) const
void HandleProc(ProcEventInfo const &eventInfo)
static bool CheckRampageProc(AuraScript const &, AuraEffect const *, ProcEventInfo const &eventInfo)
void CalculateExecuteDamage(SpellEffectInfo const &, Unit const *, int32 const &, int32 const &, float &pctMod) const
void DetermineKillStatus(DamageInfo const &damageInfo, uint32 &, int32 &) const
void Register() override
std::pair< int32, int32 > GetRageCost() const
Optional< int32 > GetSuddenDeathRageCost() const
void HandleExecuteCast(SpellEffIndex spellEffIndex)
bool Validate(SpellInfo const *spellInfo) override
static void HandleFrenziedEnrage(SpellScript const &, WorldObject *&target)
bool Validate(SpellInfo const *spellInfo) override
static bool CheckProc(AuraScript const &, ProcEventInfo const &eventInfo)
static void HandleProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
static bool CheckSpecialization(AuraScript const &, AuraEffect const *, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
void HandlePeriodic(AuraEffect const *)
bool Validate(SpellInfo const *) override
void HandleProc(ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
SpellCastResult CheckElevation() const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *spellInfo) override
void CalculateDamage(SpellEffectInfo const &spellEffectInfo, Unit const *victim, int32 &, int32 &, float &pctMod) const
bool Validate(SpellInfo const *spellInfo) override
void HandleHit(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void HandleAura(SpellEffIndex) const
void HandleDummy(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void Register() override
void FilterTargets(std::list< WorldObject * > &unitList) const
static void ClearTargets(SpellScript const &, std::list< WorldObject * > &unitList)
void FilterTargets(std::list< WorldObject * > &unitList) const
bool Validate(SpellInfo const *) override
void HandleProc(ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *spellInfo) override
static bool CheckProc(AuraScript const &, AuraEffect const *, ProcEventInfo const &eventInfo)
static void HandleProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &)
bool Validate(SpellInfo const *) override
void OnRemove(AuraEffect const *aurEff, AuraEffectHandleModes) const
void HandleAbsorb(AuraEffect const *, DamageInfo const &dmgInfo, uint32 &absorbAmount) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *spellInfo) override
void HandleDamageBonus(SpellEffectInfo const &spellEffectInfo, Unit const *, int32 &, int32 &, float &pctMod) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleMortalWounds(SpellEffIndex) const
void CalculateDamage(SpellEffectInfo const &, Unit const *victim, int32 &, int32 &, float &pctMod) const
bool Validate(SpellInfo const *) override
static void CalculateHeal(SpellScript const &, SpellEffectInfo const &, Unit const *, int32 &, int32 &, float &pctMod)
static void HandlePowerfulEnrage(SpellScript const &, WorldObject *&target)
bool Validate(SpellInfo const *spellInfo) override
bool Validate(SpellInfo const *) override
void HandleResetCooldown(SpellEffIndex) const
void HandleScript(SpellEffIndex)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleCone(SpellEffIndex effIndex)
void HandleSingleTarget(SpellEffIndex effIndex)
void HandleCooldownReduction(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void HandleHitTarget(SpellEffIndex)
bool Validate(SpellInfo const *) override
void HandleDummy(SpellEffIndex)
bool Validate(SpellInfo const *) override
void HandleStun(SpellEffIndex) const
void Register() override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleOnHit(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void FilterTargets(std::list< WorldObject * > &targets) const
static bool CheckProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &)
bool Validate(SpellInfo const *) override
void HandleCooldown(AuraEffect const *, ProcEventInfo const &) const
void HandleProc(AuraEffect const *, ProcEventInfo const &) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
bool CheckProc(ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
bool CheckProc(ProcEventInfo &eventInfo)
void Register() override
bool Validate(SpellInfo const *) override
static bool CheckEffectProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
static void HandleProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
void Register() override
void HandleProc(ProcEventInfo const &eventInfo) const
bool Validate(SpellInfo const *) override
void HandleEffectProc(AuraEffect const *aurEff, ProcEventInfo const &eventInfo) const
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect const *, ProcEventInfo const &) const
static bool CheckProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &)
static void PreventDefaultTargetObject(SpellScript const &, WorldObject *&target)
bool Validate(SpellInfo const *) override
void HandleRend(SpellEffIndex) const
void HandleSlow(SpellEffIndex) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleProc(ProcEventInfo const &eventInfo) const
bool Validate(SpellInfo const *) override
void Register() override
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *spellInfo) override
bool CheckProc(ProcEventInfo &) const
void HandleProc(ProcEventInfo &) const
bool Validate(SpellInfo const *) override
void CalculateDamage(SpellEffectInfo const &, Unit const *victim, int32 &, int32 &, float &pctMod) const
void HandleOnProc(AuraEffect *, ProcEventInfo &procInfo)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleDummy(SpellEffIndex)
bool Validate(SpellInfo const *) override
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
static void ApplyWhirlwindCleaveAura(Player *caster, Difficulty difficulty, Spell const *triggeringSpell)
@ SPELL_WARRIOR_SHIELD_WALL
@ SPELL_WARRIOR_RAVAGER
@ SPELL_WARRIOR_BLOODTHIRST_HEAL
@ SPELL_WARRIOR_SURGE_OF_ADRENALINE_PROC
@ SPELL_WARRIOR_BRUTAL_FINISH_BUFF
@ SPELL_WARRIOR_SUDDEN_DEATH
@ SPELL_WARRIOR_SHIELD_BLOCK_AURA
@ SPELL_WARRIOR_BOUNDING_STRIDE
@ SPELL_WARRIOR_WARRIORS_WRATH
@ SPELL_WARRIOR_THUNDER_BLAST
@ SPELL_WARRIOR_RALLYING_CRY
@ SPELL_WARRIOR_GLYPH_OF_THE_BLAZING_TRAIL
@ SPELL_WARRIOR_WRATH_AND_FURY
@ SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_1
@ SPELL_WARRIOR_COLD_STEEL_HOT_BLOOD_TALENT
@ SPELL_WARRIOR_OVERPOWER
@ SPELL_WARRIOR_SURGE_OF_ADRENALINE_TALENT
@ SPELL_WARRIOR_CHARGE_EFFECT
@ SPELL_WARRIOR_INTERVENE_AURA
@ SPELL_WARRIOR_AVATAR
@ SPELL_WARRIOR_TAUNT
@ SPELL_WARRIOR_STORM_BOLTS
@ SPELL_WARRIOR_POWERFUL_ENRAGE
@ SPELL_WARRIOR_CRITICAL_THINKING_ENERGIZE
@ SPELL_WARRIOR_INVIGORATING_FURY_TALENT
@ SPELL_WARRIOR_SHIELD_SLAM_MARKER
@ SPELL_WARRIOR_DEFT_EXPERIENCE
@ SPELL_WARRIOR_SHOCKWAVE_STUN
@ SPELL_WARRIOR_KILL_OR_BE_KILLED_COOLDOWN
@ SPELL_WARRIOR_VICTORY_RUSH_HEAL
@ SPELL_WARRIOR_FRESH_MEAT_TALENT
@ SPELL_WARRIOR_SUDDEN_DEATH_BUFF
@ SPELL_WARRIOR_KILL_OR_BE_KILLED_INSTAKILL
@ SPELL_WARRIOR_SHIELD_SLAM
@ SPELL_WARRIOR_KILL_OR_BE_KILLED_TARGET
@ SPELL_WARRIOR_SLAUGHTERING_STRIKES
@ SPELL_WARRIOR_FRESH_MEAT_DEBUFF
@ SPELL_WARRIOR_ALWAYS_ANGRY
@ SPELL_WARRIOR_FUELED_BY_VIOLENCE_HEAL
@ SPELL_WARRIOR_FROTHING_BERSERKER_ENERGIZE
@ SPELL_WARRIOR_SHIELD_CHARGE_EFFECT
@ SPELL_WARRIOR_STOICISM
@ SPELL_WARRIOR_STORM_BOLT_STUN
@ SPELL_WARRIOR_COLOSSUS_SMASH
@ SPELL_WARRIOR_INVIGORATING_FURY
@ SPELL_WARRIOR_BRUTAL_FINISH_TALENT
@ SPELL_WARRIOR_MORTAL_WOUNDS
@ SPELL_WARRIOR_CHARGE_ROOT_EFFECT
@ SPELL_WARRIOR_IMPROVED_RAGING_BLOW
@ SPELL_WARRIOR_IMPENDING_VICTORY
@ SPELL_WARRIOR_IN_FOR_THE_KILL
@ SPELL_WARRIOR_TACTICIAN_ACTION_BUTTON_GLOW
@ SPELL_WARRIOR_IMPROVED_WHIRLWIND
@ SPELL_WARRIOR_EXECUTE
@ SPELL_WARRIOR_COLOSSUS_SMASH_AURA
@ SPELL_WARRIOR_INTERVENE_CHARGE
@ SPELL_WARRIOR_KILL_OR_BE_KILLED_FULFILLED
@ SPELL_WARRIOR_WARBREAKER
@ SPELL_WARRIOR_RAMPAGING_RUIN
@ SPELL_WARRIOR_CRASHING_THUNDER
@ SPELL_WARRIOR_BOUNDING_STRIDE_AURA
@ SPELL_WARRIOR_ENRAGE
@ SPELL_WARRIOR_WHIRLWIND_ENERGIZE
@ SPELL_WARRIOR_RECKLESSNESS
@ SPELL_WARRIOR_REND_AURA
@ SPELL_WARRIOR_OVERPOWERING_FINISH
@ SPELL_WARRIOR_GUSHING_WOUND
@ SPELL_WARRIOR_SLAUGHTERING_STRIKES_BUFF
@ SPELL_WARRIOR_MEAT_CLEAVER_TALENT
@ SPELL_WARRIOR_KILL_OR_BE_KILLED_PROC
@ SPELL_WARRIOR_IMPENDING_VICTORY_HEAL
@ SPELL_WARRIOR_REND
@ SPELL_WARRIOR_BLADESTORM_PERIODIC_WHIRLWIND
@ SPELL_WARRIOR_VICIOUS_CONTEMPT
@ SPELL_WARRIOR_WHIRLWIND_CLEAVE_AURA
@ SPELL_WARRIOR_BLOODSURGE_ENERGIZE
@ SPELL_WARRIOR_IGNORE_PAIN
@ SPELL_WARRIOR_TRAUMA_EFFECT
@ SPELL_WARRIOR_FRENZIED_ENRAGE
@ SPELL_WARRIOR_IMPROVED_EXECUTE_ARMS
@ SPELL_WARRIOR_THUNDER_CLAP_SLOW
@ SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_2
@ SPELL_WARRIOR_RUMBLING_EARTH
@ SPELL_WARRIOR_VICTORIOUS
@ SPELL_WARRIOR_BLADESTORM
@ SPELL_WARRIOR_CHARGE_DROP_FIRE_PERIODIC
@ SPELL_WARRIOR_IN_FOR_THE_KILL_HASTE
@ SPELL_WARRIOR_INTIMIDATING_SHOUT_MENACE_AOE
void AddSC_warrior_spell_scripts()
WarriorSpellLabels
@ SPELL_LABEL_THUNDER_BLAST
WarriorMisc
@ SPELL_VISUAL_BLAZING_CHARGE
TriggerCastFlags TriggerFlags
Spell const * TriggeringSpell
CastSpellExtraArgs & AddSpellBP0(SpellEffectValue val)
CastSpellExtraArgs & AddSpellMod(SpellValueMod mod, int32 val)
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:160