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{
139};
140
145
150
151static void ApplyWhirlwindCleaveAura(Player* caster, Difficulty difficulty, Spell const* triggeringSpell)
152{
153 SpellInfo const* whirlwindCleaveAuraInfo = sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_WHIRLWIND_CLEAVE_AURA, difficulty);
154 int32 stackAmount = static_cast<int32>(whirlwindCleaveAuraInfo->StackAmount);
155 caster->ApplySpellMod(whirlwindCleaveAuraInfo, SpellModOp::MaxAuraStacks, stackAmount);
156
159 .TriggeringSpell = triggeringSpell,
160 .SpellValueOverrides = { { SPELLVALUE_AURA_STACK, stackAmount } }
161 });
162}
163
164// 152278 - Anger Management
166{
167 static bool ValidateProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo, ChrSpecialization spec)
168 {
169 if (aurEff->GetAmountAsInt() == 0)
170 return false;
171
172 Player const* player = eventInfo.GetActor()->ToPlayer();
173 if (!player)
174 return false;
175
176 Spell const* procSpell = eventInfo.GetProcSpell();
177 if (!procSpell)
178 return false;
179
180 if (procSpell->GetPowerTypeCostAmount(POWER_RAGE) <= 0)
181 return false;
182
183 return player->GetPrimarySpecialization() == spec;
184 }
185
186 static bool CheckArmsProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
187 {
188 if (!ValidateProc(aurEff, eventInfo, ChrSpecialization::WarriorArms))
189 return false;
190
191 // exclude non-attacks such as Ignore Pain
192 if (!eventInfo.GetSpellInfo()->IsAffected(SPELLFAMILY_WARRIOR, { 0x100, 0x0, 0x0, 0x0 }))
193 return false;
194
195 return true;
196 }
197
198 static bool CheckFuryProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
199 {
200 return ValidateProc(aurEff, eventInfo, ChrSpecialization::WarriorFury);
201 }
202
203 static bool CheckProtectionProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
204 {
205 return ValidateProc(aurEff, eventInfo, ChrSpecialization::WarriorProtection);
206 }
207
221
222 void HandleProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo, std::span<int32 const> spellIds) const
223 {
224 int32 rageCost = *eventInfo.GetProcSpell()->GetPowerTypeCostAmount(POWER_RAGE) / 10; // db values are 10x the actual rage cost
225 SpellEffectValue multiplier = static_cast<float>(rageCost) / aurEff->GetAmount();
226 Milliseconds cooldownMod = -duration_cast<Milliseconds>(multiplier * CooldownReduction);
227
228 for (int32 spellId : spellIds)
229 GetTarget()->GetSpellHistory()->ModifyCooldown(spellId, cooldownMod);
230 }
231
232 void OnProcArms(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const
233 {
234 HandleProc(aurEff, eventInfo, ArmsSpellIds);
235 }
236
237 void OnProcFury(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const
238 {
239 HandleProc(aurEff, eventInfo, FurySpellIds);
240 }
241
242 void OnProcProtection(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const
243 {
244 HandleProc(aurEff, eventInfo, ProtectionSpellIds);
245 }
246
257
261 static constexpr std::array<int32, 2> ProtectionSpellIds = { SPELL_WARRIOR_AVATAR, SPELL_WARRIOR_SHIELD_WALL };
262};
263
264// 392536 - Ashen Juggernaut
266{
267 static bool CheckProc(AuraScript const&, ProcEventInfo const& eventInfo)
268 {
269 // should only proc on primary target
270 return eventInfo.GetActionTarget() == eventInfo.GetProcSpell()->m_targets.GetUnitTarget();
271 }
272
277};
278
279// 107574 - Avatar
292
293// 384361 - Bloodsurge
295{
296 bool Validate(SpellInfo const* /*spellInfo*/) override
297 {
299 }
300
301 void HandlePeriodic(AuraEffect const* aurEff) const
302 {
303 Unit* caster = GetTarget();
304 float rends = 0.0f;
305 auto work = [&rends, warrior = caster->GetGUID()](Unit const* target)
306 {
307 if (target->HasAuraEffect(SPELL_WARRIOR_REND_AURA, EFFECT_0, warrior))
308 rends += 1.0f;
309 };
310 Trinity::UnitWorker worker(caster, work);
311 Cell::VisitAllObjects(caster, worker, 50.0f);
312
313 SpellEffectValue chance = std::sqrt(rends) * aurEff->GetAmount();
314 if (!roll_chance(chance))
315 return;
316
319 .TriggeringAura = aurEff
320 });
321 }
322
327};
328
329// 23881 - Bloodthirst
330// 335096 - Bloodbath
332{
333 bool Validate(SpellInfo const* /*spellInfo*/) override
334 {
336 }
337
349
354};
355
356// 446085 - Brutal Finish (attached to 446035 - Bladestorm)
382
383// 384036 - Brutal Vitality
385{
386 bool Validate(SpellInfo const* /*spellInfo*/) override
387 {
389 }
390
391 void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
392 {
393 _damageAmount += CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount());
394 }
395
396 void HandleDummyTick(AuraEffect const* /*aurEff*/)
397 {
398 if (_damageAmount == 0)
399 return;
400
401 if (AuraEffect* ignorePainAura = GetTarget()->GetAuraEffect(SPELL_WARRIOR_IGNORE_PAIN, EFFECT_0))
402 ignorePainAura->ChangeAmount(ignorePainAura->GetAmount() + _damageAmount);
403
404 _damageAmount = 0;
405 }
406
412
413private:
415};
416
417// 100 - Charge
438
439// 126661 - Warrior Charge Drop Fire Periodic
441{
442 void DropFireVisual(AuraEffect const* aurEff)
443 {
445
446 Unit* target = GetTarget();
447 if (target->IsSplineEnabled())
448 {
449 Movement::Location from = target->movespline->ComputePosition();
450 Movement::Location to = target->movespline->ComputePosition(aurEff->GetPeriod());
451
452 int32 fireCount = std::lround((to - from).length());
453
454 for (int32 i = 0; i < fireCount; ++i)
455 {
456 int32 timeOffset = i * aurEff->GetPeriod() / fireCount;
457 Movement::Location loc = target->movespline->ComputePosition(timeOffset);
458 target->SendPlaySpellVisual(Position(loc.x, loc.y, loc.z), SPELL_VISUAL_BLAZING_CHARGE, 0, 0, 1.f, true);
459 }
460 }
461 }
462
467};
468
469// 198337 - Charge Effect
471{
472 bool Validate(SpellInfo const* /*spellInfo*/) override
473 {
474 return ValidateSpellInfo
475 ({
478 });
479 }
480
481 void HandleCharge(SpellEffIndex /*effIndex*/) const
482 {
483 Unit* caster = GetCaster();
484 Unit* target = GetHitUnit();
485
487 .TriggerFlags = TRIGGERED_FULL_MASK & ~TRIGGERED_CAST_DIRECTLY,
488 .TriggeringSpell = GetSpell()
489 };
490
493
494 caster->CastSpell(target, SPELL_WARRIOR_CHARGE_ROOT_EFFECT, args);
495 }
496
501};
502
503// 23881 - Bloodthirst
504// 335096 - Bloodbath
532
533// 167105 - Colossus Smash
534// 262161 - Warbreaker
536{
542
544 {
545 Unit* target = GetHitUnit();
546 Unit* caster = GetCaster();
547
549
551 {
552 if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARRIOR_IN_FOR_THE_KILL, DIFFICULTY_NONE))
553 {
554 if (target->HealthBelowPct(spellInfo->GetEffect(EFFECT_2).CalcValue(caster)))
555 _bonusHaste = true;
556 }
557 }
558 }
559
561 {
562 Unit* caster = GetCaster();
563 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARRIOR_IN_FOR_THE_KILL, DIFFICULTY_NONE);
564 if (!spellInfo)
565 return;
566
568 args.AddSpellBP0(spellInfo->GetEffect(EFFECT_0).CalcValue(caster));
569 if (_bonusHaste)
570 args.AddSpellBP0(spellInfo->GetEffect(EFFECT_1).CalcValue(caster));
571 caster->CastSpell(caster, SPELL_WARRIOR_IN_FOR_THE_KILL_HASTE, args);
572 }
573
579
580private:
581 bool _bonusHaste = false;
582};
583
584// 389306 - Critical Thinking
586{
587 bool Validate(SpellInfo const* /*spellInfo*/) override
588 {
590 }
591
592 void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
593 {
596 .AddSpellBP0(CalculatePct(*rageCost, aurEff->GetAmount())));
597 }
598
603};
604
605// 383295 - Deft Experience (attached to 23881 - Bloodthirst)
606// 383295 - Deft Experience (attached to 335096 - Bloodbath)
608{
609 bool Validate(SpellInfo const* /*spellInfo*/) override
610 {
612 }
613
614 bool Load() override
615 {
617 }
618
619 void HandleDeftExperience(SpellEffIndex /*effIndex*/) const
620 {
621 if (GetHitUnit() != GetExplTargetUnit())
622 return;
623
624 Unit const* caster = GetCaster();
625 if (Aura* enrageAura = caster->GetAura(SPELL_WARRIOR_ENRAGE))
627 enrageAura->SetDuration(enrageAura->GetDuration() + (aurEff->GetAmountAsInt() * (IsHitCrit() ? 2 : 1)));
628 }
629
634};
635
636// 236279 - Devastator
638{
639 bool Validate(SpellInfo const* spellInfo) override
640 {
642 }
643
644 void OnProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*eventInfo*/) const
645 {
646 if (GetTarget()->GetSpellHistory()->HasCooldown(SPELL_WARRIOR_SHIELD_SLAM))
647 {
648 if (roll_chance(GetEffectInfo(EFFECT_1).CalcValue()))
649 {
652 }
653 }
654 }
655
660};
661
662// 184361 - Enrage
664{
665 bool Validate(SpellInfo const* /*spellInfo*/) override
666 {
668 }
669
670 static bool CheckRampageProc(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
671 {
672 SpellInfo const* spellInfo = eventInfo.GetSpellInfo();
673 if (!spellInfo || !spellInfo->IsAffected(SPELLFAMILY_WARRIOR, { 0x0, 0x0, 0x0, 0x8000000 })) // Rampage
674 return false;
675
676 return true;
677 }
678
679 static bool IsBloodthirst(SpellInfo const* spellInfo)
680 {
681 // Bloodthirst/Bloodbath
682 return spellInfo->IsAffected(SPELLFAMILY_WARRIOR, { 0x0, 0x400 });
683 }
684
685 static bool CheckBloodthirstProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
686 {
687 SpellInfo const* spellInfo = eventInfo.GetSpellInfo();
688 if (!spellInfo || !IsBloodthirst(spellInfo))
689 return false;
690
691 // Fresh Meat talent handling
692 if (Unit const* actor = eventInfo.GetActor())
693 {
694 if (actor->HasAura(SPELL_WARRIOR_FRESH_MEAT_TALENT))
695 {
696 Spell const* procSpell = eventInfo.GetProcSpell();
697 if (!procSpell)
698 return false;
699
700 Unit const* target = procSpell->m_targets.GetUnitTarget();
701 if (!target)
702 return false;
703
704 if (!target->HasAura(SPELL_WARRIOR_FRESH_MEAT_DEBUFF, actor->GetGUID()))
705 return true;
706 }
707 }
708
709 return roll_chance(aurEff->GetAmount());
710 }
711
712 void HandleProc(ProcEventInfo const& eventInfo)
713 {
715
716 Unit* auraTarget = GetTarget();
717
720 .TriggeringSpell = eventInfo.GetProcSpell()
721 });
722
723 // Fresh Meat talent handling
725 {
726 Spell const* procSpell = eventInfo.GetProcSpell();
727 if (!procSpell)
728 return;
729
730 if (!IsBloodthirst(procSpell->GetSpellInfo()))
731 return;
732
733 if (Unit* bloodthirstTarget = procSpell->m_targets.GetUnitTarget())
734 if (!bloodthirstTarget->HasAura(SPELL_WARRIOR_FRESH_MEAT_DEBUFF, auraTarget->GetGUID()))
737 });
738 }
739 }
740
747};
748
749// 163201 - Execute (Arms, Protection)
750// 281000 - Massacre
751// 330334 - Condemn (Venthyr) (Arms)
752// 317349 - Condemn (Venthyr) (Protection)
754{
755 bool Validate(SpellInfo const* spellInfo) override
756 {
757 return ValidateSpellEffect({
759 { spellInfo->Id, EFFECT_0 }
760 }) && ValidateSpellInfo({
762 spellInfo->GetEffect(EFFECT_0).TriggerSpell
763 });
764 }
765
767 {
768 if (Aura* suddenDeathAura = GetCaster()->GetAura(SPELL_WARRIOR_SUDDEN_DEATH_BUFF))
769 if (GetSpell()->m_appliedMods.contains(suddenDeathAura))
770 if (AuraEffect const* suddenDeathTalentAura = GetCaster()->GetAuraEffect(SPELL_WARRIOR_SUDDEN_DEATH, EFFECT_0))
771 return suddenDeathTalentAura->GetAmountAsInt() * 10;
772
773 return {};
774 }
775
776 std::pair<int32, int32> GetRageCost() const
777 {
778 for (SpellPowerEntry const* powerCost : GetSpellInfo()->PowerCosts)
779 if (powerCost->PowerType == POWER_RAGE)
780 return { powerCost->ManaCost, powerCost->OptionalCost };
781
782 return { 0, 0 };
783 }
784
786 {
787 PreventHitDefaultEffect(spellEffIndex);
788
789 // Can't use SpellInfo::CalcPowerCost here since Sudden Death modifies the costs so it's free.
790 auto [baseCost, optionalCost] = GetRageCost();
791 int32 rageSpent = GetSpell()->GetPowerTypeCostAmount(POWER_RAGE).value_or(0);
792
793 GetCaster()->CastSpell(GetHitUnit(), GetEffectInfo(spellEffIndex).TriggerSpell, CastSpellExtraArgsInit{
795 .TriggeringSpell = GetSpell(),
796 .CustomArg = TriggerArgs{
797 .BaseRageCost = baseCost,
798 .OptionalRageCost = optionalCost,
799 .DamageRageSpent = GetSuddenDeathRageCost().value_or(rageSpent),
800 .RefundRage = CalculatePct(rageSpent, GetEffectInfo(EFFECT_1).CalcValueAsInt())
801 }
802 });
803 }
804
809
810public:
818};
819
820// 260798 - Execute (Arms, Protection)
821// 317483 - Condemn (Venthyr) (Arms, Protection)
823{
824 void CalculateExecuteDamage(SpellEffectInfo const& /*spellEffectInfo*/, Unit const* /*victim*/, int32 const& /*damageOrHealing*/, int32 const& /*flatMod*/, float& pctMod) const
825 {
826 spell_warr_execute::TriggerArgs const* triggerArgs = std::any_cast<spell_warr_execute::TriggerArgs>(&GetSpell()->m_customArg);
827 if (!triggerArgs)
828 return;
829
830 if (triggerArgs->OptionalRageCost <= 0)
831 return;
832
833 pctMod *= (static_cast<float>(triggerArgs->DamageRageSpent - triggerArgs->BaseRageCost) / static_cast<float>(triggerArgs->OptionalRageCost) + 1.0f);
834 }
835
840};
841
842// 260798 - Execute -> 316405 (Improved Execute (Arms))
844{
845 bool Load() override
846 {
848 }
849
850 void DetermineKillStatus(DamageInfo const& damageInfo, uint32& /*resistAmount*/, int32& /*absorbAmount*/) const
851 {
852 bool killed = damageInfo.GetDamage() >= damageInfo.GetVictim()->GetHealth();
853 if (killed)
854 return;
855
856 spell_warr_execute::TriggerArgs const* triggerArgs = std::any_cast<spell_warr_execute::TriggerArgs>(&GetSpell()->m_customArg);
857 if (!triggerArgs)
858 return;
859
860 GetCaster()->ModifyPower(POWER_RAGE, triggerArgs->RefundRage, false);
861 }
862
863 void Register() override
864 {
865 // abuse OnCalculateResistAbsorb to determine if this spell will kill target or not (its still not perfect - happens before absorbs are applied)
867 }
868};
869
870// 383848 - Frenzied Enrage (attached to 184362 - Enrage)
897
898// 392792 - Frothing Berserker
900{
901 bool Validate(SpellInfo const* /*spellInfo*/) override
902 {
904 }
905
906 static bool CheckProc(AuraScript const&, ProcEventInfo const& eventInfo)
907 {
908 Spell const* procSpell = eventInfo.GetProcSpell();
909 return procSpell && procSpell->GetPowerTypeCostAmount(POWER_RAGE) > 0;
910 }
911
912 template <ChrSpecialization Spec>
913 static bool CheckSpecialization(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
914 {
915 return eventInfo.GetActor()->IsPlayer() && eventInfo.GetActor()->ToPlayer()->GetPrimarySpecialization() == Spec;
916 }
917
918 static void HandleProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
919 {
920 Unit* target = eventInfo.GetActor();
921 Spell const* procSpell = eventInfo.GetProcSpell();
922 int32 spentRage = *procSpell->GetPowerTypeCostAmount(POWER_RAGE);
925 .TriggeringSpell = procSpell,
926 .TriggeringAura = aurEff,
927 .SpellValueOverrides = { { SPELLVALUE_BASE_POINT0, static_cast<SpellEffectValue>(CalculatePct(spentRage, aurEff->GetAmount())) } }
928 });
929 }
930
931 void Register() override
932 {
934 DoCheckEffectProc += AuraCheckEffectProcFn(spell_warr_frothing_berserker::CheckSpecialization<ChrSpecialization::WarriorArms>, EFFECT_0, SPELL_AURA_DUMMY);
935 DoCheckEffectProc += AuraCheckEffectProcFn(spell_warr_frothing_berserker::CheckSpecialization<ChrSpecialization::WarriorFury>, EFFECT_1, SPELL_AURA_DUMMY);
936 DoCheckEffectProc += AuraCheckEffectProcFn(spell_warr_frothing_berserker::CheckSpecialization<ChrSpecialization::WarriorProtection>, EFFECT_2, SPELL_AURA_DUMMY);
938 }
939};
940
941// 438590 - Keep Your Feet on the Ground
943{
944 static bool CheckProc(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
945 {
946 SpellInfo const* spellInfo = eventInfo.GetSpellInfo();
947 return spellInfo->HasLabel(SPELL_LABEL_THUNDER_BLAST);
948 }
949
954};
955
956// 400205 - Overpowering Finish (attached to 7384 - Overpower)
958{
959 bool Validate(SpellInfo const* /*spellInfo*/) override
960 {
962 }
963
964 bool Load() override
965 {
967 }
968
969 void CalculateDamage(SpellEffectInfo const& /*effectInfo*/, Unit const* victim, int32& /*damage*/, int32& /*flatMod*/, float& pctMod) const
970 {
972 if (!talent)
973 return;
974
975 AuraEffect const* healthPct = talent->GetEffect(EFFECT_1);
976 if (!healthPct || !victim->HealthBelowPct(healthPct->GetAmount()))
977 return;
978
979 if (AuraEffect const* dmgIncrease = talent->GetEffect(EFFECT_0))
980 AddPct(pctMod, dmgIncrease->GetAmount());
981 }
982
987};
988
989// 382551 - Pain and Gain (heal)
991{
992 static void CalculateHeal(SpellScript const&, SpellEffectInfo const& /*effInfo*/, Unit const* /*victim*/, int32& /*healing*/, int32& /*flatMod*/, float& pctMod)
993 {
994 pctMod *= 0.1f;
995 }
996
1001};
1002
1003// 440277 - Powerful Enrage (attached to 184362 - Enrage)
1030
1031// 383103 - Fueled by Violence
1033{
1034 bool Validate(SpellInfo const* /*spellInfo*/) override
1035 {
1037 }
1038
1039 void HandleProc(ProcEventInfo& eventInfo)
1040 {
1042
1044 }
1045
1046 void HandlePeriodic(AuraEffect const* /*aurEff*/)
1047 {
1048 if (_nextHealAmount == 0)
1049 return;
1050
1051 Unit* target = GetTarget();
1054
1055 target->CastSpell(target, SPELL_WARRIOR_FUELED_BY_VIOLENCE_HEAL, args);
1056 _nextHealAmount = 0;
1057 }
1058
1064
1065private:
1067};
1068
1069// 6544 - Heroic leap
1071{
1072 bool Validate(SpellInfo const* /*spellInfo*/) override
1073 {
1075 }
1076
1078 {
1079 if (WorldLocation const* dest = GetExplTargetDest())
1080 {
1081 if (GetCaster()->HasUnitMovementFlag(MOVEMENTFLAG_ROOT))
1082 return SPELL_FAILED_ROOTED;
1083
1084 if (GetCaster()->GetMap()->Instanceable())
1085 {
1086 float range = GetSpellInfo()->GetMaxRange(true, GetCaster()) * 1.5f;
1087
1088 PathGenerator generatedPath(GetCaster());
1089 generatedPath.SetPathLengthLimit(range);
1090
1091 bool result = generatedPath.CalculatePath(dest->GetPositionX(), dest->GetPositionY(), dest->GetPositionZ(), false);
1092 if (generatedPath.GetPathType() & PATHFIND_SHORT)
1094
1095 if (!result || generatedPath.GetPathType() & PATHFIND_NOPATH)
1096 return SPELL_FAILED_NOPATH;
1097 }
1098 else if (dest->GetPositionZ() > GetCaster()->GetPositionZ() + 4.0f)
1099 return SPELL_FAILED_NOPATH;
1100
1101 return SPELL_CAST_OK;
1102 }
1103
1105 }
1106
1107 void HandleCast() const
1108 {
1109 if (Player* playerCaster = GetCaster()->ToPlayer())
1110 if (playerCaster->GetPrimarySpecialization() == ChrSpecialization::WarriorProtection)
1111 playerCaster->GetSpellHistory()->ResetCooldown(SPELL_WARRIOR_TAUNT);
1112 }
1113
1119};
1120
1121// 52174 - Heroic Leap (Damage)
1123{
1124 bool Validate(SpellInfo const* /*spellInfo*/) override
1125 {
1126 return ValidateSpellInfo(
1127 {
1130 });
1131 }
1132
1133 bool Load() override
1134 {
1136 }
1137
1144
1149};
1150
1151// 202168 - Impending Victory
1153{
1154 bool Validate(SpellInfo const* /*spellInfo*/) override
1155 {
1157 }
1158
1160 {
1161 Unit* caster = GetCaster();
1162 caster->CastSpell(caster, SPELL_WARRIOR_IMPENDING_VICTORY_HEAL, true);
1164 }
1165
1170};
1171
1172// 12950 - Improved Whirlwind (attached to 190411 - Whirlwind)
1174{
1180
1181 bool Load() override
1182 {
1184 }
1185
1186 void HandleHit(SpellEffIndex /*effIndex*/) const
1187 {
1188 int64 const targetsHit = GetUnitTargetCountForEffect(EFFECT_0);
1189 if (!targetsHit)
1190 return;
1191
1192 Player* caster = GetCaster()->ToPlayer();
1193 if (!caster)
1194 return;
1195
1196 int32 const ragePerTarget = GetEffectValueAsInt();
1197 int32 const baseRage = GetEffectInfo(EFFECT_0).CalcValueAsInt();
1198 int32 const maxRage = baseRage + (ragePerTarget * GetEffectInfo(EFFECT_2).CalcValueAsInt());
1199 int32 const rageGained = std::min<int32>(baseRage + (targetsHit * ragePerTarget), maxRage);
1200
1203 .TriggeringSpell = GetSpell(),
1204 .SpellValueOverrides = {{ SPELLVALUE_BASE_POINT0, SpellEffectValue(rageGained * 10) } }
1205 });
1206
1208 }
1209
1214};
1215
1252{
1253 bool Validate(SpellInfo const* spellInfo) override
1254 {
1256 && spellInfo->IsAffected(SPELLFAMILY_WARRIOR, sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_WHIRLWIND_CLEAVE_AURA, DIFFICULTY_NONE)->GetEffect(EFFECT_0).SpellClassMask);
1257 }
1258
1259 bool Load() override
1260 {
1262 }
1263
1264 void CalculateDamage(SpellEffectInfo const& spellEffectInfo, Unit const* victim, int32& /*damage*/, int32& /*flatMod*/, float& pctMod) const
1265 {
1266 int32 const targetIndex = GetUnitTargetIndexForEffect(victim->GetGUID(), spellEffectInfo.EffectIndex);
1267 if (targetIndex == 0)
1268 return; // nothing to do, it's the first target
1269
1270 if (AuraEffect const* damageEffect = GetCaster()->GetAuraEffect(SPELL_WARRIOR_WHIRLWIND_CLEAVE_AURA, EFFECT_1))
1271 ApplyPct(pctMod, damageEffect->GetAmount());
1272 }
1273
1278};
1279
1280// 3411 - Intervene
1282{
1283 bool Validate(SpellInfo const* /*spellInfo*/) override
1284 {
1286 }
1287
1288 void HandleDummy(SpellEffIndex /*effIndex*/) const
1289 {
1290 Unit* caster = GetCaster();
1291 Unit* target = GetHitUnit();
1293 if (caster->IsWithinCombatRange(target, 3.0f))
1295
1296 caster->CastSpell(target, spellId, CastSpellExtraArgsInit{
1298 .TriggeringSpell = GetSpell()
1299 });
1300 }
1301
1306};
1307
1308// 316531 - Intervene (charge)
1310{
1311 bool Validate(SpellInfo const* /*spellInfo*/) override
1312 {
1314 }
1315
1316 void HandleAura(SpellEffIndex /*effIndex*/) const
1317 {
1319 .TriggerFlags = TRIGGERED_FULL_MASK & ~TRIGGERED_CAST_DIRECTLY,
1320 .TriggeringSpell = GetSpell()
1321 });
1322 }
1323
1328};
1329
1330// 5246 - Intimidating Shout
1332{
1333 void FilterTargets(std::list<WorldObject*>& unitList) const
1334 {
1335 unitList.remove(GetExplTargetWorldObject());
1336 }
1337
1338 static void ClearTargets(SpellScript const&, std::list<WorldObject*>& unitList)
1339 {
1340 // This is used in effect 3, which is an AOE Root effect.
1341 // This doesn't seem to be a thing anymore, so we clear the targets list here.
1342 unitList.clear();
1343 }
1344
1350};
1351
1352// 316594 - Intimidating Shout (Menace Talent, knock back -> root)
1354{
1355 bool Validate(SpellInfo const* /*spellInfo*/) override
1356 {
1358 }
1359
1360 void FilterTargets(std::list<WorldObject*>& unitList) const
1361 {
1362 unitList.remove(GetExplTargetWorldObject());
1363 }
1364
1365 void HandleRoot(SpellEffIndex /*effIndex*/) const
1366 {
1369 .TriggeringSpell = GetSpell()
1370 };
1371
1372 GetCaster()->m_Events.AddEventAtOffset([caster = GetCaster(), targetGUID = GetHitUnit()->GetGUID(), castArgs = std::move(args)]()
1373 {
1374 if (Unit* targetUnit = ObjectAccessor::GetUnit(*caster, targetGUID))
1375 caster->CastSpell(targetUnit, SPELL_WARRIOR_INTIMIDATING_SHOUT_MENACE_AOE, castArgs);
1376 }, 500ms);
1377 }
1378
1384};
1385
1386// 385174 - Invigorating Fury (attached to 184364 - Enraged Regeneration)
1388{
1389 bool Validate(SpellInfo const* /*spellInfo*/) override
1390 {
1392 }
1393
1394 bool Load() override
1395 {
1397 }
1398
1406
1411};
1412
1413// 70844 - Item - Warrior T10 Protection 4P Bonus
1415{
1416 bool Validate(SpellInfo const* spellInfo) override
1417 {
1419 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
1420 }
1421
1422 void HandleProc(ProcEventInfo& eventInfo)
1423 {
1425
1426 Unit* target = eventInfo.GetActionTarget();
1427 SpellEffectValue bp0 = CalculatePct(target->GetMaxHealth(), GetEffectInfo(EFFECT_1).CalcValue());
1429 args.AddSpellBP0(bp0);
1430 target->CastSpell(nullptr, SPELL_WARRIOR_STOICISM, args);
1431 }
1432
1437};
1438
1439// 1265361 - Kill or Be Killed
1441{
1446
1447 void HandleAbsorb(AuraEffect const* /*aurEff*/, DamageInfo const& dmgInfo, uint32& absorbAmount) const
1448 {
1449 Unit* target = GetTarget();
1450
1452 return;
1453
1455 {
1456 absorbAmount = 0;
1457 return;
1458 }
1459
1462 };
1463
1464 SpellCastResult result = target->CastSpell(dmgInfo.GetAttacker(), SPELL_WARRIOR_KILL_OR_BE_KILLED_TARGET, castArgs);
1465 if (result != SPELL_FAILED_SUCCESS)
1466 {
1467 absorbAmount = 0;
1468 return;
1469 }
1470
1471 target->CastSpell(nullptr, SPELL_WARRIOR_KILL_OR_BE_KILLED_PROC, castArgs);
1472
1473 target->CastSpell(nullptr, SPELL_WARRIOR_KILL_OR_BE_KILLED_COOLDOWN, castArgs);
1474 }
1475
1480};
1481
1482// 1265641 - Kill or Be Killed (target)
1484{
1485 static void HandleProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& /*procEvent*/)
1486 {
1487 Unit* caster = aurEff->GetCaster();
1488 if (!caster || !caster->IsAlive())
1489 return;
1490
1492 }
1493
1498};
1499
1500// 1265600 - Kill or Be Killed (warrior)
1502{
1507
1508 void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) const
1509 {
1510 Unit* target = GetTarget();
1511 switch (GetTargetApplication()->GetRemoveMode())
1512 {
1516 });
1517 break;
1521 });
1522
1523 if (target->HealthBelowPct(aurEff->GetAmount()))
1524 target->SetHealth(target->CountPctFromMaxHealth(aurEff->GetAmount()));
1525 break;
1526 default:
1527 break;
1528 }
1529 }
1530
1535};
1536
1537// 280392 - Meat Cleaver (attached to 199667 - Whirlwind, 44949 - Whirlwind Off-Hand, 199852 - Whirlwind, 199851 - Whirlwind Off-Hand)
1539{
1540protected:
1541 bool Validate(SpellInfo const* /*spellInfo*/) override
1542 {
1544 }
1545
1546 bool Load() override
1547 {
1549 }
1550
1551 void HandleDamageBonus(SpellEffectInfo const& spellEffectInfo, Unit const* /*victim*/, int32& /*damage*/, int32& /*flatMod*/, float& pctMod) const
1552 {
1553 Unit const* caster = GetCaster();
1554 Aura const* meatCleaver = caster->GetAura(SPELL_WARRIOR_MEAT_CLEAVER_TALENT);
1555 if (!meatCleaver)
1556 return;
1557
1558 AuraEffect const* minTargetCount = meatCleaver->GetEffect(EFFECT_1);
1559 if (!minTargetCount)
1560 return;
1561
1562 int64 const targetCount = GetUnitTargetCountForEffect(spellEffectInfo.EffectIndex);
1563
1564 if (targetCount < minTargetCount->GetAmountAsInt())
1565 return;
1566
1567 if (AuraEffect const* aurEff = meatCleaver->GetEffect(EFFECT_0))
1568 AddPct(pctMod, aurEff->GetAmount());
1569 }
1570
1575};
1576
1577// 280392 - Meat Cleaver (attached to 6343 - Thunder Clap)
1578// 280392 - Meat Cleaver (attached to 435222 - Thunder Blast)
1593
1594// 12294 - Mortal Strike
1615
1616// 383854 - Improved Raging Blow (attached to 85288 - Raging Blow, 335097 - Crushing Blow)
1617// 392936 - Wrath and Fury (attached to 85288 - Raging Blow, 335097 - Crushing Blow)
1619{
1625
1626 bool Load() override
1627 {
1628 Unit const* caster = GetCaster();
1632 }
1633
1634 void HandleResetCooldown(SpellEffIndex /*effIndex*/) const
1635 {
1636 // it is currently impossible to have Wrath and Fury without having Improved Raging Blow, but we will check it anyway
1637 Unit* caster = GetCaster();
1638 SpellEffectValue value = 0;
1640 value = GetEffectValue();
1641
1642 if (AuraEffect const* auraEffect = caster->GetAuraEffect(SPELL_WARRIOR_WRATH_AND_FURY, EFFECT_0))
1643 value += auraEffect->GetAmount();
1644
1645 if (roll_chance(value))
1646 {
1649 .TriggeringSpell = GetSpell()
1650 });
1652 }
1653 }
1654
1659};
1660
1661// 97462 - Rallying Cry
1663{
1664 bool Validate(SpellInfo const* /*spellInfo*/) override
1665 {
1667 }
1668
1669 bool Load() override
1670 {
1671 return GetCaster()->GetTypeId() == TYPEID_PLAYER;
1672 }
1673
1681
1686};
1687
1688// 1265357 - Rampaging Ruin (attached to 184367 - Rampage)
1690{
1691 bool Validate(SpellInfo const* /*spellInfo*/) override
1692 {
1694 }
1695
1697 {
1698 Unit const* caster = GetCaster();
1700 PreventHitDefaultEffect(effIndex);
1701 }
1702
1704 {
1705 Unit const* caster = GetCaster();
1707 PreventHitDefaultEffect(effIndex);
1708 }
1709
1722};
1723
1724// 275339 - (attached to 46968 - Shockwave)
1726{
1727 bool Validate(SpellInfo const* /*spellInfo*/) override
1728 {
1730 }
1731
1732 bool Load() override
1733 {
1735 }
1736
1738 {
1739 Unit* caster = GetCaster();
1740 Aura const* rumblingEarth = caster->GetAura(SPELL_WARRIOR_RUMBLING_EARTH);
1741 if (!rumblingEarth)
1742 return;
1743
1744 AuraEffect const* minTargetCount = rumblingEarth->GetEffect(EFFECT_0);
1745 AuraEffect const* cooldownReduction = rumblingEarth->GetEffect(EFFECT_1);
1746 if (!minTargetCount || !cooldownReduction)
1747 return;
1748
1749 if (GetUnitTargetCountForEffect(EFFECT_0) >= minTargetCount->GetAmountAsInt())
1750 GetCaster()->GetSpellHistory()->ModifyCooldown(GetSpellInfo()->Id, -duration_cast<Milliseconds>(FloatSeconds(cooldownReduction->GetAmount())));
1751 }
1752
1757};
1758
1759// 2565 - Shield Block
1761{
1762 bool Validate(SpellInfo const* /*spellInfo*/) override
1763 {
1765 }
1766
1768 {
1770 }
1771
1776};
1777
1778// 385952 - Shield Charge
1780{
1781 bool Validate(SpellInfo const* /*spellInfo*/) override
1782 {
1784 }
1785
1790
1795};
1796
1797// 46968 - Shockwave
1799{
1800 bool Validate(SpellInfo const* /*spellInfo*/) override
1801 {
1803 }
1804
1812
1817};
1818
1819// 107570 - Storm Bolt
1821{
1822 bool Validate(SpellInfo const* /*spellInfo*/) override
1823 {
1825 }
1826
1827 void HandleOnHit(SpellEffIndex /*effIndex*/) const
1828 {
1830 }
1831
1836};
1837
1838// 107570 - Storm Bolt
1840{
1841 bool Validate(SpellInfo const* /*spellInfo*/) override
1842 {
1844 }
1845
1846 bool Load() override
1847 {
1849 }
1850
1851 void FilterTargets(std::list<WorldObject*>& targets) const
1852 {
1853 targets.clear();
1854
1855 if (Unit* target = GetExplTargetUnit())
1856 targets.push_back(target);
1857 }
1858
1863};
1864
1865// 384041 - Strategist
1867{
1873
1874 static bool CheckProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& /*procEvent*/)
1875 {
1876 return roll_chance(aurEff->GetAmount());
1877 }
1878
1879 void HandleCooldown(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*procEvent*/) const
1880 {
1881 Unit* caster = GetTarget();
1884 }
1885
1891};
1892
1893// 29725 - Sudden Death
1895{
1896 bool Validate(SpellInfo const* /*spellInfo*/) override
1897 {
1899 }
1900
1901 void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*eventInfo*/) const
1902 {
1903 Unit* target = GetTarget();
1906 });
1907 }
1908
1913};
1914
1915// 1265359 - Surge of Adrenaline (talent) - attached to 280270 (Always Angry)
1941
1942// 12328, 18765, 35429 - Sweeping Strikes
1944{
1949
1950 bool CheckProc(ProcEventInfo& eventInfo)
1951 {
1952 _procTarget = eventInfo.GetActor()->SelectNearbyTarget(eventInfo.GetProcTarget());
1953 return _procTarget != nullptr;
1954 }
1955
1956 void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
1957 {
1959 if (DamageInfo* damageInfo = eventInfo.GetDamageInfo())
1960 {
1961 SpellInfo const* spellInfo = damageInfo->GetSpellInfo();
1963 {
1964 // If triggered by Execute (while target is not under 20% hp) or Bladestorm deals normalized weapon damage
1966 }
1967 else
1968 {
1969 CastSpellExtraArgs args(aurEff);
1970 args.AddSpellMod(SPELLVALUE_BASE_POINT0, damageInfo->GetDamage());
1972 }
1973 }
1974 }
1975
1981
1982 Unit* _procTarget = nullptr;
1983};
1984
1985// 184783 - Tactician
1987{
1988 bool Validate(SpellInfo const* /*spellInfo*/) override
1989 {
1991 && sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_OVERPOWER, DIFFICULTY_NONE)->ChargeCategoryId;
1992 }
1993
1994 static bool CheckEffectProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
1995 {
1996 SpellInfo const* procSpell = eventInfo.GetSpellInfo();
1997 if (!procSpell)
1998 return false;
1999
2000 if (!procSpell->CalcPowerCost(POWER_RAGE, false, eventInfo.GetActor(), SpellSchoolMask(procSpell->SchoolMask)))
2001 return false;
2002
2003 return roll_chance(aurEff->GetAmount());
2004 }
2005
2006 static void HandleProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
2007 {
2008 Unit* caster = eventInfo.GetActor();
2009 SpellInfo const* overpowerInfo = sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_OVERPOWER, DIFFICULTY_NONE);
2010 caster->GetSpellHistory()->RestoreCharge(overpowerInfo->ChargeCategoryId);
2013 .TriggeringSpell = eventInfo.GetProcSpell(),
2014 .TriggeringAura = aurEff
2015 });
2016 }
2017
2023};
2024
2025// 388933 - Tenderize
2027{
2032
2033 void HandleProc(ProcEventInfo const& eventInfo) const
2034 {
2037 .TriggeringSpell = eventInfo.GetProcSpell()
2038 });
2039 }
2040
2041 void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const
2042 {
2043 Unit* target = GetTarget();
2045 return;
2046
2049 .TriggeringSpell = eventInfo.GetProcSpell(),
2050 .SpellValueOverrides = { { SPELLVALUE_AURA_STACK, aurEff->GetAmountAsInt() } }
2051 });
2052 }
2053
2059};
2060
2061// 435607 - Thunder Blast
2076
2078{
2079 bool Validate(SpellInfo const* /*spellInfo*/) override
2080 {
2082 }
2083
2084 static bool CheckProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/)
2085 {
2086 return roll_chance(aurEff->GetAmount());
2087 }
2088
2089 void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*eventInfo*/) const
2090 {
2091 Unit* target = GetTarget();
2094 });
2095 }
2096
2102};
2103
2104// 6343 - Thunder Clap
2105// 435222 - Thunder Blast
2126
2127// 6343 - Thunder Clap (Rend)
2128// 435222 - Thunder Blast (Rend)
2130{
2131 bool Validate(SpellInfo const* /*spellInfo*/) override
2132 {
2134 }
2135
2136 bool Load() override
2137 {
2139 }
2140
2148
2153};
2154
2155// 394329 - Titanic Rage
2157{
2158 bool Validate(SpellInfo const* /*spellInfo*/) override
2159 {
2161 }
2162
2163 void HandleProc(ProcEventInfo const& eventInfo) const
2164 {
2165 Player* target = GetTarget()->ToPlayer();
2166 if (!target)
2167 return;
2168
2171 .TriggeringSpell = eventInfo.GetProcSpell()
2172 });
2173
2174 ApplyWhirlwindCleaveAura(target, GetCastDifficulty(), nullptr);
2175 }
2176
2177 void Register() override
2178 {
2180 }
2181};
2182
2183// 215538 - Trauma
2185{
2186 bool Validate(SpellInfo const* /*spellInfo*/) override
2187 {
2189 && sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_TRAUMA_EFFECT, DIFFICULTY_NONE)->GetEffect(EFFECT_0).GetPeriodicTickCount();
2190 }
2191
2192 void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
2193 {
2194 Unit* target = eventInfo.GetActionTarget();
2195 //Get 25% of damage from the spell casted (Slam & Whirlwind) plus Remaining Damage from Aura
2196 SpellEffectValue damage = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()) / sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_TRAUMA_EFFECT, GetCastDifficulty())->GetEffect(EFFECT_0).GetPeriodicTickCount();
2198 args.AddSpellMod(SPELLVALUE_BASE_POINT0, damage);
2200 }
2201
2206};
2207
2208// 28845 - Cheat Death
2210{
2211 bool CheckProc(ProcEventInfo& eventInfo)
2212 {
2213 if (eventInfo.GetActionTarget()->HealthBelowPct(20))
2214 return true;
2215
2216 DamageInfo* damageInfo = eventInfo.GetDamageInfo();
2217 if (damageInfo && damageInfo->GetDamage())
2218 if (GetTarget()->HealthBelowPctDamaged(20, damageInfo->GetDamage()))
2219 return true;
2220
2221 return false;
2222 }
2223
2228};
2229
2230// 389603 - Unbridled Ferocity
2232{
2233 bool Validate(SpellInfo const* spellInfo) override
2234 {
2236 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } })
2238 && spellInfo->GetEffect(EFFECT_1).IsAura(SPELL_AURA_DUMMY);
2239 }
2240
2250
2251 bool CheckProc(ProcEventInfo& /*eventInfo*/) const
2252 {
2253 return roll_chance(GetEffect(EFFECT_0)->GetAmount());
2254 }
2255
2261};
2262
2263// 383885 - Vicious Contempt (attached to 23881 - Bloodthirst)
2264// 383885 - Vicious Contempt (attached to 335096 - Bloodbath)
2266{
2267 bool Validate(SpellInfo const* /*spellInfo*/) override
2268 {
2270 }
2271
2272 bool Load() override
2273 {
2275 }
2276
2277 void CalculateDamage(SpellEffectInfo const& /*spellEffectInfo*/, Unit const* victim, int32& /*damage*/, int32& /*flatMod*/, float& pctMod) const
2278 {
2280 return;
2281
2282 if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_WARRIOR_VICIOUS_CONTEMPT, EFFECT_0))
2283 AddPct(pctMod, aurEff->GetAmount());
2284 }
2285
2290};
2291
2292// 32215 - Victorious State
2294{
2295 bool Validate(SpellInfo const* /*spellInfo*/) override
2296 {
2298 }
2299
2307
2312};
2313
2314// 34428 - Victory Rush
2316{
2317 bool Validate(SpellInfo const* /*spellInfo*/) override
2318 {
2319 return ValidateSpellInfo
2320 ({
2323 });
2324 }
2325
2327 {
2328 Unit* caster = GetCaster();
2329 caster->CastSpell(caster, SPELL_WARRIOR_VICTORY_RUSH_HEAL, true);
2331 }
2332
2337};
2338
2340{
2409}
ChrSpecialization
Definition DBCEnums.h:398
Difficulty
Definition DBCEnums.h:932
@ DIFFICULTY_NONE
Definition DBCEnums.h:933
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
@ 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(T chance)
Definition Random.h:55
#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
@ TARGET_UNIT_DEST_AREA_ENEMY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ TARGET_UNIT_CASTER
SpellSchoolMask
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_TRIGGER_SPELL
@ SPELL_EFFECT_CHARGE
@ SPELL_EFFECT_KNOCK_BACK
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ 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_MELEE_SLOW
@ SPELL_AURA_ADD_PCT_MODIFIER
@ SPELL_AURA_MOD_INCREASE_SPEED
@ SPELL_AURA_PROC_TRIGGER_SPELL
@ SPELL_AURA_DUMMY
@ SPELL_AURA_PERIODIC_DUMMY
@ 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)
@ MOVEMENTFLAG_ROOT
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:447
Unit * GetAttacker() const
Definition Unit.h:446
uint32 GetDamage() const
Definition Unit.h:452
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:2008
void ApplySpellMod(SpellInfo const *spellInfo, SpellModOp op, T &basevalue, Spell *spell=nullptr) const
Definition Player.cpp:22893
Unit * GetActionTarget() const
Definition Unit.h:500
Spell const * GetProcSpell() const
Definition Unit.h:514
SpellInfo const * GetSpellInfo() const
Definition Unit.cpp:281
DamageInfo * GetDamageInfo() const
Definition Unit.h:511
Unit * GetProcTarget() const
Definition Unit.h:501
Unit * GetActor() const
Definition Unit.h:499
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:588
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
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
SpellInfo const * GetSpellInfo() const
Definition Spell.h:702
SpellCastTargets m_targets
Definition Spell.h:651
Optional< int32 > GetPowerTypeCostAmount(Powers power) const
Definition Spell.cpp:8157
Definition Unit.h:635
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition Unit.cpp:8697
void SetHealth(uint64 val)
Definition Unit.cpp:9973
uint64 CountPctFromMaxHealth(float pct) const
Definition Unit.h:797
void SendPlaySpellVisual(Unit *target, uint32 spellVisualId, uint8 missReason, uint8 reflectStatus, float travelSpeed, bool speedAsTime=false, float launchDelay=0.0f)
Definition Unit.cpp:12305
bool IsWithinCombatRange(Unit const *obj, float dist2compare) const
Definition Unit.cpp:670
Unit * SelectNearbyTarget(Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
Definition Unit.cpp:10903
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:4604
bool IsSplineEnabled() const
Definition Unit.cpp:14211
bool IsAlive() const
Definition Unit.h:1185
virtual bool HasSpell(uint32) const
Definition Unit.h:1084
uint64 GetMaxHealth() const
Definition Unit.h:789
bool HasAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
Definition Unit.cpp:4774
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4700
uint64 GetHealth() const
Definition Unit.h:788
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition Unit.cpp:6146
bool HealthBelowPct(float pct) const
Definition Unit.h:792
std::unique_ptr< Movement::MoveSpline > movespline
Definition Unit.h:1838
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4804
SpellHistory * GetSpellHistory()
Definition Unit.h:1498
void RemoveMovementImpairingAuras(bool withRoot)
Definition Unit.cpp:4294
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3974
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
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
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
static bool CheckBloodthirstProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
void HandleProc(ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
static bool CheckRampageProc(AuraScript const &, AuraEffect const *, ProcEventInfo const &eventInfo)
static bool IsBloodthirst(SpellInfo const *spellInfo)
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
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_IMPROVED_HEROIC_LEAP
@ SPELL_WARRIOR_BLOODTHIRST_HEAL
@ SPELL_WARRIOR_SURGE_OF_ADRENALINE_PROC
@ SPELL_WARRIOR_BRUTAL_FINISH_BUFF
@ SPELL_WARRIOR_SUDDEN_DEATH
@ SPELL_WARRIOR_FRENZY_BUFF
@ SPELL_WARRIOR_SHIELD_BLOCK_AURA
@ SPELL_WARRIOR_BOUNDING_STRIDE
@ 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_GLYPH_OF_HEROIC_LEAP
@ 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_CHARGE
@ 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_FRENZY_TALENT
@ SPELL_WARRIOR_STRATEGIST
@ 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_HEROIC_LEAP_JUMP
@ 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_HEROIC_LEAP_DAMAGE
@ SPELL_WARRIOR_WHIRLWIND_ENERGIZE
@ SPELL_WARRIOR_RECKLESSNESS
@ SPELL_WARRIOR_GLYPH_OF_HEROIC_LEAP_BUFF
@ 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_SHOCKWAVE
@ SPELL_WARRIOR_IGNORE_PAIN
@ SPELL_WARRIOR_TRAUMA_EFFECT
@ SPELL_WARRIOR_FRENZIED_ENRAGE
@ SPELL_WARRIOR_IMPROVED_EXECUTE_ARMS
@ SPELL_WARRIOR_TITANIC_RAGE
@ SPELL_WARRIOR_THUNDER_CLAP_SLOW
@ SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_2
@ SPELL_WARRIOR_RUMBLING_EARTH
@ SPELL_WARRIOR_VICTORIOUS
@ SPELL_WARRIOR_BLADESTORM
@ SPELL_WARRIOR_MORTAL_STRIKE
@ 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, bool dont_load=true)
Definition CellImpl.h:203