diff options
-rw-r--r-- | sql/updates/world/2013_07_18_01_world_koralon.sql | 15 | ||||
-rw-r--r-- | src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp | 165 |
2 files changed, 150 insertions, 30 deletions
diff --git a/sql/updates/world/2013_07_18_01_world_koralon.sql b/sql/updates/world/2013_07_18_01_world_koralon.sql new file mode 100644 index 00000000000..a67df5222ca --- /dev/null +++ b/sql/updates/world/2013_07_18_01_world_koralon.sql @@ -0,0 +1,15 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` IN (66725,68161,66808,68160,66765,67333,66809,67331); +INSERT INTO `spell_script_names` (`spell_id` ,`ScriptName`) VALUES +(66725, 'spell_koralon_meteor_fists'), +(68161, 'spell_koralon_meteor_fists'), +(66808, 'spell_flame_warder_meteor_fists'), +(68160, 'spell_flame_warder_meteor_fists'), +(66765, 'spell_koralon_meteor_fists_damage'), +(67333, 'spell_koralon_meteor_fists_damage'), +(66809, 'spell_koralon_meteor_fists_damage'), +(67331, 'spell_koralon_meteor_fists_damage'); + +DELETE FROM `spell_proc_event` WHERE `entry` IN (66808,68160); +INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`procFlags`,`procEx`,`ppmRate`,`CustomChance`,`Cooldown`) VALUES +(66808,0,0,0,0,0,0x4,0,0,0,0), +(68160,0,0,0,0,0,0x4,0,0,0,0); 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(); } |