Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
spell_warrior.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6/*
7 * Scripts for spells with SPELLFAMILY_WARRIOR and SPELLFAMILY_GENERIC spells used by warrior players.
8 * Ordered alphabetically using scriptname.
9 * Scriptnames of files in this file should be prefixed with "spell_warr_".
10 */
11
12#include "Player.h"
13#include "ScriptMgr.h"
14#include "SpellScript.h"
15#include "SpellAuraEffects.h"
16
50
55
56
63
64// Bloodthirst - 23881
66{
67public:
68 spell_warr_bloodthirst() : SpellScriptLoader("spell_warr_bloodthirst") { }
69
71 {
73
74 bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE
75 {
76 if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_BLOODTHIRST_DAMAGE) ||
78 return false;
79 return true;
80 }
82 {
83 if (Player* _player = GetCaster()->ToPlayer())
84 if (Unit* target = GetHitUnit())
85 if (GetHitDamage())
86 {
87 _player->CastSpell(_player, SPELL_WARRIOR_BLOODTHIRST_HEAL, true);
88 if (_player->HasAura(SPELL_WARRIOR_BLOODSURGE))
89 if (roll_chance_i(20))
90 _player->CastSpell(_player, SPELL_WARRIOR_BLOODSURGE_EFFECT, true);
91 }
92 }
93
98 };
99
104};
105
108{
109public:
110 spell_warr_charge() : SpellScriptLoader("spell_warr_charge") { }
111
113 {
115
116 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
117 {
118 if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_WARBRINGER_ROOT) ||
120 !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_WARBRINGER) ||
121 !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_CHARGE_STUN) ||
122 !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_CHARGE))
123 return false;
124 return true;
125 }
126
127 void HandleDummy(SpellEffIndex /*effIndex*/)
128 {
129 int32 chargeBasePoints0 = GetEffectValue();
130 Unit* caster = GetCaster();
131 caster->CastCustomSpell(caster, SPELL_WARRIOR_CHARGE, &chargeBasePoints0, NULL, NULL, true);
132 }
133
134 void HandleCharge(SpellEffIndex /*effIndex*/)
135 {
136 if (Unit* target = GetHitUnit())
137 {
138 if (GetCaster()->HasAura(SPELL_WARRIOR_WARBRINGER))
139 {
142 }
143 else
145 }
146 }
147
148
154 };
155
157 {
159 }
160};
161
188
189// Called By Thunder Clap - 6343, Mortal Strike - 12294, Bloodthirst - 23881 and Devastate - 20243
190// Deep Wounds - 115767
192{
193public:
194 spell_warr_deep_wounds() : SpellScriptLoader("spell_warr_deep_wounds") { }
195
197 {
199
201 {
202 if (Player* _player = GetCaster()->ToPlayer())
203 {
204 if (Unit* target = GetHitUnit())
205 {
206 if (target->GetGUID() == _player->GetGUID())
207 return;
208
209 if (_player->getLevel() >= 32)
211 _player->CastSpell(target, SPELL_WARRIOR_DEEP_WOUNDS, true);
212
213 // Item - Warrior T16 DPS 4P Bonus - 144441
215 if (_player->HasAura(SPELL_WARRIOR_T16_DPS_4P_BONUS))
216 if (roll_chance_i(10))
217 _player->CastSpell(_player, SPELL_WARRIOR_T16_DPS_4P_BONUS_PROC, true);
218 }
219 }
220 }
221
226 };
227
232};
233
236{
237public:
238 spell_warr_execute() : SpellScriptLoader("spell_warr_execute") { }
239
241 {
243
244 void HandleEffect(SpellEffIndex /*effIndex*/)
245 {
246 Unit* caster = GetCaster();
247 if (GetHitUnit())
248 {
249 /*
250 SpellInfo const* spellInfo = GetSpellInfo();
251 int32 rageUsed = std::min<int32>(200 - spellInfo->CalcPowerCost(caster, SpellSchoolMask(spellInfo->SchoolMask)), caster->GetPower(POWER_RAGE));
252 int32 newRage = std::max<int32>(0, caster->GetPower(POWER_RAGE) - rageUsed);
253
254 // Sudden Death rage save
255 if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_GENERIC, WARRIOR_ICON_ID_SUDDEN_DEATH, EFFECT_0))
256 {
257 int32 ragesave = aurEff->GetSpellInfo()->Effects[EFFECT_0].CalcValue() * 10;
258 newRage = std::max(newRage, ragesave);
259 }
260
261 caster->SetPower(POWER_RAGE, uint32(newRage));
262
264 int32 baseDamage = int32(10 + caster->GetTotalAttackPowerValue(WeaponAttackType::BASE_ATTACK) * 0.437f * GetEffectValue() / 100.0f);
266 int32 moreDamage = int32(rageUsed * (caster->GetTotalAttackPowerValue(WeaponAttackType::BASE_ATTACK) * 0.874f * GetEffectValue() / 100.0f - 1) / 200);
267 SetHitDamage(baseDamage + moreDamage);
268 */
269 }
270 }
271
276 };
277
282};
283
284// 59725 - Improved Spell Reflection
311
312// 5246 - Intimidating Shout
339
341// 12975 - Last Stand
343{
344public:
345 spell_warr_last_stand() : SpellScriptLoader("spell_warr_last_stand") { }
346
348 {
350
351 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
352 {
354 return false;
355 return true;
356 }
357
358 void HandleDummy(SpellEffIndex /*effIndex*/)
359 {
360 Unit* caster = GetCaster();
361 int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(GetEffectValue()));
362 caster->CastCustomSpell(caster, SPELL_WARRIOR_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, NULL, NULL, true, NULL);
363 }
364
366 {
367 // add dummy effect spell handler to Last Stand
369 }
370 };
371
376};
377
378// 97462 - Rallying Cry
380{
381public:
382 spell_warr_rallying_cry() : SpellScriptLoader("spell_warr_rallying_cry") { }
383
385 {
387
388 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
389 {
390 if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_RALLYING_CRY))
391 return false;
392 return true;
393 }
394
396 {
398 }
399
400 void HandleScript(SpellEffIndex /*effIndex*/)
401 {
402 int32 basePoints0 = int32(GetHitUnit()->CountPctFromMaxHealth(GetEffectValue()));
403
404 GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_WARRIOR_RALLYING_CRY, &basePoints0, NULL, NULL, true);
405 }
406
411 };
412
417};
418
419// 94009 - Rend
421{
422public:
423 spell_warr_rend() : SpellScriptLoader("spell_warr_rend") { }
424
426 {
428
429 void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated)
430 {
431 if (Unit* caster = GetCaster())
432 {
433 canBeRecalculated = false;
434
435 // $0.25 * (($MWB + $mwb) / 2 + $AP / 14 * $MWS) bonus per tick
436 float ap = caster->GetTotalAttackPowerValue(WeaponAttackType::BASE_ATTACK);
437 int32 mws = caster->GetAttackTime(WeaponAttackType::BASE_ATTACK);
438 float mwbMin = caster->GetWeaponDamageRange(WeaponAttackType::BASE_ATTACK, WeaponDamageRange::MINDAMAGE);
439 float mwbMax = caster->GetWeaponDamageRange(WeaponAttackType::BASE_ATTACK, WeaponDamageRange::MAXDAMAGE);
440 float mwb = ((mwbMin + mwbMax) / 2 + ap * mws / 14000) * 0.25f;
441 amount += int32(caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), mwb));
442 }
443 }
444
449 };
450
452 {
453 return new spell_warr_rend_AuraScript();
454 }
455};
456
457// 20230 - Retaliation
459{
460public:
461 spell_warr_retaliation() : SpellScriptLoader("spell_warr_retaliation") { }
462
464 {
466
467 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
468 {
470 return false;
471 return true;
472 }
473
474 bool CheckProc(ProcEventInfo& eventInfo)
475 {
476 // check attack comes not from behind
477 return GetTarget()->isInFront(eventInfo.GetProcTarget(), M_PI);
478 }
479
480 void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
481 {
483 GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_WARRIOR_RETALIATION_DAMAGE, true, NULL, aurEff);
484 }
485
491 };
492
497};
498
499// 64380, 65941 - Shattering Throw
501{
502public:
503 spell_warr_shattering_throw() : SpellScriptLoader("spell_warr_shattering_throw") { }
504
506 {
508
510 {
511 PreventHitDefaultEffect(effIndex);
512
513 // remove shields, will still display immune to damage part
514 if (Unit* target = GetHitUnit())
515 target->RemoveAurasWithMechanic(1 << MECHANIC_IMMUNE_SHIELD, AURA_REMOVE_BY_ENEMY_SPELL);
516 }
517
522 };
523
528};
529
531{
532public:
533 spell_warr_second_wind_proc() : SpellScriptLoader("spell_warr_second_wind_proc") { }
534
536 {
538
539 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
540 {
545 return false;
546 return true;
547 }
548
549 bool CheckProc(ProcEventInfo& eventInfo)
550 {
551 if (eventInfo.GetProcTarget() == GetTarget())
552 return false;
553 if (!eventInfo.GetDamageInfo()->GetSpellInfo() || !(eventInfo.GetDamageInfo()->GetSpellInfo()->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))))
554 return false;
555 return true;
556 }
557
558 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
559 {
561 uint32 spellId = 0;
562
567 if (!spellId)
568 return;
569
570 GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff);
571 }
572
578 };
579
584};
585
587{
588public:
589 spell_warr_second_wind_trigger() : SpellScriptLoader("spell_warr_second_wind_trigger") { }
590
605
610};
611
612// 52437 - Sudden Death
614{
615public:
616 spell_warr_sudden_death() : SpellScriptLoader("spell_warr_sudden_death") { }
617
619 {
621
622 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
623 {
624 if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_COLOSSUS_SMASH))
625 return false;
626 return true;
627 }
628
629 void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
630 {
631 // Remove cooldown on Colossus Smash
632 if (Player* player = GetTarget()->ToPlayer())
633 player->RemoveSpellCooldown(SPELL_WARRIOR_COLOSSUS_SMASH, true);
634 }
635
640 };
641
646};
647
648// 12328, 18765, 35429 - Sweeping Strikes
650{
651public:
652 spell_warr_sweeping_strikes() : SpellScriptLoader("spell_warr_sweeping_strikes") { }
653
655 {
657
658 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
659 {
661 return false;
662 return true;
663 }
664
666 {
667 _procTarget = NULL;
668 return true;
669 }
670
671 bool CheckProc(ProcEventInfo& eventInfo)
672 {
673 _procTarget = eventInfo.GetActor()->SelectNearbyTarget(eventInfo.GetProcTarget());
674 return _procTarget;
675 }
676
677 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
678 {
681 }
682
688
689 private:
691 };
692
697};
698
699// -46951 - Sword and Board
701{
702public:
703 spell_warr_sword_and_board() : SpellScriptLoader("spell_warr_sword_and_board") { }
704
706 {
708
709 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
710 {
711 if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SHIELD_SLAM))
712 return false;
713 return true;
714 }
715
716 void OnProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
717 {
718 // Remove cooldown on Shield Slam
719 if (Player* player = GetTarget()->ToPlayer())
720 player->RemoveSpellCooldown(SPELL_WARRIOR_SHIELD_SLAM, true);
721 }
722
727 };
728
733};
734
735// 32216 - Victorious
736// 82368 - Victorious
762
763// 46968 - Shockwave
765{
766public:
767 spell_warr_shockwave() : SpellScriptLoader("spell_warr_shockwave") { }
768
806
807 SpellScript* GetSpellScript() const override
808 {
810 }
811};
812
@ IN_MILLISECONDS
Definition Common.h:125
#define M_PI
Definition Common.h:192
std::int32_t int32
Definition Define.h:73
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ TYPEID_PLAYER
Definition Object.h:55
SpellEffIndex
@ EFFECT_3
@ EFFECT_1
@ EFFECT_0
@ EFFECT_2
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_CHARGE
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ TARGET_UNIT_CONE_ENEMY_104
@ TARGET_UNIT_SRC_AREA_ENEMY
@ TARGET_UNIT_CASTER_AREA_RAID
@ MECHANIC_STUN
@ MECHANIC_ROOT
@ MECHANIC_IMMUNE_SHIELD
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_PROC_TRIGGER_SPELL
@ SPELL_AURA_PERIODIC_HEAL
@ SPELL_AURA_DUMMY
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
#define sSpellMgr
Definition SpellMgr.h:744
#define AuraEffectProcFn(F, I, N)
#define SpellEffectFn(F, I, N)
#define AuraEffectCalcAmountFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define SpellCastFn(F)
#define AuraCheckProcFn(F)
#define SpellHitFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
@ AURA_REMOVE_BY_ENEMY_SPELL
Definition Unit.h:409
bool roll_chance_i(int chance)
Definition Util.h:89
T CalculatePct(T base, U pct)
Definition Util.h:103
uint32 GetEffIndex() const
void PreventDefaultAction()
SpellInfo const * GetSpellInfo() const
HookList< EffectApplyHandler > AfterEffectApply
HookList< EffectCalcAmountHandler > DoEffectCalcAmount
Unit * GetCaster() const
Unit * GetTarget() const
HookList< CheckProcHandler > DoCheckProc
HookList< EffectProcHandler > OnEffectProc
Unit * GetUnitOwner() const
uint32 GetId() const
SpellInfo const * GetSpellInfo() const
Definition Unit.h:907
Player * ToPlayer()
Definition Object.h:204
TypeID GetTypeId() const
Definition Object.h:131
void ModifySpellCooldown(uint32 spellId, int32 cooldown)
Definition Player.cpp:17641
DamageInfo * GetDamageInfo() const
Definition Unit.h:985
Unit * GetProcTarget() const
Definition Unit.h:974
Unit * GetActor() const
Definition Unit.h:972
uint32 GetAllEffectsMechanicMask() const
HookList< CastHandler > AfterCast
SpellInfo const * GetSpellInfo()
HookList< HitHandler > OnHit
HookList< EffectHandler > OnEffectHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
HookList< EffectHandler > OnEffectHitTarget
Unit * GetHitUnit()
int32 GetEffectValue()
WorldObject * GetExplTargetWorldObject()
void SetHitDamage(int32 damage)
Unit * GetCaster()
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
int32 GetHitDamage()
SpellScriptLoader(const char *name)
Definition Unit.h:1367
Unit * SelectNearbyTarget(Unit *exclude=NULL, float dist=NOMINAL_MELEE_RANGE) const
Definition Unit.cpp:6043
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
void CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
uint32 CountPctFromMaxHealth(int32 pct) const
Definition Unit.h:1633
bool isInFront(WorldObject const *target, float arc=M_PI) const
Definition Object.cpp:1940
PrepareSpellScript(spell_warr_bloodthirst_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_warr_charge_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_warr_concussion_blow_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_warr_deep_wounds_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_warr_execute_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_warr_last_stand_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_warr_rallying_cry_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
void CalculateAmount(AuraEffect const *aurEff, int32 &amount, bool &canBeRecalculated)
PrepareAuraScript(spell_warr_rend_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
void HandleEffectProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
PrepareAuraScript(spell_warr_retaliation_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &)
AuraScript * GetAuraScript() const OVERRIDE
void CalculateAmount(AuraEffect const *, int32 &amount, bool &)
AuraScript * GetAuraScript() const OVERRIDE
PrepareSpellScript(spell_warr_shattering_throw_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_warr_shockwave_SpellScript)
void CountTargets(std::list< WorldObject * > &targetList)
SpellScript * GetSpellScript() const override
void HandleApply(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_warr_sudden_death_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &)
AuraScript * GetAuraScript() const OVERRIDE
PrepareAuraScript(spell_warr_sword_and_board_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
PrepareAuraScript(spell_warr_victorious_AuraScript)
void HandleEffectProc(AuraEffect const *, ProcEventInfo &)
AuraScript * GetAuraScript() const OVERRIDE
MiscSpells
@ SPELL_PALADIN_BLESSING_OF_SANCTUARY
@ SPELL_PALADIN_GREATER_BLESSING_OF_SANCTUARY
@ SPELL_PRIEST_RENEWED_HOPE
@ SPELL_WARRIOR_BLOODTHIRST_HEAL
@ SPELL_WARRIOR_RETALIATION_DAMAGE
@ SPELL_WARRIOR_BLOODSURGE
@ SPELL_WARRIOR_RALLYING_CRY
@ SPELL_WARRIOR_SECOUND_WIND_PROC_RANK_1
@ SPELL_WARRIOR_T16_DPS_4P_BONUS
@ SPELL_WARRIOR_BLOODSURGE_EFFECT
@ SPELL_WARRIOR_SHOCKWAVE_STUN
@ SPELL_WARRIOR_LAST_STAND_TRIGGERED
@ SPELL_WARRIOR_CHARGE
@ SPELL_WARRIOR_SHIELD_SLAM
@ SPELL_WARRIOR_SECOUND_WIND_PROC_RANK_2
@ SPELL_WARRIOR_T16_DPS_4P_BONUS_PROC
@ SPELL_WARRIOR_COLOSSUS_SMASH
@ SPELL_WARRIOR_MORTAL_STRIKE_AURA
@ SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK
@ SPELL_WARRIOR_WARBRINGER_SLOW
@ SPELL_WARRIOR_SECOUND_WIND_TRIGGER_RANK_2
@ SPELL_WARRIOR_BLOOD_AND_THUNDER
@ SPELL_WARRIOR_BLOODTHIRST_DAMAGE
@ SPELL_WARRIOR_WARBRINGER
@ SPELL_WARRIOR_CHARGE_STUN
@ SPELL_WARRIOR_DEEP_WOUNDS
@ SPELL_WARRIOR_SECOUND_WIND_TRIGGER_RANK_1
@ SPELL_WARRIOR_WARBRINGER_ROOT
@ SPELL_WARRIOR_THUNDER_CLAP
void AddSC_warrior_spell_scripts()
WarriorSpellIcons
@ WARRIOR_ICON_ID_SUDDEN_DEATH