diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Spells/spell_monk.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/server/scripts/Spells/spell_monk.cpp b/src/server/scripts/Spells/spell_monk.cpp index 3190821f404..7ac66095f98 100644 --- a/src/server/scripts/Spells/spell_monk.cpp +++ b/src/server/scripts/Spells/spell_monk.cpp @@ -37,6 +37,9 @@ enum MonkSpells SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK_CD = 117953, SPELL_MONK_PROVOKE_SINGLE_TARGET = 116189, SPELL_MONK_PROVOKE_AOE = 118635, + SPELL_MONK_NO_FEATHER_FALL = 79636, + SPELL_MONK_ROLL_BACKWARD = 109131, + SPELL_MONK_ROLL_FORWARD = 107427, SPELL_MONK_SOOTHING_MIST = 115175, SPELL_MONK_STANCE_OF_THE_SPIRITED_CRANE = 154436, SPELL_MONK_STAGGER_DAMAGE_AURA = 124255, @@ -164,6 +167,77 @@ class spell_monk_provoke : public SpellScript } }; +// 109132 - Roll +class spell_monk_roll : public SpellScript +{ + PrepareSpellScript(spell_monk_roll); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MONK_ROLL_BACKWARD, SPELL_MONK_ROLL_FORWARD, SPELL_MONK_NO_FEATHER_FALL }); + } + + SpellCastResult CheckCast() + { + if (GetCaster()->HasUnitState(UNIT_STATE_ROOT)) + return SPELL_FAILED_ROOTED; + return SPELL_CAST_OK; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetCaster(), GetCaster()->HasUnitMovementFlag(MOVEMENTFLAG_BACKWARD) ? SPELL_MONK_ROLL_BACKWARD : SPELL_MONK_ROLL_FORWARD, + TRIGGERED_IGNORE_CAST_IN_PROGRESS); + GetCaster()->CastSpell(GetCaster(), SPELL_MONK_NO_FEATHER_FALL, true); + } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_monk_roll::CheckCast); + OnEffectHitTarget += SpellEffectFn(spell_monk_roll::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 107427 - Roll +// 109131 - Roll (backward) +class spell_monk_roll_aura : public AuraScript +{ + PrepareAuraScript(spell_monk_roll_aura); + + void CalcMovementAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + amount += 100; + } + + void CalcImmunityAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + amount -= 100; + } + + void ChangeRunBackSpeed(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->SetSpeed(MOVE_RUN_BACK, GetTarget()->GetSpeed(MOVE_RUN)); + } + + void RestoreRunBackSpeed(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->UpdateSpeed(MOVE_RUN_BACK); + } + + void Register() override + { + // Values need manual correction + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_monk_roll_aura::CalcMovementAmount, EFFECT_0, SPELL_AURA_MOD_SPEED_NO_CONTROL); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_monk_roll_aura::CalcMovementAmount, EFFECT_2, SPELL_AURA_MOD_MINIMUM_SPEED); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_monk_roll_aura::CalcImmunityAmount, EFFECT_5, SPELL_AURA_MECHANIC_IMMUNITY); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_monk_roll_aura::CalcImmunityAmount, EFFECT_6, SPELL_AURA_MECHANIC_IMMUNITY); + + // This is a special aura that sets backward run speed equal to forward speed + AfterEffectApply += AuraEffectApplyFn(spell_monk_roll_aura::ChangeRunBackSpeed, EFFECT_4, SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectApplyFn(spell_monk_roll_aura::RestoreRunBackSpeed, EFFECT_4, SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED, AURA_EFFECT_HANDLE_REAL); + } +}; + // Utility for stagger scripts Aura* FindExistingStaggerEffect(Unit* unit) { @@ -392,6 +466,8 @@ void AddSC_monk_spell_scripts() RegisterSpellScript(spell_monk_crackling_jade_lightning); RegisterSpellScript(spell_monk_crackling_jade_lightning_knockback_proc_aura); RegisterSpellScript(spell_monk_provoke); + RegisterSpellScript(spell_monk_roll); + RegisterSpellScript(spell_monk_roll_aura); RegisterSpellScript(spell_monk_stagger); RegisterSpellScript(spell_monk_stagger_damage_aura); RegisterSpellScript(spell_monk_stagger_debuff_aura); |