aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Scripting/ScriptLoader.cpp14
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp864
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h51
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_ascendant_lord_obsidius.cpp112
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_beauty.cpp118
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_corla.cpp92
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_karsh_steelbender.cpp113
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_romogg_bonecrusher.cpp140
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp87
-rw-r--r--src/server/scripts/EasternKingdoms/CMakeLists.txt8
10 files changed, 1599 insertions, 0 deletions
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index 4b68aa6648b..bff413d73f4 100644
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -112,6 +112,13 @@ void AddSC_boss_alizabal(); //Baradin Hold
void AddSC_boss_occuthar();
void AddSC_boss_pit_lord_argaloth();
void AddSC_instance_baradin_hold();
+void AddSC_boss_romogg_bonecrusher(); //Blackrock Caverns
+void AddSC_boss_corla();
+void AddSC_boss_karsh_steelbender();
+void AddSC_boss_beauty();
+void AddSC_boss_ascendant_lord_obsidius();
+void AddSC_blackrock_caverns();
+void AddSC_instance_blackrock_caverns();
void AddSC_blackrock_depths(); //Blackrock Depths
void AddSC_boss_ambassador_flamelash();
void AddSC_boss_anubshiah();
@@ -832,6 +839,13 @@ void AddEasternKingdomsScripts()
AddSC_boss_occuthar();
AddSC_boss_pit_lord_argaloth();
AddSC_instance_baradin_hold();
+ AddSC_boss_romogg_bonecrusher(); //Blackrock Caverns
+ AddSC_boss_corla();
+ AddSC_boss_karsh_steelbender();
+ AddSC_boss_beauty();
+ AddSC_boss_ascendant_lord_obsidius();
+ AddSC_blackrock_caverns();
+ AddSC_instance_blackrock_caverns();
AddSC_blackrock_depths(); //Blackrock Depths
AddSC_boss_ambassador_flamelash();
AddSC_boss_anubshiah();
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp
new file mode 100644
index 00000000000..9261eb85ba7
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp
@@ -0,0 +1,864 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "blackrock_caverns.h"
+#include "SpellScript.h"
+#include "SpellAuras.h"
+#include "player.h"
+
+/*#####
+# npc_fire_cyclone
+#####*/
+
+enum FireCycloneSpells
+{
+ SPELL_FIRE_CYCLONE_AURA = 74851
+};
+
+enum FireCycloneEvents
+{
+ EVENT_FIRE_CYCLONE_AURA = 1
+};
+
+class npc_fire_cyclone : public CreatureScript
+{
+ public: npc_fire_cyclone() : CreatureScript("npc_fire_cyclone") {}
+
+ struct npc_fire_cycloneAI : public ScriptedAI
+ {
+ npc_fire_cycloneAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
+
+ void Reset() override
+ {
+ me->AddUnitState(UNIT_STATE_ROOT);
+ _events.ScheduleEvent(EVENT_FIRE_CYCLONE_AURA, 100);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_FIRE_CYCLONE_AURA:
+ DoCast(me, SPELL_FIRE_CYCLONE_AURA, true);
+ _events.ScheduleEvent(EVENT_FIRE_CYCLONE_AURA, 4000);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ private:
+ EventMap _events;
+ InstanceScript* _instance;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetBlackrockCavernsAI<npc_fire_cycloneAI>(creature);
+ }
+};
+
+/*#####
+# npc_twilight_flame_caller
+#####*/
+
+enum TwilightFlameCallerSpells
+{
+ SPELL_FIRE_CHANNELING_1 = 74911,
+ SPELL_FIRE_CHANNELING_2 = 74912,
+ SPELL_BLAST_WAVE = 76473,
+ SPELL_CALL_FLAMES = 76325
+
+};
+
+enum TwilightFlameCallerEvents
+{
+ EVENT_CHANNEL = 2,
+ EVENT_BLAST_WAVE = 3,
+ EVENT_CALL_FLAMES = 4
+};
+
+class npc_twilight_flame_caller : public CreatureScript
+{
+ public: npc_twilight_flame_caller() : CreatureScript("npc_twilight_flame_caller") {}
+
+ struct npc_twilight_flame_callerAI : public ScriptedAI
+ {
+ npc_twilight_flame_callerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
+
+ void Reset() override
+ {
+ _flamecaller1GUID = 0;
+ _flamecaller2GUID = 0;
+ if (me->GetPositionX() > 172 && me->GetPositionX() < 173 && me->GetPositionY() > 1086 && me->GetPositionY() < 1087)
+ _flamecaller1GUID = me->GetGUID();
+ if (me->GetPositionX() > 247 && me->GetPositionX() < 248 && me->GetPositionY() > 1081 && me->GetPositionY() < 1082)
+ _flamecaller2GUID = me->GetGUID();
+ _events.ScheduleEvent(EVENT_CHANNEL, 100);
+ }
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _events.ScheduleEvent(EVENT_BLAST_WAVE, urand(8000, 10000));
+ _events.ScheduleEvent(EVENT_CALL_FLAMES, urand(10000, 14000));
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+
+ _events.Update(diff);
+
+ if (!UpdateVictim())
+ {
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_CHANNEL:
+ if (me->GetGUID() == _flamecaller1GUID)
+ DoCast(me, SPELL_FIRE_CHANNELING_1);
+ if (me->GetGUID() == _flamecaller2GUID)
+ DoCast(me, SPELL_FIRE_CHANNELING_2);
+ _events.ScheduleEvent(EVENT_CHANNEL, 12000);
+ break;
+ default:
+ break;
+ }
+ }
+ return;
+ }
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_BLAST_WAVE:
+ DoCast(me, SPELL_BLAST_WAVE);
+ _events.ScheduleEvent(EVENT_BLAST_WAVE, 16000, 20000);
+ break;
+ case EVENT_CALL_FLAMES:
+ DoCast(me, SPELL_CALL_FLAMES);
+ _events.ScheduleEvent(EVENT_CALL_FLAMES, 12000, 15000);
+ break;
+ default:
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ EventMap _events;
+ InstanceScript* _instance;
+ uint64 _flamecaller1GUID;
+ uint64 _flamecaller2GUID;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetBlackrockCavernsAI<npc_twilight_flame_callerAI>(creature);
+ }
+};
+
+/*#####
+# npc_twilight_torturer
+#####*/
+
+enum TwilightTorturerSpells
+{
+ SPELL_INFLICT_PAIN = 75590,
+ SPELL_RED_HOT_POKER = 76478,
+ SPELL_SHACKLES = 76484,
+ SPELL_WILD_BEATDOWN = 76487
+};
+
+enum TwilightTorturerEvents
+{
+ EVENT_INFLICT_PAIN_TT = 5,
+ EVENT_RED_HOT_POKER = 6,
+ EVENT_SHACKLES = 7,
+ EVENT_WILD_BEATDOWN = 8
+};
+
+class npc_twilight_torturer : public CreatureScript
+{
+ public: npc_twilight_torturer() : CreatureScript("npc_twilight_torturer") {}
+
+ struct npc_twilight_torturerAI : public ScriptedAI
+ {
+ npc_twilight_torturerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
+
+ void Reset() override
+ {
+ }
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _events.ScheduleEvent(EVENT_RED_HOT_POKER, 9000);
+ _events.ScheduleEvent(EVENT_SHACKLES, 13000);
+ _events.ScheduleEvent(EVENT_WILD_BEATDOWN, 17000);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+
+ _events.Update(diff);
+
+ if (!UpdateVictim())
+ {
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_INFLICT_PAIN_TT:
+ DoCast(me, SPELL_INFLICT_PAIN);
+ _events.ScheduleEvent(EVENT_INFLICT_PAIN_TT, urand(25000, 32000));
+ break;
+ default:
+ break;
+ }
+ }
+ return;
+ }
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_RED_HOT_POKER:
+ DoCast(me, SPELL_RED_HOT_POKER);
+ _events.ScheduleEvent(EVENT_RED_HOT_POKER, 16000, 20000);
+ break;
+ case EVENT_SHACKLES:
+ DoCast(me, SPELL_SHACKLES);
+ _events.ScheduleEvent(EVENT_SHACKLES, 12000, 15000);
+ break;
+ case EVENT_WILD_BEATDOWN:
+ DoCast(me, SPELL_WILD_BEATDOWN);
+ _events.ScheduleEvent(EVENT_WILD_BEATDOWN, 12000, 15000);
+ break;
+ default:
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ EventMap _events;
+ InstanceScript* _instance;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetBlackrockCavernsAI<npc_twilight_torturerAI>(creature);
+ }
+};
+
+/*#####
+# npc_twilight_sadist
+#####*/
+
+enum TwilightSadistSpells
+{
+ SPELL_INFLICT_PAIN_1 = 76497,
+ SPELL_HEAT_SEEKER_BLADE = 76502,
+ SPELL_SHORT_THROW = 76572,
+ SPELL_SINISTER_STRIKE = 76500
+};
+
+enum TwilightSadistEvents
+{
+ EVENT_INFLICT_PAIN_TS = 9,
+ EVENT_HEAT_SEEKER_BLADE = 10,
+ EVENT_SHORT_THROW = 11,
+ EVENT_SINISTER_STRIKE = 12
+};
+
+class npc_twilight_sadist : public CreatureScript
+{
+ public: npc_twilight_sadist() : CreatureScript("npc_twilight_sadist") {}
+
+ struct npc_twilight_sadistAI : public ScriptedAI
+ {
+ npc_twilight_sadistAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
+
+ void Reset() override
+ {
+ if(!me->GetWaypointPath())
+ _events.ScheduleEvent(EVENT_INFLICT_PAIN_TS, urand(6000, 18000));
+ }
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _events.ScheduleEvent(EVENT_INFLICT_PAIN_TS, 9000);
+ _events.ScheduleEvent(EVENT_HEAT_SEEKER_BLADE, 13000);
+ _events.ScheduleEvent(EVENT_SHORT_THROW, 17000);
+ _events.ScheduleEvent(EVENT_SINISTER_STRIKE, 17000);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+
+ _events.Update(diff);
+
+ if (!UpdateVictim())
+ {
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_INFLICT_PAIN_TS:
+ DoCast(me, SPELL_INFLICT_PAIN);
+ _events.ScheduleEvent(EVENT_INFLICT_PAIN_TS, urand(25000, 32000));
+ break;
+ default:
+ break;
+ }
+ }
+ return;
+ }
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_RED_HOT_POKER:
+ DoCast(me, SPELL_RED_HOT_POKER);
+ _events.ScheduleEvent(EVENT_RED_HOT_POKER, 16000, 20000);
+ break;
+ case EVENT_SHACKLES:
+ DoCast(me, SPELL_SHACKLES);
+ _events.ScheduleEvent(EVENT_SHACKLES, 12000, 15000);
+ break;
+ case EVENT_WILD_BEATDOWN:
+ DoCast(me, SPELL_WILD_BEATDOWN);
+ _events.ScheduleEvent(EVENT_WILD_BEATDOWN, 12000, 15000);
+ break;
+ default:
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ EventMap _events;
+ InstanceScript* _instance;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetBlackrockCavernsAI<npc_twilight_sadistAI>(creature);
+ }
+};
+
+/*#####
+# npc_mad_prisoner
+#####*/
+
+enum MadPrisonerSpells
+{
+ SPELL_HEAD_CRACK = 77568,
+ SPELL_INFECTED_WOUND = 76512,
+ SPELL_ENRAGE = 8599
+};
+
+enum MadPrisonerEvents
+{
+ EVENT_INFLICT_PAIN_MP1 = 13,
+ EVENT_HEAD_CRACK = 14,
+ EVENT_INFECTED_WOUND = 15,
+ EVENT_ENRAGE = 16
+};
+
+class npc_mad_prisoner : public CreatureScript
+{
+ public: npc_mad_prisoner() : CreatureScript("npc_mad_prisoner") {}
+
+ struct npc_mad_prisonerAI : public ScriptedAI
+ {
+ npc_mad_prisonerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
+
+ void Reset() override
+ {
+ _events.ScheduleEvent(EVENT_INFLICT_PAIN_MP1, urand(6000, 18000));
+ }
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _events.ScheduleEvent(EVENT_HEAD_CRACK, 9000);
+ _events.ScheduleEvent(EVENT_INFECTED_WOUND, 13000);
+ _events.ScheduleEvent(EVENT_ENRAGE, 17000);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+
+ _events.Update(diff);
+
+ if (!UpdateVictim())
+ {
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_INFLICT_PAIN_MP1:
+ DoCast(me, SPELL_INFLICT_PAIN);
+ _events.ScheduleEvent(EVENT_INFLICT_PAIN_MP1, urand(25000, 32000));
+ break;
+ default:
+ break;
+ }
+ }
+ return;
+ }
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_HEAD_CRACK:
+ DoCast(me, SPELL_HEAD_CRACK);
+ _events.ScheduleEvent(EVENT_HEAD_CRACK, 16000, 20000);
+ break;
+ case EVENT_INFECTED_WOUND:
+ DoCast(me, SPELL_INFECTED_WOUND);
+ _events.ScheduleEvent(EVENT_INFECTED_WOUND, 12000, 15000);
+ break;
+ case EVENT_ENRAGE:
+ DoCast(me, SPELL_ENRAGE);
+ _events.ScheduleEvent(EVENT_ENRAGE, 12000, 15000);
+ break;
+ default:
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ EventMap _events;
+ InstanceScript* _instance;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetBlackrockCavernsAI<npc_mad_prisonerAI>(creature);
+ }
+};
+
+/*#####
+# npc_crazed_mage
+#####*/
+
+enum CrazedMageEvents
+{
+ EVENT_INFLICT_PAIN_MP2 = 17,
+ EVENT_HEAD_CRACK2 = 18,
+ EVENT_INFECTED_WOUND2 = 19,
+ EVENT_ENRAGE2 = 20
+};
+
+class npc_crazed_mage : public CreatureScript
+{
+ public: npc_crazed_mage() : CreatureScript("npc_crazed_mage") {}
+
+ struct npc_crazed_mageAI : public ScriptedAI
+ {
+ npc_crazed_mageAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
+
+ void Reset() override
+ {
+ _events.ScheduleEvent(EVENT_INFLICT_PAIN_MP2, urand(6000, 18000));
+ }
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _events.ScheduleEvent(EVENT_HEAD_CRACK2, 9000);
+ _events.ScheduleEvent(EVENT_INFECTED_WOUND2, 13000);
+ _events.ScheduleEvent(EVENT_ENRAGE2, 17000);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+
+ _events.Update(diff);
+
+ if (!UpdateVictim())
+ {
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_INFLICT_PAIN_MP2:
+ DoCast(me, SPELL_INFLICT_PAIN);
+ _events.ScheduleEvent(EVENT_INFLICT_PAIN_MP2, urand(25000, 32000));
+ break;
+ default:
+ break;
+ }
+ }
+ return;
+ }
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_HEAD_CRACK2:
+ DoCast(me, SPELL_HEAD_CRACK);
+ _events.ScheduleEvent(EVENT_HEAD_CRACK2, 16000, 20000);
+ break;
+ case EVENT_INFECTED_WOUND2:
+ DoCast(me, SPELL_INFECTED_WOUND);
+ _events.ScheduleEvent(EVENT_INFECTED_WOUND2, 12000, 15000);
+ break;
+ case EVENT_ENRAGE2:
+ DoCast(me, SPELL_ENRAGE);
+ _events.ScheduleEvent(EVENT_ENRAGE2, 12000, 15000);
+ break;
+ default:
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ EventMap _events;
+ InstanceScript* _instance;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetBlackrockCavernsAI<npc_crazed_mageAI>(creature);
+ }
+};
+
+/*#####
+# npc_raz_the_crazed
+#####*/
+
+enum RazTheCrazedSpells
+{
+ SPELL_AGGRO_NEARBY_TARGETS = 80196,
+ SPELL_SHADOW_PRISON = 79725
+};
+
+enum RazTheCrazedEvents
+{
+};
+
+class npc_raz_the_crazed : public CreatureScript
+{
+ public: npc_raz_the_crazed() : CreatureScript("npc_raz_the_crazed") {}
+
+ struct npc_raz_the_crazedAI : public ScriptedAI
+ {
+ npc_raz_the_crazedAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
+
+ void Reset() override
+ {
+ }
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ }
+
+ void IsSummonedBy(Unit* summoner) override
+ {
+ if (summoner->GetEntry() == NPC_ROMOGG_BONECRUSHER)
+ {
+ me->SetDisableGravity(true);
+ DoCast(me, SPELL_AGGRO_NEARBY_TARGETS);
+ DoCast(me, SPELL_SHADOW_PRISON);
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+
+ _events.Update(diff);
+
+ if (!UpdateVictim())
+ return;
+
+ /*while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ default:
+ break;
+ }
+ }*/
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ EventMap _events;
+ InstanceScript* _instance;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetBlackrockCavernsAI<npc_raz_the_crazedAI>(creature);
+ }
+};
+
+/*#####
+# npc_chains_of_woe
+#####*/
+
+enum ChainsOfWoeSpells
+{
+ SPELL_CHAINS_OF_WOE_1 = 75437,
+ SPELL_CHAINS_OF_WOE_2 = 75441,
+ SPELL_CHAINS_OF_WOE_3 = 75464,
+ SPELL_CHAINS_OF_WOE_4 = 82189,
+ SPELL_CHAINS_OF_WOE_5 = 82192
+};
+
+enum ChainsOfWoeModel
+{
+ MODEL_INVISIBLE = 38330
+};
+
+class npc_chains_of_woe : public CreatureScript
+{
+ public: npc_chains_of_woe() : CreatureScript("npc_chains_of_woe") {}
+
+ struct npc_chains_of_woeAI : public ScriptedAI
+ {
+ npc_chains_of_woeAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
+
+ void IsSummonedBy(Unit* /*summoner*/)
+ {
+ me->SetDisplayId(MODEL_INVISIBLE);
+ DoCast(me, SPELL_CHAINS_OF_WOE_1, true);
+ DoCast(me, SPELL_CHAINS_OF_WOE_2, true);
+ }
+
+ private:
+ InstanceScript* _instance;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetBlackrockCavernsAI<npc_chains_of_woeAI>(creature);
+ }
+};
+
+
+/*#####
+# spell_chains_of_woe_1
+#####*/
+
+class spell_chains_of_woe_1 : public SpellScriptLoader
+{
+ public: spell_chains_of_woe_1() : SpellScriptLoader("spell_chains_of_woe_1") { }
+
+ class spell_chains_of_woe_1_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_chains_of_woe_1_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellEntry*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_CHAINS_OF_WOE_1))
+ return false;
+ return true;
+ }
+
+ void HandleScriptEffect(SpellEffIndex /* effIndex */)
+ {
+ if (Player* playerTarget = GetHitPlayer())
+ {
+ Unit* caster = GetCaster();
+ playerTarget->CastSpell(caster, SPELL_CHAINS_OF_WOE_3, true, NULL);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_chains_of_woe_1_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_chains_of_woe_1_SpellScript();
+ }
+};
+
+/*#####
+# spell_chains_of_woe_4
+#####*/
+
+class spell_chains_of_woe_4 : public SpellScriptLoader
+{
+ public: spell_chains_of_woe_4() : SpellScriptLoader("spell_chains_of_woe_4") { }
+
+ class spell_chains_of_woe_4_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_chains_of_woe_4_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellEntry*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_CHAINS_OF_WOE_4))
+ return false;
+ return true;
+ }
+
+ void HandleScriptEffect(SpellEffIndex /* effIndex */)
+ {
+ if (Player* playerTarget = GetHitPlayer())
+ {
+ playerTarget->CastSpell(playerTarget, SPELL_CHAINS_OF_WOE_5, true, NULL);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_chains_of_woe_4_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_chains_of_woe_4_SpellScript();
+ }
+};
+
+/*#####
+# spell_nether_dragon_essence_1
+#####*/
+
+enum NetherDragonEssence
+{
+ SPELL_NETHER_DRAGON_ESSENCE_1 = 75649,
+ SPELL_NETHER_DRAGON_ESSENCE_2 = 75650,
+ SPELL_NETHER_DRAGON_ESSENCE_3 = 75653,
+ SPELL_NETHER_DRAGON_ESSENCE_4 = 75654
+};
+
+class spell_nether_dragon_essence_1 : public SpellScriptLoader
+{
+public: spell_nether_dragon_essence_1() : SpellScriptLoader("spell_nether_dragon_essence_1") { }
+
+ class spell_nether_dragon_essence_1_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_nether_dragon_essence_1_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellEntry*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_NETHER_DRAGON_ESSENCE_2) || !sSpellMgr->GetSpellInfo(SPELL_NETHER_DRAGON_ESSENCE_3) || !sSpellMgr->GetSpellInfo(SPELL_NETHER_DRAGON_ESSENCE_4))
+ return false;
+ return true;
+ }
+
+ void HandleTriggerSpell(AuraEffect const* /*aurEff*/)
+ {
+ if (Unit* caster = GetCaster())
+ caster->CastSpell(caster, RAND(SPELL_NETHER_DRAGON_ESSENCE_2, SPELL_NETHER_DRAGON_ESSENCE_3, SPELL_NETHER_DRAGON_ESSENCE_4));
+ }
+
+ void Register()
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_nether_dragon_essence_1_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_nether_dragon_essence_1_AuraScript();
+ }
+};
+
+/*#####
+# spell_nether_dragon_essence_2
+#####*/
+
+class spell_nether_dragon_essence_2 : public SpellScriptLoader
+{
+ public: spell_nether_dragon_essence_2() : SpellScriptLoader("spell_nether_dragon_essence_2") { }
+
+ class spell_nether_dragon_essence_2_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_nether_dragon_essence_2_SpellScript);
+
+ void ModDestHeight(SpellEffIndex /*effIndex*/)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ float posZ = 0;
+
+ switch (GetSpellInfo()->Id)
+ {
+ case SPELL_NETHER_DRAGON_ESSENCE_2:
+ posZ = 25.0f;
+ break;
+ case SPELL_NETHER_DRAGON_ESSENCE_3:
+ posZ = 17.0f;
+ break;
+ case SPELL_NETHER_DRAGON_ESSENCE_4:
+ posZ = 33.0f;
+ break;
+ }
+
+ float posX = frand(-35.0f, 35.0f);
+ float posY = frand(-25.0f, 25.0f);
+ Position offset = {posX, posY, posZ, 0.0f};
+ const_cast<WorldLocation*>(GetExplTargetDest())->RelocateOffset(offset);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectLaunch += SpellEffectFn(spell_nether_dragon_essence_2_SpellScript::ModDestHeight, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_nether_dragon_essence_2_SpellScript();
+ }
+};
+
+void AddSC_blackrock_caverns()
+{
+ // Creature Scripts
+ new npc_fire_cyclone();
+ new npc_twilight_flame_caller();
+ new npc_twilight_torturer();
+ new npc_twilight_sadist();
+ new npc_mad_prisoner();
+ new npc_crazed_mage();
+ new npc_raz_the_crazed();
+ new npc_chains_of_woe();
+ // Spell Scripts
+ new spell_chains_of_woe_1();
+ new spell_chains_of_woe_4();
+ new spell_nether_dragon_essence_1();
+ new spell_nether_dragon_essence_2();
+}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h
new file mode 100644
index 00000000000..bdfdda87736
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef DEF_BLACKROCKCAVERNS_H
+#define DEF_BLACKROCKCAVERNS_H
+
+#define BCScriptName "instance_blackrock_caverns"
+
+uint32 const EncounterCount = 5;
+
+enum DataTypes
+{
+ DATA_ROMOGG_BONECRUSHER = 0,
+ DATA_CORLA = 1,
+ DATA_KARSH_STEELBENDER = 2,
+ DATA_BEAUTY = 3,
+ DATA_ASCENDANT_LORD_OBSIDIUS = 4
+};
+
+enum CreatureIds
+{
+ NPC_TWILIGHT_FLAME_CALLER = 39708,
+ NPC_RAZ_THE_CRAZED = 39670,
+ NPC_ROMOGG_BONECRUSHER = 39665
+};
+
+template<class AI>
+CreatureAI* GetBlackrockCavernsAI(Creature* creature)
+{
+ if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
+ if (instance->GetInstanceScript())
+ if (instance->GetScriptId() == sObjectMgr->GetScriptId(BCScriptName))
+ return new AI(creature);
+ return NULL;
+}
+
+#endif
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_ascendant_lord_obsidius.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_ascendant_lord_obsidius.cpp
new file mode 100644
index 00000000000..fc64a1a65d9
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_ascendant_lord_obsidius.cpp
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "blackrock_caverns.h"
+
+enum Text
+{
+ YELL_AGGRO = 0,
+ YELL_KILL = 1,
+ YELL_SWITCHING_SHADOWS = 2,
+ YELL_DEATH = 3,
+ EMOTE_SWITCHING_SHADOWS = 4
+};
+
+enum Spells
+{
+ SPELL_MANA_TAP = 36021,
+ SPELL_ARCANE_TORRENT = 36022,
+ SPELL_DOMINATION = 35280,
+};
+
+enum Events
+{
+ EVENT_MANA_TAP = 0,
+ EVENT_ARCANE_TORRENT = 1,
+ EVENT_DOMINATION = 2
+};
+
+class boss_ascendant_lord_obsidius : public CreatureScript
+{
+ public:
+ boss_ascendant_lord_obsidius(): CreatureScript("boss_ascendant_lord_obsidius") {}
+
+ struct boss_ascendant_lord_obsidiusAI : public BossAI
+ {
+ boss_ascendant_lord_obsidiusAI(Creature* creature) : BossAI(creature, DATA_ASCENDANT_LORD_OBSIDIUS) { }
+
+ void Reset() override
+ {
+
+ }
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_MANA_TAP, 30000);
+ Talk(YELL_AGGRO);
+ }
+
+ void KilledUnit(Unit* /*victim*/) override
+ {
+ Talk(YELL_KILL);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(YELL_DEATH);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_MANA_TAP:
+ DoCastVictim(SPELL_MANA_TAP, true);
+ events.ScheduleEvent(EVENT_MANA_TAP, urand(14000, 22000));
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_ascendant_lord_obsidiusAI (creature);
+ }
+};
+
+void AddSC_boss_ascendant_lord_obsidius()
+{
+ new boss_ascendant_lord_obsidius();
+}
+
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_beauty.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_beauty.cpp
new file mode 100644
index 00000000000..bc6a8ffbc20
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_beauty.cpp
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "blackrock_caverns.h"
+
+enum Sounds
+{
+ SOUND_AGGRO = 18559,
+ SOUND_DEATH = 18563
+};
+
+enum Spells
+{
+ SPELL_TERRIFYING_ROAR = 76028, // Not yet Implemented
+ SPELL_BERSERKER_CHARGE = 76030,
+ SPELL_MAGMA_SPIT = 76031,
+ SPELL_FLAMEBREAK = 76032,
+ SPELL_BERSERK = 82395 // Not yet Implemented
+};
+
+enum Events
+{
+ EVENT_TERRIFYING_ROAR = 0,
+ EVENT_BERSERKER_CHARGE = 1,
+ EVENT_MAGMA_SPIT = 2,
+ EVENT_FLAMEBREAK = 3,
+ EVENT_BERSERK = 4,
+};
+
+class boss_beauty : public CreatureScript
+{
+ public: boss_beauty(): CreatureScript("boss_beauty") {}
+
+ struct boss_beautyAI : public BossAI
+ {
+ boss_beautyAI(Creature* creature) : BossAI(creature, DATA_BEAUTY) {}
+
+ void Reset() override
+ {
+
+ }
+
+ void EnterCombat(Unit* who) override
+ {
+ _EnterCombat();
+ events.ScheduleEvent(SPELL_MAGMA_SPIT, urand(7000, 10000));
+ events.ScheduleEvent(EVENT_BERSERKER_CHARGE, urand(16000, 19000));
+ events.ScheduleEvent(EVENT_FLAMEBREAK, urand(18000, 22000));
+ DoPlaySoundToSet(me, SOUND_AGGRO);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ DoPlaySoundToSet(me, SOUND_DEATH);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case SPELL_MAGMA_SPIT:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_MAGMA_SPIT, true);
+ events.ScheduleEvent(SPELL_MAGMA_SPIT, urand(7000, 10000));
+ break;
+ case EVENT_BERSERKER_CHARGE:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_BERSERKER_CHARGE, true);
+ events.ScheduleEvent(EVENT_BERSERKER_CHARGE, urand(16000, 19000));
+ break;
+ case EVENT_FLAMEBREAK:
+ DoCast(me, SPELL_FLAMEBREAK);
+ events.ScheduleEvent(EVENT_FLAMEBREAK, urand(18000, 22000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_beautyAI(creature);
+ }
+};
+
+void AddSC_boss_beauty()
+{
+ new boss_beauty();
+}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_corla.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_corla.cpp
new file mode 100644
index 00000000000..c51316812ff
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_corla.cpp
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "blackrock_caverns.h"
+
+enum Text
+{
+ YELL_AGGRO = 0,
+ YELL_KILL = 1,
+ YELL_EVOLVED_ZEALOT = 2,
+ YELL_DEATH = 3,
+ EMOTE_EVOLVED_ZEALOT = 4
+};
+
+enum Spells
+{
+ SPELL_SHADOW_POWER = 35322,
+ H_SPELL_SHADOW_POWER = 39193
+};
+
+enum Events
+{
+
+};
+
+class boss_corla : public CreatureScript
+{
+ public:
+ boss_corla(): CreatureScript("boss_corla") {}
+
+ struct boss_corlaAI : public BossAI
+ {
+ boss_corlaAI(Creature* creature) : BossAI(creature, DATA_CORLA) {}
+
+ void Reset() override
+ {
+
+ }
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _EnterCombat();
+ Talk(YELL_AGGRO);
+ }
+
+ void KilledUnit(Unit* /*victim*/) override
+ {
+ Talk(YELL_KILL);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(YELL_DEATH);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_corlaAI(creature);
+ }
+};
+
+void AddSC_boss_corla()
+{
+ new boss_corla();
+}
+
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_karsh_steelbender.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_karsh_steelbender.cpp
new file mode 100644
index 00000000000..89b518992aa
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_karsh_steelbender.cpp
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "blackrock_caverns.h"
+
+enum Text
+{
+ YELL_AGGRO = 0,
+ YELL_KILL = 1,
+ YELL_QUICKSILVER_ARMOR = 2,
+ YELL_DEATH = 3,
+ EMOTE_QUICKSILVER_ARMOR = 4
+};
+
+enum Spells
+{
+ SPELL_CLEAVE = 15284,
+ SPELL_QUICKSILVER_ARMOR = 75842,
+ SPELL_SUPERHEATED_QUICKSILVER_ARMOR = 75846
+};
+
+enum Events
+{
+ EVENT_CLEAVE = 0,
+ EVENT_QUICKSILVER_ARMOR = 1,
+ EVENT_SUPERHEATED_QUICKSILVER_ARMOR = 2
+};
+
+class boss_karsh_steelbender : public CreatureScript
+{
+ public:
+ boss_karsh_steelbender() : CreatureScript("boss_karsh_steelbender") { }
+
+ struct boss_karsh_steelbenderAI : public BossAI
+ {
+ boss_karsh_steelbenderAI(Creature* creature) : BossAI(creature, DATA_KARSH_STEELBENDER) { }
+
+ void Reset() override
+ {
+
+ }
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _EnterCombat();
+ Talk(YELL_AGGRO);
+ events.ScheduleEvent(EVENT_CLEAVE, 10000);
+ }
+
+ void KilledUnit(Unit* /*victim*/) override
+ {
+ Talk(YELL_KILL);
+ }
+
+ void JustDied(Unit* /*victim*/) override
+ {
+ _JustDied();
+ Talk(YELL_DEATH);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_CLEAVE:
+ DoCastVictim(SPELL_CLEAVE);
+ events.ScheduleEvent(EVENT_CLEAVE, 10000);
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_karsh_steelbenderAI(creature);
+ }
+};
+
+void AddSC_boss_karsh_steelbender()
+{
+ new boss_karsh_steelbender();
+}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_romogg_bonecrusher.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_romogg_bonecrusher.cpp
new file mode 100644
index 00000000000..240d1f661b7
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_romogg_bonecrusher.cpp
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "blackrock_caverns.h"
+
+enum Say
+{
+ YELL_AGGRO = 0,
+ YELL_KILL = 1,
+ YELL_SKULLCRACKER = 2,
+ YELL_DEATH = 3,
+ EMOTE_CALL_FOR_HELP = 4,
+ EMOTE_SKULLCRACKER = 5
+};
+
+enum Spells
+{
+ SPELL_CALL_FOR_HELP = 82137, // Needs Scripting
+ SPELL_CHAINS_OF_WOE = 75539,
+ SPELL_QUAKE = 75272,
+ SPELL_SKULLCRACKER = 75543,
+ SPELL_WOUNDING_STRIKE = 75571
+};
+
+enum Events
+{
+ EVENT_CHAINS_OF_WOE = 1,
+ EVENT_QUAKE = 2, // Not yet sure of timing
+ EVENT_SKULLCRACKER = 3,
+ EVENT_WOUNDING_STRIKE = 4
+};
+
+Position const SummonPos[1] =
+{
+ { 249.2639f, 949.1614f, 191.7866f, 3.141593f }
+};
+
+class boss_romogg_bonecrusher : public CreatureScript
+{
+ public:
+ boss_romogg_bonecrusher() : CreatureScript("boss_romogg_bonecrusher") {}
+
+ struct boss_romogg_bonecrusherAI : public BossAI
+ {
+ boss_romogg_bonecrusherAI(Creature* creature) : BossAI(creature, DATA_ROMOGG_BONECRUSHER) {}
+
+ void Reset() override
+ {
+ if(instance)
+ me->SummonCreature(NPC_RAZ_THE_CRAZED, SummonPos[0], TEMPSUMMON_MANUAL_DESPAWN, 200000);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(YELL_DEATH);
+ }
+
+ void KilledUnit(Unit* /*victim*/) override
+ {
+ Talk(YELL_KILL);
+ }
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_CHAINS_OF_WOE, urand(22000, 32000));
+ events.ScheduleEvent(EVENT_WOUNDING_STRIKE, urand(26000, 32000));
+ events.ScheduleEvent(EVENT_QUAKE, 45000);
+ Talk(YELL_AGGRO);
+ Talk(EMOTE_CALL_FOR_HELP);
+ DoCast(me, SPELL_CALL_FOR_HELP);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_CHAINS_OF_WOE:
+ Talk(YELL_SKULLCRACKER);
+ DoCast(me, SPELL_CHAINS_OF_WOE);
+ events.ScheduleEvent(EVENT_CHAINS_OF_WOE, urand(22000, 32000));
+ events.ScheduleEvent(EVENT_SKULLCRACKER, 3000);
+ break;
+ case EVENT_SKULLCRACKER:
+ Talk(EMOTE_SKULLCRACKER);
+ DoCast(me, SPELL_SKULLCRACKER);
+ break;
+ case EVENT_QUAKE:
+ DoCast(me, SPELL_QUAKE);
+ events.ScheduleEvent(EVENT_QUAKE, urand(32000, 40000));
+ break;
+ case EVENT_WOUNDING_STRIKE:
+ DoCastVictim(SPELL_WOUNDING_STRIKE, true);
+ events.ScheduleEvent(EVENT_WOUNDING_STRIKE, urand(26000, 32000));
+ break;
+ default:
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_romogg_bonecrusherAI (creature);
+ }
+};
+
+void AddSC_boss_romogg_bonecrusher()
+{
+ new boss_romogg_bonecrusher();
+}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp
new file mode 100644
index 00000000000..0279ee268d6
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "InstanceScript.h"
+#include "blackrock_caverns.h"
+
+class instance_blackrock_caverns : public InstanceMapScript
+{
+ public:
+ instance_blackrock_caverns(): InstanceMapScript(BCScriptName, 645) { }
+
+ struct instance_blackrock_caverns_InstanceMapScript : public InstanceScript
+ {
+ instance_blackrock_caverns_InstanceMapScript(Map* map) : InstanceScript(map)
+ {
+ SetBossNumber(EncounterCount);
+ }
+
+ void OnCreatureCreate(Creature* creature)
+ {
+ switch (creature->GetEntry())
+ {
+ case NPC_TWILIGHT_FLAME_CALLER:
+ break;
+ default:
+ break;
+ }
+ }
+
+ uint64 GetData64(uint32 type) const
+ {
+ switch (type)
+ {
+ case NPC_TWILIGHT_FLAME_CALLER:
+ default:
+ break;
+ }
+
+ return 0;
+ }
+
+ bool SetBossState(uint32 type, EncounterState state)
+ {
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ switch (type)
+ {
+ case DATA_ROMOGG_BONECRUSHER:
+ case DATA_CORLA:
+ case DATA_KARSH_STEELBENDER:
+ case DATA_BEAUTY:
+ case DATA_ASCENDANT_LORD_OBSIDIUS:
+ break;
+ default:
+ break;
+ }
+
+ return true;
+ }
+ };
+
+ InstanceScript* GetInstanceScript(InstanceMap* map) const
+ {
+ return new instance_blackrock_caverns_InstanceMapScript(map);
+ }
+};
+
+void AddSC_instance_blackrock_caverns()
+{
+ new instance_blackrock_caverns();
+}
diff --git a/src/server/scripts/EasternKingdoms/CMakeLists.txt b/src/server/scripts/EasternKingdoms/CMakeLists.txt
index 7f3ca8c6b3f..83fdf513f01 100644
--- a/src/server/scripts/EasternKingdoms/CMakeLists.txt
+++ b/src/server/scripts/EasternKingdoms/CMakeLists.txt
@@ -20,6 +20,14 @@ set(scripts_STAT_SRCS
EasternKingdoms/BaradinHold/boss_occuthar.cpp
EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp
EasternKingdoms/BaradinHold/instance_baradin_hold.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_romogg_bonecrusher.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_corla.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_karsh_steelbender.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_beauty.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_ascendant_lord_obsidius.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h
EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp
EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp
EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp