diff options
author | joschiwald <joschiwald@online.de> | 2013-07-18 23:01:14 +0200 |
---|---|---|
committer | joschiwald <joschiwald@online.de> | 2013-07-18 23:01:14 +0200 |
commit | 06d54ba4386384e38f2d8c9e9d840f6629d1a1a9 (patch) | |
tree | f61031facabe06d20cddf758da394ebef9a43808 /src | |
parent | 4ba3c2e51df0485449a4bd01f162faa719334be9 (diff) |
Scripts/VaultOfArchavon/Koralon: Fix Meteor Fists
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp | 165 |
1 files changed, 135 insertions, 30 deletions
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp index f259fbf2b78..ad65fcc83fd 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp @@ -17,6 +17,8 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellAuraEffects.h" +#include "SpellScript.h" #include "vault_of_archavon.h" enum Events @@ -24,14 +26,12 @@ enum Events // Koralon EVENT_BURNING_BREATH = 1, EVENT_BURNING_FURY = 2, - EVENT_FLAME_CINDER_A = 3, - EVENT_METEOR_FISTS_A = 4, - EVENT_METEOR_FISTS_B = 5, + EVENT_FLAME_CINDER = 3, + EVENT_METEOR_FISTS = 4, // Flame Warder - EVENT_FW_LAVA_BIRST = 6, - EVENT_FW_METEOR_FISTS_A = 7, - EVENT_FW_METEOR_FISTS_B = 8, + EVENT_FW_LAVA_BIRST = 5, + EVENT_FW_METEOR_FISTS = 6 }; enum Spells @@ -41,13 +41,13 @@ enum Spells SPELL_BURNING_FURY = 66721, SPELL_FLAME_CINDER_A = 66684, SPELL_FLAME_CINDER_B = 66681, // don't know the real relation to SPELL_FLAME_CINDER_A atm. - SPELL_METEOR_FISTS_A = 66725, - SPELL_METEOR_FISTS_B = 67333, + SPELL_METEOR_FISTS = 66725, + SPELL_METEOR_FISTS_DAMAGE = 66765, // Spells Flame Warder SPELL_FW_LAVA_BIRST = 66813, - SPELL_FW_METEOR_FISTS_A = 66808, - SPELL_FW_METEOR_FISTS_B = 67331, + SPELL_FW_METEOR_FISTS = 66808, + SPELL_FW_METEOR_FISTS_DAMAGE = 66809 }; class boss_koralon : public CreatureScript @@ -67,8 +67,8 @@ class boss_koralon : public CreatureScript events.ScheduleEvent(EVENT_BURNING_FURY, 20000); /// @todo check timer events.ScheduleEvent(EVENT_BURNING_BREATH, 15000); // 1st after 15sec, then every 45sec - events.ScheduleEvent(EVENT_METEOR_FISTS_A, 75000); // 1st after 75sec, then every 45sec - events.ScheduleEvent(EVENT_FLAME_CINDER_A, 30000); /// @todo check timer + events.ScheduleEvent(EVENT_METEOR_FISTS, 75000); // 1st after 75sec, then every 45sec + events.ScheduleEvent(EVENT_FLAME_CINDER, 30000); /// @todo check timer _EnterCombat(); } @@ -95,17 +95,13 @@ class boss_koralon : public CreatureScript DoCast(me, SPELL_BURNING_BREATH); events.ScheduleEvent(EVENT_BURNING_BREATH, 45000); break; - case EVENT_METEOR_FISTS_A: - DoCast(me, SPELL_METEOR_FISTS_A); - events.ScheduleEvent(EVENT_METEOR_FISTS_B, 1500); + case EVENT_METEOR_FISTS: + DoCast(me, SPELL_METEOR_FISTS); + events.ScheduleEvent(EVENT_METEOR_FISTS, 45000); break; - case EVENT_METEOR_FISTS_B: - DoCast(me, SPELL_METEOR_FISTS_B); - events.ScheduleEvent(EVENT_METEOR_FISTS_A, 45000); - break; - case EVENT_FLAME_CINDER_A: + case EVENT_FLAME_CINDER: DoCast(me, SPELL_FLAME_CINDER_A); - events.ScheduleEvent(EVENT_FLAME_CINDER_A, 30000); + events.ScheduleEvent(EVENT_FLAME_CINDER, 30000); break; default: break; @@ -123,7 +119,7 @@ class boss_koralon : public CreatureScript }; /*###### -## Mob Flame Warder +## Npc Flame Warder ######*/ class npc_flame_warder : public CreatureScript { @@ -146,7 +142,7 @@ class npc_flame_warder : public CreatureScript DoZoneInCombat(); events.ScheduleEvent(EVENT_FW_LAVA_BIRST, 5000); - events.ScheduleEvent(EVENT_FW_METEOR_FISTS_A, 10000); + events.ScheduleEvent(EVENT_FW_METEOR_FISTS, 10000); } void UpdateAI(uint32 diff) OVERRIDE @@ -164,13 +160,9 @@ class npc_flame_warder : public CreatureScript DoCastVictim(SPELL_FW_LAVA_BIRST); events.ScheduleEvent(EVENT_FW_LAVA_BIRST, 15000); break; - case EVENT_FW_METEOR_FISTS_A: - DoCast(me, SPELL_FW_METEOR_FISTS_A); - events.ScheduleEvent(EVENT_FW_METEOR_FISTS_B, 1500); - break; - case EVENT_FW_METEOR_FISTS_B: - DoCast(me, SPELL_FW_METEOR_FISTS_B); - events.ScheduleEvent(EVENT_FW_METEOR_FISTS_A, 20000); + case EVENT_FW_METEOR_FISTS: + DoCast(me, SPELL_FW_METEOR_FISTS); + events.ScheduleEvent(EVENT_FW_METEOR_FISTS, 20000); break; default: break; @@ -190,8 +182,121 @@ class npc_flame_warder : public CreatureScript } }; +class spell_koralon_meteor_fists : public SpellScriptLoader +{ + public: + spell_koralon_meteor_fists() : SpellScriptLoader("spell_koralon_meteor_fists") { } + + class spell_koralon_meteor_fists_AuraScript : public AuraScript + { + PrepareAuraScript(spell_koralon_meteor_fists_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(SPELL_METEOR_FISTS_DAMAGE)) + return false; + return true; + } + + void TriggerFists(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_METEOR_FISTS_DAMAGE, true, NULL, aurEff); + } + + void Register() OVERRIDE + { + OnEffectProc += AuraEffectProcFn(spell_koralon_meteor_fists_AuraScript::TriggerFists, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const OVERRIDE + { + return new spell_koralon_meteor_fists_AuraScript(); + } +}; + +class spell_koralon_meteor_fists_damage : public SpellScriptLoader +{ + public: + spell_koralon_meteor_fists_damage() : SpellScriptLoader("spell_koralon_meteor_fists_damage") { } + + class spell_koralon_meteor_fists_damage_SpellScript : public SpellScript + { + PrepareSpellScript(spell_koralon_meteor_fists_damage_SpellScript); + + bool Load() OVERRIDE + { + _chainTargets = 0; + return true; + } + + void FilterTargets(std::list<WorldObject*>& targets) + { + _chainTargets = targets.size(); + } + + void CalculateSplitDamage() + { + if (_chainTargets) + SetHitDamage(GetHitDamage() / (_chainTargets + 1)); + } + + void Register() OVERRIDE + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_koralon_meteor_fists_damage_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_TARGET_ENEMY); + OnHit += SpellHitFn(spell_koralon_meteor_fists_damage_SpellScript::CalculateSplitDamage); + } + + private: + uint8 _chainTargets; + }; + + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_koralon_meteor_fists_damage_SpellScript(); + } +}; + +class spell_flame_warder_meteor_fists : public SpellScriptLoader +{ + public: + spell_flame_warder_meteor_fists() : SpellScriptLoader("spell_flame_warder_meteor_fists") { } + + class spell_flame_warder_meteor_fists_AuraScript : public AuraScript + { + PrepareAuraScript(spell_flame_warder_meteor_fists_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(SPELL_FW_METEOR_FISTS_DAMAGE)) + return false; + return true; + } + + void TriggerFists(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_FW_METEOR_FISTS_DAMAGE, true, NULL, aurEff); + } + + void Register() OVERRIDE + { + OnEffectProc += AuraEffectProcFn(spell_flame_warder_meteor_fists_AuraScript::TriggerFists, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const OVERRIDE + { + return new spell_flame_warder_meteor_fists_AuraScript(); + } +}; + void AddSC_boss_koralon() { new boss_koralon(); new npc_flame_warder(); + new spell_koralon_meteor_fists(); + new spell_koralon_meteor_fists_damage(); + new spell_flame_warder_meteor_fists(); } |