diff options
| -rw-r--r-- | sql/updates/world/6.x/2016_06_17_01_world.sql | 3 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_monk.cpp | 74 |
2 files changed, 71 insertions, 6 deletions
diff --git a/sql/updates/world/6.x/2016_06_17_01_world.sql b/sql/updates/world/6.x/2016_06_17_01_world.sql new file mode 100644 index 00000000000..e5bc16000ce --- /dev/null +++ b/sql/updates/world/6.x/2016_06_17_01_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_monk_provoke'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(115546,'spell_monk_provoke'); diff --git a/src/server/scripts/Spells/spell_monk.cpp b/src/server/scripts/Spells/spell_monk.cpp index 904089bc451..e87a76c3e9f 100644 --- a/src/server/scripts/Spells/spell_monk.cpp +++ b/src/server/scripts/Spells/spell_monk.cpp @@ -28,12 +28,13 @@ enum MonkSpells { - SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHANNEL = 117952, - SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHI_PROC = 123333, - SPELL_MONK_STANCE_OF_THE_SPIRITED_CRANE = 154436, - - SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK = 117962, - SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK_CD = 117953, + SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHANNEL = 117952, + SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHI_PROC = 123333, + SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK = 117962, + SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK_CD = 117953, + SPELL_MONK_PROVOKE_SINGLE_TARGET = 116189, + SPELL_MONK_PROVOKE_AOE = 118635, + SPELL_MONK_STANCE_OF_THE_SPIRITED_CRANE = 154436, }; // 117952 - Crackling Jade Lightning @@ -125,8 +126,69 @@ public: } }; +// 115546 - Provoke +class spell_monk_provoke : public SpellScriptLoader +{ +public: + spell_monk_provoke() : SpellScriptLoader("spell_monk_provoke") { } + + class spell_monk_provoke_SpellScript : public SpellScript + { + PrepareSpellScript(spell_monk_provoke_SpellScript); + + static uint32 const BlackOxStatusEntry = 61146; + + bool Validate(SpellInfo const* spellInfo) override + { + if (!(spellInfo->GetExplicitTargetMask() & TARGET_FLAG_UNIT_MASK)) // ensure GetExplTargetUnit() will return something meaningful during CheckCast + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_MONK_PROVOKE_SINGLE_TARGET)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_MONK_PROVOKE_AOE)) + return false; + return true; + } + + SpellCastResult CheckExplicitTarget() + { + if (GetExplTargetUnit()->GetEntry() != BlackOxStatusEntry) + { + SpellInfo const* singleTarget = sSpellMgr->AssertSpellInfo(SPELL_MONK_PROVOKE_SINGLE_TARGET); + SpellCastResult singleTargetExplicitResult = singleTarget->CheckExplicitTarget(GetCaster(), GetExplTargetUnit()); + if (singleTargetExplicitResult != SPELL_CAST_OK) + return singleTargetExplicitResult; + } + else if (GetExplTargetUnit()->GetOwnerGUID() != GetCaster()->GetGUID()) + return SPELL_FAILED_BAD_TARGETS; + + return SPELL_CAST_OK; + } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (GetHitUnit()->GetEntry() != BlackOxStatusEntry) + GetCaster()->CastSpell(GetHitUnit(), SPELL_MONK_PROVOKE_SINGLE_TARGET, true); + else + GetCaster()->CastSpell(GetHitUnit(), SPELL_MONK_PROVOKE_AOE, true); + } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_monk_provoke_SpellScript::CheckExplicitTarget); + OnEffectHitTarget += SpellEffectFn(spell_monk_provoke_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_monk_provoke_SpellScript(); + } +}; + void AddSC_monk_spell_scripts() { new spell_monk_crackling_jade_lightning(); new spell_monk_crackling_jade_lightning_knockback_proc_aura(); + new spell_monk_provoke(); } |
