From f63d798ed7e192d46462081eb5620057ca5e67c3 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Mon, 6 Dec 2021 15:01:02 +0100 Subject: [PATCH] Scripts/Firelands: implement Ragnaros encounter --- .../world/4.3.4/2022_02_02_00_world.sql | 851 ++++++ src/server/game/Spells/SpellMgr.cpp | 68 + .../Firelands/boss_ragnaros_firelands.cpp | 2497 +++++++++++++++++ .../scripts/Kalimdor/Firelands/firelands.cpp | 42 + .../scripts/Kalimdor/Firelands/firelands.h | 1025 ++++++- .../Kalimdor/Firelands/instance_firelands.cpp | 107 +- .../Kalimdor/kalimdor_script_loader.cpp | 4 + 7 files changed, 4582 insertions(+), 12 deletions(-) create mode 100644 sql/updates/world/4.3.4/2022_02_02_00_world.sql create mode 100644 src/server/scripts/Kalimdor/Firelands/boss_ragnaros_firelands.cpp create mode 100644 src/server/scripts/Kalimdor/Firelands/firelands.cpp diff --git a/sql/updates/world/4.3.4/2022_02_02_00_world.sql b/sql/updates/world/4.3.4/2022_02_02_00_world.sql new file mode 100644 index 00000000000..c8868dcc366 --- /dev/null +++ b/sql/updates/world/4.3.4/2022_02_02_00_world.sql @@ -0,0 +1,851 @@ + +-- Ragnaros +UPDATE `creature_template` SET `ScriptName`= 'boss_ragnaros_firelands' WHERE `entry`= 52409; +UPDATE `creature_template` SET `minlevel`= 88, `maxlevel`= 88, `exp`= 3, `faction`= 2234, `mechanic_immune_mask`= 650854271, `flags_extra`= 0x1 WHERE `entry` IN (52409, 53797, 53798, 53799); +UPDATE `creature_template` SET `difficulty_entry_2`= 54258 WHERE `entry`= 53920; +UPDATE `creature_template` SET `minlevel`= 88, `maxlevel`= 88, `exp`= 3, `faction`= 2234, `BaseAttackTime`= 1500, `mechanic_immune_mask`= 650854271, `flags_extra`= 0x1 WHERE `entry` IN (53920, 54258); +UPDATE `creature_template` SET `BaseVariance`= 0.5, `DamageModifier`= 240 WHERE `entry` IN (52409, 53797, 53798, 53799, 53920, 54258); + +-- Magma Trap +UPDATE `creature_template` SET `unit_flags`= 0x2000000, `flags_extra`= `flags_extra`| 128, `AIName`= 'NullCreatureAI' WHERE `entry`= 53086; +-- Sulfuras Smash +UPDATE `creature_template` SET `unit_flags`= 0x2000000, `flags_extra`= `flags_extra` | 128, `AIName`= 'NullCreatureAI' WHERE `entry`= 53266; +UPDATE `creature_template` SET `unit_flags`= 0x2000000, `flags_extra`= `flags_extra` | 128 | 0x20000000, `AIName`= 'NullCreatureAI' WHERE `entry`= 53268; +-- Splitting Blow +UPDATE `creature_template` SET `unit_flags`= 0x2000000, `flags_extra`= `flags_extra` | 128, `AIName`= 'NullCreatureAI' WHERE `entry`= 53393; +-- Lava Wave +UPDATE `creature_template` SET `unit_flags`= 0x2000000, `flags_extra`= `flags_extra` | 128, `AIName`= 'NullCreatureAI' WHERE `entry`= 53363; +-- Son Of Flame +UPDATE `creature_template` SET `ScriptName`= 'npc_ragnaros_son_of_flame' WHERE `entry`= 53140; +UPDATE `creature_template` SET `mechanic_immune_mask`= 0x1 | 0x512 | 0x10000 | 0x20000 | 0x400000 WHERE `entry` IN (53140, 53800, 53801, 53802); +-- Sulfuras, Hand of Ragnaros +UPDATE `creature_template` SET `unit_flags`= 0x2000000, `unit_flags2`= 0x8000 | 0x800, `flags_extra`= `flags_extra` | 128, `AIName`= 'NullCreatureAI' WHERE `entry`= 53420; +-- Molten Seed Caster +UPDATE `creature_template` SET `unit_flags`= 0x2000000, `flags_extra`= `flags_extra` | 128, `AIName`= 'NullCreatureAI' WHERE `entry`= 53186; +-- Lava Scion - We have to disable pathfinding for this creature until gameobject pathfinding is supported. +UPDATE `creature_template` SET `ScriptName`= 'npc_ragnaros_lava_scion' WHERE `entry`= 53231; +UPDATE `creature_template` SET `flags_extra`= `flags_extra` | 0x20000000, `BaseVariance`= 0.5, `DamageModifier`= 120, `mechanic_immune_mask`= 650854271 WHERE `entry` IN (53231, 53816, 53817, 53818); +-- Molten Elemental - We have to disable pathfinding for this creature until gameobject pathfinding is supported. +UPDATE `creature_template` SET `unit_flags`= 0x100, `flags_extra`= `flags_extra` | 0x20000000, `BaseVariance`= 0.5, `DamageModifier`= 30, `mechanic_immune_mask`= 0x1 | 0x512 | 0x10000 | 0x20000 | 0x400000 WHERE `entry` IN (53189, 53810, 53811, 53812); +-- Blazing Heat +UPDATE `creature_template` SET `unit_flags`= 0x2000000, `flags_extra`= `flags_extra` | 128, `AIName`= 'NullCreatureAI' WHERE `entry`= 53473; +-- Dreadflame Spawn +UPDATE `creature_template` SET `unit_flags`= 0x2000000, `flags_extra`= `flags_extra` | 128, `AIName`= 'NullCreatureAI' WHERE `entry`= 54203; +-- Living Meteor +UPDATE `creature_template` SET `ScriptName`= 'npc_ragnaros_living_meteor' WHERE `entry`= 53500; +UPDATE `creature_template` SET `flags_extra`= `flags_extra` | 0x20000000 WHERE `entry` IN (53500, 53813, 53814, 53815); +-- Archdruids +UPDATE `creature_template` SET `ScriptName`= 'npc_ragnaros_archdruid' WHERE `entry` IN (53876, 53875, 53872); +-- Entrapping Roots +UPDATE `creature_template` SET `unit_flags`= 0x2000000, `flags_extra`= `flags_extra` | 128, `AIName`= 'NullCreatureAI' WHERE `entry`= 54074; +-- Dreadflame +UPDATE `creature_template` SET `flags_extra`= `flags_extra` | 128, `ScriptName`= 'npc_ragnaros_dreadflame' WHERE `entry`= 54127; +-- Cloudburst +UPDATE `creature_template` SET `ScriptName`= 'npc_ragnaros_cloudburst' WHERE `entry`= 54147; +UPDATE `creature_template` SET `flags_extra`= `flags_extra` | 128 WHERE `entry` IN (54147, 54155); +-- Breadth of Frost +UPDATE `creature_template` SET `unit_flags`= 0x2000000, `flags_extra`= `flags_extra` | 128, `AIName`= 'NullCreatureAI' WHERE `entry`= 53953; + +DELETE FROM `creature_text` WHERE `CreatureID` IN (52409, 53231, 53872, 53875, 53876); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `comment`) VALUES +-- Ragnaros +(52409, 0, 0, 'Mortal Insects! You dare trespass into MY domain? Your arrogance will be purged in living flame.', 14, 0, 100, 0, 0, 24517, 52203, 'Ragnaros - Emerge'), +(52409, 1, 0, 'Be consumed by flame!', 14, 0, 100, 0, 0, 24535, 52413, 'Ragnaros - Aggro'), +(52409, 1, 1, 'Begone from my realm, insects.', 14, 0, 100, 0, 0, 24533, 52411, 'Ragnaros - Aggro'), +(52409, 1, 2, 'The realm of fire will consume you!', 14, 0, 100, 0, 0, 24536, 52414, 'Ragnaros - Aggro'), +(52409, 2, 0, 'By fire be purged!', 14, 0, 100, 0, 0, 24532, 52211, 'Ragnaros - Wrath of Ragnaros'), +(52409, 3, 0, '|TInterface\\Icons\\spell_fire_selfdestruct.blp:20|t%s casts |cFFFF6600|Hspell:98164|h[Magma Trap]|h|r!', 41, 0, 100, 0, 0, 0, 52115, 'Ragnaros - Announce Magma Trap'), +(52409, 4, 0, '|TInterface\\Icons\\spell_shaman_lavasurge.blp:20|t%s begins to cast |cFFFF0000|Hspell:98710|h[Sulfuras Smash]|h|r!', 41, 0, 100, 0, 0, 0, 52125, 'Ragnaros to Sulfuras Smash'), +(52409, 5, 0, '|TInterface\\Icons\\spell_fire_ragnaros_splittingblow.blp:20|t%s begins to cast |cFFFF0000|Hspell:98951|h[Splitting Blow]|h|r!', 41, 0, 100, 0, 0, 0, 52114, 'Ragnaros - Announce Splitting Blow'), +(52409, 6, 0, 'You will be crushed!', 14, 0, 100, 0, 0, 24520, 52212, 'Ragnaros - Splitting Blow'), +(52409, 6, 1, 'Your judgement has come!', 14, 0, 100, 0, 0, 24522, 52214, 'Ragnaros Splitting Blow'), +(52409, 7, 0, 'Denizens of flame, come to me!', 14, 0, 100, 0, 0, 24515, 52209, 'Ragnaros - Invoke Sons'), +(52409, 7, 1, 'Arise, servants of fire, consume their flesh!', 14, 0, 100, 0, 0, 24516, 52210, 'Ragnaros - Invoke Sons'), +(52409, 8, 0, 'Enough! I will finish this.', 14, 0, 100, 0, 0, 24523, 52215, 'Ragnaros - Pick up Sulfuras'), +(52409, 8, 1, 'Fall to your knees, mortals! This ends now.', 14, 0, 100, 0, 0, 24524, 52216, 'Ragnaros - Pick up Sulfuras'), +(52409, 8, 2, 'Sulfuras will be your end.', 14, 0, 100, 0, 0, 24525, 52217, 'Ragnaros - Pick up Sulfuras'), +(52409, 9, 0, '|TInterface\\Icons\\ability_mage_worldinflames.blp:20|t%s begins to cast |cFFFF6600|Hspell:100171|h[World In Flames]|h|r!', 41, 0, 100, 0, 0, 0, 52450, 'Ragnaros - Announce World in Flames'), +(52409, 10, 0, '|TInterface\\Icons\\ability_mage_worldinflames.blp:20|t%s begins to cast |cFFFF6600|Hspell:99171|h[Engulfing Flames]|h|r!', 41, 0, 100, 0, 0, 0, 52084, 'Ragnaros - Announce Engulfing Flames'), +(52409, 11, 0, '%s is about to |cFFFF0000Emerge|r!', 41, 0, 100, 0, 0, 0, 52594, 'Ragnaros - Announce Emerge'), +(52409, 12, 0, 'Too soon! ... You have come too soon...', 14, 0, 100, 0, 0, 24519, 52218, 'Ragnaros - Defeated Normal'), +(52409, 13, 0, 'Too soon...', 14, 0, 100, 0, 0, 24528, 52219, 'Ragnaros - Submerge Heroic'), +(52409, 14, 0, 'Arrggh, outsiders - this is not your realm!', 14, 0, 100, 0, 0, 24527, 52220, 'Ragnaros - Emerge Heroic'), +(52409, 15, 0, 'When I finish this, your pathetic mortal world will burn with my vengeance!', 14, 0, 100, 0, 0, 24526, 52221, 'Ragnaros - Break Free'), +(52409, 16, 0, '|TInterface\\Icons\\inv_mace_2h_sulfuras_d_01.blp:20|t%s begins to cast |cFFFF6600|Hspell:100604|h[Empower Sulfuras]|h|r!', 41, 0, 100, 0, 0, 0, 52709, 'Ragnaros - Announce Empower Sulfuras'), +(52409, 17, 0, '|TInterface\\Icons\\ability_mage_firestarter.blp:20|t%s casts |cFFFF0000|Hspell:100675|h[Dreadflame]|h|r!', 41, 0, 100, 0, 0, 0, 52849, 'Ragnaros - Announce Dreadflame'), +(52409, 18, 0, 'Pathetic.', 14, 0, 100, 0, 0, 24530, 52205, 'Ragnaros - Slay'), +(52409, 18, 1, 'This is MY realm!', 14, 0, 100, 0, 0, 24529, 52206, 'Ragnaros - Slay'), +(52409, 18, 2, 'Begone from my realm, insects.', 14, 0, 100, 0, 0, 24533, 52411, 'Ragnaros - Slay'), +(52409, 18, 3, 'Die!', 14, 0, 100, 0, 0, 24521, 52213, 'Ragnaros - Slay'), +(52409, 19, 0, 'No, noooo- This was to be my hour of triumph...', 14, 0, 100, 0, 0, 24518, 52222, 'Ragnaros - Death'), +-- Cenarius +(53872, 0, 0, 'No, fiend. Your time is NOW.', 14, 0, 100, 0, 0, 25159, 52569, 'Cenarius'), +(53872, 1, 0, 'Perhaps...', 14, 0, 100, 0, 0, 25160, 52572, 'Cenarius'), +(53872, 2, 0, 'Ragnaros has perished. But the primal powers he represents can never be vanquished. Another will rise to power, someday.', 14, 0, 100, 0, 0, 25158, 52574, 'Cenarius'), +(53872, 3, 0, 'Indeed.', 14, 0, 100, 0, 0, 25161, 52576, 'Cenarius'), +-- Malfurion Stormrage +(53875, 0, 0, 'Heroes! He is bound. Finish him!', 14, 0, 100, 0, 0, 25169, 52570, 'Malfurion Stormrage '), +(53875, 1, 0, 'It is finished then!', 14, 0, 100, 0, 0, 25170, 52571, 'Malfurion Stormrage'), +(53875, 2, 0, 'Heroes, the world owes you a great debt.', 14, 0, 100, 0, 0, 25171, 52573, 'Malfurion Stormrage'), +-- Archdruid Hamuul Runetotem +(53876, 1, 0, 'Yes Cenarius, we must maintain a constant vigil over this realm. But let us celebrate this day and the great victory we have earned here.', 14, 0, 100, 0, 0, 25168, 52575, 'Archdruid Hamuul Runetotem to Player'), +-- Lava Scion +(53231, 0, 0, '|TInterface\\Icons\\inv_elemental_mote_fire01.blp:16|tYou are about to burst into |cFFFF0000|Hspell:100460|h[Blazing Heat]|h|r!', 42, 0, 100, 0, 0, 0, 52819, 'Lava Scion - Announce Blazing Heat'); + +DELETE FROM `creature_summon_groups` WHERE `summonerId`= 52409; +INSERT INTO `creature_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `summonType`, `summonTime`) VALUES +(52409, 0, 0, 53231, 1026.861083984375, 5.895833492279052734, 55.44696807861328125, 4.904375076293945312, 6, 3000), -- Lava Scion (Area: Sulfuron Keep - Difficulty: 0) +(52409, 0, 0, 53231, 1027.3055419921875, -121.746528625488281, 55.44710159301757812, 1.361356854438781738, 6, 3000), -- Lava Scion (Area: Sulfuron Keep - Difficulty: 0) +(52409, 0, 1, 53876, 787.2101, -50.723957, 93.77381, 6.27602386474609375, 8, 0), -- Archdruid Hamuul Runetotem (Area: Sulfuron Keep - Difficulty: 0) (Auras: 100311 - Transform (Hamuul)) (possible waypoints or random movement) +(52409, 0, 1, 53875, 786.36115, -68.770836, 93.93824, 3.261384487152099609, 8, 0), -- Malfurion Stormrage (Area: Sulfuron Keep - Difficulty: 0) (Auras: 100310 - Transform (Malfurion)) (possible waypoints or random movement) +(52409, 0, 1, 53872, 786.0003, -59.59131, 86.39431, 0.020506108179688453, 8, 0); -- Cenarius (Area: Sulfuron Keep - Difficulty: 0) + +DELETE FROM `waypoint_data` WHERE `id` IN (53876 * 100, 53875 * 100, 53872 * 100); +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `velocity`) VALUES +(53876 * 100, 0, 982.9132, -43.220486, 59.49538, NULL, 0, 1, 24), +(53875 * 100, 0, 984.2274, -77.62153, 61.69744, NULL, 0, 1, 24), +(53872 * 100, 0, 984.13715, -57.65625, 55.366516, NULL, 0, 1, 24); + +DELETE FROM `waypoint_data_addon` WHERE `PathID` IN (53876 * 100, 53875 * 100, 53872 * 100); +INSERT INTO `waypoint_data_addon` (`PathID`, `PointID`, `SplinePointIndex`, `PositionX`, `PositionY`, `PositionZ`) VALUES +-- Hamuul +(53876 * 100, 0, 0, 788.2101, -50.723957, 93.77381), +(53876 * 100, 0, 1, 789.7153, -50.376736, 97.14188), +(53876 * 100, 0, 2, 842.7656, -53.435764, 88.888725), +(53876 * 100, 0, 3, 884.75, -36.713543, 60.775967), +(53876 * 100, 0, 4, 951.0347, -49.512154, 60.775967), +-- Malfurion +(53875 * 100, 0, 0, 787.36115, -68.770836, 93.93824), +(53875 * 100, 0, 1, 788.3715, -69.71528, 98.04888), +(53875 * 100, 0, 2, 881.5781, -67.989586, 79.69471), +(53875 * 100, 0, 3, 961.54517, -90.048615, 72.05601), +-- Cenarius +(53872 * 100, 0, 0, 786.9566, -59.883682, 86.39431), +(53872 * 100, 0, 1, 791.1458, -60.227432, 85.664314), +(53872 * 100, 0, 2, 821.7049, -59.600697, 71.56089), +(53872 * 100, 0, 3, 841.19446, -58.581596, 71.56089), +(53872 * 100, 0, 4, 869.1875, -59.211807, 54.77988), +(53872 * 100, 0, 5, 882.4983, -58.998264, 53.73591), +(53872 * 100, 0, 6, 890.92535, -58.80903, 49.192184), +(53872 * 100, 0, 7, 939.6042, -59.177082, 48.961807), +(53872 * 100, 0, 8, 963.4393, -58.230904, 49.187195), +(53872 * 100, 0, 9, 977.7205, -57.779514, 55.430775); + +DELETE FROM `creature_template_addon` WHERE `entry` IN (52409, 53797, 53798, 53799); +DELETE FROM `creature_addon` WHERE `guid` IN (338819, 338906, 338912); +INSERT INTO `creature_addon` (`guid`, `bytes1`, `bytes2`, `visibilityDistanceType`, `auras`) VALUES +(338819, 0x3000000, 0x1, 5, ''), +(338906, 0x3000000, 0x1, 3, '99908'), +(338912, 0x3000000, 0x1, 3, '99908'); + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_ragnaros_wrath_of_ragnaros', +'spell_ragnaros_magma_trap', +'spell_ragnaros_magma_trap_periodic', +'spell_ragnaros_magma_trap_missile', +'spell_ragnaros_sulfuras_smash', +'spell_ragnaros_splitting_blow', +'spell_ragnaros_splitting_blow_script', +'spell_ragnaros_invoke_sons', +'spell_ragnaros_submerge', +'spell_ragnaros_invoke_sons_script', +'spell_ragnaros_burning_speed', +'spell_ragnaros_molten_seed', +'spell_ragnaros_molten_seed_dummy', +'spell_ragnaros_molten_seed_visual', +'spell_ragnaros_engulfing_flames', +'spell_ragnaros_world_in_flames', +'spell_ragnaros_molten_inferno', +'spell_ragnaros_blazing_heat', +'spell_ragnaros_blazing_heat_script', +'spell_ragnaros_blazing_heat_aoe', +'spell_ragnaros_living_meteor', +'spell_ragnaros_fixate', +'spell_ragnaros_combustible', +'spell_ragnaros_living_meteor_aoe', +'spell_ragnaros_death', +'spell_ragnaros_burning_wound', +'spell_ragnaros_empowered_sulfuras', +'spell_ragnaros_empower_sulfuras', +'spell_ragnaros_empower_sulfuras_periodic', +'spell_ragnaros_entrapping_roots', +'spell_ragnaros_entrapping_roots_aura', +'spell_ragnaros_dreadflame', +'spell_ragnaros_dreadflame_control_aura_damage', +'spell_ragnaros_dreadflame_control_aura_spawn', +'spell_ragnaros_dreadflame_control_aura_spread', +'spell_ragnaros_dreadflame_control_aura_deluge', +'spell_ragnaros_cloudburst', +'spell_ragnaros_breadth_of_frost_trigger', +'spell_ragnaros_breadth_of_frost', +'spell_ragnaros_superheated'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(98259, 'spell_ragnaros_wrath_of_ragnaros'), +(98260, 'spell_ragnaros_wrath_of_ragnaros'), +(100110, 'spell_ragnaros_wrath_of_ragnaros'), +(100111, 'spell_ragnaros_wrath_of_ragnaros'), +(98159, 'spell_ragnaros_magma_trap'), +(98171, 'spell_ragnaros_magma_trap_periodic'), +(98164, 'spell_ragnaros_magma_trap_missile'), +(98708, 'spell_ragnaros_sulfuras_smash'), +(100256, 'spell_ragnaros_sulfuras_smash'), +(100257, 'spell_ragnaros_sulfuras_smash'), +(100258, 'spell_ragnaros_sulfuras_smash'), +(98951, 'spell_ragnaros_splitting_blow'), +(100883, 'spell_ragnaros_splitting_blow'), +(100884, 'spell_ragnaros_splitting_blow'), +(100885, 'spell_ragnaros_splitting_blow'), +(99012, 'spell_ragnaros_splitting_blow_script'), +(99054, 'spell_ragnaros_invoke_sons'), +(98982, 'spell_ragnaros_submerge'), +(100295, 'spell_ragnaros_submerge'), +(100296, 'spell_ragnaros_submerge'), +(100297, 'spell_ragnaros_submerge'), +(100312 , 'spell_ragnaros_submerge'), -- Legs Submerge (Heroic Only) +(99051, 'spell_ragnaros_invoke_sons_script'), +(98473, 'spell_ragnaros_burning_speed'), +(98497, 'spell_ragnaros_molten_seed'), +(98498, 'spell_ragnaros_molten_seed_dummy'), +(100579, 'spell_ragnaros_molten_seed_dummy'), +(100580, 'spell_ragnaros_molten_seed_dummy'), +(100581, 'spell_ragnaros_molten_seed_dummy'), +(98520, 'spell_ragnaros_molten_seed_visual'), +(100887, 'spell_ragnaros_molten_seed_visual'), +(100888, 'spell_ragnaros_molten_seed_visual'), +(100889, 'spell_ragnaros_molten_seed_visual'), +(99171, 'spell_ragnaros_engulfing_flames'), +(100172, 'spell_ragnaros_engulfing_flames'), +(100173, 'spell_ragnaros_engulfing_flames'), +(100174, 'spell_ragnaros_engulfing_flames'), +(100171, 'spell_ragnaros_world_in_flames'), +(100190, 'spell_ragnaros_world_in_flames'), +(98518, 'spell_ragnaros_molten_inferno'), +(100252, 'spell_ragnaros_molten_inferno'), +(100253, 'spell_ragnaros_molten_inferno'), +(100254, 'spell_ragnaros_molten_inferno'), +(100459, 'spell_ragnaros_blazing_heat'), +(101249, 'spell_ragnaros_blazing_heat'), +(101250, 'spell_ragnaros_blazing_heat'), +(101251, 'spell_ragnaros_blazing_heat'), +(100460, 'spell_ragnaros_blazing_heat_script'), +(100981, 'spell_ragnaros_blazing_heat_script'), +(100982, 'spell_ragnaros_blazing_heat_script'), +(100983, 'spell_ragnaros_blazing_heat_script'), +(99125, 'spell_ragnaros_blazing_heat_aoe'), +(99267, 'spell_ragnaros_living_meteor'), +(101387, 'spell_ragnaros_living_meteor'), +(101388, 'spell_ragnaros_living_meteor'), +(101389, 'spell_ragnaros_living_meteor'), +(99849, 'spell_ragnaros_fixate'), +(99296, 'spell_ragnaros_combustible'), +(100282, 'spell_ragnaros_combustible'), +(100283, 'spell_ragnaros_combustible'), +(100284, 'spell_ragnaros_combustible'), +(99279, 'spell_ragnaros_living_meteor_aoe'), +(99430, 'spell_ragnaros_death'), +(99399, 'spell_ragnaros_burning_wound'), +(101238, 'spell_ragnaros_burning_wound'), +(101239, 'spell_ragnaros_burning_wound'), +(101240, 'spell_ragnaros_burning_wound'), +(100628, 'spell_ragnaros_empowered_sulfuras'), +(100604, 'spell_ragnaros_empower_sulfuras'), +(100997, 'spell_ragnaros_empower_sulfuras'), +(100605, 'spell_ragnaros_empower_sulfuras_periodic'), +(100645, 'spell_ragnaros_entrapping_roots'), +(100653, 'spell_ragnaros_entrapping_roots_aura'), +(101237, 'spell_ragnaros_entrapping_roots_aura'), +(100691, 'spell_ragnaros_dreadflame'), +(101016, 'spell_ragnaros_dreadflame'), +(100966, 'spell_ragnaros_dreadflame_control_aura_damage'), +(100906, 'spell_ragnaros_dreadflame_control_aura_spawn'), +(100695, 'spell_ragnaros_dreadflame_control_aura_spread'), +(100823, 'spell_ragnaros_dreadflame_control_aura_deluge'), +(100751, 'spell_ragnaros_cloudburst'), +(100472, 'spell_ragnaros_breadth_of_frost_trigger'), +(100503, 'spell_ragnaros_breadth_of_frost'), +(100594, 'spell_ragnaros_superheated'), +(100915, 'spell_ragnaros_superheated'); + +DELETE FROM `conditions` WHERE `SourceEntry` IN (98710, 100890, 100891, 100892, 98708, 100256, 100257, 100258, 98951, 100883, 100884, 100885, 99012, 99054, 99051, 98497, 98498, 100579, 100580, 100581, 100158, 100302, 99172, 100175, 100176, 100177, 99216, 99217, 99235, 100178, 100179, 100180, 99236, 100181, 100182, 100183, 99218, 99125, 99145, 100344, 100342, 100345, 100907, 100605, 100606, 100604, 100997, 100645, 100653, 101237, 100906, 100751, 100472, 100567, 101088, 101102) AND `SourceTypeOrReferenceId`= 13; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ScriptName`, `Comment`) VALUES +(13, 1, 98710, 0, 0, 31, 0, 3, 53268, 0, 0, 0, '', 'Sulfuras Smash - Target Sulfuras Smash'), +(13, 1, 100890, 0, 0, 31, 0, 3, 53268, 0, 0, 0, '', 'Sulfuras Smash - Target Sulfuras Smash'), +(13, 1, 100891, 0, 0, 31, 0, 3, 53268, 0, 0, 0, '', 'Sulfuras Smash - Target Sulfuras Smash'), +(13, 1, 100892, 0, 0, 31, 0, 3, 53268, 0, 0, 0, '', 'Sulfuras Smash - Target Sulfuras Smash'), +(13, 2, 98708, 0, 0, 31, 0, 3, 53363, 0, 0, 0, '', 'Sulfuras Smash - Target Lava Wave'), +(13, 2, 100256, 0, 0, 31, 0, 3, 53363, 0, 0, 0, '', 'Sulfuras Smash - Target Lava Wave'), +(13, 2, 100257, 0, 0, 31, 0, 3, 53363, 0, 0, 0, '', 'Sulfuras Smash - Target Lava Wave'), +(13, 2, 100258, 0, 0, 31, 0, 3, 53363, 0, 0, 0, '', 'Sulfuras Smash - Target Lava Wave'), +(13, 4, 98708, 0, 0, 31, 0, 3, 53268, 0, 0, 0, '', 'Sulfuras Smash - Target Sulfuras Smash'), +(13, 4, 100256, 0, 0, 31, 0, 3, 53268, 0, 0, 0, '', 'Sulfuras Smash - Target Sulfuras Smash'), +(13, 4, 100257, 0, 0, 31, 0, 3, 53268, 0, 0, 0, '', 'Sulfuras Smash - Target Sulfuras Smash'), +(13, 4, 100258, 0, 0, 31, 0, 3, 53268, 0, 0, 0, '', 'Sulfuras Smash - Target Sulfuras Smash'), +(13, 1, 98951, 0, 0, 31, 0, 3, 53393, 0, 0, 0, '', 'Splitting Blow - Target Splitting Blow'), +(13, 1, 100883, 0, 0, 31, 0, 3, 53393, 0, 0, 0, '', 'Splitting Blow - Target Splitting Blow'), +(13, 1, 100884, 0, 0, 31, 0, 3, 53393, 0, 0, 0, '', 'Splitting Blow - Target Splitting Blow'), +(13, 1, 100885, 0, 0, 31, 0, 3, 53393, 0, 0, 0, '', 'Splitting Blow - Target Splitting Blow'), +(13, 1, 99012, 0, 0, 31, 0, 3, 53393, 0, 0, 0, '', 'Splitting Blow - Target Splitting Blow'), +(13, 1, 99051, 0, 0, 31, 0, 3, 53140, 0, 0, 0, '', 'Invoke Sons - Target Son Of Flame'), +(13, 1, 99054, 0, 0, 31, 0, 3, 53140, 0, 0, 0, '', 'Invoke Sons - Target Son Of Flame'), +(13, 1, 98497, 0, 0, 31, 0, 3, 53186, 0, 0, 0, '', 'Molten Seed - Target Molten Seed Caster'), +(13, 2, 98498, 0, 0, 31, 0, 3, 53189, 0, 0, 0, '', 'Molten Seed - Target Molten Elemental'), +(13, 2, 100579, 0, 0, 31, 0, 3, 53189, 0, 0, 0, '', 'Molten Seed - Target Molten Elemental'), +(13, 2, 100580, 0, 0, 31, 0, 3, 53189, 0, 0, 0, '', 'Molten Seed - Target Molten Elemental'), +(13, 2, 100581, 0, 0, 31, 0, 3, 53189, 0, 0, 0, '', 'Molten Seed - Target Molten Elemental'), +(13, 7, 100158, 0, 0, 31, 0, 3, 53189, 0, 0, 0, '', 'Molten Power - Target Molten Elemental'), +(13, 7, 100302, 0, 0, 31, 0, 3, 53189, 0, 0, 0, '', 'Molten Power - Target Molten Elemental'), +-- Engulfing Flames Near +(13, 1, 99172, 0, 0, 31, 0, 3, 53485, 338918, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 1, 31, 0, 3, 53485, 338917, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 2, 31, 0, 3, 53485, 338916, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 3, 31, 0, 3, 53485, 338910, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 4, 31, 0, 3, 53485, 338902, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 5, 31, 0, 3, 53485, 338888, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 6, 31, 0, 3, 53485, 338882, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 7, 31, 0, 3, 53485, 338873, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 8, 31, 0, 3, 53485, 338868, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 9, 31, 0, 3, 53485, 338869, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 10, 31, 0, 3, 53485, 338872, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 11, 31, 0, 3, 53485, 338879, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 12, 31, 0, 3, 53485, 338886, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 13, 31, 0, 3, 53485, 338899, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 14, 31, 0, 3, 53485, 338908, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 15, 31, 0, 3, 53485, 338913, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 16, 31, 0, 3, 53485, 338915, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99172, 0, 17, 31, 0, 3, 53485, 338919, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 0, 31, 0, 3, 53485, 338918, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 1, 31, 0, 3, 53485, 338917, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 2, 31, 0, 3, 53485, 338916, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 3, 31, 0, 3, 53485, 338910, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 4, 31, 0, 3, 53485, 338902, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 5, 31, 0, 3, 53485, 338888, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 6, 31, 0, 3, 53485, 338882, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 7, 31, 0, 3, 53485, 338873, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 8, 31, 0, 3, 53485, 338868, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 9, 31, 0, 3, 53485, 338869, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 10, 31, 0, 3, 53485, 338872, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 11, 31, 0, 3, 53485, 338879, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 12, 31, 0, 3, 53485, 338886, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 13, 31, 0, 3, 53485, 338899, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 14, 31, 0, 3, 53485, 338908, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 15, 31, 0, 3, 53485, 338913, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 16, 31, 0, 3, 53485, 338915, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100175, 0, 17, 31, 0, 3, 53485, 338919, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 0, 31, 0, 3, 53485, 338918, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 1, 31, 0, 3, 53485, 338917, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 2, 31, 0, 3, 53485, 338916, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 3, 31, 0, 3, 53485, 338910, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 4, 31, 0, 3, 53485, 338902, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 5, 31, 0, 3, 53485, 338888, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 6, 31, 0, 3, 53485, 338882, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 7, 31, 0, 3, 53485, 338873, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 8, 31, 0, 3, 53485, 338868, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 9, 31, 0, 3, 53485, 338869, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 10, 31, 0, 3, 53485, 338872, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 11, 31, 0, 3, 53485, 338879, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 12, 31, 0, 3, 53485, 338886, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 13, 31, 0, 3, 53485, 338899, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 14, 31, 0, 3, 53485, 338908, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 15, 31, 0, 3, 53485, 338913, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 16, 31, 0, 3, 53485, 338915, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100176, 0, 17, 31, 0, 3, 53485, 338919, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 0, 31, 0, 3, 53485, 338918, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 1, 31, 0, 3, 53485, 338917, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 2, 31, 0, 3, 53485, 338916, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 3, 31, 0, 3, 53485, 338910, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 4, 31, 0, 3, 53485, 338902, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 5, 31, 0, 3, 53485, 338888, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 6, 31, 0, 3, 53485, 338882, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 7, 31, 0, 3, 53485, 338873, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 8, 31, 0, 3, 53485, 338868, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 9, 31, 0, 3, 53485, 338869, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 10, 31, 0, 3, 53485, 338872, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 11, 31, 0, 3, 53485, 338879, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 12, 31, 0, 3, 53485, 338886, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 13, 31, 0, 3, 53485, 338899, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 14, 31, 0, 3, 53485, 338908, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 15, 31, 0, 3, 53485, 338913, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 16, 31, 0, 3, 53485, 338915, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100177, 0, 17, 31, 0, 3, 53485, 338919, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99216, 0, 0, 31, 0, 3, 53485, 338918, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 1, 31, 0, 3, 53485, 338917, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 2, 31, 0, 3, 53485, 338916, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 3, 31, 0, 3, 53485, 338910, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 4, 31, 0, 3, 53485, 338902, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 5, 31, 0, 3, 53485, 338888, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 6, 31, 0, 3, 53485, 338882, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 7, 31, 0, 3, 53485, 338873, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 8, 31, 0, 3, 53485, 338868, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 9, 31, 0, 3, 53485, 338869, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 10, 31, 0, 3, 53485, 338872, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 11, 31, 0, 3, 53485, 338879, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 12, 31, 0, 3, 53485, 338886, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 13, 31, 0, 3, 53485, 338899, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 14, 31, 0, 3, 53485, 338908, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 15, 31, 0, 3, 53485, 338913, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 16, 31, 0, 3, 53485, 338915, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +(13, 1, 99216, 0, 17, 31, 0, 3, 53485, 338919, 0, 0, '', 'Engulfing Flames Near Visual - Target Engulfing Flames'), +-- Engulfing Flames Middle +(13, 1, 99235, 0, 0, 31, 0, 3, 53485, 338905, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99235, 0, 1, 31, 0, 3, 53485, 338903, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99235, 0, 2, 31, 0, 3, 53485, 338897, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99235, 0, 3, 31, 0, 3, 53485, 338890, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99235, 0, 4, 31, 0, 3, 53485, 338877, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99235, 0, 5, 31, 0, 3, 53485, 338862, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99235, 0, 6, 31, 0, 3, 53485, 338857, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99235, 0, 7, 31, 0, 3, 53485, 338854, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99235, 0, 8, 31, 0, 3, 53485, 338851, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99235, 0, 9, 31, 0, 3, 53485, 338853, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99235, 0, 10, 31, 0, 3, 53485, 338856, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99235, 0, 11, 31, 0, 3, 53485, 338860, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99235, 0, 12, 31, 0, 3, 53485, 338867, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99235, 0, 13, 31, 0, 3, 53485, 338880, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99235, 0, 14, 31, 0, 3, 53485, 338889, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99235, 0, 15, 31, 0, 3, 53485, 338901, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99235, 0, 16, 31, 0, 3, 53485, 338904, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 0, 31, 0, 3, 53485, 338905, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 1, 31, 0, 3, 53485, 338903, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 2, 31, 0, 3, 53485, 338897, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 3, 31, 0, 3, 53485, 338890, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 4, 31, 0, 3, 53485, 338877, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 5, 31, 0, 3, 53485, 338862, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 6, 31, 0, 3, 53485, 338857, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 7, 31, 0, 3, 53485, 338854, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 8, 31, 0, 3, 53485, 338851, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 9, 31, 0, 3, 53485, 338853, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 10, 31, 0, 3, 53485, 338856, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 11, 31, 0, 3, 53485, 338860, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 12, 31, 0, 3, 53485, 338867, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 13, 31, 0, 3, 53485, 338880, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 14, 31, 0, 3, 53485, 338889, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 15, 31, 0, 3, 53485, 338901, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100178, 0, 16, 31, 0, 3, 53485, 338904, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 0, 31, 0, 3, 53485, 338905, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 1, 31, 0, 3, 53485, 338903, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 2, 31, 0, 3, 53485, 338897, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 3, 31, 0, 3, 53485, 338890, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 4, 31, 0, 3, 53485, 338877, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 5, 31, 0, 3, 53485, 338862, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 6, 31, 0, 3, 53485, 338857, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 7, 31, 0, 3, 53485, 338854, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 8, 31, 0, 3, 53485, 338851, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 9, 31, 0, 3, 53485, 338853, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 10, 31, 0, 3, 53485, 338856, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 11, 31, 0, 3, 53485, 338860, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 12, 31, 0, 3, 53485, 338867, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 13, 31, 0, 3, 53485, 338880, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 14, 31, 0, 3, 53485, 338889, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 15, 31, 0, 3, 53485, 338901, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100179, 0, 16, 31, 0, 3, 53485, 338904, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 0, 31, 0, 3, 53485, 338905, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 1, 31, 0, 3, 53485, 338903, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 2, 31, 0, 3, 53485, 338897, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 3, 31, 0, 3, 53485, 338890, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 4, 31, 0, 3, 53485, 338877, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 5, 31, 0, 3, 53485, 338862, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 6, 31, 0, 3, 53485, 338857, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 7, 31, 0, 3, 53485, 338854, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 8, 31, 0, 3, 53485, 338851, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 9, 31, 0, 3, 53485, 338853, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 10, 31, 0, 3, 53485, 338856, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 11, 31, 0, 3, 53485, 338860, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 12, 31, 0, 3, 53485, 338867, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 13, 31, 0, 3, 53485, 338880, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 14, 31, 0, 3, 53485, 338889, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 15, 31, 0, 3, 53485, 338901, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100180, 0, 16, 31, 0, 3, 53485, 338904, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99217, 0, 0, 31, 0, 3, 53485, 338905, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +(13, 1, 99217, 0, 1, 31, 0, 3, 53485, 338903, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +(13, 1, 99217, 0, 2, 31, 0, 3, 53485, 338897, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +(13, 1, 99217, 0, 3, 31, 0, 3, 53485, 338890, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +(13, 1, 99217, 0, 4, 31, 0, 3, 53485, 338877, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +(13, 1, 99217, 0, 5, 31, 0, 3, 53485, 338862, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +(13, 1, 99217, 0, 6, 31, 0, 3, 53485, 338857, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +(13, 1, 99217, 0, 7, 31, 0, 3, 53485, 338854, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +(13, 1, 99217, 0, 8, 31, 0, 3, 53485, 338851, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +(13, 1, 99217, 0, 9, 31, 0, 3, 53485, 338853, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +(13, 1, 99217, 0, 10, 31, 0, 3, 53485, 338856, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +(13, 1, 99217, 0, 11, 31, 0, 3, 53485, 338860, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +(13, 1, 99217, 0, 12, 31, 0, 3, 53485, 338867, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +(13, 1, 99217, 0, 13, 31, 0, 3, 53485, 338880, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +(13, 1, 99217, 0, 14, 31, 0, 3, 53485, 338889, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +(13, 1, 99217, 0, 15, 31, 0, 3, 53485, 338901, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +(13, 1, 99217, 0, 16, 31, 0, 3, 53485, 338904, 0, 0, '', 'Engulfing Flames Middle Visual - Target Engulfing Flames'), +-- Engulfing Flames Far +(13, 1, 99236, 0, 0, 31, 0, 3, 53485, 338898, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 1, 31, 0, 3, 53485, 338892, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 2, 31, 0, 3, 53485, 338883, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 3, 31, 0, 3, 53485, 338865, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 4, 31, 0, 3, 53485, 338852, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 5, 31, 0, 3, 53485, 338844, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 6, 31, 0, 3, 53485, 338839, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 7, 31, 0, 3, 53485, 338837, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 8, 31, 0, 3, 53485, 338836, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 9, 31, 0, 3, 53485, 338838, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 10, 31, 0, 3, 53485, 338840, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 11, 31, 0, 3, 53485, 338843, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 12, 31, 0, 3, 53485, 338849, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 13, 31, 0, 3, 53485, 338866, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 14, 31, 0, 3, 53485, 338881, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 15, 31, 0, 3, 53485, 338891, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 16, 31, 0, 3, 53485, 338895, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 17, 31, 0, 3, 53485, 338885, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 18, 31, 0, 3, 53485, 338870, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 19, 31, 0, 3, 53485, 338861, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 20, 31, 0, 3, 53485, 338850, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 21, 31, 0, 3, 53485, 338841, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 22, 31, 0, 3, 53485, 338832, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 23, 31, 0, 3, 53485, 338830, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 24, 31, 0, 3, 53485, 338822, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 25, 31, 0, 3, 53485, 338834, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 26, 31, 0, 3, 53485, 338829, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 27, 31, 0, 3, 53485, 338831, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 28, 31, 0, 3, 53485, 338833, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 29, 31, 0, 3, 53485, 338842, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 30, 31, 0, 3, 53485, 338846, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 31, 31, 0, 3, 53485, 338855, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 32, 31, 0, 3, 53485, 338864, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 33, 31, 0, 3, 53485, 338871, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99236, 0, 34, 31, 0, 3, 53485, 338884, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 0, 31, 0, 3, 53485, 338898, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 1, 31, 0, 3, 53485, 338892, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 2, 31, 0, 3, 53485, 338883, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 3, 31, 0, 3, 53485, 338865, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 4, 31, 0, 3, 53485, 338852, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 5, 31, 0, 3, 53485, 338844, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 6, 31, 0, 3, 53485, 338839, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 7, 31, 0, 3, 53485, 338837, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 8, 31, 0, 3, 53485, 338836, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 9, 31, 0, 3, 53485, 338838, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 10, 31, 0, 3, 53485, 338840, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 11, 31, 0, 3, 53485, 338843, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 12, 31, 0, 3, 53485, 338849, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 13, 31, 0, 3, 53485, 338866, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 14, 31, 0, 3, 53485, 338881, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 15, 31, 0, 3, 53485, 338891, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 16, 31, 0, 3, 53485, 338895, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 17, 31, 0, 3, 53485, 338885, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 18, 31, 0, 3, 53485, 338870, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 19, 31, 0, 3, 53485, 338861, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 20, 31, 0, 3, 53485, 338850, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 21, 31, 0, 3, 53485, 338841, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 22, 31, 0, 3, 53485, 338832, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 23, 31, 0, 3, 53485, 338830, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 24, 31, 0, 3, 53485, 338822, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 25, 31, 0, 3, 53485, 338834, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 26, 31, 0, 3, 53485, 338829, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 27, 31, 0, 3, 53485, 338831, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 28, 31, 0, 3, 53485, 338833, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 29, 31, 0, 3, 53485, 338842, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 30, 31, 0, 3, 53485, 338846, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 31, 31, 0, 3, 53485, 338855, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 32, 31, 0, 3, 53485, 338864, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 33, 31, 0, 3, 53485, 338871, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100181, 0, 34, 31, 0, 3, 53485, 338884, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 0, 31, 0, 3, 53485, 338898, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 1, 31, 0, 3, 53485, 338892, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 2, 31, 0, 3, 53485, 338883, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 3, 31, 0, 3, 53485, 338865, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 4, 31, 0, 3, 53485, 338852, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 5, 31, 0, 3, 53485, 338844, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 6, 31, 0, 3, 53485, 338839, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 7, 31, 0, 3, 53485, 338837, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 8, 31, 0, 3, 53485, 338836, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 9, 31, 0, 3, 53485, 338838, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 10, 31, 0, 3, 53485, 338840, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 11, 31, 0, 3, 53485, 338843, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 12, 31, 0, 3, 53485, 338849, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 13, 31, 0, 3, 53485, 338866, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 14, 31, 0, 3, 53485, 338881, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 15, 31, 0, 3, 53485, 338891, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 16, 31, 0, 3, 53485, 338895, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 17, 31, 0, 3, 53485, 338885, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 18, 31, 0, 3, 53485, 338870, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 19, 31, 0, 3, 53485, 338861, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 20, 31, 0, 3, 53485, 338850, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 21, 31, 0, 3, 53485, 338841, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 22, 31, 0, 3, 53485, 338832, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 23, 31, 0, 3, 53485, 338830, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 24, 31, 0, 3, 53485, 338822, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 25, 31, 0, 3, 53485, 338834, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 26, 31, 0, 3, 53485, 338829, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 27, 31, 0, 3, 53485, 338831, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 28, 31, 0, 3, 53485, 338833, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 29, 31, 0, 3, 53485, 338842, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 30, 31, 0, 3, 53485, 338846, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 31, 31, 0, 3, 53485, 338855, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 32, 31, 0, 3, 53485, 338864, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 33, 31, 0, 3, 53485, 338871, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100182, 0, 34, 31, 0, 3, 53485, 338884, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 0, 31, 0, 3, 53485, 338898, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 1, 31, 0, 3, 53485, 338892, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 2, 31, 0, 3, 53485, 338883, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 3, 31, 0, 3, 53485, 338865, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 4, 31, 0, 3, 53485, 338852, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 5, 31, 0, 3, 53485, 338844, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 6, 31, 0, 3, 53485, 338839, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 7, 31, 0, 3, 53485, 338837, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 8, 31, 0, 3, 53485, 338836, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 9, 31, 0, 3, 53485, 338838, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 10, 31, 0, 3, 53485, 338840, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 11, 31, 0, 3, 53485, 338843, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 12, 31, 0, 3, 53485, 338849, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 13, 31, 0, 3, 53485, 338866, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 14, 31, 0, 3, 53485, 338881, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 15, 31, 0, 3, 53485, 338891, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 16, 31, 0, 3, 53485, 338895, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 17, 31, 0, 3, 53485, 338885, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 18, 31, 0, 3, 53485, 338870, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 19, 31, 0, 3, 53485, 338861, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 20, 31, 0, 3, 53485, 338850, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 21, 31, 0, 3, 53485, 338841, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 22, 31, 0, 3, 53485, 338832, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 23, 31, 0, 3, 53485, 338830, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 24, 31, 0, 3, 53485, 338822, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 25, 31, 0, 3, 53485, 338834, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 26, 31, 0, 3, 53485, 338829, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 27, 31, 0, 3, 53485, 338831, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 28, 31, 0, 3, 53485, 338833, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 29, 31, 0, 3, 53485, 338842, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 30, 31, 0, 3, 53485, 338846, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 31, 31, 0, 3, 53485, 338855, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 32, 31, 0, 3, 53485, 338864, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 33, 31, 0, 3, 53485, 338871, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 100183, 0, 34, 31, 0, 3, 53485, 338884, 0, 0, '', 'Engulfing Flames - Target Engulfing Flames'), +(13, 1, 99218, 0, 0, 31, 0, 3, 53485, 338898, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 1, 31, 0, 3, 53485, 338892, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 2, 31, 0, 3, 53485, 338883, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 3, 31, 0, 3, 53485, 338865, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 4, 31, 0, 3, 53485, 338852, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 5, 31, 0, 3, 53485, 338844, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 6, 31, 0, 3, 53485, 338839, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 7, 31, 0, 3, 53485, 338837, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 8, 31, 0, 3, 53485, 338836, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 9, 31, 0, 3, 53485, 338838, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 10, 31, 0, 3, 53485, 338840, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 11, 31, 0, 3, 53485, 338843, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 12, 31, 0, 3, 53485, 338849, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 13, 31, 0, 3, 53485, 338866, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 14, 31, 0, 3, 53485, 338881, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 15, 31, 0, 3, 53485, 338891, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 16, 31, 0, 3, 53485, 338895, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 17, 31, 0, 3, 53485, 338885, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 18, 31, 0, 3, 53485, 338870, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 19, 31, 0, 3, 53485, 338861, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 20, 31, 0, 3, 53485, 338850, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 21, 31, 0, 3, 53485, 338841, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 22, 31, 0, 3, 53485, 338832, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 23, 31, 0, 3, 53485, 338830, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 24, 31, 0, 3, 53485, 338822, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 25, 31, 0, 3, 53485, 338834, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 26, 31, 0, 3, 53485, 338829, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 27, 31, 0, 3, 53485, 338831, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 28, 31, 0, 3, 53485, 338833, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 29, 31, 0, 3, 53485, 338842, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 30, 31, 0, 3, 53485, 338846, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 31, 31, 0, 3, 53485, 338855, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 32, 31, 0, 3, 53485, 338864, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 33, 31, 0, 3, 53485, 338871, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99218, 0, 34, 31, 0, 3, 53485, 338884, 0, 0, '', 'Engulfing Flames Far Visual - Target Engulfing Flames'), +(13, 1, 99125, 0, 0, 31, 0, 3, 53473, 0, 0, 0, '', 'Blazing Heat - Target Blazing Heat'), +(13, 1, 99145, 0, 0, 31, 0, 3, 53231, 0, 0, 0, '', 'Blazing Heat - Target Lava Scion'), +(13, 1, 99145, 0, 1, 31, 0, 3, 53140, 0, 0, 0, '', 'Blazing Heat - Target Son of Flame'), +(13, 1, 100344, 0, 0, 31, 0, 3, 52409, 0, 0, 0, '', 'Draw Out Firelord - Target Ragnaros'), +(13, 1, 100342, 0, 0, 31, 0, 3, 52409, 0, 0, 0, '', 'Draw Out Firelord - Target Ragnaros'), +(13, 1, 100345, 0, 0, 31, 0, 3, 52409, 0, 0, 0, '', 'Draw Out Firelord - Target Ragnaros'), +(13, 1, 100907, 0, 0, 31, 0, 3, 53500, 0, 0, 0, '', 'Freeze - Target Living Meteor'), +(13, 1, 100605, 0, 0, 31, 0, 3, 53186, 0, 0, 0, '', 'Empower Sulfuras - Target Molten Seed Caster'), +(13, 2, 100604, 0, 0, 31, 0, 3, 53186, 0, 0, 0, '', 'Empower Sulfuras - Target Molten Seed Caster'), +(13, 2, 100997, 0, 0, 31, 0, 3, 53186, 0, 0, 0, '', 'Empower Sulfuras - Target Molten Seed Caster'), +(13, 1, 100606, 0, 0, 31, 0, 3, 52409, 0, 0, 0, '', 'Empower Sulfuras Missile - Target Ragnaros'), +(13, 1, 100645, 0, 0, 31, 0, 3, 53952, 0, 0, 0, '', 'Entrapping Roots - Target Platform Stalker'), +(13, 3, 100653, 0, 0, 31, 0, 3, 52409, 0, 0, 0, '', 'Entrapping Roots - Target Ragnaros'), +(13, 3, 101237, 0, 0, 31, 0, 3, 52409, 0, 0, 0, '', 'Entrapping Roots - Target Ragnaros'), +(13, 1, 100906, 0, 0, 31, 0, 3, 54203, 0, 0, 0, '', 'Dreadflame Control Aura - Target Dreadflame Spawn'), +(13, 1, 100751, 0, 0, 31, 0, 3, 53952, 0, 0, 0, '', 'Cloudburst - Target Platform Stalker'), +(13, 1, 100472, 0, 0, 31, 0, 3, 53952, 0, 0, 0, '', 'Breadth of Frost Trigger - Target Platform Stalker'), +(13, 7, 100567, 0, 0, 31, 0, 3, 53500, 0, 0, 0, '', 'Breadth of Frost - Target Living Meteor'), +(13, 1, 101088, 0, 0, 31, 0, 3, 53500, 0, 0, 0, '', 'Lavalogged - Target Living Meteor'), +(13, 1, 101102, 0, 0, 31, 0, 3, 53500, 0, 0, 0, '', 'Lavalogged - Target Living Meteor'); + +DELETE FROM `spawn_group_template` WHERE `groupId` IN (458, 459); +INSERT INTO `spawn_group_template` (`groupId`, `groupName`, `groupFlags`) VALUES +(458, 'Firelands - Ragnaros', 4), +(459, 'Firelands - Ragnaros Stalkers', 4); + +DELETE FROM `spawn_group` WHERE `groupId` IN (458, 459); +INSERT INTO `spawn_group` (`groupId`, `spawnType`, `spawnId`) VALUES +(458, 0, 338819), +(459, 0, 338823), +(459, 0, 338824), +(459, 0, 338825), +(459, 0, 338826), +(459, 0, 338827), +(459, 0, 338828), +(459, 0, 338835), +(459, 0, 338845), +(459, 0, 338859), +(459, 0, 338863), +(459, 0, 338876), +(459, 0, 338887), +(459, 0, 338894), +(459, 0, 338900), +(459, 0, 338907), +(459, 0, 338911), +(459, 0, 338914), +(459, 0, 338920), +(459, 0, 338921), +(459, 0, 338922), +(459, 0, 338923), +(459, 0, 338858), +(459, 0, 338874), +(459, 0, 338875), +(459, 0, 338822), +(459, 0, 338829), +(459, 0, 338830), +(459, 0, 338831), +(459, 0, 338832), +(459, 0, 338833), +(459, 0, 338834), +(459, 0, 338836), +(459, 0, 338837), +(459, 0, 338838), +(459, 0, 338839), +(459, 0, 338840), +(459, 0, 338841), +(459, 0, 338842), +(459, 0, 338843), +(459, 0, 338844), +(459, 0, 338846), +(459, 0, 338849), +(459, 0, 338850), +(459, 0, 338851), +(459, 0, 338852), +(459, 0, 338853), +(459, 0, 338854), +(459, 0, 338855), +(459, 0, 338856), +(459, 0, 338857), +(459, 0, 338860), +(459, 0, 338861), +(459, 0, 338862), +(459, 0, 338864), +(459, 0, 338865), +(459, 0, 338866), +(459, 0, 338867), +(459, 0, 338868), +(459, 0, 338869), +(459, 0, 338870), +(459, 0, 338871), +(459, 0, 338872), +(459, 0, 338873), +(459, 0, 338877), +(459, 0, 338879), +(459, 0, 338880), +(459, 0, 338881), +(459, 0, 338882), +(459, 0, 338883), +(459, 0, 338884), +(459, 0, 338885), +(459, 0, 338886), +(459, 0, 338888), +(459, 0, 338889), +(459, 0, 338890), +(459, 0, 338891), +(459, 0, 338892), +(459, 0, 338895), +(459, 0, 338897), +(459, 0, 338898), +(459, 0, 338899), +(459, 0, 338901), +(459, 0, 338902), +(459, 0, 338903), +(459, 0, 338904), +(459, 0, 338905), +(459, 0, 338908), +(459, 0, 338909), +(459, 0, 338910), +(459, 0, 338913), +(459, 0, 338915), +(459, 0, 338916), +(459, 0, 338917), +(459, 0, 338918), +(459, 0, 338919), +(459, 0, 338847), +(459, 0, 338848), +(459, 0, 338878), +(459, 0, 338893), +(459, 0, 338896), +(459, 0, 338906), +(459, 0, 338912); + +DELETE FROM `areatrigger_scripts` WHERE `ScriptName`= 'at_fl_ragnaros_spawn'; +INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES +(6845, 'at_fl_ragnaros_spawn'); + +DELETE FROM `creature_template_movement` WHERE `CreatureId` IN (52409, 53086, 53266, 53268, 53363, 53140, 53420, 53186, 53485, 53797, 53798, 53799, 53876, 53875, 53920, 53952, 53729, 54074, 54127, 54203, 54147, 54155); +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`) VALUES +-- Ragnaros +(52409, 1, 0, 0, 0), +(53797, 1, 0, 0, 0), +(53798, 1, 0, 0, 0), +(53799, 1, 0, 0, 0), +(53920, 1, 0, 0, 0), +-- Magma Trap +(53086, 1, 0, 1, 1), +-- Sulfuras Smash +(53266, 1, 0, 1, 1), +(53268, 1, 0, 1, 1), +-- Lava Wave +(53363, 1, 0, 1, 0), +-- Son of Flame +(53140, 1, 0, 0, 0), +-- Sulfuras, Hand of Ragnaros +(53420, 1, 0, 1, 0), +-- Molten Seed Caster +(53186, 1, 0, 1, 1), +-- Engulfing Flames +(53485, 1, 0, 1, 1), +-- Platform Stalker +(53952, 1, 0, 1, 1), +-- Magma +(53729, 0, 0, 1, 1), +-- Entrapping Roots +(54074, 1, 0, 1, 1), +-- Dreadflame Spawn +(54203, 1, 0, 1, 1), +-- Dreadflame +(54127, 1, 0, 1, 1), +-- Archdruid Hamuul Runetotem +(53876, 1, 0, 1, 0), +-- Malfurion Stormrage +(53875, 1, 0, 1, 0), +-- Cloudburst +(54147, 0, 0, 1, 1), +(54155, 0, 0, 1, 1); + +DELETE FROM `spell_dbc` WHERE `Id`= 100170; +INSERT INTO `spell_dbc` (`Id`, `Attributes`, `AttributesEx`, `AttributesEx2`, `AttributesEx3`, `AttributesEx4`, `AttributesEx6`, `SpellAuraOptionsId`, `DurationIndex`, `SpellName`) VALUES +(100170, 0x00800180, 0x10000000, 0x00000005, 0x00100000, 0x00000080, 0x00000404, 7249, 21, '(Serverside/Non-DB2) Molten Seed'); + +DELETE FROM `spelleffect_dbc` WHERE `Id`= 160114; +INSERT INTO `spelleffect_dbc` (`Id`, `SpellID`, `Effect`, `EffectAura`, `EffectBasePoints`, `EffectIndex`, `Comment`) VALUES +(160114, 100170, 6, 61, 20, 0, '(Serverside/Non-DB2) Molten Seed'); + +UPDATE `instance_encounters` SET `creditType`= 1, `creditEntry`= 102237 WHERE `entry`= 1203; + +DELETE FROM `spell_target_position` WHERE `ID` IN (101095, 101096, 100679); +INSERT INTO `spell_target_position` (`ID`, `EffectIndex`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `VerifiedBuild`) VALUES +(101095, 0, 720, 1012.49, -57.2882, 55.3302, 3.533860683441162109, 15211), +(101096, 0, 720, 1012.49, -57.2882, 55.3302, 3.533860683441162109, 15211), +(100679, 0, 720, 1041.25, -57.4478, 55.5, 0, 15595); + +DELETE FROM `creature` WHERE `guid`= 339066; +DELETE FROM `creature_addon` WHERE `guid`= 339066; + +UPDATE `creature_model_info` SET `BoundingRadius`= 0.75, `CombatReach`= 21 WHERE `DisplayID`= 38570; + +DELETE FROM `spell_dbc` WHERE `Id`= 102237; +INSERT INTO `spell_dbc` (`Id`, `Attributes`, `AttributesEx`, `AttributesEx2`, `AttributesEx3`, `AttributesEx4`, `AttributesEx5`, `AttributesEx6`, `AttributesEx7`, `AttributesEx8`, `AttributesEx9`, `AttributesEx10`, `CastingTimeIndex`, `DurationIndex`, `RangeIndex`, `SchoolMask`, `SpellAuraOptionsId`, `SpellCastingRequirementsId`, `SpellCategoriesId`, `SpellClassOptionsId`, `SpellEquippedItemsId`, `SpellInterruptsId`, `SpellLevelsId`, `SpellTargetRestrictionsId`, `SpellName`) VALUES +(102237, 2843738368, 268436512, 540677, 269943552, 128, 393225, 5120, 33554432, 32, 0, 0, 0, 36, 13, 0, 38, 0, 0, 0, 0, 0, 0, 0, '(Serverside/Non-DB2) Ragnaros Kill Credit (DND)'); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index a8e4da9efcc..b5ac9bc4092 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -4980,6 +4980,74 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_100_YARDS); }); + // World in Flames + // There is no channel update packet in sniffs so we can assume that this is a leftover from a redesign + ApplySpellFix({ + 100171, + 100190 + }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx &= ~SPELL_ATTR1_CHANNELED; + }); + + // Fixate + ApplySpellFix({ 99849 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx5 |= SPELL_ATTR5_ALLOW_ACTIONS_DURING_CHANNEL; + }); + + // Lava Bolt (25 player) + ApplySpellFix({ + 100289, + 100291 + }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 10; + }); + + // Lava Bolt (10 player) + ApplySpellFix({ + 98981, + 100290 + }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 4; + }); + + // Sulfuras Smash + // Sniffs cast packets show immunities so we can assume that Sulfuras Smash does have interrupt flags internally. + // We are going with SpellInterruptFlags::Stun so SMSG_SPELL_START sends the correct immunities + ApplySpellFix({ + 98710, + 100890, + 100891, + 100892 + }, [](SpellInfo* spellInfo) + { + spellInfo->InterruptFlags |= SpellInterruptFlags::Stun; + }); + + // Sulfuras Smash + ApplySpellFix({ + 98708, + 100256, + 100257, + 100258 + }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx7 |= SPELL_ATTR7_CANT_MISS; + }); + + // Entrapping Roots + ApplySpellFix({ + 100653, + 101237, + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].MaxRadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS); + spellInfo->Effects[EFFECT_1].MaxRadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS); + }); + // ENDOF FIRELANDS SPELLS // diff --git a/src/server/scripts/Kalimdor/Firelands/boss_ragnaros_firelands.cpp b/src/server/scripts/Kalimdor/Firelands/boss_ragnaros_firelands.cpp new file mode 100644 index 00000000000..b9188fff438 --- /dev/null +++ b/src/server/scripts/Kalimdor/Firelands/boss_ragnaros_firelands.cpp @@ -0,0 +1,2497 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * 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 . + */ + +#include "firelands.h" +#include "DynamicObject.h" +#include "GameObject.h" +#include "InstanceScript.h" +#include "Map.h" +#include "MoveSpline.h" +#include "MotionMaster.h" +#include "ObjectAccessor.h" +#include "PassiveAI.h" +#include "ScriptMgr.h" +#include "SpellAuras.h" +#include "SpellAuraEffects.h" +#include "ScriptedCreature.h" +#include "Spell.h" +#include "SpellMgr.h" +#include "SpellScript.h" +#include "TemporarySummon.h" + +#include "boost/container/flat_set.hpp" + +enum Spells +{ + // Ragnaros + SPELL_BASE_VISUAL = 98860, + SPELL_BURNING_WOUND = 99401, + SPELL_WRATH_OF_RAGNAROS_AOE = 98259, + SPELL_HAND_OF_RAGNAROS = 98237, + SPELL_MAGMA_TRAP_AOE = 98159, + SPELL_MAGMA_BLAST = 98313, + SPELL_SULFURAS_SMASH_AOE = 98703, + SPELL_SULFURAS_SMASH_SUMMON = 98706, + SPELL_SULFURAS_SMASH = 98710, + SPELL_SPLITTING_BLOW = 98951, + SPELL_SUBMERGE = 100051, + SPELL_MOLTEN_SEED = 98333, + SPELL_ENGULFING_FLAMES = 99171, + SPELL_ENGULFING_FLAMES_FAR = 99236, + SPELL_ENGULFING_FLAMES_FAR_VISUAL = 99218, + SPELL_ENGULFING_FLAMES_MIDDLE = 99235, + SPELL_ENGULFING_FLAMES_MIDDLE_VISUAL = 99217, + SPELL_ENGULFING_FLAMES_NEAR = 99172, + SPELL_ENGULFING_FLAMES_NEAR_VISUAL = 99216, + SPELL_LIVING_METEOR = 99267, + SPELL_ACHIEVEMENT_CHECK = 101091, + SPELL_AWARD_REPUTATION_BOSS_KILL = 101620, + SPELL_HEART_OF_RAGNAROS = 101253, // @todo: handle + SPELL_RAGNAROS_KILL_CREDIT = 102237, // Serverside Spell + SPELL_SUMMON_CHEST = 101095, + SPELL_DEATH = 99430, + SPELL_BURNING_BLAST = 99400, + SPELL_LEGS_SUBMERGE = 100312, + SPELL_LEGS_HEAL = 100346, + SPELL_TRANSFORM = 100420, + SPELL_SUPERHEATED = 100593, + SPELL_DREADFLAME_SUMMON_CONTROLLER = 100679, + SPELL_DREADFLAME_PERIODIC = 100691, + SPELL_DREADFLAME_MISSILE = 100675, + SPELL_BREADTH_OF_FROST_TRIGGER = 100472, + SPELL_ENTRAPPING_ROOTS = 100645, + SPELL_EMPOWER_SULFURAS = 100604, + + // Magma Trap + SPELL_MAGMA_TRAP_VISUAL = 98179, + SPELL_MAGMA_TRAP_PERIODIC_AURA = 98172, + SPELL_MAGMA_TRAP_VULNERABILITY = 100238, + SPELL_MAGMA_TRAP_ERUPTION = 100107, + + // Sulfuras Smash + SPELL_LAVA_WAVE_N = 98874, + SPELL_LAVA_WAVE_W = 98876, + SPELL_LAVA_WAVE_E = 98875, + SPELL_LAVA_POOL = 98712, + SPELL_SCORCHED_GROUND = 100119, + + // Lava Wave + SPELL_LAVA_WAVE = 98873, + + // Son of Flame + SPELL_HIT_ME = 100446, + SPELL_BURNING_SPEED = 98473, + SPELL_BURNING_SPEED_AURA = 99414, + SPELL_SUPERNOVA = 99112, + SPELL_QUITE_SUICIDE = 3617, // Serverside spell + + // Splitting Blow + SPELL_INVOKE_SONS = 99050, + + // Sulfuras, Hand of Ragnaros + SPELL_SULFURAS = 100456, + + // Molten Elemental + SPELL_INVIS_PRE_VISUAL_2 = 100153, + SPELL_MOLTEN_SEED_AOE = 98497, + SPELL_MOLTEN_SEED_VISUAL = 98520, + SPELL_MOLTEN_POWER = 100158, + SPELL_MOLTEN_INFERNO = 100253, + SPELL_AGGRO_DEMON_CREATOR = 100142, + SPELL_REDUCE_CRITICAL_STRIKE_CHANCE_100_PCT = 64481, + + // Lava Scion + SPELL_BLAZING_HEAT = 100459, + SPELL_BLAZING_HEAT_SUMMON = 99129, + + // Blazing Heat + SPELL_BLAZING_HEAT_AURA = 99128, + + // Living Meteor + SPELL_LIVING_METEOR_DAMAGE_REDUCTION = 100904, + SPELL_COMBUSTIBLE = 99296, + SPELL_LIVING_METEOR_TARGET_SEARCHER = 99269, + SPELL_LIVING_METEOR_SPEED_STACKER = 100278, + SPELL_LIVING_METEOR_SPEED_AURA = 100277, + SPELL_FIXATE = 99849, + SPELL_COMBUSTION = 99303, + SPELL_METEOR_IMPACT = 99287, + SPELL_TRIGGERED_LIVING_METEOR = 100910, + + // Archdruid Hamuul Runetotem + SPELL_TRANSFORM_HAMUUL = 100311, + SPELL_DRAW_OUT_FIRELORD_HAMUUL = 100344, + SPELL_ENTRAPPING_ROOTS_CAST = 100646, + + // Malfurion Stormrage + SPELL_TRANSFORM_MALFURION = 100310, + SPELL_DRAW_OUT_FIRELORD_MALFURION = 100342, + SPELL_CLOUDBURST = 100751, + + // Cenarius + SPELL_DRAW_OUT_FIRELORD_CENARIUS = 100345, + SPELL_BREADTH_OF_FROST_CAST = 100479, + SPELL_BREADTH_OF_FROST_AURA = 100503, + + // Dreadflame + SPELL_DREADFLAME_CONTROL_AURA_1 = 100695, + SPELL_DREADFLAME_CONTROL_AURA_2 = 100696, + SPELL_DREADFLAME_CONTROL_AURA_3 = 100965, + SPELL_DREADFLAME_CONTROL_AURA_4 = 100905, + SPELL_DREADFLAME_AREA_DUMMY_AURA = 100692, + SPELL_DREADFLAME_DAMAGE = 100941, + SPELL_DELUGE_TRIGGERED = 100757, + + // Cloudburst + SPELL_CLOUDBURST_VISUAL = 100758, + SPELL_DELUGE = 100713, + + // Magma + SPELL_KNOCKBACK_PERIODIC = 99908 +}; + +#define SPELL_SUBMERGE_AURA RAID_MODE(98982, 100295, 100296, 100297) +#define SPELL_WORLD_IN_FLAMES RAID_MODE(100171, 100190) +#define SPELL_INVIS_PRE_VISUAL_1 RAID_MODE(98983, 100133, 100134, 100135) + +enum Texts +{ + // Ragnaros + SAY_EMERGE = 0, + SAY_AGGRO = 1, + SAY_WRATH_OF_RAGNAROS = 2, + SAY_ANNOUNCE_MAGMA_TRAP = 3, + SAY_ANNOUNCE_SULFURAS_SMASH = 4, + SAY_ANNOUNCE_SPLITTING_BLOW = 5, + SAY_SPLITTING_BLOW = 6, + SAY_INVOKE_SONS_OF_FLAME = 7, + SAY_PICK_UP_SULFURAS = 8, + SAY_ANNOUNCE_WORLD_IN_FLAMES = 9, + SAY_ANNOUNCE_ENGULFING_FLAMES = 10, + SAY_ANNOUNCE_EMERGE = 11, + SAY_DEFEATED = 12, // Normal difficulty only + SAY_SUBMERGE_HEROIC = 13, + SAY_EMERGE_HEROIC = 14, + SAY_BREAK_FREE = 15, + SAY_ANNOUNCE_EMPOWER_SULFURAS = 16, + SAY_ANNOUNCE_DREADFLAME = 17, + SAY_SLAY = 18, + SAY_DEATH = 19, + + // Lava Scion + SAY_ANNOUNCE_BLAZING_HEAT = 0, + + // Cenarius + SAY_PREPARE_TO_DRAW_RAGNAROS_OUT = 0, + + // Malfurion Stormrage + SAY_RAGNAROS_BOUND = 0, + + // Archdruids + SAY_OUTRO_1 = 1, + SAY_OUTRO_2 = 2, + SAY_OUTRO_3 = 3 +}; + +enum Events +{ + // Ragnaros + EVENT_EMERGE = 1, + EVENT_BASE_VISUAL, + EVENT_FINISH_ARRIVAL, + EVENT_WRATH_OF_RAGNAROS, + EVENT_HAND_OF_RAGNAROS, + EVENT_MAGMA_TRAP, + EVENT_SULFURAS_SMASH, + EVENT_SET_AGGRESSIVE_REACT_STATE, + EVENT_SPLITTING_BLOW, + EVENT_MOLTEN_SEED, + EVENT_ENGULFING_FLAMES, + EVENT_ANNOUNCE_END_OF_INTERMISSION, + EVENT_FINISH_INTERMISSION, + EVENT_LIVING_METEOR, + EVENT_LEGS_HEAL, + EVENT_FACE_HOME, + EVENT_EMERGE_HEROIC, + EVENT_TALK_EMERGE_HEROIC, + EVENT_BREAK_FREE, + EVENT_SUPERHEATED, + EVENT_ENTRAPPING_ROOTS, + EVENT_EMPOWER_SULFURAS, + EVENT_DREADFLAME, + EVENT_BREADTH_OF_FROST, + + // Son of Flame + EVENT_MOVE_TOWARDS_SULFURAS, + + // Lava Scion + EVENT_BLAZING_HEAT, + + // Living Meteor + EVENT_FIXATE, + EVENT_COMBUSTIBLE, + EVENT_RESUME_CHASE_MOVEMENT, + + // Archdruids + EVENT_DRAW_OUT_FIRELORD, + EVENT_OUTRO_1, + EVENT_OUTRO_2, + EVENT_OUTRO_3, + + // Cenarius + EVENT_TALK_PREPARE_TO_DRAW_RAGNAROS_OUT, + + // Malfurion Stormrage + EVENT_SAY_RAGNAROS_BOUND, + EVENT_CLOUDBURST, +}; + +enum Actions +{ + // Ragnaros + ACTION_INVOKE_SONS_OF_FLAME_TRIGGERED = 0, + ACTION_SON_OF_FLAME_DIED = 1, + ACTION_ARCHDRUIDS_ARRIVED = 2, + + // Son of Flame + ACTION_INVOKE_SON = 0, + + // Lava Scion + ACTION_DISENGAGE = 0, + + // Living Meteor + ACTION_COMBUSTION_TRIGGERED = 0, + ACTION_IMPACT_TRIGGERED = 1, + + // Dreadflame + ACTION_SPREAD_DREADFLAMES = 0, + + // Archdruids + ACTION_RAGNAROS_KILLED = 0, +}; + +enum Phases +{ + PHASE_INTRO = 1, + PHASE_ONE = 2, + PHASE_INTERMISSION_1 = 3, + PHASE_TWO = 4, + PHASE_INTERMISSION_2 = 5, + PHASE_THREE = 6, + PHASE_FOUR = 7 +}; + +enum AnimKits +{ + // Ragnaros + ANIM_KIT_ID_EMERGE = 1467, + ANIM_KIT_ID_TALK = 1468, + ANIM_KIT_ID_PICK_UP_SULFURAS = 1465, + ANIM_KIT_ID_EMERGE_HEROIC = 1522, + ANIM_KIT_ID_BREAK_FREE = 1486, + + // Son of Flame + ANIM_KIT_ID_INVOKE = 1370, + + // Malfurion Stormrage + ANIM_KIT_ID_YELL = 1523 +}; + +enum Data +{ + // Ragnaros + DATA_CURRENT_SPLITTING_BLOW_TARGET = 0, + DATA_CAST_DREADFLAMES = 0, + + // Dreadflame + DATA_DREADFLAME_POSTION_INFO_INDEX = 0, + DATA_OCCUPY_DREADFLAME_POSITION_INFO_INDEX = 0, + DATA_RELEASE_DREADFLAME_POSITION_INFO_INDEX = 1 +}; + +enum MovePoints +{ + // Son of Flame + POINT_ID_TRIGGER_SUPERNOVA = 1, + + // Archdruids + POINT_ID_ENTER_PLATFORM = 0, + POINT_ID_LAND = 1 +}; + +enum SummonGroups +{ + // Ragnaros + SUMMON_GROUP_ID_LAVA_SCIONS = 0, + SUMMON_GROUP_ID_ARCHDRUIDS = 1 +}; + +enum VirtualItemSlotIds +{ + ITEM_SLOT_ID_EMPOWERED_SULFURAS = 71036, + ITEM_SLOT_ID_DEFAULT_SULFURAS = 69804 +}; + +enum Misc +{ + INVALID_DREADFLAME_POSITION_INFO_INDEX = 1000 +}; + +static std::vector SonOfFlameSpawnPositions = +{ + { 1014.3245849609375f, -88.8020858764648437f, 55.5272216796875f, 1.919862151145935058f }, + { 1055.3316650390625f, -105.013893127441406f, 55.43525314331054687f, 2.408554315567016601f }, + { 1035.048583984375f, -98.7586822509765625f, 55.58205032348632812f, 2.234021425247192382f }, + { 1074.8663330078125f, -100.788192749023437f, 55.42414093017578125f, 2.600540637969970703f }, + { 1013.45831298828125f, -68.0850677490234375f, 55.42096710205078125f, 2.513274192810058593f }, + { 1074.8524169921875f, -12.3159723281860351f, 55.4241180419921875f, 3.700098037719726562f }, + { 1061.34033203125f, -16.7413196563720703f, 55.56818771362304687f, 3.769911050796508789f }, + { 1051.49658203125f, -113.729156494140625f, 55.44934844970703125f, 2.39110112190246582f }, + { 1051.7603759765625f, 0.128472223877906799f, 55.44715118408203125f, 4.031710624694824218f }, + { 998.89410400390625f, -69.0763931274414062f, 55.557647705078125f, 1.256637096405029296f }, + { 1065.2569580078125f, -6.94618082046508789f, 55.56818389892578125f, 3.839724302291870117f }, + { 1030.37158203125f, -23.6371536254882812f, 55.44153594970703125f, 4.049163818359375f }, + { 1068.1510009765625f, -101.392356872558593f, 55.56827926635742187f, 2.565634012222290039f }, + { 1055.5555419921875f, -8.875f, 55.43347930908203125f, 3.874630928039550781f }, + { 1067.6927490234375f, -13.4114580154418945f, 55.53647994995117187f, 3.700098037719726562f }, + { 1060.94970703125f, -98.1336822509765625f, 55.56827545166015625f, 2.513274192810058593f }, + { 1029.8038330078125f, -90.6909713745117187f, 55.57508087158203125f, 2.234021425247192382f } +}; + +struct EngulfingFlamesSpellIds +{ + EngulfingFlamesSpellIds(uint32 visualSpellId, uint32 castSpellId) : VisualSpellID(visualSpellId), CastSpellID(castSpellId) { } + + uint32 VisualSpellID; + uint32 CastSpellID; +}; + +static std::array EngulfingFlamesData = +{ + EngulfingFlamesSpellIds(SPELL_ENGULFING_FLAMES_NEAR_VISUAL, SPELL_ENGULFING_FLAMES_NEAR), + EngulfingFlamesSpellIds(SPELL_ENGULFING_FLAMES_MIDDLE_VISUAL, SPELL_ENGULFING_FLAMES_MIDDLE), + EngulfingFlamesSpellIds(SPELL_ENGULFING_FLAMES_FAR_VISUAL, SPELL_ENGULFING_FLAMES_FAR) +}; + +struct boss_ragnaros_firelands : public BossAI +{ + boss_ragnaros_firelands(Creature* creature) : BossAI(creature, DATA_RAGNAROS), + _defeatedSonsOfFlame(0), _defeated(IsHeroic()), _canBeKilled(false) + { + me->setActive(true); // ensure that the AI is being updated while Ragnaros is doing his arrival events + } + + void InitializeAI() override + { + BossAI::InitializeAI(); + me->SetDisableGravity(true); + me->SetControlled(true, UNIT_STATE_ROOT); + } + + void JustAppeared() override + { + instance->SetBossState(DATA_RAGNAROS, NOT_STARTED); + instance->instance->SpawnGroupSpawn(SPAWN_GROUP_ID_RAGNAROS_STALKERS, true); + events.SetPhase(PHASE_INTRO); + events.ScheduleEvent(EVENT_EMERGE, 200ms); // Oneshot Anim Kits only work properly when Ragnaros has been sent out via UpdateObject, so we have to delay the packet a bit. + events.ScheduleEvent(EVENT_BASE_VISUAL, 2s); + events.ScheduleEvent(EVENT_FINISH_ARRIVAL, 7s); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); + Talk(SAY_AGGRO, who); + DoCastSelf(SPELL_BURNING_WOUND); + events.SetPhase(PHASE_ONE); + events.ScheduleEvent(EVENT_WRATH_OF_RAGNAROS, 6s, 0, PHASE_ONE); + events.ScheduleEvent(EVENT_HAND_OF_RAGNAROS, 26s, 0, PHASE_ONE); + events.ScheduleEvent(EVENT_MAGMA_TRAP, 16s, 0, PHASE_ONE); + events.ScheduleEvent(EVENT_SULFURAS_SMASH, 31s, 0, PHASE_ONE); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + EndEncounter(false); + } + + void JustDied(Unit* /*killer*/) override + { + EndEncounter(true); + } + + void KilledUnit(Unit* who) override + { + Talk(SAY_SLAY, who); + } + + void JustSummoned(Creature* summon) override + { + summons.RemoveNotExisting(); // Might be a bit excessive but probably better than risking giant loops on resets or completions + + switch (summon->GetEntry()) + { + case NPC_ARCHDRUID_HAMUUL_RUNETOTEM: + case NPC_MALFURION_STORMRAGE: + case NPC_CENARIUS: + _archdruidGUIDs.push_back(summon->GetGUID()); + break; + default: + summons.Summon(summon); + break; + } + + switch (summon->GetEntry()) + { + case NPC_MAGMA_TRAP: + summon->CastSpell(nullptr, SPELL_MAGMA_TRAP_VISUAL); + summon->m_Events.AddEventAtOffset([summon]() { summon->CastSpell(nullptr, SPELL_MAGMA_TRAP_PERIODIC_AURA); }, 1s); + break; + case NPC_SULFURAS_SMASH_1: + Talk(SAY_ANNOUNCE_SULFURAS_SMASH, summon); + me->AttackStop(); + me->SetReactState(REACT_PASSIVE); + me->SetFacingToObject(summon); + me->SetOrientationTowards(summon); // we need an immediately updated orientation for the next cast + DoCastSelf(SPELL_SULFURAS_SMASH_SUMMON); + + // Sulfuras Smash delays the execution of Wrath of Ragnaros by 5,5s + if (events.IsInPhase(PHASE_ONE)) + events.RescheduleEvent(EVENT_WRATH_OF_RAGNAROS, Milliseconds(events.GetTimeUntilEvent(EVENT_WRATH_OF_RAGNAROS)) + 5s + 500ms, 0, PHASE_ONE); + break; + case NPC_SULFURAS_SMASH_2: + if (summon->IsSummon()) + { + // For some reason, the npc dies instead of despawning right away according to sniffs. Let's do this as well. + summon->ToTempSummon()->SetTempSummonType(TEMPSUMMON_MANUAL_DESPAWN); + summon->m_Events.AddEventAtOffset([summon]() { summon->KillSelf(); }, 10s); + summon->SetCorpseDelay(15); + } + DoCastSelf(SPELL_SULFURAS_SMASH); + events.ScheduleEvent(EVENT_SET_AGGRESSIVE_REACT_STATE, 5s + 500ms); + for (uint32 spellId : { SPELL_LAVA_WAVE_N, SPELL_LAVA_WAVE_W, SPELL_LAVA_WAVE_E, SPELL_LAVA_POOL }) + summon->CastSpell(nullptr, spellId); + break; + case NPC_LAVA_WAVE: + if (summon->IsSummon()) + { + // For some reason, the npc dies instead of despawning right away according to sniffs. Let's do this as well. + summon->ToTempSummon()->SetTempSummonType(TEMPSUMMON_MANUAL_DESPAWN); + summon->m_Events.AddEventAtOffset([summon]() { summon->KillSelf(); }, 10s); + summon->SetCorpseDelay(2); + } + break; + case NPC_SULFURAS_HAND_OF_RAGNAROS: + summon->CastSpell(nullptr, SPELL_SULFURAS); + break; + case NPC_MOLTEN_ELEMENTAL: + summon->SetCorpseDelay(2); + summon->CastSpell(nullptr, SPELL_INVIS_PRE_VISUAL_2); + summon->CastSpell(nullptr, SPELL_MOLTEN_SEED_AOE); + break; + case NPC_BLAZING_HEAT: + summon->CastSpell(nullptr, SPELL_BLAZING_HEAT_AURA); + break; + case NPC_ARCHDRUID_HAMUUL_RUNETOTEM: + case NPC_MALFURION_STORMRAGE: + case NPC_CENARIUS: + if (!me->GetMap()->IsGridLoaded(summon->GetPositionX(), summon->GetPositionY())) + me->GetMap()->LoadGrid(summon->GetPositionX(), summon->GetPositionY()); + summon->setActive(true); + summon->GetMotionMaster()->MovePath(summon->GetEntry() * 100, false); + break; + case NPC_ENTRAPPING_ROOTS: + if (Creature* hamuul = instance->GetCreature(DATA_ARCHDRUID_HAMUUL_RUNETOTEM)) + hamuul->CastSpell(summon, SPELL_ENTRAPPING_ROOTS_CAST); + break; + case NPC_DREADFLAME: + for (uint32 spellId : { SPELL_DREADFLAME_CONTROL_AURA_1, SPELL_DREADFLAME_CONTROL_AURA_2, SPELL_DREADFLAME_CONTROL_AURA_3, SPELL_DREADFLAME_CONTROL_AURA_4 }) + summon->CastSpell(nullptr, spellId, true); + break; + case NPC_BREADTH_OF_FROST: + if (Creature* cenarius = instance->GetCreature(DATA_CENARIUS)) + cenarius->CastSpell(summon, SPELL_BREADTH_OF_FROST_CAST); + break; + default: + break; + } + } + + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_INVOKE_SONS_OF_FLAME_TRIGGERED: + Talk(SAY_INVOKE_SONS_OF_FLAME); + events.ScheduleEvent(EVENT_ANNOUNCE_END_OF_INTERMISSION, 42s, 0, events.IsInPhase(PHASE_INTERMISSION_1) ? PHASE_INTERMISSION_1 : PHASE_INTERMISSION_2); + if (events.IsInPhase(PHASE_INTERMISSION_2)) + me->SummonCreatureGroup(SUMMON_GROUP_ID_LAVA_SCIONS); + break; + case ACTION_SON_OF_FLAME_DIED: + ++_defeatedSonsOfFlame; + if (_defeatedSonsOfFlame >= 8) + { + events.CancelEvent(EVENT_ANNOUNCE_END_OF_INTERMISSION); + events.ScheduleEvent(EVENT_FINISH_INTERMISSION, 1s + 500ms, 0, events.IsInPhase(PHASE_INTERMISSION_1) ? PHASE_INTERMISSION_1 : PHASE_INTERMISSION_2); + } + break; + case ACTION_ARCHDRUIDS_ARRIVED: + Talk(SAY_SUBMERGE_HEROIC); + me->AttackStop(); + me->SetReactState(REACT_PASSIVE); + DoCastSelf(SPELL_LEGS_SUBMERGE); + events.ScheduleEvent(EVENT_LEGS_HEAL, 5s + 500ms, 0, PHASE_FOUR); + break; + default: + break; + } + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (me->HealthBelowPctDamaged(70, damage) && events.IsInPhase(PHASE_ONE)) + { + events.CancelEvent(EVENT_SET_AGGRESSIVE_REACT_STATE); + events.SetPhase(PHASE_INTERMISSION_1); + events.ScheduleEvent(EVENT_SPLITTING_BLOW, 1ms, 0, PHASE_INTERMISSION_1); + } + else if (me->HealthBelowPctDamaged(40, damage) && events.IsInPhase(PHASE_TWO)) + { + events.CancelEvent(EVENT_SET_AGGRESSIVE_REACT_STATE); + events.SetPhase(PHASE_INTERMISSION_2); + events.ScheduleEvent(EVENT_SPLITTING_BLOW, 1ms, 0, PHASE_INTERMISSION_2); + } + else if (!IsHeroic() && !_defeated && me->HealthBelowPctDamaged(10, damage) && events.IsInPhase(PHASE_THREE)) + { + EndEncounter(true); + _defeated = true; + } + else if (IsHeroic() && me->HealthBelowPctDamaged(10, damage) && events.IsInPhase(PHASE_THREE)) + { + events.SetPhase(PHASE_FOUR); + me->SummonCreatureGroup(SUMMON_GROUP_ID_ARCHDRUIDS); + } + + if (damage >= me->GetHealth() && !_canBeKilled) + damage = me->GetHealth() - 1; + } + + ObjectGuid GetGUID(int32 type /*= 0*/) const override + { + switch (type) + { + case DATA_CURRENT_SPLITTING_BLOW_TARGET: + return _splittingBlowTargetGUID; + default: + return ObjectGuid::Empty; + } + return ObjectGuid::Empty; + } + + void SetData(uint32 type, uint32 value) override + { + switch (type) + { + case DATA_CAST_DREADFLAMES: + { + if (Creature* dreadflame = instance->GetCreature(DATA_DREADFLAME_CONTROLLER)) + { + if (CreatureAI* ai = dreadflame->AI()) + { + bool hasBeenCasted = false; + for (uint8 i = 0; i < value; ++i) + { + uint16 index = ai->GetData(DATA_DREADFLAME_POSTION_INFO_INDEX); + if (index != INVALID_DREADFLAME_POSITION_INFO_INDEX) + { + me->CastSpell(DreadflamePositionInfoData[index].Dest, SPELL_DREADFLAME_MISSILE, true); + ai->SetData(DATA_OCCUPY_DREADFLAME_POSITION_INFO_INDEX, index); + hasBeenCasted = true; + } + else + break; + } + + if (hasBeenCasted) + Talk(SAY_ANNOUNCE_DREADFLAME); + } + } + break; + } + default: + break; + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim() && !events.IsInPhase(PHASE_INTRO)) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_EMERGE: + me->PlayOneShotAnimKitId(ANIM_KIT_ID_EMERGE); + break; + case EVENT_BASE_VISUAL: + DoCastSelf(SPELL_BASE_VISUAL); + break; + case EVENT_FINISH_ARRIVAL: + DoCastSelf(SPELL_BURNING_WOUND); + if (instance->GetData(DATA_FIRST_RAGNAROS_SPAWN)) + { + Talk(SAY_EMERGE); + me->PlayOneShotAnimKitId(ANIM_KIT_ID_TALK); + instance->SetData(DATA_FIRST_RAGNAROS_SPAWN, 0); + } + me->setActive(false); + break; + case EVENT_WRATH_OF_RAGNAROS: + DoCastAOE(SPELL_WRATH_OF_RAGNAROS_AOE, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_MAX_TARGETS, Is25ManRaid() ? 3 : 1)); + Talk(SAY_WRATH_OF_RAGNAROS); + events.Repeat(30s); + break; + case EVENT_HAND_OF_RAGNAROS: + DoCastAOE(SPELL_HAND_OF_RAGNAROS); + events.Repeat(26s); + break; + case EVENT_MAGMA_TRAP: + Talk(SAY_ANNOUNCE_MAGMA_TRAP); + DoCastAOE(SPELL_MAGMA_TRAP_AOE, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_MAX_TARGETS, 1)); + events.Repeat(26s); + break; + case EVENT_SULFURAS_SMASH: + // Delay cases + if (events.IsInPhase(PHASE_THREE) && Milliseconds(events.GetTimeUntilEvent(EVENT_SULFURAS_SMASH)) < 2s) + events.Repeat(2s); + if (me->HasAura(SPELL_WORLD_IN_FLAMES)) + events.Repeat(1s); + + DoCastAOE(SPELL_SULFURAS_SMASH_AOE, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_MAX_TARGETS, 1)); + events.Repeat(events.IsInPhase(PHASE_TWO) ? 40s : 30s); + break; + case EVENT_SET_AGGRESSIVE_REACT_STATE: + me->SetReactState(REACT_AGGRESSIVE); + break; + case EVENT_SPLITTING_BLOW: + _splittingBlowTargetGUID = instance->GetGuidData(DATA_RANDOM_SPLITTING_BLOW_GUID); + if (_splittingBlowTargetGUID.IsEmpty()) // encounter broke. Phase transition wont work. Reset encounter + { + EnterEvadeMode(EVADE_REASON_OTHER); + break; + } + + me->AttackStop(); + me->SetReactState(REACT_PASSIVE); + if (Creature* splittingBlow = ObjectAccessor::GetCreature(*me, _splittingBlowTargetGUID)) + { + // We are gong to summon 8 Sons of Flame at 8 random locations. + // However, we have to ensure that their spawn location has a certain distance to the splitting blow target. + std::vector sonOfFlamesPositions = SonOfFlameSpawnPositions; + for (std::vector::const_iterator itr = sonOfFlamesPositions.begin(); itr != sonOfFlamesPositions.end();) + { + if ((*itr).GetExactDist(splittingBlow) <= 30.f) + itr = sonOfFlamesPositions.erase(itr); + else + ++itr; + } + + if (sonOfFlamesPositions.size() > 8) + Trinity::Containers::RandomResize(sonOfFlamesPositions, 8); + else if (sonOfFlamesPositions.size() < 8) + { + // There are too few Sons of Flame spawn positions available. Reset encounter + EnterEvadeMode(EVADE_REASON_OTHER); + break; + } + + for (Position const& pos : sonOfFlamesPositions) + DoSummon(NPC_SON_OF_FLAME, pos, 0, TEMPSUMMON_MANUAL_DESPAWN); + + _defeatedSonsOfFlame = 0; + Talk(SAY_ANNOUNCE_SPLITTING_BLOW); + Talk(SAY_SPLITTING_BLOW); + DoCastSelf(SPELL_SUBMERGE); + me->SetFacingToObject(splittingBlow); + DoCastSelf(SPELL_SPLITTING_BLOW); + } + break; + case EVENT_MOLTEN_SEED: + DoCastAOE(SPELL_MOLTEN_SEED, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_MAX_TARGETS, Is25ManRaid() ? 20 : 10)); + events.Repeat(1min); + break; + case EVENT_ENGULFING_FLAMES: + DoCastAOE(IsHeroic() ? SPELL_WORLD_IN_FLAMES : SPELL_ENGULFING_FLAMES, CastSpellExtraArgs().AddSpellBP0(urand(0, 2))); + Talk(IsHeroic() ? SAY_ANNOUNCE_WORLD_IN_FLAMES : SAY_ANNOUNCE_ENGULFING_FLAMES); + events.Repeat(events.IsInPhase(PHASE_TWO) ? 1min : 30s); + break; + case EVENT_ANNOUNCE_END_OF_INTERMISSION: + Talk(SAY_ANNOUNCE_EMERGE); + events.ScheduleEvent(EVENT_FINISH_INTERMISSION, IsHeroic() ? 20s : 5s, 0, events.IsInPhase(PHASE_INTERMISSION_1) ? PHASE_INTERMISSION_1 : PHASE_INTERMISSION_2); + break; + case EVENT_FINISH_INTERMISSION: + FinishIntermissionPhase(); + break; + case EVENT_LIVING_METEOR: + // Living Meteor delays Sulfuras Smash by 2 seconds + events.RescheduleEvent(EVENT_SULFURAS_SMASH, Milliseconds(events.GetTimeUntilEvent(EVENT_SULFURAS_SMASH)) + 2s, 0, PHASE_THREE); + + DoCastAOE(SPELL_LIVING_METEOR, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_MAX_TARGETS, 1)); + events.Repeat(1min); + break; + case EVENT_LEGS_HEAL: + { + DoCastSelf(SPELL_LEGS_HEAL); + DoCastSelf(SPELL_TRANSFORM); + me->AddUnitState(UNIT_STATE_IGNORE_PATHFINDING); // @todo: remove this once mmaps for gameobjects are supported + Position dest = me->GetPosition(); + dest.m_positionZ = 56.f; + me->NearTeleportTo(dest); + events.ScheduleEvent(EVENT_FACE_HOME, 8s, 0, PHASE_FOUR); + break; + } + case EVENT_FACE_HOME: + me->SetFacingTo(me->GetHomePosition().GetOrientation()); + events.ScheduleEvent(EVENT_EMERGE_HEROIC, 500ms, 0, PHASE_FOUR); + break; + case EVENT_EMERGE_HEROIC: + if (GameObject* platform = instance->GetGameObject(DATA_RAGNAROS_PLATFORM)) + platform->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); + me->RemoveAurasDueToSpell(SPELL_LEGS_SUBMERGE); + me->SendSetPlayHoverAnim(true); + me->SetAnimationTier(AnimationTier::Fly, false); + me->SetControlled(false, UNIT_STATE_ROOT); + me->PlayOneShotAnimKitId(ANIM_KIT_ID_EMERGE_HEROIC); + instance->SetData(DATA_MAGMA_KNOCKBACK, 0); + events.ScheduleEvent(EVENT_TALK_EMERGE_HEROIC, 3s, 0, PHASE_FOUR); + break; + case EVENT_TALK_EMERGE_HEROIC: + Talk(SAY_EMERGE_HEROIC); + me->PlayOneShotAnimKitId(ANIM_KIT_ID_TALK); + me->RemoveAurasDueToSpell(SPELL_DRAW_OUT_FIRELORD_CENARIUS); + me->RemoveAurasDueToSpell(SPELL_DRAW_OUT_FIRELORD_MALFURION); + me->RemoveAurasDueToSpell(SPELL_DRAW_OUT_FIRELORD_HAMUUL); + events.ScheduleEvent(EVENT_BREAK_FREE, 10s, 0, PHASE_FOUR); + break; + case EVENT_BREAK_FREE: + if (GameObject* platform = instance->GetGameObject(DATA_RAGNAROS_PLATFORM)) + { + platform->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED); + platform->EnableCollision(true); // we have to keep VMaps active for the platform + } + + Talk(SAY_BREAK_FREE); + DoCastSelf(SPELL_DREADFLAME_SUMMON_CONTROLLER); + me->PlayOneShotAnimKitId(ANIM_KIT_ID_BREAK_FREE); + me->SendSetPlayHoverAnim(false); + me->SetAnimationTier(AnimationTier::Ground, false); + me->SetDisableGravity(false); + _canBeKilled = true; + events.ScheduleEvent(EVENT_SET_AGGRESSIVE_REACT_STATE, 5s, 0, PHASE_FOUR); + events.ScheduleEvent(EVENT_SUPERHEATED, 5s, 0, PHASE_FOUR); + events.ScheduleEvent(EVENT_ENTRAPPING_ROOTS, 41s, 0, PHASE_FOUR); + events.ScheduleEvent(EVENT_DREADFLAME, 16s, 0, PHASE_FOUR); + events.ScheduleEvent(EVENT_BREADTH_OF_FROST, 6s, 0, PHASE_FOUR); + break; + case EVENT_SUPERHEATED: + DoCastSelf(SPELL_SUPERHEATED); + break; + case EVENT_ENTRAPPING_ROOTS: + DoCastAOE(SPELL_ENTRAPPING_ROOTS); + events.ScheduleEvent(EVENT_EMPOWER_SULFURAS, 15s, 0, PHASE_FOUR); + events.Repeat(55s); + break; + case EVENT_EMPOWER_SULFURAS: + if (!me->HasUnitState(UNIT_STATE_STUNNED)) + { + Talk(SAY_ANNOUNCE_EMPOWER_SULFURAS); + DoCastSelf(SPELL_EMPOWER_SULFURAS); + } + break; + case EVENT_DREADFLAME: + DoCastSelf(SPELL_DREADFLAME_PERIODIC); + break; + case EVENT_BREADTH_OF_FROST: + DoCastAOE(SPELL_BREADTH_OF_FROST_TRIGGER); + events.Repeat(46s); + break; + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } + + if (me->GetVictim() && me->GetVictim()->IsWithinMeleeRange(me)) + DoMeleeAttackIfReady(); + else if (!events.IsInPhase(PHASE_FOUR)) + DoSpellAttackIfReady(SPELL_MAGMA_BLAST); + } +private: + GuidVector _archdruidGUIDs; + ObjectGuid _splittingBlowTargetGUID; + uint8 _defeatedSonsOfFlame; + bool _defeated; + bool _canBeKilled; + + void FinishIntermissionPhase() + { + uint8 nextPhase = events.IsInPhase(PHASE_INTERMISSION_1) ? PHASE_TWO : PHASE_THREE; + + if (Creature* sulfuras = instance->GetCreature(DATA_SULFURAS_HAND_OF_RAGNAROS)) + sulfuras->DespawnOrUnsummon(3s); + + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->RemoveAurasDueToSpell(SPELL_SUBMERGE_AURA); + Talk(SAY_PICK_UP_SULFURAS); + DoCastSelf(SPELL_BASE_VISUAL); + me->PlayOneShotAnimKitId(ANIM_KIT_ID_PICK_UP_SULFURAS); + events.SetPhase(nextPhase); + events.ScheduleEvent(EVENT_SET_AGGRESSIVE_REACT_STATE, 5s, 0, nextPhase); + + if (nextPhase == PHASE_TWO) + { + events.ScheduleEvent(EVENT_SULFURAS_SMASH, 5s + 500ms, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_MOLTEN_SEED, 15s, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_ENGULFING_FLAMES, 40s, 0, PHASE_TWO); + } + else if (nextPhase == PHASE_THREE) + { + events.ScheduleEvent(EVENT_SULFURAS_SMASH, 15s, 0, PHASE_THREE); + events.ScheduleEvent(EVENT_ENGULFING_FLAMES, 30s, 0, PHASE_THREE); + events.ScheduleEvent(EVENT_LIVING_METEOR, 45s, 0, PHASE_THREE); + } + } + + void EndEncounter(bool victorious) + { + EntryCheckPredicate pred(NPC_LAVA_SCION); + summons.DoAction(ACTION_DISENGAGE, pred); + summons.DespawnAll(); + instance->instance->SpawnGroupDespawn(SPAWN_GROUP_ID_RAGNAROS_STALKERS); + events.Reset(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_DELUGE); + + if (victorious) + { + DoCastAOE(SPELL_ACHIEVEMENT_CHECK); + DoCastAOE(SPELL_AWARD_REPUTATION_BOSS_KILL); + DoCastAOE(SPELL_HEART_OF_RAGNAROS); + + if (!IsHeroic()) + { + Talk(SAY_DEFEATED); + DoCastSelf(SPELL_SUMMON_CHEST); + DoCastSelf(SPELL_DEATH); + instance->instance->PermBindAllPlayers(); + } + else + { + Talk(SAY_DEATH); + for (ObjectGuid const& guid : _archdruidGUIDs) + if (Creature* archdruid = ObjectAccessor::GetCreature(*me, guid)) + if (CreatureAI* ai = archdruid->AI()) + ai->DoAction(ACTION_RAGNAROS_KILLED); + } + + // We should probably create a serverside spell for that but since we do not have sniff data due to being serverside, we're sticking with that for now. + instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_RAGNAROS_KILL_CREDIT, 0, me); + instance->UpdateEncounterStateForSpellCast(SPELL_RAGNAROS_KILL_CREDIT, me); + + instance->instance->SetSpawnGroupInactive(SPAWN_GROUP_ID_RAGNAROS); + instance->SetBossState(DATA_RAGNAROS, DONE); + } + else + { + if (GameObject* platform = instance->GetGameObject(DATA_RAGNAROS_PLATFORM)) + platform->SetDestructibleState(GO_DESTRUCTIBLE_INTACT); + + if (IsHeroic()) + for (ObjectGuid const& guid : _archdruidGUIDs) + if (Creature* archdruid = ObjectAccessor::GetCreature(*me, guid)) + archdruid->DespawnOrUnsummon(); + + _DespawnAtEvade(); + } + } +}; + +struct npc_ragnaros_son_of_flame : public ScriptedAI +{ + npc_ragnaros_son_of_flame(Creature* creature) : ScriptedAI(creature), _instance(nullptr) + { + me->SetReactState(REACT_PASSIVE); + } + + void InitializeAI() override + { + _instance = me->GetInstanceScript(); + } + + void JustAppeared() override + { + me->SetDisableGravity(true); + me->SetControlled(true, UNIT_STATE_ROOT); + me->SetCorpseDelay(2); + DoCastSelf(SPELL_HIT_ME); + DoCastSelf(SPELL_INVIS_PRE_VISUAL_1); + } + + void JustDied(Unit* /*killer*/) override + { + if (Creature* ragnaros = _instance->GetCreature(DATA_RAGNAROS)) + if (CreatureAI* ai = ragnaros->AI()) + ai->DoAction(ACTION_SON_OF_FLAME_DIED); + } + + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_INVOKE_SON: + me->RemoveAurasDueToSpell(SPELL_INVIS_PRE_VISUAL_1); + me->CastSpell(nullptr, SPELL_BURNING_SPEED); + me->SetDisableGravity(false); + me->SetControlled(false, UNIT_STATE_ROOT); + me->PlayOneShotAnimKitId(ANIM_KIT_ID_INVOKE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + if (Creature const* sulfuras = _instance->GetCreature(DATA_SULFURAS_HAND_OF_RAGNAROS)) + { + _destination = sulfuras->GetPosition(); + _events.ScheduleEvent(EVENT_MOVE_TOWARDS_SULFURAS, 2s + 500ms); + } + break; + default: + break; + } + } + + void MovementInform(uint32 motionType, uint32 id) override + { + if (motionType != POINT_MOTION_TYPE) + return; + + switch (id) + { + case POINT_ID_TRIGGER_SUPERNOVA: + if (!me->HasUnitState(UNIT_STATE_NOT_MOVE)) + { + DoCastSelf(SPELL_SUPERNOVA); + DoCastSelf(SPELL_QUITE_SUICIDE); + } + break; + default: + break; + } + } + + void UpdateAI(uint32 diff) override + { + if (!me->IsAlive()) + return; + + ScriptedAI::UpdateAI(diff); + + _events.Update(diff); + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_MOVE_TOWARDS_SULFURAS: + if (me->movespline->Finalized() && !me->HasUnitState(UNIT_STATE_NOT_MOVE)) + { + float dist = me->GetExactDist(_destination); + if (dist > 4.4f) + dist -= 4.4f; + else + { + DoCastSelf(SPELL_SUPERNOVA); + DoCastSelf(SPELL_QUITE_SUICIDE); + break; + } + + float angle = me->GetAngle(_destination); + Position dest = me->GetPosition(); + dest.m_positionX += std::cos(angle) * dist; + dest.m_positionY += std::sin(angle) * dist; + + me->GetMotionMaster()->MovePoint(POINT_ID_TRIGGER_SUPERNOVA, dest, false); + } + _events.Repeat(1s); + break; + default: + break; + } + } + } + +private: + EventMap _events; + InstanceScript* _instance; + Position _destination; +}; + +struct npc_ragnaros_lava_scion : public ScriptedAI +{ + npc_ragnaros_lava_scion(Creature* creature) : ScriptedAI(creature), _instance(nullptr) { } + + void InitializeAI() override + { + _instance = me->GetInstanceScript(); + } + + void JustAppeared() override + { + DoZoneInCombat(); + } + + void JustEngagedWith(Unit* who) override + { + ScriptedAI::JustEngagedWith(who); + _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); + _events.ScheduleEvent(EVENT_BLAZING_HEAT, 15s); + } + + void JustDied(Unit* who) override + { + ScriptedAI::JustDied(who); + _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + _events.Reset(); + } + + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_DISENGAGE: + _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + break; + default: + break; + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_BLAZING_HEAT: + DoCastAOE(SPELL_BLAZING_HEAT, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_MAX_TARGETS, 1)); + _events.Repeat(23s); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + +private: + EventMap _events; + InstanceScript* _instance; +}; + +struct npc_ragnaros_living_meteor : public ScriptedAI +{ + npc_ragnaros_living_meteor(Creature* creature) : ScriptedAI(creature) { } + + void JustAppeared() override + { + DoCastSelf(SPELL_LIVING_METEOR_DAMAGE_REDUCTION); + DoZoneInCombat(); + _events.ScheduleEvent(EVENT_COMBUSTIBLE, 2s + 500ms); + _events.ScheduleEvent(EVENT_FIXATE, 3s); + } + + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_COMBUSTION_TRIGGERED: + case ACTION_IMPACT_TRIGGERED: + me->AttackStop(); + me->SetReactState(REACT_PASSIVE); + _events.ScheduleEvent(EVENT_FIXATE, 400ms); + _events.ScheduleEvent(EVENT_COMBUSTIBLE, action == ACTION_COMBUSTION_TRIGGERED ? 7s : 4s); + _events.ScheduleEvent(EVENT_RESUME_CHASE_MOVEMENT, action == ACTION_COMBUSTION_TRIGGERED ? 2s : 4s); + break; + default: + break; + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FIXATE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.f, true, true)) + DoCast(target, SPELL_FIXATE); + break; + case EVENT_COMBUSTIBLE: + DoCastSelf(SPELL_COMBUSTIBLE, true); + break; + case EVENT_RESUME_CHASE_MOVEMENT: + me->SetReactState(REACT_AGGRESSIVE); + break; + default: + break; + } + } + } + +private: + EventMap _events; +}; + +struct npc_ragnaros_archdruid : public NullCreatureAI +{ + npc_ragnaros_archdruid(Creature* creature) : NullCreatureAI(creature), _instance(nullptr) { } + + void InitializeAI() override + { + _instance = me->GetInstanceScript(); + } + + void MovementInform(uint32 motionType, uint32 pointId) override + { + if (motionType != WAYPOINT_MOTION_TYPE && motionType != POINT_MOTION_TYPE) + return; + + if (motionType == WAYPOINT_MOTION_TYPE) + { + switch (pointId) + { + case POINT_ID_ENTER_PLATFORM: + { + if (me->GetEntry() == NPC_ARCHDRUID_HAMUUL_RUNETOTEM || me->GetEntry() == NPC_MALFURION_STORMRAGE) + { + Position dest = me->GetPosition(); + dest.m_positionZ = me->GetFloorZ(); + me->GetMotionMaster()->MovePoint(POINT_ID_LAND, dest, false, 2.5f); + } + else + { + if (Creature* ragnaros = _instance->GetCreature(DATA_RAGNAROS)) + if (CreatureAI* ai = ragnaros->AI()) + ai->DoAction(ACTION_ARCHDRUIDS_ARRIVED); + + _events.ScheduleEvent(EVENT_TALK_PREPARE_TO_DRAW_RAGNAROS_OUT, 3s + 600ms); + } + + Milliseconds drawOutTimer = 7s; + if (me->GetEntry() == NPC_MALFURION_STORMRAGE) + drawOutTimer += 1s; + else if (me->GetEntry() == NPC_CENARIUS) + drawOutTimer += 2s; + + _events.ScheduleEvent(EVENT_DRAW_OUT_FIRELORD, drawOutTimer); + break; + } + default: + break; + } + } + else + { + switch (pointId) + { + case POINT_ID_LAND: + me->SetDisableGravity(false); + me->SetHover(false); + DoCastSelf(me->GetEntry() == NPC_ARCHDRUID_HAMUUL_RUNETOTEM ? SPELL_TRANSFORM_HAMUUL : SPELL_TRANSFORM_MALFURION); + break; + default: + break; + } + } + + } + + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_RAGNAROS_KILLED: + switch (me->GetEntry()) + { + case NPC_MALFURION_STORMRAGE: + _events.ScheduleEvent(EVENT_OUTRO_1, 5s + 500ms); + _events.ScheduleEvent(EVENT_OUTRO_2, 12s + 500ms); + break; + case NPC_ARCHDRUID_HAMUUL_RUNETOTEM: + _events.ScheduleEvent(EVENT_OUTRO_1, 32s); + break; + case NPC_CENARIUS: + _events.ScheduleEvent(EVENT_OUTRO_1, 9s); + _events.ScheduleEvent(EVENT_OUTRO_2, 18s + 500ms); + _events.ScheduleEvent(EVENT_OUTRO_3, 45s + 500ms); + break; + default: + break; + } + break; + default: + break; + } + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_TALK_PREPARE_TO_DRAW_RAGNAROS_OUT: + Talk(SAY_PREPARE_TO_DRAW_RAGNAROS_OUT); + break; + case EVENT_DRAW_OUT_FIRELORD: + { + uint32 spellId = SPELL_DRAW_OUT_FIRELORD_HAMUUL; + if (me->GetEntry() == NPC_MALFURION_STORMRAGE) + spellId = SPELL_DRAW_OUT_FIRELORD_MALFURION; + else if (me->GetEntry() == NPC_CENARIUS) + spellId = SPELL_DRAW_OUT_FIRELORD_CENARIUS; + + DoCastAOE(spellId); + + if (me->GetEntry() == NPC_MALFURION_STORMRAGE) + { + _events.ScheduleEvent(EVENT_SAY_RAGNAROS_BOUND, 14s); + _events.ScheduleEvent(EVENT_CLOUDBURST, 27s); + } + break; + } + case EVENT_SAY_RAGNAROS_BOUND: + me->PlayOneShotAnimKitId(ANIM_KIT_ID_YELL); + Talk(SAY_RAGNAROS_BOUND); + break; + case EVENT_CLOUDBURST: + DoCastAOE(SPELL_CLOUDBURST, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_MAX_TARGETS, 1)); + break; + case EVENT_OUTRO_1: + if (me->GetEntry() == NPC_MALFURION_STORMRAGE) + me->PlayOneShotAnimKitId(ANIM_KIT_ID_YELL); + Talk(SAY_OUTRO_1); + break; + case EVENT_OUTRO_2: + if (me->GetEntry() == NPC_MALFURION_STORMRAGE) + me->PlayOneShotAnimKitId(ANIM_KIT_ID_YELL); + Talk(SAY_OUTRO_2); + break; + case EVENT_OUTRO_3: + Talk(SAY_OUTRO_3); + break; + default: + break; + } + } + } + +private: + EventMap _events; + InstanceScript* _instance; +}; + +struct npc_ragnaros_dreadflame : public NullCreatureAI +{ + npc_ragnaros_dreadflame(Creature* creature) : NullCreatureAI(creature) { } + + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_SPREAD_DREADFLAMES: + { + if (_occupiedDreadflameIndexes.empty()) + break; + + boost::container::flat_set availableSpreadLocations; + + for (uint16 index : _occupiedDreadflameIndexes) + for (int8 offset : { -1, 31, 1, -31 }) + if (IsLocationAvailable(index + offset)) + availableSpreadLocations.insert(index + offset); + + if (availableSpreadLocations.empty()) + break; + + Trinity::Containers::RandomResize(availableSpreadLocations, std::ceil(_occupiedDreadflameIndexes.size() / 2)); + + _newlyStoredDreadflameIndexes.clear(); + for (uint16 index : availableSpreadLocations) + { + me->CastSpell(DreadflamePositionInfoData[index].Dest, SPELL_DREADFLAME_AREA_DUMMY_AURA); + OccupyDreadflameIndex(index); + } + + break; + } + default: + break; + } + } + + void SetData(uint32 type, uint32 value) override + { + switch (type) + { + case DATA_OCCUPY_DREADFLAME_POSITION_INFO_INDEX: + OccupyDreadflameIndex(value); + break; + case DATA_RELEASE_DREADFLAME_POSITION_INFO_INDEX: + _occupiedDreadflameIndexes.erase(value); + _newlyStoredDreadflameIndexes.erase(value); + break; + default: + break; + } + } + + uint32 GetData(uint32 type) const override + { + switch (type) + { + case DATA_DREADFLAME_POSTION_INFO_INDEX: + { + bool noIndexesAvailable = true; + DreadflamePositionInfoArray::const_iterator itr = Trinity::Containers::SelectRandomWeightedContainerElement(DreadflamePositionInfoData, [&](DreadflamePositionInfo const& info) + { + if (!info.OnPlatform || _occupiedDreadflameIndexes.find(info.Index) != _occupiedDreadflameIndexes.end()) + return 0.f; + + noIndexesAvailable = false; + return 1.f; + }); + + if (noIndexesAvailable || itr == DreadflamePositionInfoData.end()) + return INVALID_DREADFLAME_POSITION_INFO_INDEX; + + return itr->Index; + } + default: + return 0; + } + + return 0; + } + +private: + std::unordered_set _occupiedDreadflameIndexes; + std::unordered_set _newlyStoredDreadflameIndexes; + + bool IsLocationAvailable(int16 index) + { + // Index is out of range + if (index < 0 || index > int16(DreadflamePositionInfoData.size() - 1)) + return false; + + // Location is not on the platform + if (!DreadflamePositionInfoData[index].OnPlatform) + return false; + + // Index has been occupied just prior to this spread tick. Skip spreading that flame + if (_newlyStoredDreadflameIndexes.find(index) != _newlyStoredDreadflameIndexes.end()) + return false; + + return _occupiedDreadflameIndexes.find(index) == _occupiedDreadflameIndexes.end(); + } + + void OccupyDreadflameIndex(uint16 index) + { + _occupiedDreadflameIndexes.insert(index); + _newlyStoredDreadflameIndexes.insert(index); + } +}; + +struct npc_ragnaros_cloudburst : public NullCreatureAI +{ + npc_ragnaros_cloudburst(Creature* creature) : NullCreatureAI(creature), _allowedSpellClicks(0) { } + + void InitializeAI() override + { + _allowedSpellClicks = me->GetMap()->Is25ManRaid() ? 3 : 1; + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); // we have to assign the spellclick flag manually since we do not use npc_spellclick_spells for strict click number control + } + + void JustAppeared() override + { + DoCastSelf(SPELL_CLOUDBURST_VISUAL); + } + + void OnSpellClick(Unit* clicker, bool& result) override + { + if (!_allowedSpellClicks) + result = false; + else + { + --_allowedSpellClicks; + clicker->CastSpell(nullptr, SPELL_DELUGE); + + if (!_allowedSpellClicks) + me->DespawnOrUnsummon(); + } + } + +private: + uint8 _allowedSpellClicks; +}; + +class spell_ragnaros_wrath_of_ragnaros : public SpellScript +{ + void HandleDummyEffect(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (!caster) + return; + + caster->CastSpell(GetHitUnit(), static_cast(GetEffectValue())); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_wrath_of_ragnaros::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +class spell_ragnaros_magma_trap : public SpellScript +{ + void HandleDummyEffect(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (!caster) + return; + + caster->CastSpell(GetHitUnit(), static_cast(GetEffectValue())); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_magma_trap::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +class spell_ragnaros_magma_trap_periodic : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MAGMA_TRAP_ERUPTION, SPELL_MAGMA_TRAP_VULNERABILITY }); + } + + void FilterTargets(std::list& targets) + { + _triggerDetonation = !targets.empty(); + } + + void HandleDetonation() + { + if (!_triggerDetonation) + return; + + Unit* caster = GetCaster(); + if (!caster) + return; + + caster->CastSpell(nullptr, SPELL_MAGMA_TRAP_ERUPTION); + caster->CastSpell(nullptr, SPELL_MAGMA_TRAP_VULNERABILITY); + caster->RemoveAllAuras(); + + if (caster->IsCreature()) + caster->ToCreature()->DespawnOrUnsummon(4s); + + _triggerDetonation = false; + } + + void Register() override + { + OnObjectAreaTargetSelect.Register(&spell_ragnaros_magma_trap_periodic::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + AfterCast.Register(&spell_ragnaros_magma_trap_periodic::HandleDetonation); + } +private: + bool _triggerDetonation = false; +}; + +class spell_ragnaros_magma_trap_missile: public SpellScript +{ + void SetTargetDest(SpellDestination& target) + { + Position dest = target._position; + dest.m_positionZ = GetCaster()->GetMapHeight(dest.GetPositionX(), dest.GetPositionY(), GetCaster()->GetPositionZ() + 10.f); + target.Relocate(dest); + } + + void Register() override + { + OnDestinationTargetSelect.Register(&spell_ragnaros_magma_trap_missile::SetTargetDest, EFFECT_0, TARGET_DEST_TARGET_ANY); + } +}; + +class spell_ragnaros_sulfuras_smash : public SpellScript +{ + bool Load() override + { + _instance = GetCaster()->GetInstanceScript(); + return true; + } + + void HandleDummyEffect1(SpellEffIndex /*effIndex*/) + { + if (!_instance) + return; + + Creature* smash = _instance->GetCreature(DATA_SULFURAS_SMASH); + if (!smash) + return; + + Unit* target = GetHitUnit(); + target->CastSpell(nullptr, SPELL_LAVA_WAVE); + + Position dest = target->GetPosition(); + dest.SetOrientation(Position::NormalizeOrientation(dest.GetAngle(smash) + float(M_PI))); + dest.m_positionX += std::cos(dest.GetOrientation()) * 80.f; + dest.m_positionY += std::sin(dest.GetOrientation()) * 80.f; + target->GetMotionMaster()->MovePoint(0, dest, false); + } + + void HandleDummyEffect2(SpellEffIndex /*effIndex*/) + { + Creature* target = GetHitCreature(); + if (!target) + return; + + target->RemoveAllAuras(); + target->CastSpell(nullptr, SPELL_SCORCHED_GROUND); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_sulfuras_smash::HandleDummyEffect1, EFFECT_1, SPELL_EFFECT_DUMMY); + OnEffectHitTarget.Register(&spell_ragnaros_sulfuras_smash::HandleDummyEffect2, EFFECT_2, SPELL_EFFECT_DUMMY); + } +private: + InstanceScript* _instance = nullptr; +}; + +class spell_ragnaros_splitting_blow: public SpellScript +{ + void SetTargetDest(SpellDestination& target) + { + if (Creature* caster = GetCaster()->ToCreature()) + if (CreatureAI* ai = caster->AI()) + if (ObjectGuid guid = ai->GetGUID(DATA_CURRENT_SPLITTING_BLOW_TARGET)) + if (Creature* splittingBlow = ObjectAccessor::GetCreature(*caster, guid)) + target.Relocate(splittingBlow->GetPosition()); + } + + void Register() override + { + OnDestinationTargetSelect.Register(&spell_ragnaros_splitting_blow::SetTargetDest, EFFECT_0, TARGET_DEST_NEARBY_ENTRY); + } +}; + +class spell_ragnaros_splitting_blow_script: public SpellScript +{ + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (!caster) + return; + + Unit* target = GetHitUnit(); + target->CastSpell(nullptr, static_cast(GetEffectValue())); + target->CastSpell(nullptr, static_cast(GetSpellInfo()->Effects[EFFECT_1].BasePoints)); + + if (Creature* creature = caster->ToCreature()) + if (CreatureAI* ai = creature->AI()) + ai->DoAction(ACTION_INVOKE_SONS_OF_FLAME_TRIGGERED); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_splitting_blow_script::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_ragnaros_invoke_sons: public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_INVOKE_SONS }); + } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + caster->CastSpell(GetHitUnit(), SPELL_INVOKE_SONS); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_invoke_sons::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_ragnaros_invoke_sons_script: public SpellScript +{ + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Creature* creature = GetHitCreature()) + if (CreatureAI* ai = creature->AI()) + ai->DoAction(ACTION_INVOKE_SON); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_invoke_sons_script::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_ragnaros_submerge: public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_BASE_VISUAL }); + } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Unit* target = GetHitUnit(); + target->RemoveAurasDueToSpell(SPELL_BASE_VISUAL); + target->RemoveAppliedAuras([target](AuraApplication const* aurApp)->bool + { + return aurApp->GetBase()->GetCasterGUID() != target->GetGUID(); + }); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_submerge::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_ragnaros_submerge_AuraScript : public AuraScript +{ + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } + + void Register() override + { + AfterEffectApply.Register(&spell_ragnaros_submerge_AuraScript::HandleApply, EFFECT_0, m_scriptSpellId == SPELL_LEGS_SUBMERGE ? SPELL_AURA_DUMMY : SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove.Register(&spell_ragnaros_submerge_AuraScript::HandleRemove, EFFECT_0, m_scriptSpellId == SPELL_LEGS_SUBMERGE ? SPELL_AURA_DUMMY : SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } +}; + +class spell_ragnaros_burning_speed : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_BURNING_SPEED_AURA }); + } + + void HandlePeriodic(AuraEffect const* /*aurEff*/) + { + Unit* target = GetTarget(); + uint8 stacks = ceilf(target->GetHealthPct() / 10); + + if (Aura* burningSpeed = target->GetAura(SPELL_BURNING_SPEED_AURA, target->GetGUID())) + burningSpeed->SetStackAmount(stacks); + else + target->CastSpell(nullptr, SPELL_BURNING_SPEED_AURA, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_AURA_STACK, stacks)); + } + + void Register() override + { + OnEffectPeriodic.Register(&spell_ragnaros_burning_speed::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } +}; + +class spell_ragnaros_molten_seed: public SpellScript +{ + void FilterTargets(std::list& targets) + { + if (targets.empty()) + return; + + Unit const* caster = GetCaster(); + targets.sort(Trinity::ObjectDistanceOrderPred(caster, true)); + targets.resize(1); + } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + GetHitUnit()->CastSpell(caster, static_cast(GetEffectValue())); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_molten_seed::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnObjectAreaTargetSelect.Register(&spell_ragnaros_molten_seed::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + } +}; + +class spell_ragnaros_molten_seed_dummy: public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MOLTEN_SEED_VISUAL }); + } + + void HandleDummyEffect(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(nullptr, SPELL_MOLTEN_SEED_VISUAL); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_molten_seed_dummy::HandleDummyEffect, EFFECT_1, SPELL_EFFECT_DUMMY); + } +}; + +class spell_ragnaros_molten_seed_visual : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_MOLTEN_POWER, + SPELL_MOLTEN_INFERNO, + SPELL_AGGRO_DEMON_CREATOR, + SPELL_REDUCE_CRITICAL_STRIKE_CHANCE_100_PCT, + SPELL_INVIS_PRE_VISUAL_2 + }); + } + + void HandlePeriodic(AuraEffect const* aurEff) + { + if (aurEff->GetTickNumber() == uint32(aurEff->GetTotalTicks())) + GetTarget()->CastSpell(nullptr, SPELL_MOLTEN_POWER); + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->RemoveAurasDueToSpell(SPELL_INVIS_PRE_VISUAL_2); + target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + target->CastSpell(nullptr, SPELL_MOLTEN_INFERNO); + + if (Creature* creature = target->ToCreature()) + { + target->m_Events.AddEventAtOffset([creature]() + { + creature->CastSpell(nullptr, SPELL_AGGRO_DEMON_CREATOR); + creature->CastSpell(nullptr, SPELL_REDUCE_CRITICAL_STRIKE_CHANCE_100_PCT); + }, 1s); + } + } + + void Register() override + { + OnEffectPeriodic.Register(&spell_ragnaros_molten_seed_visual::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + AfterEffectRemove.Register(&spell_ragnaros_molten_seed_visual::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } +}; + +class spell_ragnaros_engulfing_flames: public SpellScript +{ + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Unit* target = GetHitUnit(); + target->CastSpell(nullptr, EngulfingFlamesData[GetEffectValue()].VisualSpellID); + target->CastSpell(nullptr, EngulfingFlamesData[GetEffectValue()].CastSpellID); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_engulfing_flames::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_ragnaros_world_in_flames : public AuraScript +{ + bool Load() override + { + _previouslyNukedSegment = urand(0, 2); + return true; + } + + void HandlePeriodic(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + + uint8 segmentToNuke = urand(0, EngulfingFlamesData.size() - 1); + if (segmentToNuke == _previouslyNukedSegment) + segmentToNuke = uint16(segmentToNuke + 1) % EngulfingFlamesData.size(); + + GetTarget()->CastSpell(nullptr, SPELL_ENGULFING_FLAMES, CastSpellExtraArgs().AddSpellBP0(segmentToNuke)); + _previouslyNukedSegment = segmentToNuke; + } + + void Register() override + { + OnEffectPeriodic.Register(&spell_ragnaros_world_in_flames::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } +private: + uint8 _previouslyNukedSegment = 0; +}; + +class spell_ragnaros_molten_inferno: public SpellScript +{ + void HandleDamageFalloff(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (!caster) + return; + + // Calculation is based on sniff research + uint32 damage = GetHitDamage(); + float distanceDamageMod = caster->GetExactDist2d(GetHitUnit()) / 5.f; + if (distanceDamageMod < 1.f) + return; + + damage /= distanceDamageMod; + SetHitDamage(damage); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_molten_inferno::HandleDamageFalloff, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } +}; + +class spell_ragnaros_blazing_heat: public SpellScript +{ + void HandleDummyEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + caster->CastSpell(GetHitUnit(), static_cast(GetEffectValue())); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_blazing_heat::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +class spell_ragnaros_blazing_heat_script: public SpellScript +{ + bool Load() override + { + return GetCaster()->IsCreature(); + } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (!caster) + return; + + if (CreatureAI* ai = caster->ToCreature()->AI()) + ai->Talk(SAY_ANNOUNCE_BLAZING_HEAT, GetHitUnit()); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_blazing_heat_script::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_ragnaros_blazing_heat_aoe : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_BLAZING_HEAT_SUMMON }); + } + + void FilterTargets(std::list& targets) + { + _triggerSummon = targets.empty(); + } + + void HandleSummon() + { + if (!_triggerSummon) + return; + + if (Unit* caster = GetCaster()) + caster->CastSpell(caster->GetPosition(), SPELL_BLAZING_HEAT_SUMMON, true); + } + + void Register() override + { + OnObjectAreaTargetSelect.Register(&spell_ragnaros_blazing_heat_aoe::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + AfterCast.Register(&spell_ragnaros_blazing_heat_aoe::HandleSummon); + } +private: + bool _triggerSummon = false; +}; + +class spell_ragnaros_living_meteor: public SpellScript +{ + void HandleDummyEffect(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (!caster) + return; + + caster->CastSpell(GetHitUnit(), static_cast(GetEffectValue())); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_living_meteor::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +class spell_ragnaros_living_meteor_aoe: public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_METEOR_IMPACT, + SPELL_TRIGGERED_LIVING_METEOR, + SPELL_COMBUSTIBLE + }); + } + + void HandleImpact() + { + Unit* caster = GetCaster(); + if (!caster) + return; + + caster->CastSpell(nullptr, SPELL_METEOR_IMPACT); + caster->CastSpell(nullptr, SPELL_TRIGGERED_LIVING_METEOR); + caster->RemoveAurasDueToSpell(sSpellMgr->GetSpellIdForDifficulty(SPELL_COMBUSTIBLE , caster)); + + if (Creature* creature = caster->ToCreature()) + if (CreatureAI* ai = creature->AI()) + ai->DoAction(ACTION_IMPACT_TRIGGERED); + } + + void Register() override + { + AfterHit.Register(&spell_ragnaros_living_meteor_aoe::HandleImpact); + } +}; + +class spell_ragnaros_fixate : public AuraScript +{ + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + caster->GetThreatManager().FixateTarget(GetTarget()); + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + caster->GetThreatManager().ClearFixate(); + } + + void Register() override + { + AfterEffectApply.Register(&spell_ragnaros_fixate::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove.Register(&spell_ragnaros_fixate::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + +class spell_ragnaros_combustible : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_COMBUSTION, + SPELL_LIVING_METEOR_TARGET_SEARCHER, + SPELL_LIVING_METEOR_SPEED_STACKER, + SPELL_LIVING_METEOR_SPEED_AURA + }); + } + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->CastSpell(nullptr, SPELL_LIVING_METEOR_TARGET_SEARCHER, true); + target->CastSpell(nullptr, SPELL_LIVING_METEOR_SPEED_STACKER, true); + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->RemoveAurasDueToSpell(sSpellMgr->GetSpellIdForDifficulty(SPELL_LIVING_METEOR_TARGET_SEARCHER, target)); + target->RemoveAurasDueToSpell(sSpellMgr->GetSpellIdForDifficulty(SPELL_LIVING_METEOR_SPEED_STACKER, target)); + target->RemoveAurasDueToSpell(sSpellMgr->GetSpellIdForDifficulty(SPELL_LIVING_METEOR_SPEED_AURA, target)); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetActor(); + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + GetTarget()->CastSpell(eventInfo.GetActor(), SPELL_COMBUSTION); + + if (Creature* creature = GetTarget()->ToCreature()) + if (CreatureAI* ai = creature->AI()) + ai->DoAction(ACTION_COMBUSTION_TRIGGERED); + } + + void Register() override + { + AfterEffectApply.Register(&spell_ragnaros_combustible::HandleApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove.Register(&spell_ragnaros_combustible::HandleRemove, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + DoCheckProc.Register(&spell_ragnaros_combustible::CheckProc); + OnEffectProc.Register(&spell_ragnaros_combustible::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } +}; + +class spell_ragnaros_death : public SpellScript +{ + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Creature* creature = GetHitCreature(); + if (!creature) + return; + + creature->RemoveAppliedAuras([creature](AuraApplication const* aurApp)->bool + { + return aurApp->GetBase()->GetCasterGUID() != creature->GetGUID(); + }); + + creature->AttackStop(); + creature->SetReactState(REACT_PASSIVE); + creature->SetFacingTo(3.533860683441162109f); + creature->RemoveAurasDueToSpell(SPELL_BASE_VISUAL); + creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + creature->DespawnOrUnsummon(4s); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_death::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_ragnaros_burning_wound : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_BURNING_BLAST }); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* target = GetTarget(); + int32 basePoints = sSpellMgr->AssertSpellInfo(SPELL_BURNING_BLAST)->Effects[EFFECT_0].CalcValue(target) * GetStackAmount(); + target->CastSpell(eventInfo.GetProcTarget(), SPELL_BURNING_BLAST, CastSpellExtraArgs(aurEff).AddSpellBP0(basePoints)); + } + + void Register() override + { + OnEffectProc.Register(&spell_ragnaros_burning_wound::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL); + } +}; + +class spell_ragnaros_empowered_sulfuras: public AuraScript +{ + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, ITEM_SLOT_ID_EMPOWERED_SULFURAS); + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, ITEM_SLOT_ID_DEFAULT_SULFURAS); + } + + void Register() override + { + AfterEffectApply.Register(&spell_ragnaros_empowered_sulfuras::HandleApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove.Register(&spell_ragnaros_empowered_sulfuras::HandleRemove, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } +}; + +class spell_ragnaros_empower_sulfuras : public SpellScript +{ + void HandleAfterCast() + { + GetCaster()->CastSpell(nullptr, GetSpellInfo()->Effects[EFFECT_1].BasePoints); + } + + void Register() override + { + AfterCast.Register(&spell_ragnaros_empower_sulfuras::HandleAfterCast); + } +}; + +class spell_ragnaros_empower_sulfuras_periodic : public AuraScript +{ + void HandlePeriodic(AuraEffect const* aurEff) + { + if (roll_chance_f(75.f)) + return; + + GetTarget()->CastSpell(nullptr, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell); + } + + void Register() override + { + OnEffectPeriodic.Register(&spell_ragnaros_empower_sulfuras_periodic::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } +}; + +class spell_ragnaros_entrapping_roots: public SpellScript +{ + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(nullptr, static_cast(GetEffectValue())); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_entrapping_roots::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_ragnaros_entrapping_roots_aura: public SpellScript +{ + void HandleAuraRemoval(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (!caster) + return; + + caster->RemoveAllAuras(); + if (Creature* creature = caster->ToCreature()) + creature->DespawnOrUnsummon(2s + 500ms); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_entrapping_roots_aura::HandleAuraRemoval, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } +}; + +class spell_ragnaros_cloudburst: public SpellScript +{ + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + caster->CastSpell(GetHitUnit(), static_cast(GetEffectValue())); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_cloudburst::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +class spell_ragnaros_dreadflame : public AuraScript +{ + void HandlePeriodic(AuraEffect const* aurEff) + { + Unit* target = GetTarget(); + + _ticksUntilNextCast -= 1; + if (_ticksUntilNextCast == 0) + { + InstanceScript* instance = target->GetInstanceScript(); + if (!instance) + return; + + uint8 const castCount = target->GetMap()->Is25ManRaid() ? 5 : 2; + if (Creature* creature = GetTarget()->ToCreature()) + if (CreatureAI* ai = creature->AI()) + ai->SetData(DATA_CAST_DREADFLAMES, castCount); + + _ticksUntilNextCast = GetNextCastTickAmount(aurEff->GetTickNumber()); + } + } + + void Register() override + { + OnEffectPeriodic.Register(&spell_ragnaros_dreadflame::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + +private: + uint8 _ticksUntilNextCast = 1; + + uint8 GetNextCastTickAmount(uint32 tickNumber) + { + uint8 const baseValue = 9; + uint8 const offset = std::min(floor(tickNumber / 2), baseValue - 1); + + return baseValue - offset; + } +}; + +class spell_ragnaros_dreadflame_control_aura_damage : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_DREADFLAME_DAMAGE, + SPELL_DREADFLAME_AREA_DUMMY_AURA + }); + } + + void FilterTargets(std::list& targets) + { + targets.remove_if([](WorldObject const* target) + { + Unit const* unitTarget = target->ToUnit(); + return (!unitTarget || !unitTarget->HasAura(SPELL_DREADFLAME_AREA_DUMMY_AURA)); + }); + } + + void HandleDummyEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + caster->CastSpell(GetHitUnit(), SPELL_DREADFLAME_DAMAGE, true); + } + + void Register() override + { + OnObjectAreaTargetSelect.Register(&spell_ragnaros_dreadflame_control_aura_damage::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget.Register(&spell_ragnaros_dreadflame_control_aura_damage::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +class spell_ragnaros_dreadflame_control_aura_spawn : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DREADFLAME_AREA_DUMMY_AURA }); + } + + void HandleDummyEffect(SpellEffIndex /*effIndex*/) + { + Creature* creature = GetHitCreature(); + if (!creature) + return; + + if (Unit* caster = GetCaster()) + caster->CastSpell(creature, SPELL_DREADFLAME_AREA_DUMMY_AURA, true); + + creature->DespawnOrUnsummon(); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_dreadflame_control_aura_spawn::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +class spell_ragnaros_dreadflame_control_aura_spread : public AuraScript +{ + void HandlePeriodic(AuraEffect const* /*aurEff*/) + { + if (Creature* creature = GetTarget()->ToCreature()) + if (CreatureAI* ai = creature->AI()) + ai->DoAction(ACTION_SPREAD_DREADFLAMES); + } + + void Register() override + { + OnEffectPeriodic.Register(&spell_ragnaros_dreadflame_control_aura_spread::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } +}; + +class spell_ragnaros_dreadflame_control_aura_deluge : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_DELUGE_TRIGGERED, + SPELL_DREADFLAME_AREA_DUMMY_AURA + }); + } + + void HandleDummyEffect(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (!caster) + return; + + if (Aura const* aura = GetHitUnit()->GetAura(SPELL_DREADFLAME_AREA_DUMMY_AURA)) + { + if (DynamicObject* dynObject = aura->GetDynobjOwner()) + { + Position const& gridOriginPos = DreadflamePositionInfoData[0].Dest; + float diffX = dynObject->GetPositionX() - gridOriginPos.GetPositionX(); + float diffY = dynObject->GetPositionY() - gridOriginPos.GetPositionY(); + + uint16 index = static_cast((diffX / 5.f) * 31 + (diffY / 5.f)); + if (Creature* creature = caster->ToCreature()) + if (CreatureAI* ai = creature->AI()) + ai->SetData(DATA_RELEASE_DREADFLAME_POSITION_INFO_INDEX, index); + + caster->CastSpell(dynObject->GetPosition(), SPELL_DELUGE_TRIGGERED); + caster->RemoveAurasDueToSpell(SPELL_DREADFLAME_AREA_DUMMY_AURA, dynObject->GetGUID()); + dynObject->Remove(); // @todo: this should be handled by the deluge spell effect 177 but until then, we cancel it manually. + } + } + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_dreadflame_control_aura_deluge::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +class spell_ragnaros_breadth_of_frost_trigger: public SpellScript +{ + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(nullptr, static_cast(GetEffectValue())); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_breadth_of_frost_trigger::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_ragnaros_breadth_of_frost: public SpellScript +{ + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Unit* target = GetHitUnit(); + target->RemoveAurasDueToSpell(sSpellMgr->GetSpellIdForDifficulty(static_cast(GetEffectValue()), target)); + } + + void Register() override + { + OnEffectHitTarget.Register(&spell_ragnaros_breadth_of_frost::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_ragnaros_superheated : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_BREADTH_OF_FROST_AURA }); + } + + void FilterTargets(std::list& targets) + { + targets.remove_if([](WorldObject const* target) + { + return (!target->IsUnit() || target->ToUnit()->HasAura(SPELL_BREADTH_OF_FROST_AURA)); + }); + } + + void Register() override + { + OnObjectAreaTargetSelect.Register(&spell_ragnaros_superheated::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect.Register(&spell_ragnaros_superheated::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + } +}; + +void AddSC_boss_ragnaros_firelands() +{ + RegisterFirelandsCreatureAI(boss_ragnaros_firelands); + RegisterFirelandsCreatureAI(npc_ragnaros_son_of_flame); + RegisterFirelandsCreatureAI(npc_ragnaros_lava_scion); + RegisterFirelandsCreatureAI(npc_ragnaros_living_meteor); + RegisterFirelandsCreatureAI(npc_ragnaros_archdruid); + RegisterFirelandsCreatureAI(npc_ragnaros_dreadflame); + RegisterFirelandsCreatureAI(npc_ragnaros_cloudburst); + RegisterSpellScript(spell_ragnaros_wrath_of_ragnaros); + RegisterSpellScript(spell_ragnaros_magma_trap); + RegisterSpellScript(spell_ragnaros_magma_trap_periodic); + RegisterSpellScript(spell_ragnaros_magma_trap_missile); + RegisterSpellScript(spell_ragnaros_sulfuras_smash); + RegisterSpellScript(spell_ragnaros_splitting_blow); + RegisterSpellScript(spell_ragnaros_splitting_blow_script); + RegisterSpellScript(spell_ragnaros_invoke_sons); + RegisterSpellScript(spell_ragnaros_invoke_sons_script); + RegisterSpellAndAuraScriptPair(spell_ragnaros_submerge, spell_ragnaros_submerge_AuraScript); + RegisterSpellScript(spell_ragnaros_burning_speed); + RegisterSpellScript(spell_ragnaros_molten_seed); + RegisterSpellScript(spell_ragnaros_molten_seed_dummy); + RegisterSpellScript(spell_ragnaros_molten_seed_visual); + RegisterSpellScript(spell_ragnaros_engulfing_flames); + RegisterSpellScript(spell_ragnaros_world_in_flames); + RegisterSpellScript(spell_ragnaros_molten_inferno); + RegisterSpellScript(spell_ragnaros_blazing_heat); + RegisterSpellScript(spell_ragnaros_blazing_heat_script); + RegisterSpellScript(spell_ragnaros_blazing_heat_aoe); + RegisterSpellScript(spell_ragnaros_living_meteor); + RegisterSpellScript(spell_ragnaros_living_meteor_aoe); + RegisterSpellScript(spell_ragnaros_fixate); + RegisterSpellScript(spell_ragnaros_combustible); + RegisterSpellScript(spell_ragnaros_death); + RegisterSpellScript(spell_ragnaros_burning_wound); + RegisterSpellScript(spell_ragnaros_empowered_sulfuras); + RegisterSpellScript(spell_ragnaros_empower_sulfuras); + RegisterSpellScript(spell_ragnaros_empower_sulfuras_periodic); + RegisterSpellScript(spell_ragnaros_entrapping_roots); + RegisterSpellScript(spell_ragnaros_entrapping_roots_aura); + RegisterSpellScript(spell_ragnaros_cloudburst); + RegisterSpellScript(spell_ragnaros_dreadflame); + RegisterSpellScript(spell_ragnaros_dreadflame_control_aura_damage); + RegisterSpellScript(spell_ragnaros_dreadflame_control_aura_spawn); + RegisterSpellScript(spell_ragnaros_dreadflame_control_aura_spread); + RegisterSpellScript(spell_ragnaros_dreadflame_control_aura_deluge); + RegisterSpellScript(spell_ragnaros_breadth_of_frost_trigger); + RegisterSpellScript(spell_ragnaros_breadth_of_frost); + RegisterSpellScript(spell_ragnaros_superheated); +} diff --git a/src/server/scripts/Kalimdor/Firelands/firelands.cpp b/src/server/scripts/Kalimdor/Firelands/firelands.cpp new file mode 100644 index 00000000000..4c978ba7b01 --- /dev/null +++ b/src/server/scripts/Kalimdor/Firelands/firelands.cpp @@ -0,0 +1,42 @@ +/* +* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information +* +* 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 . +*/ + +#include "firelands.h" +#include "InstanceScript.h" +#include "Map.h" +#include "Player.h" +#include "ScriptMgr.h" + +class at_fl_ragnaros_spawn : public OnlyOnceAreaTriggerScript +{ +public: + at_fl_ragnaros_spawn() : OnlyOnceAreaTriggerScript("at_fl_ragnaros_spawn") { } + + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (instance->GetBossState(DATA_RAGNAROS) != DONE && instance->GetGuidData(DATA_RAGNAROS).IsEmpty()) + instance->instance->SpawnGroupSpawn(SPAWN_GROUP_ID_RAGNAROS); + + return true; + } +}; + +void AddSC_firelands() +{ + new at_fl_ragnaros_spawn(); +} diff --git a/src/server/scripts/Kalimdor/Firelands/firelands.h b/src/server/scripts/Kalimdor/Firelands/firelands.h index 9c2b4e179c4..1c48edb73be 100644 --- a/src/server/scripts/Kalimdor/Firelands/firelands.h +++ b/src/server/scripts/Kalimdor/Firelands/firelands.h @@ -19,6 +19,8 @@ #define FIRELANDS_H_ #include "CreatureAIImpl.h" +#include "Position.h" +#include #define DataHeader "FL" #define FirelandsScriptName "instance_firelands" @@ -39,7 +41,16 @@ enum FLDataTypes // Encounter Specific DATA_LORD_RHYOLITH_MOVEMENT_CONTROLLER, DATA_LEFT_FOOT, - DATA_RIGHT_FOOT + DATA_RIGHT_FOOT, + DATA_FIRST_RAGNAROS_SPAWN, + DATA_SULFURAS_SMASH, + DATA_RANDOM_SPLITTING_BLOW_GUID, + DATA_SULFURAS_HAND_OF_RAGNAROS, + DATA_RAGNAROS_PLATFORM, + DATA_ARCHDRUID_HAMUUL_RUNETOTEM, + DATA_DREADFLAME_CONTROLLER, + DATA_CENARIUS, + DATA_MAGMA_KNOCKBACK, }; enum FLCreatureIds @@ -79,16 +90,1024 @@ enum FLCreatureIds // Majordomo Staghelm NPC_SPIRIT_OF_THE_FLAME = 52593, NPC_BURNING_ORB = 53216, - NPC_DRUID_OF_THE_FLAME = 53619 + NPC_DRUID_OF_THE_FLAME = 53619, + + // Ragnaros + NPC_MAGMA_TRAP = 53086, + NPC_SULFURAS_SMASH_1 = 53266, + NPC_SULFURAS_SMASH_2 = 53268, + NPC_LAVA_WAVE = 53363, + NPC_SPLITTING_BLOW = 53393, + NPC_SON_OF_FLAME = 53140, + NPC_SULFURAS_HAND_OF_RAGNAROS = 53420, + NPC_MOLTEN_ELEMENTAL = 53189, + NPC_LAVA_SCION = 53231, + NPC_BLAZING_HEAT = 53473, + NPC_ARCHDRUID_HAMUUL_RUNETOTEM = 53876, + NPC_MALFURION_STORMRAGE = 53875, + NPC_CENARIUS = 53872, + NPC_ENTRAPPING_ROOTS = 54074, + NPC_DREADFLAME = 54127, + NPC_DREADFLAME_SPAWN = 54203, + NPC_CLOUDBURST = 54147, + NPC_BREADTH_OF_FROST = 53953, + NPC_MAGMA = 53729, }; -enum GameobjectIds +enum FLGameobjectIds { GO_LORD_RHYOLITH_BRIDGE = 209255, GO_BETH_TILAC_DOOR = 208877, GO_BALEROC_FIREWALL = 209066, GO_MAJORDOMO_FIREWALL = 208906, GO_RAGNAROS_DOOR = 209073, + GO_RAGNAROS_PLATFORM = 208835, +}; + +enum FLSpawnGroups +{ + SPAWN_GROUP_ID_RAGNAROS = 458, + SPAWN_GROUP_ID_RAGNAROS_STALKERS = 459 +}; + +struct DreadflamePositionInfo +{ + DreadflamePositionInfo(bool onPlatform, uint16 index, Position const& dest) : + OnPlatform(onPlatform), Index(index), Dest(dest) + { + } + + bool OnPlatform; + uint16 Index; + Position Dest; +}; + +// This one might be very ugly but it's the most precise and fastest way to index and handle the spread and spawn behavior of Dreadflames +typedef std::array DreadflamePositionInfoArray; + +static DreadflamePositionInfoArray DreadflamePositionInfoData = +{ + DreadflamePositionInfo(false, 0, Position(968.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 1, Position(968.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 2, Position(968.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 3, Position(968.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 4, Position(968.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 5, Position(968.f, -108.f, 55.5f)), + DreadflamePositionInfo(false, 6, Position(968.f, -103.f, 55.5f)), + DreadflamePositionInfo(false, 7, Position(968.f, -98.f, 55.5f)), + DreadflamePositionInfo(false, 8, Position(968.f, -93.f, 55.5f)), + DreadflamePositionInfo(false, 9, Position(968.f, -88.f, 55.5f)), + DreadflamePositionInfo(false, 10, Position(968.f, -83.f, 55.5f)), + DreadflamePositionInfo(false, 11, Position(968.f, -78.f, 55.5f)), + DreadflamePositionInfo(false, 12, Position(968.f, -73.f, 55.5f)), + DreadflamePositionInfo(false, 13, Position(968.f, -68.f, 55.5f)), + DreadflamePositionInfo(false, 14, Position(968.f, -63.f, 55.5f)), + DreadflamePositionInfo(false, 15, Position(968.f, -58.f, 55.5f)), + DreadflamePositionInfo(false, 16, Position(968.f, -53.f, 55.5f)), + DreadflamePositionInfo(false, 17, Position(968.f, -48.f, 55.5f)), + DreadflamePositionInfo(false, 18, Position(968.f, -43.f, 55.5f)), + DreadflamePositionInfo(false, 19, Position(968.f, -38.f, 55.5f)), + DreadflamePositionInfo(false, 20, Position(968.f, -33.f, 55.5f)), + DreadflamePositionInfo(false, 21, Position(968.f, -28.f, 55.5f)), + DreadflamePositionInfo(false, 22, Position(968.f, -23.f, 55.5f)), + DreadflamePositionInfo(false, 23, Position(968.f, -18.f, 55.5f)), + DreadflamePositionInfo(false, 24, Position(968.f, -13.f, 55.5f)), + DreadflamePositionInfo(false, 25, Position(968.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 26, Position(968.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 27, Position(968.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 28, Position(968.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 29, Position(968.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 30, Position(968.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 31, Position(973.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 32, Position(973.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 33, Position(973.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 34, Position(973.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 35, Position(973.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 36, Position(973.f, -108.f, 55.5f)), + DreadflamePositionInfo(false, 37, Position(973.f, -103.f, 55.5f)), + DreadflamePositionInfo(false, 38, Position(973.f, -98.f, 55.5f)), + DreadflamePositionInfo(false, 39, Position(973.f, -93.f, 55.5f)), + DreadflamePositionInfo(false, 40, Position(973.f, -88.f, 55.5f)), + DreadflamePositionInfo(false, 41, Position(973.f, -83.f, 55.5f)), + DreadflamePositionInfo(false, 42, Position(973.f, -78.f, 55.5f)), + DreadflamePositionInfo(false, 43, Position(973.f, -73.f, 55.5f)), + DreadflamePositionInfo(false, 44, Position(973.f, -68.f, 55.5f)), + DreadflamePositionInfo(false, 45, Position(973.f, -63.f, 55.5f)), + DreadflamePositionInfo(false, 46, Position(973.f, -58.f, 55.5f)), + DreadflamePositionInfo(false, 47, Position(973.f, -53.f, 55.5f)), + DreadflamePositionInfo(false, 48, Position(973.f, -48.f, 55.5f)), + DreadflamePositionInfo(false, 49, Position(973.f, -43.f, 55.5f)), + DreadflamePositionInfo(false, 50, Position(973.f, -38.f, 55.5f)), + DreadflamePositionInfo(false, 51, Position(973.f, -33.f, 55.5f)), + DreadflamePositionInfo(false, 52, Position(973.f, -28.f, 55.5f)), + DreadflamePositionInfo(false, 53, Position(973.f, -23.f, 55.5f)), + DreadflamePositionInfo(false, 54, Position(973.f, -18.f, 55.5f)), + DreadflamePositionInfo(false, 55, Position(973.f, -13.f, 55.5f)), + DreadflamePositionInfo(false, 56, Position(973.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 57, Position(973.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 58, Position(973.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 59, Position(973.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 60, Position(973.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 61, Position(973.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 62, Position(978.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 63, Position(978.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 64, Position(978.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 65, Position(978.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 66, Position(978.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 67, Position(978.f, -108.f, 55.5f)), + DreadflamePositionInfo(false, 68, Position(978.f, -103.f, 55.5f)), + DreadflamePositionInfo(false, 69, Position(978.f, -98.f, 55.5f)), + DreadflamePositionInfo(false, 70, Position(978.f, -93.f, 55.5f)), + DreadflamePositionInfo(false, 71, Position(978.f, -88.f, 55.5f)), + DreadflamePositionInfo(false, 72, Position(978.f, -83.f, 55.5f)), + DreadflamePositionInfo(false, 73, Position(978.f, -78.f, 55.5f)), + DreadflamePositionInfo(false, 74, Position(978.f, -73.f, 55.5f)), + DreadflamePositionInfo(false, 75, Position(978.f, -68.f, 55.5f)), + DreadflamePositionInfo(false, 76, Position(978.f, -63.f, 55.5f)), + DreadflamePositionInfo(false, 77, Position(978.f, -58.f, 55.5f)), + DreadflamePositionInfo(false, 78, Position(978.f, -53.f, 55.5f)), + DreadflamePositionInfo(false, 79, Position(978.f, -48.f, 55.5f)), + DreadflamePositionInfo(false, 80, Position(978.f, -43.f, 55.5f)), + DreadflamePositionInfo(false, 81, Position(978.f, -38.f, 55.5f)), + DreadflamePositionInfo(false, 82, Position(978.f, -33.f, 55.5f)), + DreadflamePositionInfo(false, 83, Position(978.f, -28.f, 55.5f)), + DreadflamePositionInfo(false, 84, Position(978.f, -23.f, 55.5f)), + DreadflamePositionInfo(false, 85, Position(978.f, -18.f, 55.5f)), + DreadflamePositionInfo(false, 86, Position(978.f, -13.f, 55.5f)), + DreadflamePositionInfo(false, 87, Position(978.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 88, Position(978.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 89, Position(978.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 90, Position(978.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 91, Position(978.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 92, Position(978.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 93, Position(983.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 94, Position(983.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 95, Position(983.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 96, Position(983.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 97, Position(983.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 98, Position(983.f, -108.f, 55.5f)), + DreadflamePositionInfo(false, 99, Position(983.f, -103.f, 55.5f)), + DreadflamePositionInfo(false, 100, Position(983.f, -98.f, 55.5f)), + DreadflamePositionInfo(false, 101, Position(983.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 102, Position(983.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 103, Position(983.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 104, Position(983.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 105, Position(983.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 106, Position(983.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 107, Position(983.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 108, Position(983.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 109, Position(983.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 110, Position(983.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 111, Position(983.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 112, Position(983.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 113, Position(983.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 114, Position(983.f, -28.f, 55.5f)), + DreadflamePositionInfo(false, 115, Position(983.f, -23.f, 55.5f)), + DreadflamePositionInfo(false, 116, Position(983.f, -18.f, 55.5f)), + DreadflamePositionInfo(false, 117, Position(983.f, -13.f, 55.5f)), + DreadflamePositionInfo(false, 118, Position(983.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 119, Position(983.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 120, Position(983.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 121, Position(983.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 122, Position(983.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 123, Position(983.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 124, Position(988.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 125, Position(988.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 126, Position(988.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 127, Position(988.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 128, Position(988.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 129, Position(988.f, -108.f, 55.5f)), + DreadflamePositionInfo(false, 130, Position(988.f, -103.f, 55.5f)), + DreadflamePositionInfo(false, 131, Position(988.f, -98.f, 55.5f)), + DreadflamePositionInfo(false, 132, Position(988.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 133, Position(988.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 134, Position(988.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 135, Position(988.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 136, Position(988.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 137, Position(988.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 138, Position(988.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 139, Position(988.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 140, Position(988.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 141, Position(988.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 142, Position(988.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 143, Position(988.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 144, Position(988.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 145, Position(988.f, -28.f, 55.5f)), + DreadflamePositionInfo(false, 146, Position(988.f, -23.f, 55.5f)), + DreadflamePositionInfo(false, 147, Position(988.f, -18.f, 55.5f)), + DreadflamePositionInfo(false, 148, Position(988.f, -13.f, 55.5f)), + DreadflamePositionInfo(false, 149, Position(988.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 150, Position(988.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 151, Position(988.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 152, Position(988.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 153, Position(988.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 154, Position(988.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 155, Position(993.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 156, Position(993.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 157, Position(993.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 158, Position(993.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 159, Position(993.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 160, Position(993.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 161, Position(993.f, -103.f, 55.5f)), + DreadflamePositionInfo(false, 162, Position(993.f, -98.f, 55.5f)), + DreadflamePositionInfo(false, 163, Position(993.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 164, Position(993.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 165, Position(993.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 166, Position(993.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 167, Position(993.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 168, Position(993.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 169, Position(993.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 170, Position(993.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 171, Position(993.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 172, Position(993.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 173, Position(993.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 174, Position(993.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 175, Position(993.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 176, Position(993.f, -28.f, 55.5f)), + DreadflamePositionInfo(false, 177, Position(993.f, -23.f, 55.5f)), + DreadflamePositionInfo(false, 178, Position(993.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 179, Position(993.f, -13.f, 55.5f)), + DreadflamePositionInfo(false, 180, Position(993.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 181, Position(993.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 182, Position(993.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 183, Position(993.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 184, Position(993.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 185, Position(993.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 186, Position(998.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 187, Position(998.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 188, Position(998.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 189, Position(998.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 190, Position(998.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 191, Position(998.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 192, Position(998.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 193, Position(998.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 194, Position(998.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 195, Position(998.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 196, Position(998.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 197, Position(998.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 198, Position(998.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 199, Position(998.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 200, Position(998.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 201, Position(998.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 202, Position(998.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 203, Position(998.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 204, Position(998.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 205, Position(998.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 206, Position(998.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 207, Position(998.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 208, Position(998.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 209, Position(998.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 210, Position(998.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 211, Position(998.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 212, Position(998.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 213, Position(998.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 214, Position(998.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 215, Position(998.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 216, Position(998.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 217, Position(1003.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 218, Position(1003.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 219, Position(1003.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 220, Position(1003.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 221, Position(1003.f, -113.f, 55.5f)), + DreadflamePositionInfo(true, 222, Position(1003.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 223, Position(1003.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 224, Position(1003.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 225, Position(1003.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 226, Position(1003.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 227, Position(1003.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 228, Position(1003.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 229, Position(1003.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 230, Position(1003.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 231, Position(1003.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 232, Position(1003.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 233, Position(1003.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 234, Position(1003.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 235, Position(1003.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 236, Position(1003.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 237, Position(1003.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 238, Position(1003.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 239, Position(1003.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 240, Position(1003.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 241, Position(1003.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 242, Position(1003.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 243, Position(1003.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 244, Position(1003.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 245, Position(1003.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 246, Position(1003.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 247, Position(1003.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 248, Position(1008.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 249, Position(1008.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 250, Position(1008.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 251, Position(1008.f, -118.f, 55.5f)), + DreadflamePositionInfo(true, 252, Position(1008.f, -113.f, 55.5f)), + DreadflamePositionInfo(true, 253, Position(1008.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 254, Position(1008.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 255, Position(1008.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 256, Position(1008.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 257, Position(1008.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 258, Position(1008.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 259, Position(1008.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 260, Position(1008.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 261, Position(1008.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 262, Position(1008.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 263, Position(1008.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 264, Position(1008.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 265, Position(1008.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 266, Position(1008.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 267, Position(1008.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 268, Position(1008.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 269, Position(1008.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 270, Position(1008.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 271, Position(1008.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 272, Position(1008.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 273, Position(1008.f, -8.f, 55.5f)), + DreadflamePositionInfo(true, 274, Position(1008.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 275, Position(1008.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 276, Position(1008.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 277, Position(1008.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 278, Position(1008.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 279, Position(1013.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 280, Position(1013.f, -128.f, 55.5f)), + DreadflamePositionInfo(true, 281, Position(1013.f, -123.f, 55.5f)), + DreadflamePositionInfo(true, 282, Position(1013.f, -118.f, 55.5f)), + DreadflamePositionInfo(true, 283, Position(1013.f, -113.f, 55.5f)), + DreadflamePositionInfo(true, 284, Position(1013.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 285, Position(1013.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 286, Position(1013.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 287, Position(1013.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 288, Position(1013.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 289, Position(1013.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 290, Position(1013.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 291, Position(1013.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 292, Position(1013.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 293, Position(1013.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 294, Position(1013.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 295, Position(1013.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 296, Position(1013.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 297, Position(1013.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 298, Position(1013.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 299, Position(1013.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 300, Position(1013.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 301, Position(1013.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 302, Position(1013.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 303, Position(1013.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 304, Position(1013.f, -8.f, 55.5f)), + DreadflamePositionInfo(true, 305, Position(1013.f, -3.f, 55.5f)), + DreadflamePositionInfo(true, 306, Position(1013.f, 2.f, 55.5f)), + DreadflamePositionInfo(true, 307, Position(1013.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 308, Position(1013.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 309, Position(1013.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 310, Position(1018.f, -133.f, 55.5f)), + DreadflamePositionInfo(true, 311, Position(1018.f, -128.f, 55.5f)), + DreadflamePositionInfo(true, 312, Position(1018.f, -123.f, 55.5f)), + DreadflamePositionInfo(true, 313, Position(1018.f, -118.f, 55.5f)), + DreadflamePositionInfo(true, 314, Position(1018.f, -113.f, 55.5f)), + DreadflamePositionInfo(true, 315, Position(1018.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 316, Position(1018.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 317, Position(1018.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 318, Position(1018.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 319, Position(1018.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 320, Position(1018.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 321, Position(1018.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 322, Position(1018.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 323, Position(1018.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 324, Position(1018.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 325, Position(1018.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 326, Position(1018.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 327, Position(1018.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 328, Position(1018.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 329, Position(1018.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 330, Position(1018.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 331, Position(1018.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 332, Position(1018.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 333, Position(1018.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 334, Position(1018.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 335, Position(1018.f, -8.f, 55.5f)), + DreadflamePositionInfo(true, 336, Position(1018.f, -3.f, 55.5f)), + DreadflamePositionInfo(true, 337, Position(1018.f, 2.f, 55.5f)), + DreadflamePositionInfo(true, 338, Position(1018.f, 7.f, 55.5f)), + DreadflamePositionInfo(true, 339, Position(1018.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 340, Position(1018.f, 17.f, 55.5f)), + DreadflamePositionInfo(true, 341, Position(1023.f, -133.f, 55.5f)), + DreadflamePositionInfo(true, 342, Position(1023.f, -128.f, 55.5f)), + DreadflamePositionInfo(true, 343, Position(1023.f, -123.f, 55.5f)), + DreadflamePositionInfo(true, 344, Position(1023.f, -118.f, 55.5f)), + DreadflamePositionInfo(true, 345, Position(1023.f, -113.f, 55.5f)), + DreadflamePositionInfo(true, 346, Position(1023.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 347, Position(1023.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 348, Position(1023.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 349, Position(1023.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 350, Position(1023.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 351, Position(1023.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 352, Position(1023.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 353, Position(1023.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 354, Position(1023.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 355, Position(1023.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 356, Position(1023.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 357, Position(1023.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 358, Position(1023.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 359, Position(1023.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 360, Position(1023.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 361, Position(1023.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 362, Position(1023.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 363, Position(1023.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 364, Position(1023.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 365, Position(1023.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 366, Position(1023.f, -8.f, 55.5f)), + DreadflamePositionInfo(true, 367, Position(1023.f, -3.f, 55.5f)), + DreadflamePositionInfo(true, 368, Position(1023.f, 2.f, 55.5f)), + DreadflamePositionInfo(true, 369, Position(1023.f, 7.f, 55.5f)), + DreadflamePositionInfo(true, 370, Position(1023.f, 12.f, 55.5f)), + DreadflamePositionInfo(true, 371, Position(1023.f, 17.f, 55.5f)), + DreadflamePositionInfo(true, 372, Position(1028.f, -133.f, 55.5f)), + DreadflamePositionInfo(true, 373, Position(1028.f, -128.f, 55.5f)), + DreadflamePositionInfo(true, 374, Position(1028.f, -123.f, 55.5f)), + DreadflamePositionInfo(true, 375, Position(1028.f, -118.f, 55.5f)), + DreadflamePositionInfo(true, 376, Position(1028.f, -113.f, 55.5f)), + DreadflamePositionInfo(true, 377, Position(1028.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 378, Position(1028.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 379, Position(1028.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 380, Position(1028.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 381, Position(1028.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 382, Position(1028.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 383, Position(1028.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 384, Position(1028.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 385, Position(1028.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 386, Position(1028.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 387, Position(1028.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 388, Position(1028.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 389, Position(1028.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 390, Position(1028.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 391, Position(1028.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 392, Position(1028.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 393, Position(1028.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 394, Position(1028.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 395, Position(1028.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 396, Position(1028.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 397, Position(1028.f, -8.f, 55.5f)), + DreadflamePositionInfo(true, 398, Position(1028.f, -3.f, 55.5f)), + DreadflamePositionInfo(true, 399, Position(1028.f, 2.f, 55.5f)), + DreadflamePositionInfo(true, 400, Position(1028.f, 7.f, 55.5f)), + DreadflamePositionInfo(true, 401, Position(1028.f, 12.f, 55.5f)), + DreadflamePositionInfo(true, 402, Position(1028.f, 17.f, 55.5f)), + DreadflamePositionInfo(true, 403, Position(1033.f, -133.f, 55.5f)), + DreadflamePositionInfo(true, 404, Position(1033.f, -128.f, 55.5f)), + DreadflamePositionInfo(true, 405, Position(1033.f, -123.f, 55.5f)), + DreadflamePositionInfo(true, 406, Position(1033.f, -118.f, 55.5f)), + DreadflamePositionInfo(true, 407, Position(1033.f, -113.f, 55.5f)), + DreadflamePositionInfo(true, 408, Position(1033.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 409, Position(1033.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 410, Position(1033.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 411, Position(1033.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 412, Position(1033.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 413, Position(1033.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 414, Position(1033.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 415, Position(1033.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 416, Position(1033.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 417, Position(1033.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 418, Position(1033.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 419, Position(1033.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 420, Position(1033.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 421, Position(1033.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 422, Position(1033.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 423, Position(1033.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 424, Position(1033.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 425, Position(1033.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 426, Position(1033.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 427, Position(1033.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 428, Position(1033.f, -8.f, 55.5f)), + DreadflamePositionInfo(true, 429, Position(1033.f, -3.f, 55.5f)), + DreadflamePositionInfo(true, 430, Position(1033.f, 2.f, 55.5f)), + DreadflamePositionInfo(true, 431, Position(1033.f, 7.f, 55.5f)), + DreadflamePositionInfo(true, 432, Position(1033.f, 12.f, 55.5f)), + DreadflamePositionInfo(true, 433, Position(1033.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 434, Position(1038.f, -133.f, 55.5f)), + DreadflamePositionInfo(true, 435, Position(1038.f, -128.f, 55.5f)), + DreadflamePositionInfo(true, 436, Position(1038.f, -123.f, 55.5f)), + DreadflamePositionInfo(true, 437, Position(1038.f, -118.f, 55.5f)), + DreadflamePositionInfo(true, 438, Position(1038.f, -113.f, 55.5f)), + DreadflamePositionInfo(true, 439, Position(1038.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 440, Position(1038.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 441, Position(1038.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 442, Position(1038.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 443, Position(1038.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 444, Position(1038.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 445, Position(1038.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 446, Position(1038.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 447, Position(1038.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 448, Position(1038.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 449, Position(1038.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 450, Position(1038.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 451, Position(1038.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 452, Position(1038.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 453, Position(1038.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 454, Position(1038.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 455, Position(1038.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 456, Position(1038.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 457, Position(1038.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 458, Position(1038.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 459, Position(1038.f, -8.f, 55.5f)), + DreadflamePositionInfo(true, 460, Position(1038.f, -3.f, 55.5f)), + DreadflamePositionInfo(true, 461, Position(1038.f, 2.f, 55.5f)), + DreadflamePositionInfo(true, 462, Position(1038.f, 7.f, 55.5f)), + DreadflamePositionInfo(true, 463, Position(1038.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 464, Position(1038.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 465, Position(1043.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 466, Position(1043.f, -128.f, 55.5f)), + DreadflamePositionInfo(true, 467, Position(1043.f, -123.f, 55.5f)), + DreadflamePositionInfo(true, 468, Position(1043.f, -118.f, 55.5f)), + DreadflamePositionInfo(true, 469, Position(1043.f, -113.f, 55.5f)), + DreadflamePositionInfo(true, 470, Position(1043.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 471, Position(1043.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 472, Position(1043.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 473, Position(1043.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 474, Position(1043.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 475, Position(1043.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 476, Position(1043.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 477, Position(1043.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 478, Position(1043.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 479, Position(1043.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 480, Position(1043.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 481, Position(1043.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 482, Position(1043.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 483, Position(1043.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 484, Position(1043.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 485, Position(1043.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 486, Position(1043.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 487, Position(1043.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 488, Position(1043.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 489, Position(1043.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 490, Position(1043.f, -8.f, 55.5f)), + DreadflamePositionInfo(true, 491, Position(1043.f, -3.f, 55.5f)), + DreadflamePositionInfo(true, 492, Position(1043.f, 2.f, 55.5f)), + DreadflamePositionInfo(true, 493, Position(1043.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 494, Position(1043.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 495, Position(1043.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 496, Position(1048.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 497, Position(1048.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 498, Position(1048.f, -123.f, 55.5f)), + DreadflamePositionInfo(true, 499, Position(1048.f, -118.f, 55.5f)), + DreadflamePositionInfo(true, 500, Position(1048.f, -113.f, 55.5f)), + DreadflamePositionInfo(true, 501, Position(1048.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 502, Position(1048.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 503, Position(1048.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 504, Position(1048.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 505, Position(1048.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 506, Position(1048.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 507, Position(1048.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 508, Position(1048.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 509, Position(1048.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 510, Position(1048.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 511, Position(1048.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 512, Position(1048.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 513, Position(1048.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 514, Position(1048.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 515, Position(1048.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 516, Position(1048.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 517, Position(1048.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 518, Position(1048.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 519, Position(1048.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 520, Position(1048.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 521, Position(1048.f, -8.f, 55.5f)), + DreadflamePositionInfo(true, 522, Position(1048.f, -3.f, 55.5f)), + DreadflamePositionInfo(true, 523, Position(1048.f, 2.f, 55.5f)), + DreadflamePositionInfo(true, 524, Position(1048.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 525, Position(1048.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 526, Position(1048.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 527, Position(1053.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 528, Position(1053.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 529, Position(1053.f, -123.f, 55.5f)), + DreadflamePositionInfo(true, 530, Position(1053.f, -118.f, 55.5f)), + DreadflamePositionInfo(true, 531, Position(1053.f, -113.f, 55.5f)), + DreadflamePositionInfo(true, 532, Position(1053.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 533, Position(1053.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 534, Position(1053.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 535, Position(1053.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 536, Position(1053.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 537, Position(1053.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 538, Position(1053.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 539, Position(1053.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 540, Position(1053.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 541, Position(1053.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 542, Position(1053.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 543, Position(1053.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 544, Position(1053.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 545, Position(1053.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 546, Position(1053.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 547, Position(1053.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 548, Position(1053.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 549, Position(1053.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 550, Position(1053.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 551, Position(1053.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 552, Position(1053.f, -8.f, 55.5f)), + DreadflamePositionInfo(true, 553, Position(1053.f, -3.f, 55.5f)), + DreadflamePositionInfo(true, 554, Position(1053.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 555, Position(1053.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 556, Position(1053.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 557, Position(1053.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 558, Position(1058.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 559, Position(1058.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 560, Position(1058.f, -123.f, 55.5f)), + DreadflamePositionInfo(true, 561, Position(1058.f, -118.f, 55.5f)), + DreadflamePositionInfo(true, 562, Position(1058.f, -113.f, 55.5f)), + DreadflamePositionInfo(true, 563, Position(1058.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 564, Position(1058.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 565, Position(1058.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 566, Position(1058.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 567, Position(1058.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 568, Position(1058.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 569, Position(1058.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 570, Position(1058.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 571, Position(1058.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 572, Position(1058.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 573, Position(1058.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 574, Position(1058.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 575, Position(1058.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 576, Position(1058.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 577, Position(1058.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 578, Position(1058.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 579, Position(1058.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 580, Position(1058.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 581, Position(1058.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 582, Position(1058.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 583, Position(1058.f, -8.f, 55.5f)), + DreadflamePositionInfo(true, 584, Position(1058.f, -3.f, 55.5f)), + DreadflamePositionInfo(true, 585, Position(1058.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 586, Position(1058.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 587, Position(1058.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 588, Position(1058.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 589, Position(1063.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 590, Position(1063.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 591, Position(1063.f, -123.f, 55.5f)), + DreadflamePositionInfo(true, 592, Position(1063.f, -118.f, 55.5f)), + DreadflamePositionInfo(true, 593, Position(1063.f, -113.f, 55.5f)), + DreadflamePositionInfo(true, 594, Position(1063.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 595, Position(1063.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 596, Position(1063.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 597, Position(1063.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 598, Position(1063.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 599, Position(1063.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 600, Position(1063.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 601, Position(1063.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 602, Position(1063.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 603, Position(1063.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 604, Position(1063.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 605, Position(1063.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 606, Position(1063.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 607, Position(1063.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 608, Position(1063.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 609, Position(1063.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 610, Position(1063.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 611, Position(1063.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 612, Position(1063.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 613, Position(1063.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 614, Position(1063.f, -8.f, 55.5f)), + DreadflamePositionInfo(true, 615, Position(1063.f, -3.f, 55.5f)), + DreadflamePositionInfo(true, 616, Position(1063.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 617, Position(1063.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 618, Position(1063.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 619, Position(1063.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 620, Position(1068.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 621, Position(1068.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 622, Position(1068.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 623, Position(1068.f, -118.f, 55.5f)), + DreadflamePositionInfo(true, 624, Position(1068.f, -113.f, 55.5f)), + DreadflamePositionInfo(true, 625, Position(1068.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 626, Position(1068.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 627, Position(1068.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 628, Position(1068.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 629, Position(1068.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 630, Position(1068.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 631, Position(1068.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 632, Position(1068.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 633, Position(1068.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 634, Position(1068.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 635, Position(1068.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 636, Position(1068.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 637, Position(1068.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 638, Position(1068.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 639, Position(1068.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 640, Position(1068.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 641, Position(1068.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 642, Position(1068.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 643, Position(1068.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 644, Position(1068.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 645, Position(1068.f, -8.f, 55.5f)), + DreadflamePositionInfo(true, 646, Position(1068.f, -3.f, 55.5f)), + DreadflamePositionInfo(true, 647, Position(1068.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 648, Position(1068.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 649, Position(1068.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 650, Position(1068.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 651, Position(1073.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 652, Position(1073.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 653, Position(1073.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 654, Position(1073.f, -118.f, 55.5f)), + DreadflamePositionInfo(true, 655, Position(1073.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 656, Position(1073.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 657, Position(1073.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 658, Position(1073.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 659, Position(1073.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 660, Position(1073.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 661, Position(1073.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 662, Position(1073.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 663, Position(1073.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 664, Position(1073.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 665, Position(1073.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 666, Position(1073.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 667, Position(1073.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 668, Position(1073.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 669, Position(1073.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 670, Position(1073.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 671, Position(1073.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 672, Position(1073.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 673, Position(1073.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 674, Position(1073.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 675, Position(1073.f, -13.f, 55.5f)), + DreadflamePositionInfo(false, 676, Position(1073.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 677, Position(1073.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 678, Position(1073.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 679, Position(1073.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 680, Position(1073.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 681, Position(1073.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 682, Position(1078.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 683, Position(1078.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 684, Position(1078.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 685, Position(1078.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 686, Position(1078.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 687, Position(1078.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 688, Position(1078.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 689, Position(1078.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 690, Position(1078.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 691, Position(1078.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 692, Position(1078.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 693, Position(1078.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 694, Position(1078.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 695, Position(1078.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 696, Position(1078.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 697, Position(1078.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 698, Position(1078.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 699, Position(1078.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 700, Position(1078.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 701, Position(1078.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 702, Position(1078.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 703, Position(1078.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 704, Position(1078.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 705, Position(1078.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 706, Position(1078.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 707, Position(1078.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 708, Position(1078.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 709, Position(1078.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 710, Position(1078.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 711, Position(1078.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 712, Position(1078.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 713, Position(1083.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 714, Position(1083.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 715, Position(1083.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 716, Position(1083.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 717, Position(1083.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 718, Position(1083.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 719, Position(1083.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 720, Position(1083.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 721, Position(1083.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 722, Position(1083.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 723, Position(1083.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 724, Position(1083.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 725, Position(1083.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 726, Position(1083.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 727, Position(1083.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 728, Position(1083.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 729, Position(1083.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 730, Position(1083.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 731, Position(1083.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 732, Position(1083.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 733, Position(1083.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 734, Position(1083.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 735, Position(1083.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 736, Position(1083.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 737, Position(1083.f, -13.f, 55.5f)), + DreadflamePositionInfo(true, 738, Position(1083.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 739, Position(1083.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 740, Position(1083.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 741, Position(1083.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 742, Position(1083.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 743, Position(1083.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 744, Position(1088.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 745, Position(1088.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 746, Position(1088.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 747, Position(1088.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 748, Position(1088.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 749, Position(1088.f, -108.f, 55.5f)), + DreadflamePositionInfo(true, 750, Position(1088.f, -103.f, 55.5f)), + DreadflamePositionInfo(true, 751, Position(1088.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 752, Position(1088.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 753, Position(1088.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 754, Position(1088.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 755, Position(1088.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 756, Position(1088.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 757, Position(1088.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 758, Position(1088.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 759, Position(1088.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 760, Position(1088.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 761, Position(1088.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 762, Position(1088.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 763, Position(1088.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 764, Position(1088.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 765, Position(1088.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 766, Position(1088.f, -23.f, 55.5f)), + DreadflamePositionInfo(true, 767, Position(1088.f, -18.f, 55.5f)), + DreadflamePositionInfo(true, 768, Position(1088.f, -13.f, 55.5f)), + DreadflamePositionInfo(false, 769, Position(1088.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 770, Position(1088.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 771, Position(1088.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 772, Position(1088.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 773, Position(1088.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 774, Position(1088.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 775, Position(1093.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 776, Position(1093.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 777, Position(1093.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 778, Position(1093.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 779, Position(1093.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 780, Position(1093.f, -108.f, 55.5f)), + DreadflamePositionInfo(false, 781, Position(1093.f, -103.f, 55.5f)), + DreadflamePositionInfo(false, 782, Position(1093.f, -98.f, 55.5f)), + DreadflamePositionInfo(true, 783, Position(1093.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 784, Position(1093.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 785, Position(1093.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 786, Position(1093.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 787, Position(1093.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 788, Position(1093.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 789, Position(1093.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 790, Position(1093.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 791, Position(1093.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 792, Position(1093.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 793, Position(1093.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 794, Position(1093.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 795, Position(1093.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 796, Position(1093.f, -28.f, 55.5f)), + DreadflamePositionInfo(true, 797, Position(1093.f, -23.f, 55.5f)), + DreadflamePositionInfo(false, 798, Position(1093.f, -18.f, 55.5f)), + DreadflamePositionInfo(false, 799, Position(1093.f, -13.f, 55.5f)), + DreadflamePositionInfo(false, 800, Position(1093.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 801, Position(1093.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 802, Position(1093.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 803, Position(1093.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 804, Position(1093.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 805, Position(1093.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 806, Position(1098.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 807, Position(1098.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 808, Position(1098.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 809, Position(1098.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 810, Position(1098.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 811, Position(1098.f, -108.f, 55.5f)), + DreadflamePositionInfo(false, 812, Position(1098.f, -103.f, 55.5f)), + DreadflamePositionInfo(false, 813, Position(1098.f, -98.f, 55.5f)), + DreadflamePositionInfo(false, 814, Position(1098.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 815, Position(1098.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 816, Position(1098.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 817, Position(1098.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 818, Position(1098.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 819, Position(1098.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 820, Position(1098.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 821, Position(1098.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 822, Position(1098.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 823, Position(1098.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 824, Position(1098.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 825, Position(1098.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 826, Position(1098.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 827, Position(1098.f, -28.f, 55.5f)), + DreadflamePositionInfo(false, 828, Position(1098.f, -23.f, 55.5f)), + DreadflamePositionInfo(false, 829, Position(1098.f, -18.f, 55.5f)), + DreadflamePositionInfo(false, 830, Position(1098.f, -13.f, 55.5f)), + DreadflamePositionInfo(false, 831, Position(1098.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 832, Position(1098.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 833, Position(1098.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 834, Position(1098.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 835, Position(1098.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 836, Position(1098.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 837, Position(1103.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 838, Position(1103.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 839, Position(1103.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 840, Position(1103.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 841, Position(1103.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 842, Position(1103.f, -108.f, 55.5f)), + DreadflamePositionInfo(false, 843, Position(1103.f, -103.f, 55.5f)), + DreadflamePositionInfo(false, 844, Position(1103.f, -98.f, 55.5f)), + DreadflamePositionInfo(false, 845, Position(1103.f, -93.f, 55.5f)), + DreadflamePositionInfo(true, 846, Position(1103.f, -88.f, 55.5f)), + DreadflamePositionInfo(true, 847, Position(1103.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 848, Position(1103.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 849, Position(1103.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 850, Position(1103.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 851, Position(1103.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 852, Position(1103.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 853, Position(1103.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 854, Position(1103.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 855, Position(1103.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 856, Position(1103.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 857, Position(1103.f, -33.f, 55.5f)), + DreadflamePositionInfo(true, 858, Position(1103.f, -28.f, 55.5f)), + DreadflamePositionInfo(false, 859, Position(1103.f, -23.f, 55.5f)), + DreadflamePositionInfo(false, 860, Position(1103.f, -18.f, 55.5f)), + DreadflamePositionInfo(false, 861, Position(1103.f, -13.f, 55.5f)), + DreadflamePositionInfo(false, 862, Position(1103.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 863, Position(1103.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 864, Position(1103.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 865, Position(1103.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 866, Position(1103.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 867, Position(1103.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 868, Position(1108.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 869, Position(1108.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 870, Position(1108.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 871, Position(1108.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 872, Position(1108.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 873, Position(1108.f, -108.f, 55.5f)), + DreadflamePositionInfo(false, 874, Position(1108.f, -103.f, 55.5f)), + DreadflamePositionInfo(false, 875, Position(1108.f, -98.f, 55.5f)), + DreadflamePositionInfo(false, 876, Position(1108.f, -93.f, 55.5f)), + DreadflamePositionInfo(false, 877, Position(1108.f, -88.f, 55.5f)), + DreadflamePositionInfo(false, 878, Position(1108.f, -83.f, 55.5f)), + DreadflamePositionInfo(true, 879, Position(1108.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 880, Position(1108.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 881, Position(1108.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 882, Position(1108.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 883, Position(1108.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 884, Position(1108.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 885, Position(1108.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 886, Position(1108.f, -43.f, 55.5f)), + DreadflamePositionInfo(true, 887, Position(1108.f, -38.f, 55.5f)), + DreadflamePositionInfo(true, 888, Position(1108.f, -33.f, 55.5f)), + DreadflamePositionInfo(false, 889, Position(1108.f, -28.f, 55.5f)), + DreadflamePositionInfo(false, 890, Position(1108.f, -23.f, 55.5f)), + DreadflamePositionInfo(false, 891, Position(1108.f, -18.f, 55.5f)), + DreadflamePositionInfo(false, 892, Position(1108.f, -13.f, 55.5f)), + DreadflamePositionInfo(false, 893, Position(1108.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 894, Position(1108.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 895, Position(1108.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 896, Position(1108.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 897, Position(1108.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 898, Position(1108.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 899, Position(1113.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 900, Position(1113.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 901, Position(1113.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 902, Position(1113.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 903, Position(1113.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 904, Position(1113.f, -108.f, 55.5f)), + DreadflamePositionInfo(false, 905, Position(1113.f, -103.f, 55.5f)), + DreadflamePositionInfo(false, 906, Position(1113.f, -98.f, 55.5f)), + DreadflamePositionInfo(false, 907, Position(1113.f, -93.f, 55.5f)), + DreadflamePositionInfo(false, 908, Position(1113.f, -88.f, 55.5f)), + DreadflamePositionInfo(false, 909, Position(1113.f, -83.f, 55.5f)), + DreadflamePositionInfo(false, 910, Position(1113.f, -78.f, 55.5f)), + DreadflamePositionInfo(true, 911, Position(1113.f, -73.f, 55.5f)), + DreadflamePositionInfo(true, 912, Position(1113.f, -68.f, 55.5f)), + DreadflamePositionInfo(true, 913, Position(1113.f, -63.f, 55.5f)), + DreadflamePositionInfo(true, 914, Position(1113.f, -58.f, 55.5f)), + DreadflamePositionInfo(true, 915, Position(1113.f, -53.f, 55.5f)), + DreadflamePositionInfo(true, 916, Position(1113.f, -48.f, 55.5f)), + DreadflamePositionInfo(true, 917, Position(1113.f, -43.f, 55.5f)), + DreadflamePositionInfo(false, 918, Position(1113.f, -38.f, 55.5f)), + DreadflamePositionInfo(false, 919, Position(1113.f, -33.f, 55.5f)), + DreadflamePositionInfo(false, 920, Position(1113.f, -28.f, 55.5f)), + DreadflamePositionInfo(false, 921, Position(1113.f, -23.f, 55.5f)), + DreadflamePositionInfo(false, 922, Position(1113.f, -18.f, 55.5f)), + DreadflamePositionInfo(false, 923, Position(1113.f, -13.f, 55.5f)), + DreadflamePositionInfo(false, 924, Position(1113.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 925, Position(1113.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 926, Position(1113.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 927, Position(1113.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 928, Position(1113.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 929, Position(1113.f, 17.f, 55.5f)), + DreadflamePositionInfo(false, 930, Position(1118.f, -133.f, 55.5f)), + DreadflamePositionInfo(false, 931, Position(1118.f, -128.f, 55.5f)), + DreadflamePositionInfo(false, 932, Position(1118.f, -123.f, 55.5f)), + DreadflamePositionInfo(false, 933, Position(1118.f, -118.f, 55.5f)), + DreadflamePositionInfo(false, 934, Position(1118.f, -113.f, 55.5f)), + DreadflamePositionInfo(false, 935, Position(1118.f, -108.f, 55.5f)), + DreadflamePositionInfo(false, 936, Position(1118.f, -103.f, 55.5f)), + DreadflamePositionInfo(false, 937, Position(1118.f, -98.f, 55.5f)), + DreadflamePositionInfo(false, 938, Position(1118.f, -93.f, 55.5f)), + DreadflamePositionInfo(false, 939, Position(1118.f, -88.f, 55.5f)), + DreadflamePositionInfo(false, 940, Position(1118.f, -83.f, 55.5f)), + DreadflamePositionInfo(false, 941, Position(1118.f, -78.f, 55.5f)), + DreadflamePositionInfo(false, 942, Position(1118.f, -73.f, 55.5f)), + DreadflamePositionInfo(false, 943, Position(1118.f, -68.f, 55.5f)), + DreadflamePositionInfo(false, 944, Position(1118.f, -63.f, 55.5f)), + DreadflamePositionInfo(false, 945, Position(1118.f, -58.f, 55.5f)), + DreadflamePositionInfo(false, 946, Position(1118.f, -53.f, 55.5f)), + DreadflamePositionInfo(false, 947, Position(1118.f, -48.f, 55.5f)), + DreadflamePositionInfo(false, 948, Position(1118.f, -43.f, 55.5f)), + DreadflamePositionInfo(false, 949, Position(1118.f, -38.f, 55.5f)), + DreadflamePositionInfo(false, 950, Position(1118.f, -33.f, 55.5f)), + DreadflamePositionInfo(false, 951, Position(1118.f, -28.f, 55.5f)), + DreadflamePositionInfo(false, 952, Position(1118.f, -23.f, 55.5f)), + DreadflamePositionInfo(false, 953, Position(1118.f, -18.f, 55.5f)), + DreadflamePositionInfo(false, 954, Position(1118.f, -13.f, 55.5f)), + DreadflamePositionInfo(false, 955, Position(1118.f, -8.f, 55.5f)), + DreadflamePositionInfo(false, 956, Position(1118.f, -3.f, 55.5f)), + DreadflamePositionInfo(false, 957, Position(1118.f, 2.f, 55.5f)), + DreadflamePositionInfo(false, 958, Position(1118.f, 7.f, 55.5f)), + DreadflamePositionInfo(false, 959, Position(1118.f, 12.f, 55.5f)), + DreadflamePositionInfo(false, 960, Position(1118.f, 17.f, 55.5f)) }; template diff --git a/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp b/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp index 52fb88cc5af..16d664587b8 100644 --- a/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp +++ b/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp @@ -36,18 +36,34 @@ ObjectData const creatureData[] = { NPC_MOVEMENT_CONTROLLER_LORD_RHYOLITH, DATA_LORD_RHYOLITH_MOVEMENT_CONTROLLER }, { NPC_LEFT_FOOT, DATA_LEFT_FOOT }, { NPC_RIGHT_FOOT, DATA_RIGHT_FOOT }, + { NPC_SULFURAS_SMASH_2, DATA_SULFURAS_SMASH }, + { NPC_SULFURAS_HAND_OF_RAGNAROS, DATA_SULFURAS_HAND_OF_RAGNAROS }, + { NPC_ARCHDRUID_HAMUUL_RUNETOTEM, DATA_ARCHDRUID_HAMUUL_RUNETOTEM }, + { NPC_DREADFLAME, DATA_DREADFLAME_CONTROLLER }, + { NPC_CENARIUS, DATA_CENARIUS }, { 0, 0, } // END }; +ObjectData const gameObjectData[] = +{ + { GO_RAGNAROS_PLATFORM, DATA_RAGNAROS_PLATFORM }, + { 0, 0 } // END +}; + DoorData const doorData[] = { - {GO_LORD_RHYOLITH_BRIDGE, DATA_LORD_RHYOLITH, DOOR_TYPE_ROOM }, - {GO_BETH_TILAC_DOOR, DATA_BETHTILAC, DOOR_TYPE_ROOM }, - //{GO_BALEROC_FIREWALL, DATA_BALEROC, DOOR_TYPE_ROOM }, - {GO_MAJORDOMO_FIREWALL, DATA_MAJORDOMO_STAGHELM, DOOR_TYPE_PASSAGE }, - {GO_RAGNAROS_DOOR, DATA_RAGNAROS, DOOR_TYPE_ROOM }, - {0, 0, DOOR_TYPE_ROOM }, //END -}; //Baleroc door is special, it depends on the health status of the other bosses in the instance + { GO_LORD_RHYOLITH_BRIDGE, DATA_LORD_RHYOLITH, DOOR_TYPE_ROOM }, + { GO_BETH_TILAC_DOOR, DATA_BETHTILAC, DOOR_TYPE_ROOM }, + //{GO_BALEROC_FIREWALL, DATA_BALEROC, DOOR_TYPE_ROOM }, + { GO_MAJORDOMO_FIREWALL, DATA_MAJORDOMO_STAGHELM, DOOR_TYPE_PASSAGE }, + { GO_RAGNAROS_DOOR, DATA_RAGNAROS, DOOR_TYPE_ROOM }, + { 0, 0, DOOR_TYPE_ROOM }, //END +}; + +enum Spells +{ + SPELL_MAGMA = 108773 +}; BossBoundaryData const boundaries = { @@ -90,11 +106,11 @@ class instance_firelands : public InstanceMapScript struct instance_firelands_InstanceScript : public InstanceScript { - instance_firelands_InstanceScript(InstanceMap* map) : InstanceScript(map) + instance_firelands_InstanceScript(InstanceMap* map) : InstanceScript(map), _firstRagnarosSpawn(true) { SetHeaders(DataHeader); SetBossNumber(EncounterCount); - LoadObjectData(creatureData, nullptr); + LoadObjectData(creatureData, gameObjectData); LoadDoorData(doorData); LoadBossBoundaries(boundaries); } @@ -122,6 +138,24 @@ class instance_firelands : public InstanceMapScript // Cannot directly start attacking here as the creature is not yet on map creature->m_Events.AddEvent(new DelayedAttackStartEvent(creature), creature->m_Events.CalculateTime(500)); break; + case NPC_SULFURAS_SMASH_1: + case NPC_LAVA_WAVE: + case NPC_SULFURAS_HAND_OF_RAGNAROS: + case NPC_MOLTEN_ELEMENTAL: + case NPC_BLAZING_HEAT: + case NPC_ENTRAPPING_ROOTS: + case NPC_CLOUDBURST: + case NPC_BREADTH_OF_FROST: + if (Creature* ragnaros = GetCreature(DATA_RAGNAROS)) + if (CreatureAI* ai = ragnaros->AI()) + ai->JustSummoned(creature); + break; + case NPC_SPLITTING_BLOW: + _splittingBlowGUIDs.push_back(creature->GetGUID()); + break; + case NPC_MAGMA: + _magmaGUIDs.push_back(creature->GetGUID()); + break; default: break; } @@ -161,6 +195,13 @@ class instance_firelands : public InstanceMapScript if (state == FAIL) _events.ScheduleEvent(EVENT_RESPAWN_MAJORDOMO_STAGHELM, 30s); break; + case DATA_RAGNAROS: + if (state == FAIL) + { + _splittingBlowGUIDs.clear(); + _magmaGUIDs.clear(); + } + break; default: break; } @@ -185,8 +226,56 @@ class instance_firelands : public InstanceMapScript } } + uint32 GetData(uint32 type) const override + { + switch (type) + { + case DATA_FIRST_RAGNAROS_SPAWN: + return uint8(_firstRagnarosSpawn); + } + + return 0; + } + + void SetData(uint32 type, uint32 value) override + { + switch (type) + { + case DATA_FIRST_RAGNAROS_SPAWN: + _firstRagnarosSpawn = value != 0; + break; + case DATA_MAGMA_KNOCKBACK: + for (ObjectGuid const& guid : _magmaGUIDs) + { + if (Creature* magma = instance->GetCreature(guid)) + { + magma->CastSpell(magma, SPELL_MAGMA); + magma->DespawnOrUnsummon(100ms); + } + } + break; + default: + break; + } + } + + + ObjectGuid GetGuidData(uint32 type) const override + { + switch (type) + { + case DATA_RANDOM_SPLITTING_BLOW_GUID: + return Trinity::Containers::SelectRandomContainerElement(_splittingBlowGUIDs); + default: + return InstanceScript::GetGuidData(type); + } + } + private: + bool _firstRagnarosSpawn; EventMap _events; + GuidVector _splittingBlowGUIDs; + GuidVector _magmaGUIDs; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp b/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp index 17953ef96e9..46b1560b6f5 100644 --- a/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp +++ b/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp @@ -126,10 +126,12 @@ void AddSC_throne_of_the_four_winds(); void AddSC_boss_conclave_of_wind(); void AddSC_boss_alakir(); void AddSC_instance_firelands(); //Firelands +void AddSC_firelands(); void AddSC_boss_alysrazor(); void AddSC_boss_baleroc(); void AddSC_boss_lord_rhyolith(); void AddSC_boss_majordomo_staghelm(); +void AddSC_boss_ragnaros_firelands(); void AddSC_ashenvale(); void AddSC_azuremyst_isle(); @@ -262,10 +264,12 @@ void AddKalimdorScripts() AddSC_boss_conclave_of_wind(); AddSC_boss_alakir(); AddSC_instance_firelands(); //Firelands + AddSC_firelands(); AddSC_boss_alysrazor(); AddSC_boss_baleroc(); AddSC_boss_lord_rhyolith(); AddSC_boss_majordomo_staghelm(); + AddSC_boss_ragnaros_firelands(); AddSC_ashenvale(); AddSC_azuremyst_isle();