aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/6.x/2016_06_17_01_world.sql3
-rw-r--r--src/server/scripts/Spells/spell_monk.cpp74
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();
}