diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 23 | ||||
-rw-r--r-- | src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp | 51 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_warrior.cpp | 90 |
3 files changed, 141 insertions, 23 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index df871820bc2..5c4e415d5d2 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -5528,29 +5528,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere triggered_spell_id = 22858; break; } - // Second Wind - if (dummySpell->SpellIconID == 1697) - { - // only for spells and hit/crit (trigger start always) and not start from self casted spells (5530 Mace Stun Effect for example) - if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) || this == victim) - return false; - // Need stun or root mechanic - if (!(procSpell->GetAllEffectsMechanicMask() & ((1<<MECHANIC_ROOT)|(1<<MECHANIC_STUN)))) - return false; - - switch (dummySpell->Id) - { - case 29838: triggered_spell_id=29842; break; - case 29834: triggered_spell_id=29841; break; - case 42770: triggered_spell_id=42771; break; - default: - TC_LOG_ERROR(LOG_FILTER_UNITS, "Unit::HandleDummyAuraProc: non handled spell id: %u (SW)", dummySpell->Id); - return false; - } - - target = this; - break; - } // Glyph of Sunder Armor if (dummySpell->Id == 58387) { diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp index 9c086d8bd81..1cd0fde4107 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp @@ -21,6 +21,11 @@ #include "SpellScript.h" #include "SpellAuraEffects.h" +enum Spells +{ + SPELL_UK_SECOUND_WIND_TRIGGER = 42771 +}; + uint32 entry_search[3] = { 186609, @@ -337,10 +342,56 @@ public: } }; +class spell_uk_second_wind_proc : public SpellScriptLoader +{ + public: + spell_uk_second_wind_proc() : SpellScriptLoader("spell_uk_second_wind_proc") { } + + class spell_uk_second_wind_proc_AuraScript : public AuraScript + { + PrepareAuraScript(spell_uk_second_wind_proc_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(SPELL_UK_SECOUND_WIND_TRIGGER)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (eventInfo.GetProcTarget() == GetTarget()) + return false; + if (!(eventInfo.GetDamageInfo() || eventInfo.GetDamageInfo()->GetSpellInfo()->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN)))) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->CastCustomSpell(SPELL_UK_SECOUND_WIND_TRIGGER, SPELLVALUE_BASE_POINT0, 5, GetTarget(), true, NULL, aurEff); + } + + void Register() OVERRIDE + { + DoCheckProc += AuraCheckProcFn(spell_uk_second_wind_proc_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_uk_second_wind_proc_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + + }; + + AuraScript* GetAuraScript() const OVERRIDE + { + return new spell_uk_second_wind_proc_AuraScript(); + } +}; + void AddSC_utgarde_keep() { new npc_dragonflayer_forge_master(); new npc_enslaved_proto_drake(); new spell_ticking_time_bomb(); new spell_fixate(); + new spell_uk_second_wind_proc(); } diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index ad1decb02a8..691264015a1 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -42,6 +42,10 @@ enum WarriorSpells SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT = 64976, SPELL_WARRIOR_LAST_STAND_TRIGGERED = 12976, SPELL_WARRIOR_RALLYING_CRY = 97463, + SPELL_WARRIOR_SECOUND_WIND_PROC_RANK_1 = 29834, + SPELL_WARRIOR_SECOUND_WIND_PROC_RANK_2 = 29838, + SPELL_WARRIOR_SECOUND_WIND_TRIGGER_RANK_1 = 29841, + SPELL_WARRIOR_SECOUND_WIND_TRIGGER_RANK_2 = 29842, SPELL_WARRIOR_SLAM = 50782, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK = 26654, SPELL_WARRIOR_TAUNT = 355, @@ -590,6 +594,90 @@ class spell_warr_slam : public SpellScriptLoader } }; +class spell_warr_second_wind_proc : public SpellScriptLoader +{ + public: + spell_warr_second_wind_proc() : SpellScriptLoader("spell_warr_second_wind_proc") { } + + class spell_warr_second_wind_proc_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_second_wind_proc_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SECOUND_WIND_PROC_RANK_1) || + !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SECOUND_WIND_PROC_RANK_2) || + !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SECOUND_WIND_TRIGGER_RANK_1) || + !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SECOUND_WIND_TRIGGER_RANK_2)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (eventInfo.GetProcTarget() == GetTarget()) + return false; + if (!(eventInfo.GetDamageInfo() || eventInfo.GetDamageInfo()->GetSpellInfo()->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN)))) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + uint32 spellId = 0; + + if (GetSpellInfo()->Id == SPELL_WARRIOR_SECOUND_WIND_PROC_RANK_1) + spellId = SPELL_WARRIOR_SECOUND_WIND_TRIGGER_RANK_1; + else if (GetSpellInfo()->Id == SPELL_WARRIOR_SECOUND_WIND_PROC_RANK_2) + spellId = SPELL_WARRIOR_SECOUND_WIND_TRIGGER_RANK_2; + if (!spellId) + return; + + GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff); + + } + + void Register() OVERRIDE + { + DoCheckProc += AuraCheckProcFn(spell_warr_second_wind_proc_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_warr_second_wind_proc_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + + }; + + AuraScript* GetAuraScript() const OVERRIDE + { + return new spell_warr_second_wind_proc_AuraScript(); + } +}; + +class spell_warr_second_wind_trigger : public SpellScriptLoader +{ + public: + spell_warr_second_wind_trigger() : SpellScriptLoader("spell_warr_second_wind_trigger") { } + + class spell_warr_second_wind_trigger_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_second_wind_trigger_AuraScript); + + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + { + amount = int32(GetUnitOwner()->CountPctFromMaxHealth(amount)); + } + + void Register() OVERRIDE + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warr_second_wind_trigger_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_PERIODIC_HEAL); + } + }; + + AuraScript* GetAuraScript() const OVERRIDE + { + return new spell_warr_second_wind_trigger_AuraScript(); + } +}; + // 12328, 18765, 35429 - Sweeping Strikes class spell_warr_sweeping_strikes : public SpellScriptLoader { @@ -780,6 +868,8 @@ void AddSC_warrior_spell_scripts() new spell_warr_overpower(); new spell_warr_rallying_cry(); new spell_warr_rend(); + new spell_warr_second_wind_proc(); + new spell_warr_second_wind_trigger(); new spell_warr_shattering_throw(); new spell_warr_slam(); new spell_warr_sweeping_strikes(); |