aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/2014_09_21_04_world_misc.sql216
-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
11 files changed, 1815 insertions, 0 deletions
diff --git a/sql/updates/world/2014_09_21_04_world_misc.sql b/sql/updates/world/2014_09_21_04_world_misc.sql
new file mode 100644
index 00000000000..800a4f4d9dc
--- /dev/null
+++ b/sql/updates/world/2014_09_21_04_world_misc.sql
@@ -0,0 +1,216 @@
+-- Add script to Fire Cyclone
+UPDATE `creature_template` SET `AIName`='',`ScriptName`='npc_fire_cyclone' WHERE `entry`=40164;
+-- Add script to Twilight Flame Caller
+UPDATE `creature_template` SET `AIName`='',`ScriptName`='npc_twilight_flame_caller' WHERE `entry`=39708;
+-- Add script to Twilight Torturer
+UPDATE `creature_template` SET `AIName`='',`ScriptName`='npc_twilight_torturer' WHERE `entry`=39978;
+-- Add script to Twilight Sadist
+UPDATE `creature_template` SET `AIName`='',`ScriptName`='npc_twilight_sadist' WHERE `entry`=39980;
+-- Add script to Mad Prisoner
+UPDATE `creature_template` SET `AIName`='',`ScriptName`='npc_mad_prisoner' WHERE `entry`=39985;
+-- Add script to Crazed Mage
+UPDATE `creature_template` SET `AIName`='',`ScriptName`='npc_crazed_mage' WHERE `entry`=39982;
+-- Add script to Raz The Crazed
+UPDATE `creature_template` SET `AIName`='',`ScriptName`='npc_raz_the_crazed' WHERE `entry`=39670;
+-- Add script to Rom'ogg Bonecrusher
+UPDATE `creature_template` SET `AIName`='',`ScriptName`='boss_romogg_bonecrusher' WHERE `entry`=39665;
+-- Add script to Chains of Woe
+UPDATE `creature_template` SET `AIName`='',`ScriptName`='npc_chains_of_woe' WHERE `entry`=40447;
+
+-- Add Teleport location for Blackrock Caverns
+DELETE FROM `game_tele` WHERE `name`= 'BlackrockCaverns';
+INSERT INTO `game_tele` (`id`,`position_x`,`position_y`,`position_z`,`orientation`,`map`,`name`) VALUES
+(1523, -7570.9165, -1326.4373, 245.537216, 4.827146, 0, 'BlackrockCaverns');
+
+-- Add Instance Template for Blackrock Caverns
+DELETE FROM `instance_template` WHERE `map`=645;
+INSERT INTO `instance_template` (`map`,`parent`,`script`,`allowMount`) VALUES
+(645,0, 'instance_blackrock_caverns',0);
+
+-- Spell Script Names
+DELETE FROM `spell_script_names` WHERE `spell_id` IN (75437, 82189, 75649, 75650, 75653, 75654);
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(75437, 'spell_chains_of_woe_1'),
+(82189, 'spell_chains_of_woe_4'),
+(75649, 'spell_nether_dragon_essence_1'),
+(75650, 'spell_nether_dragon_essence_2'),
+(75653, 'spell_nether_dragon_essence_2'),
+(75654, 'spell_nether_dragon_essence_2');
+
+-- Add spell condition for Inflict Pain
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=75590;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 75590, 0, 0, 31, 3, 39982, 0, 0, '', 'Inflict Pain targets Crazed Mage'),
+(13, 1, 75590, 0, 1, 31, 3, 39985, 0, 0, '', 'Inflict Pain targets Mad Prisoner');
+
+-- Add spell condition for Chains of Woe
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (75437, 75464, 82189, 82192);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 75437, 0, 0, 31, 4, 0, 0, 0, '', 'Chains of Woe targets Player'),
+(13, 1, 75464, 0, 0, 31, 4, 0, 0, 0, '', 'Chains of Woe targets Player'),
+(13, 1, 82189, 0, 0, 31, 4, 0, 0, 0, '', 'Chains of Woe targets Player'),
+(13, 1, 82192, 0, 0, 31, 4, 0, 0, 0, '', 'Chains of Woe targets Player');
+
+-- Creature Template Updates
+UPDATE `creature_template` SET `InhabitType`=4, flags_extra=128 WHERE `entry`=39842;
+UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=40164;
+UPDATE `creature_template` SET `InhabitType`=4, flags_extra=128 WHERE `entry`=40343;
+UPDATE `creature_template` SET `difficulty_entry_1`=39706 WHERE `entry`=39705; -- Ascendant Lord Obsidius
+UPDATE `creature_template` SET `difficulty_entry_1`=39701 WHERE `entry`=39700; -- Beauty
+UPDATE `creature_template` SET `difficulty_entry_1`=39680 WHERE `entry`=39679; -- Corla, Herald of Twilight
+UPDATE `creature_template` SET `difficulty_entry_1`=39699 WHERE `entry`=39698; -- Karsh Steelbender <Twilight Armorer>
+UPDATE `creature_template` SET `difficulty_entry_1`=39666 WHERE `entry`=39665; -- Rom'ogg Bonecrusher
+UPDATE `creature_template` SET `difficulty_entry_1`=40085 WHERE `entry`=40084; -- Bellows Slave
+UPDATE `creature_template` SET `difficulty_entry_1`=40014 WHERE `entry`=40013; -- Buster
+UPDATE `creature_template` SET `difficulty_entry_1`=50379 WHERE `entry`=40447; -- Chains of Woe (No spawn data) (Summoned by 39665 using spell 75539)
+UPDATE `creature_template` SET `difficulty_entry_1`=39995 WHERE `entry`=39994; -- Conflagration (No spawn data)
+UPDATE `creature_template` SET `difficulty_entry_1`=39983 WHERE `entry`=39982; -- Crazed Mage
+UPDATE `creature_template` SET `difficulty_entry_1`=39988 WHERE `entry`=39987; -- Evolved Twilight Zealot
+UPDATE `creature_template` SET `difficulty_entry_1`=40022 WHERE `entry`=40021; -- Incendiary Spark
+UPDATE `creature_template` SET `difficulty_entry_1`=40009 WHERE `entry`=40008; -- Lucky
+UPDATE `creature_template` SET `difficulty_entry_1`=39986 WHERE `entry`=39985; -- Mad Prisoner
+UPDATE `creature_template` SET `difficulty_entry_1`=40016 WHERE `entry`=40015; -- Runty
+UPDATE `creature_template` SET `difficulty_entry_1`=40818 WHERE `entry`=40817; -- Shadow of Obsidius
+UPDATE `creature_template` SET `difficulty_entry_1`=40018 WHERE `entry`=40017; -- Twilight Element Warden
+UPDATE `creature_template` SET `difficulty_entry_1`=39709 WHERE `entry`=39708; -- Twilight Flame Caller
+UPDATE `creature_template` SET `difficulty_entry_1`=40020 WHERE `entry`=40019; -- Twilight Obsidian Borer
+UPDATE `creature_template` SET `difficulty_entry_1`=39981 WHERE `entry`=39980; -- Twilight Sadist
+UPDATE `creature_template` SET `difficulty_entry_1`=39979 WHERE `entry`=39978; -- Twilight Torturer
+UPDATE `creature_template` SET `difficulty_entry_1`=39991 WHERE `entry`=39990; -- Twilight Zealot
+UPDATE `creature_template` SET `difficulty_entry_1`=40005 WHERE `entry`=40004; -- Quicksilver
+UPDATE `creature_template` SET `difficulty_entry_1`=50285 WHERE `entry`=50284; -- Twilight Zealot
+-- Update stats for Blackrock Caverna
+UPDATE `creature_template` SET `npcflag`=0, `maxlevel`=82, `flags_extra`=0 WHERE `entry`=39705;
+UPDATE `creature_template` SET `npcflag`=0, `minlevel`=87, `maxlevel`=87, `faction`=16, `speed_walk`=1.6, `speed_run`=1.71429, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=295744, `flags_extra`=1 WHERE `entry`=39706;
+UPDATE `creature_template` SET `npcflag`=0, `maxlevel`=82, `flags_extra`=0 WHERE `entry`=39700;
+UPDATE `creature_template` SET `npcflag`=0, `minlevel`=87, `maxlevel`=87, `faction`=16, `speed_walk`=1.6, `speed_run`=1.71429, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=32832, `flags_extra`=1 WHERE `entry`=39701;
+UPDATE `creature_template` SET `npcflag`=0, `maxlevel`=82, `flags_extra`=0 WHERE `entry`=39679;
+UPDATE `creature_template` SET `npcflag`=0, `minlevel`=87, `maxlevel`=87, `faction`=16, `speed_walk`=1.6, `unit_class`=2, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=32832, `flags_extra`=1 WHERE `entry`=39680;
+UPDATE `creature_template` SET `npcflag`=0, `maxlevel`=82, `flags_extra`=0 WHERE `entry`=39698;
+UPDATE `creature_template` SET `npcflag`=0, `minlevel`=87, `maxlevel`=87, `faction`=16, `speed_walk`=1.6, `speed_run`=1.71429, `unit_class`=2, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=32832, `flags_extra`=1 WHERE `entry`=39699;
+UPDATE `creature_template` SET `npcflag`=0, `maxlevel`=82, `flags_extra`=0 WHERE `entry`=39665;
+UPDATE `creature_template` SET `npcflag`=0, `minlevel`=87, `maxlevel`=87,`faction`=16, `speed_walk`=1.6, `speed_run`=1.71429, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=32832 WHERE `entry`=39666;
+UPDATE `creature_template` SET `maxlevel`=80 WHERE `entry`=40084;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=32832, `flags_extra`=1 WHERE `entry`=40085;
+UPDATE `creature_template` SET `maxlevel`=81 WHERE `entry`=40013;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `speed_walk`=1.6, `speed_run`=1.28571, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=32832 WHERE `entry`=40014;
+UPDATE `creature_template` SET `maxlevel`=80 WHERE `entry`=39982;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `unit_class`=2, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=32832 WHERE `entry`=39983;
+UPDATE `creature_template` SET `maxlevel`=81 WHERE `entry`=39987;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `speed_walk`=1.6, `speed_run`=1.42857, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=32832 WHERE `entry`=39988;
+UPDATE `creature_template` SET `maxlevel`=80 WHERE `entry`=40021;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=32832 WHERE `entry`=40022;
+UPDATE `creature_template` SET `maxlevel`=81 WHERE `entry`=40008;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `speed_walk`=1.6, `speed_run`=1.28571, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=32832 WHERE `entry`=40009;
+UPDATE `creature_template` SET `maxlevel`=80 WHERE `entry`=39985;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=294976 WHERE `entry`=39986;
+UPDATE `creature_template` SET `maxlevel`=81 WHERE `entry`=40015;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `speed_walk`=1.6, `speed_run`=1, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=32832 WHERE `entry`=40016;
+UPDATE `creature_template` SET `maxlevel`=82 WHERE `entry`=40817;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `speed_walk`=2.4, `speed_run`=0.857143, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=295680 WHERE `entry`=40818;
+UPDATE `creature_template` SET `maxlevel`=80 WHERE `entry`=40017;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_class`=2, `unit_flags`=32832 WHERE `entry`=40018;
+UPDATE `creature_template` SET `maxlevel`=80 WHERE `entry`=39708;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=32832 WHERE `entry`=39709;
+UPDATE `creature_template` SET `maxlevel`=80 WHERE `entry`=40019;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=32832 WHERE `entry`=40020;
+UPDATE `creature_template` SET `maxlevel`=80 WHERE `entry`=39980;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=32832 WHERE `entry`=39980;
+UPDATE `creature_template` SET `maxlevel`=80 WHERE `entry`=39978;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=32832 WHERE `entry`=39979;
+UPDATE `creature_template` SET `maxlevel`=80, `unit_flags`=32832, `unit_flags2`=2048, `dynamicflags`=0 WHERE `entry`=39990;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_class`=2, `unit_flags`=32832, `unit_flags2`=2048, `dynamicflags`=0 WHERE `entry`=39991;
+UPDATE `creature_template` SET `maxlevel`=80 WHERE `entry`=40004;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `speed_run`=1.14286, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_class`=2, `unit_flags`=33587520, `unit_flags2`=0 WHERE `entry`=40005;
+UPDATE `creature_template` SET `maxlevel`=80 WHERE `entry`=50284;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=16, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_class`=2, `unit_flags`=294912 WHERE `entry`=50285;
+UPDATE `creature_template` SET `minlevel`=81, `maxlevel`=81,`faction`=14, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=524288, flags_extra=0 WHERE `entry`=40447;
+UPDATE `creature_template` SET `minlevel`=85, `maxlevel`=85,`faction`=14, `baseattacktime`=2000, `rangeattacktime`=2000, `unit_flags`=524288, flags_extra=0 WHERE `entry`=50379;
+
+DELETE FROM `creature_template_addon` WHERE `entry`=39705;
+INSERT INTO `creature_template_addon` (`entry`,`bytes2`,`auras`) VALUES (39705,1, '75054');
+DELETE FROM `creature_template_addon` WHERE `entry`=40817;
+INSERT INTO `creature_template_addon` (`entry`,`bytes2`,`auras`) VALUES (40817,1, '76190 76164 76167 75054');
+DELETE FROM `creature_template_addon` WHERE `entry`=51340;
+INSERT INTO `creature_template_addon` (`entry`,`bytes2`,`auras`) VALUES (51340,1, '95014');
+DELETE FROM `creature_template_addon` WHERE `entry`=40164;
+INSERT INTO `creature_template_addon` (`entry`,`bytes2`,`auras`) VALUES (40164,1, '74851');
+DELETE FROM `creature_template_addon` WHERE `entry`=46476;
+INSERT INTO `creature_template_addon` (`entry`,`bytes2`,`auras`) VALUES (46476,1, '92292');
+DELETE FROM `creature_template_addon` WHERE `entry`=53488;
+INSERT INTO `creature_template_addon` (`entry`,`bytes2`,`auras`) VALUES (53488,1, '99201');
+DELETE FROM `creature_template_addon` WHERE `entry`=39708;
+INSERT INTO `creature_template_addon` (`entry`,`bytes2`,`auras`) VALUES (39708,1, '74911');
+DELETE FROM `creature_template_addon` WHERE `entry`=49526;
+INSERT INTO `creature_template_addon` (`entry`,`bytes1`,`bytes2`,`auras`) VALUES (49526,65536,1, '92282 92284');
+DELETE FROM `creature_template_addon` WHERE `entry`=49476;
+INSERT INTO `creature_template_addon` (`entry`,`bytes1`,`bytes2`,`auras`) VALUES (49476,65536,1, '92292');
+DELETE FROM `creature_template_addon` WHERE `entry`=50284;
+INSERT INTO `creature_template_addon` (`entry`,`bytes1`,`bytes2`,`auras`) VALUES (50284,8,1, '75608');
+DELETE FROM `creature_template_addon` WHERE `entry`=39987;
+INSERT INTO `creature_template_addon` (`entry`,`bytes2`,`auras`) VALUES (39987,1, '18950');
+
+-- Equipment
+DELETE FROM `creature_equip_template` WHERE `entry` IN (39665, 39666, 39698, 39699, 39708, 39709, 39679, 39680, 39705, 39980, 39985, 39986, 39978, 39979, 39987, 39988, 39990, 39991, 50284, 50285, 40084, 40085, 40017, 40018, 40019, 40020);
+INSERT INTO `creature_equip_template` (`entry`, `id`, `itemEntry1`, `itemEntry2`, `itemEntry3`) VALUES
+(39665, 1, 54780, 54780, 0),
+(39666, 1, 54780, 54780, 0),
+(39698, 1, 58176, 0, 0),
+(39699, 1, 58176, 0, 0),
+(39708, 1, 49653, 0, 0),
+(39709, 1, 49653, 0, 0),
+(39679, 1, 52838, 0, 0),
+(39680, 1, 52838, 0, 0),
+(39705, 1, 60969, 0, 0),
+(39980, 1, 52517, 52517, 6886),
+(39985, 1, 54827, 0, 0),
+(39986, 1, 54827, 0, 0),
+(39978, 1, 52520, 0, 0),
+(39979, 1, 52520, 0, 0),
+(39987, 1, 58176, 0, 0),
+(39988, 1, 58176, 0, 0),
+(39990, 1, 52517, 0, 0),
+(39990, 2, 57007, 58941, 0),
+(39990, 3, 57036, 0, 0),
+(39990, 4, 58803, 0, 0),
+(39991, 1, 52517, 0, 0),
+(39991, 2, 57007, 58941, 0),
+(39991, 3, 57036, 0, 0),
+(39991, 4, 58803, 0, 0),
+(50284, 1, 41889, 0, 0),
+(50285, 1, 41889, 0, 0),
+(40084, 1, 1910, 0, 0),
+(40085, 1, 1910, 0, 0),
+(40017, 1, 49724, 0, 0),
+(40018, 1, 54815, 0, 0),
+(40019, 1, 49724, 0, 0),
+(40020, 1, 54815, 0, 0);
+
+-- Creature text
+DELETE FROM `creature_text` WHERE `entry` IN (39665,39679,39698,39705,39670,39985,49476);
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
+(39665, 0, 0, 'Boss Cho''gall not gonna be happy ''bout dis!', 14, 0, 100, 0, 0, 18925, 'Rom''ogg Bonecrusher - Aggro'),
+(39665, 1, 0, 'Dat''s what you get! Noting!', 14, 0, 100, 0, 0, 18926, 'Rom''ogg Bonecrusher - Killing a player'),
+(39665, 2, 0, 'Stand still! Rom''ogg crack your skulls!', 14, 0, 100, 0, 0, 18927, 'Rom''ogg Bonecrusher - Skullcracker'),
+(39665, 3, 0, 'Rom''ogg sorry...', 14, 0, 100, 0, 0, 18928, 'Rom''ogg Bonecrusher - Death'),
+(39665, 4, 0, '%s calls for help!', 16, 0, 100, 0, 0, 0, 'Rom''ogg Bonecrusher - Emote call for help'),
+(39665, 5, 0, '%s prepares to unleash The Skullcracker on nearby enemies!', 41, 0, 100, 0, 0, 0, 'Rom''ogg Bonecrusher - Skullcracker emote'),
+(39679, 0, 0, 'HERETICS! You will suffer for this interruption!', 14, 0, 100, 0, 0, 18589, 'Corla, Herald of Twilight - Aggro'),
+(39679, 1, 0, 'There is only one true path of enlightenment! DEATH!', 14, 0, 100, 0, 0, 18590, 'Corla, Herald of Twilight - - Killing a player'),
+(39679, 2, 0, 'Bask in his power! Rise as an agent of the master''s rage!', 14, 0, 100, 0, 0, 18592, 'Corla, Herald of Twilight - Evolved Zealot'),
+(39679, 3, 0, 'For the master I''d die a thousand times... A thousan...', 14, 0, 100, 0, 0, 18594, 'Corla, Herald of Twilight - Death'),
+(39679, 4, 0, 'A Twilight Zealot has evolved!', 41, 0, 100, 0, 0, 0, 'Corla, Herald of Twilight - Evolved Zealot emote'),
+(39698, 0, 0, 'Bodies to test my armaments upon!', 14, 0, 100, 0, 0, 18852, 'Karsh Steelbender - Aggro'),
+(39698, 1, 0, 'Merely an impurity in the compound!', 14, 0, 100, 0, 0, 18853, 'Karsh Steelbender - Killing a player'),
+(39698, 2, 0, 'Feel the burn!', 14, 0, 100, 0, 0, 18854, 'Karsh Steelbender to Karsh Steelbender - Superheated Quicksilver Armor'),
+(39698, 3, 0, 'We number in the millions! Your efforts are wasted...', 14, 0, 100, 0, 0, 18855, 'Karsh Steelbender - Death'),
+(39698, 4, 0, '%s''s armor shimmers with heat. Strike now!', 41, 0, 100, 0, 0, 0, 'Karsh Steelbender to Karsh Steelbender - Aura Emote'),
+(39705, 0, 0, 'You come seeking answers? Then have them! Look upon your answer to living!', 14, 0, 100, 0, 0, 18899, 'Ascendant Lord Obsidius - Aggro'),
+(39705, 1, 0, 'Your kind has no place in the master''s world!', 14, 0, 100, 0, 0, 18900, 'Ascendant Lord Obsidius - Killing a player'),
+(39705, 2, 0, 'Earth can be shaped, molded... You cannot! You are useless!', 14, 0, 100, 0, 0, 18901, 'Ascendant Lord Obsidius - Switching shadows'),
+(39705, 3, 0, 'I cannot be destroyed... Only... de... layed...', 14, 0, 100, 0, 0, 18902, 'Ascendant Lord Obsidius - Death'),
+(39705, 4, 0, '%s prepares to trade places with one of his shadows!', 41, 0, 100, 0, 0, 0, 'Ascendant Lord Obsidius - Switching shadows emote'),
+(39670, 0, 0, 'RAZ SMASH!', 14, 0, 100, 0, 0, 18919, 'Raz the Crazed'),
+(39670, 1, 0, 'Raz... Tired...', 14, 0, 100, 0, 0, 18920, 'Raz the Crazed'),
+(39985, 0, 0, '%s becomes enraged!', 16, 0, 100, 0, 0, 0, 'Mad Prisoner'),
+(49476, 0, 0, 'RAZ, NOOOOOOOOOOO!!!!', 14, 0, 100, 0, 0, 0, 'Finkle Einhorn');
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