diff --git a/sql/updates/world/4.3.4/WIP/vanessa.sql b/sql/updates/world/4.3.4/WIP/vanessa.sql index 5bd510701b3..bed942a0305 100644 --- a/sql/updates/world/4.3.4/WIP/vanessa.sql +++ b/sql/updates/world/4.3.4/WIP/vanessa.sql @@ -1,47 +1,59 @@ /* -21:29:47.825 -- cookie dead -21:29:47.420 -- a note from vanessa spawns -21:29:52.459 -- a note falls to the ground emote - - -21:29:53.722 -- gossip hello -21:29:55.891 -- select menu -21:30:02.677 -- despawn note - -21:29:56.655 -- vanessa spawns 0xF130C11500004444 -21:29:56.655 -- sittin aura -21:29:59.276 -- ihr hört ein geräusch von oberhalb announcement -21:30:02.895 -- hierauf habe ich lange gewartet -21:30:05.095 -- remove sitting / jump to -64.5677 Y: -820.161 Z: 41.123 // speed z = 16.31084 -21:30:13.519 -- move to intro pos -21:30:13.768 -- ich habe mir zeit gelassen -21:30:23.394 -- ich war nie sehr gut, im gesegensatz... -21:30:29.212 -- facing to 1.53589 -21:30:29.431 -- aber mit giften war ich immer -21:30:31.630 -- 92100 (Noxious Concoction) -21:30:34.220 -- vor allem mit giften, die den geist beeinflussen -21:30:38.853 -- 92113 (Nightmare Elixir) -21:30:38.853 -- 92120 (Vanessa's Blackout Aura) -21:30:39.087 -- announce nightmare -21:30:41.256 -- emote 392 -21:30:46.092 -- despawn 0x280000003457D30 --ascee guid - 21:30:42.067 -- setting up trap 21:30:42.878 -- magma trap vehicle - -- Trap Bunny 21:30:46.092 -- spawn vents - - 21:30:48.900 -- move down to -205.7569 Y: -579.0972 Z: 35.98623 21:30:48.900 -- click me 21:30:49.103 -- "aktiviert die ventile um euch zu befreien" 21:30:49.695 -- spellclick steam vent 92399 (Steam Vent) - 21:30:50.897 -- fall down 21:30:50.897 -- magma trap throw +21:31:00.990 -- vents despawn +21:30:54.937 -- nightmare slow +21:30:55.140 -- announce the nightmare elixir +21:30:55.779 -- spawn vanessa and glubtok fire bunnies 0xF130C207000044F2 48143 (Forgotten Aura) +21:30:55.779 -- glubtok spawn (with Forgotten Aura 48143) and 69676 (Cosmetic - Alpha State 50%) +21:30:55.779 -- fire bunnies activate +21:30:56.747 -- poor glubtok- when his power manifested +21:31:05.171 -- fear himself +21:31:09.788 -- nightmare auras +21:31:09.991 -- you have entered glubtoks nighmare! +21:31:10.194 -- summon real glubtok to battle +21:31:14.811 -- get back tot he ship +21:31:17.323 -- despawn vanessa +21:31:17.323 -- glubtok despawn???? +21:31:41.066 -- glubtok death +21:31:43.952 -- nightmare aura 92563 +21:31:44.155 -- the nightmare shifts +21:31:44.342 -- despawn fires +21:31:47.166 -- helix summoned +21:31:48.211 -- die meisten schurken - +21:31:54.217 -- but you never know +21:31:58.819 -- cancel nightmare aura +21:31:58.819 -- nightmare aura helix +21:32:02.548 -- despawn vanessa +21:32:05.044 -- helix says: ihr habt helix' apltraum betreten +21:32:05.652 -- nightmare skitterling spawns +21:32:07.462 -- nightmare spiders spawn announcement +21:32:36.634 -- helix death +21:32:38.646 -- spiders despawn +21:32:38.740 -- announce nightmare changes +21:32:38.990 -- nightmare aura + nightmare slow +21:32:42.188 -- helix despawn + +21:32:41.376 -- open foundry door + vanessa spawns +21:32:42.406 -- könnt ihr euch? +21:32:46.010 -- ein einzelner funke +21:32:49.410 -- cancel nightmare aura +21:32:49.426 -- nightmare aura foe reaper +21:32:49.816 -- real foe reaper + +21:32:49.629 -- ihr habt den mechanischen +21:32:51.891 -- vanessa despawn +21:32:51.891 */ @@ -58,12 +70,26 @@ UPDATE `creature_template` SET `InhabitType`= 4 WHERE `entry` IN (49454, 51624); UPDATE `creature_template` SET `ScriptName`= 'npc_deadmines_vanessas_trap_bunny' WHERE `entry`= 49454; -- Steam Valve UPDATE `creature_template` SET `npcflag`= 16777216, `ScriptName`= 'npc_deadmines_steam_valve' WHERE `entry`= 49457; - +-- Vanessa VanCleef Nightmare +UPDATE `creature_template` SET `ScriptName`= 'npc_deadmines_vanessa_van_cleef_nightmare' WHERE `entry`= 49671; +-- Glubtok Nightmare Fire Bunny +UPDATE `creature_template` SET `flags_extra`= 131 WHERE `entry`= 51594; +-- Collapsing Icicle +UPDATE `creature_template` SET `unit_flags`= 33587200, `flags_extra`= 131 WHERE `entry` IN (49481, 57866); +-- Glubtok Nightmare Illusion +UPDATE `creature_template` SET `ScriptName`= 'npc_deadmines_glubtok_nightmare' WHERE `entry`= 49670; +-- Helix Gearbreaker Illusion +UPDATE `creature_template` SET `unit_flags`= 33600, `ScriptName`= 'npc_deadmines_helix_nightmare' WHERE `entry`= 49674; +-- Lightning Platters +UPDATE `creature_template` SET `InhabitType`= 4, `flags_extra`= 128 WHERE `entry` IN (49520, 49521); -- Template Addons -DELETE FROM `creature_template_addon` WHERE `entry` IN (49564); +DELETE FROM `creature_template_addon` WHERE `entry` IN (49564, 51594, 49671, 49670, 92201); INSERT INTO `creature_template_addon` (`entry`, `bytes1`, `auras`) VALUES -(49564, 0, 92376); +(49564, 0, '92376'), +(51594, 0, '92169'), +(49671, 0, '48143'), +(49670, 0, '48143 69676'); UPDATE `creature_template_addon` SET `auras`= '94557' WHERE `entry`= 49457; @@ -76,7 +102,8 @@ INSERT INTO `gossip_menu_option` (`MenuId`, `OptionID`, `OptionIcon`, `OptionTex (12504, 0, 0, 'Continue reading... ', 49641, 1, 1, 12505); -- Texts -DELETE FROM `creature_text` WHERE `CreatureID` IN (49429, 49564, 49454); +DELETE FROM `creature_text` WHERE `CreatureID` IN (49429, 49564, 49454, 49671, 49674); +DELETE FROM `creature_text` WHERE `CreatureID`= 45979 AND `GroupID` NOT IN (0, 1, 2, 3); INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `Comment`) VALUES -- Vanessa VanCleef Intro (49429, 0, 0, 'You hear a noise from above the cabin door!', 41, 0, 100, 0, 0, 0, 49476, 'Vanessa van Cleef to Player'), @@ -89,14 +116,46 @@ INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Lan -- A Note from Vanessa VanCleef (49564, 0, 0, 'A note falls to the floor!', 41, 0, 100, 0, 0, 0, 49658, 'A Note from Vanessa to Player'), -- Vanessa's Trap Bunny -(49454, 0, 0, 'Activate the steam valves to free yourself!', 41, 0, 100, 0, 0, 0, 49680, 'Vanessa''s Trap Bunny to Player'); +(49454, 0, 0, 'Activate the steam valves to free yourself!', 41, 0, 100, 0, 0, 0, 49680, 'Vanessa''s Trap Bunny to Player'), +-- General Purpose Bunny JMF +(45979, 4, 0, 'The Nightmare Elixir takes hold!', 41, 0, 100, 0, 0, 0, 49705, 'General Purpose Bunny JMF to Steam Valve'), +(45979, 5, 0, 'The nightmare shifts!', 41, 0, 100, 0, 0, 0, 49707, 'General Purpose Bunny JMF to Player'), +-- Helix Gearbreaker +(49674, 0, 0, 'You have entered Helix''s nightmare!', 41, 0, 100, 0, 0, 0, 49708, 'Helix Gearbreaker to Player'), +(49674, 1, 0, 'Nightmare spiders appear in the darkness! Kill Helix before his nightmare overwhelms you!', 41, 0, 100, 0, 0, 0, 50871, 'Helix Geabreaker to Player'), +-- Vanessa VanCleef Nightmare +(49671, 0, 0, 'Poor Glubtok. When his powers manifested, his own ogre mound was the first to burn.', 12, 0, 100, 1, 0, 24602, 49715, 'Vanessa van Cleef to Steam Valve'), +(49671, 1, 0, 'Deep within his soul, the one thing he feared most of all was...himself.', 12, 0, 100, 1, 0, 24603, 49716, 'Vanessa van Cleef to Steam Valve'), +(49671, 2, 0, 'You have entered Glubtok''s Nightmare!', 41, 0, 100, 0, 0, 0, 49706, 'Vanessa van Cleef to Steam Valve'), +(49671, 3, 0, 'Get back to the ship!', 41, 0, 100, 0, 0, 0, 50703, 'Vanessa van Cleef to Steam Valve'), +(49671, 4, 0, 'Most rogues prefer to cloak themselves in the shadows, but not Helix.', 12, 0, 100, 1, 0, 24604, 49723, 'Vanessa van Cleef to Player'), +(49671, 5, 0, 'You never know what skitters in the darkness.', 12, 0, 100, 1, 0, 24605, 49724, 'Vanessa van Cleef to Player'), +(49671, 6, 0, 'Can you imagine the life of a machine?', 12, 0, 100, 1, 0, 24606, 49725, 'Vanessa van Cleef to Player'), +(49671, 7, 0, 'A simple spark can mean the difference between life...and death.', 12, 0, 100, 1, 0, 24607, 49726, 'Vanessa van Cleef to Player'), +(49671, 8, 0, 'You have entered the mechanical nightmare!', 41, 0, 100, 0, 0, 0, 49709, 'Vanessa van Cleef to Player'); + +UPDATE `creature_template` SET `npcflag`= 16777216 WHERE `entry`= 49520; + +-- Vehicle Acessory +DELETE FROM `vehicle_template_accessory` WHERE `entry`= 49520; +INSERT INTO `vehicle_template_accessory` (`entry`, `accessory_entry`, `seat_id`, `minion`, `description`, `summontype`, `summontimer`) VALUES +(49520, 49521, 7, 1, 'Vanessa Lightning Platter - Vanessa Lightning Stalker', 5, 0), -- Vanessa Lightning Platter - Vanessa Lightning Stalker +(49520, 49521, 6, 1, 'Vanessa Lightning Platter - Vanessa Lightning Stalker', 5, 0), -- Vanessa Lightning Platter - Vanessa Lightning Stalker +(49520, 49521, 5, 1, 'Vanessa Lightning Platter - Vanessa Lightning Stalker', 5, 0), -- Vanessa Lightning Platter - Vanessa Lightning Stalker +(49520, 49521, 4, 1, 'Vanessa Lightning Platter - Vanessa Lightning Stalker', 5, 0), -- Vanessa Lightning Platter - Vanessa Lightning Stalker +(49520, 49521, 3, 1, 'Vanessa Lightning Platter - Vanessa Lightning Stalker', 5, 0), -- Vanessa Lightning Platter - Vanessa Lightning Stalker +(49520, 49521, 2, 1, 'Vanessa Lightning Platter - Vanessa Lightning Stalker', 5, 0), -- Vanessa Lightning Platter - Vanessa Lightning Stalker +(49520, 49521, 1, 1, 'Vanessa Lightning Platter - Vanessa Lightning Stalker', 5, 0), -- Vanessa Lightning Platter - Vanessa Lightning Stalker +(49520, 49521, 0, 1, 'Vanessa Lightning Platter - Vanessa Lightning Stalker', 5, 0); -- Vanessa Lightning Platter - Vanessa Lightning Stalker -- Spells DELETE FROM `spell_script_names` WHERE `ScriptName` IN -('spell_deadmines_ride_magma_vehicle'); +('spell_deadmines_ride_magma_vehicle', +'spell_deadmines_magma_trap_throw_to_location'); INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES -(92378, 'spell_deadmines_ride_magma_vehicle'); +(92378, 'spell_deadmines_ride_magma_vehicle'), +(92438, 'spell_deadmines_magma_trap_throw_to_location'); -- Spellclick spells DELETE FROM `npc_spellclick_spells` WHERE `npc_entry` IN (49457); @@ -109,6 +168,17 @@ DELETE FROM `conditions` WHERE `SourceEntry` IN (92379) AND `SourceTypeOrReferen INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ScriptName`, `Comment`) VALUES (13, 1, 92379, 0, 0, 31, 0, 3, 49454, 0, 0, 0, '', 'Ride Magma Vehicle - Vanessa''s Trap Bunny'); +-- Creature Collapsing Icicle 49481 SAI +SET @ENTRY := 49481; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`= @ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY, 0, 0, 0, 63, 0, 100, 0, 0, 0, 0, 0, 3, 0, 28470, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "When just created - Self: Morph to model 28470 // "), +(@ENTRY, 0, 1, 2, 60, 0, 100, 1, 3200, 3200, 0, 0, 11, 92201, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Every 0 and 0 ms (for the first time, timer between 3200 and 3200 ms) - Self: Cast spell Icicle (92201) on Self // "), +(@ENTRY, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 92202, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, " Linked - Self: Cast spell Icicle (92202) on Self // "); + + + /* (49454, @GROUP_ID+0, @ID+, 'Aktiviert die Dampfventile, um Euch zu befreien!', 41, 0, 100, 0, 0, 0, UNKNOWN, 'Vanessa''s Trap Bunny to Player'), (49536, @GROUP_ID+0, @ID+, 'James... bitte... Ich liebe dich...', 12, 0, 100, 0, 0, 0, UNKNOWN, 'Calissa Harrington'), diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index e3b2c51b248..c7f1a98a865 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -4126,6 +4126,15 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(84); // To-do: Enum this radius entry - EFFECT_RADIUS_17_YARDS. }); + // Cyclone Shield + ApplySpellFix({ + 86292, + 93991, + }, [](SpellInfo* spellInfo) + { + spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(2); // Combat Range + }); + // Upwind of Altairus ApplySpellFix({ 88282 }, [](SpellInfo* spellInfo) { diff --git a/src/server/scripts/EasternKingdoms/Deadmines/boss_helix_gearbreaker.cpp b/src/server/scripts/EasternKingdoms/Deadmines/boss_helix_gearbreaker.cpp index 7dbb4eda8fd..05251875cf0 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/boss_helix_gearbreaker.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/boss_helix_gearbreaker.cpp @@ -901,7 +901,7 @@ class spell_helix_ride_face_timer_aura: public SpellScriptLoader if (Unit* vehicle = owner->GetVehicleBase()) { if (owner->GetMap() && owner->GetMap()->IsHeroic()) - if (vehicle->GetTypeId() == TYPEID_PLAYER) + if (vehicle->GetTypeId() == TYPEID_PLAYER && owner->GetEntry() == BOSS_HELIX_GEARBREAKER) { owner->CastSpell(vehicle, SPELL_CHEST_BOMB, true); owner->CastSpell(vehicle, SPELL_HELIX_CHEST_BOMB_EMOTE, true); @@ -909,7 +909,7 @@ class spell_helix_ride_face_timer_aura: public SpellScriptLoader if (Creature* oaf = instance->GetCreature(DATA_LUMBERING_OAF)) { - if (oaf->IsAlive()) + if (oaf->IsAlive() && owner->GetEntry() == BOSS_HELIX_GEARBREAKER) { owner->CastSpell(oaf, SPELL_RIDE_VEHICLE_OAF); if (Creature* creature = owner->ToCreature()) diff --git a/src/server/scripts/EasternKingdoms/Deadmines/boss_vanessa_van_cleef.cpp b/src/server/scripts/EasternKingdoms/Deadmines/boss_vanessa_van_cleef.cpp index 2218e82ef8c..965f2616e3a 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/boss_vanessa_van_cleef.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/boss_vanessa_van_cleef.cpp @@ -130,6 +130,8 @@ class boss_vanessa_van_cleef : public CreatureScript { switch (eventId) { + case 0: + break; default: break; } @@ -231,7 +233,7 @@ class npc_vanessa_vanessa_van_cleef : public CreatureScript _events.ScheduleEvent(EVENT_MAGMA_TRAP, Milliseconds(800)); break; case EVENT_MAGMA_TRAP: - _instance->SetData(DATA_VANESSA_VAN_CLEEF_ENCOUNTER, NIGHTMARE_STAGE_GLUBTOK); + _instance->SetData(DATA_VANESSA_VAN_CLEEF_ENCOUNTER, NIGHTMARE_STAGE_MAGMA_TRAP); break; default: break; diff --git a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp index 985dd3306c4..a0f082f5f66 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp @@ -272,6 +272,293 @@ class npc_deadmines_steam_valve : public CreatureScript } }; +enum VanessaVanCleef +{ + SAY_GLUBTOK_INTRO_1 = 0, + SAY_GLUBTOK_INTRO_2 = 1, + SAY_ANNOUNCE_GLUBTOKS_NIGHTMARE = 2, + SAY_ANNOUNCE_GET_BACK_TO_THE_SHIP = 3, + SAY_HELIX_INTRO_1 = 4, + SAY_HELIX_INTRO_2 = 5, + SAY_MECHANICAL_INTRO_1 = 6, + SAY_MECHANICAL_INTRO_2 = 7, + SAY_ANNOUNCE_MECHANICAL_NIGHTMARE = 8, + + EVENT_TALK_GLUBTOKS_NIGHTMARE_1 = 1, + EVENT_TALK_GLUBTOKS_NIGHTMARE_2, + EVENT_CANCEL_NIGHTMARE_AURA_TRAP, + EVENT_ANNOUNCE_ENTERED_GLUBTOKS_NIGHTMARE, + EVENT_ANNOUNCE_GET_BACK_TO_THE_SHIP, + EVENT_TALK_HELIX_NIGHTMARE_1, + EVENT_TALK_HELIX_NIGHTMARE_2, + EVENT_CANCEL_NIGHTMARE_AURA_GLUBTOK, + EVENT_TALK_MECHANICAL_NIGHTMARE_1, + EVENT_TALK_MECHANICAL_NIGHTMARE_2, + EVENT_CANCEL_NIGHTMARE_AURA_HELIX, + EVENT_ANNOUNCE_ENTERED_MECHANICAL_NIGHTMARE, + + SPELL_CANCEL_NIGHTMARE_AURA = 92583, + SPELL_NIGHTMARE_AURA_GLUBTOK = 92565, + SPELL_NIGHTMARE_AURA_HELIX = 92566, + SPELL_NIGHTMARE_AURA_MECHANICAL = 92567, +}; + +class npc_deadmines_vanessa_van_cleef_nightmare : public CreatureScript +{ + public: + npc_deadmines_vanessa_van_cleef_nightmare() : CreatureScript("npc_deadmines_vanessa_van_cleef_nightmare") { } + + struct npc_deadmines_vanessa_van_cleef_nightmareAI : public ScriptedAI + { + npc_deadmines_vanessa_van_cleef_nightmareAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + + void Reset() override + { + if (_instance->GetData(DATA_VANESSA_VAN_CLEEF_ENCOUNTER) == NIGHTMARE_STAGE_GLUBTOK) + _events.ScheduleEvent(EVENT_TALK_GLUBTOKS_NIGHTMARE_1, Seconds(1)); + else if (_instance->GetData(DATA_VANESSA_VAN_CLEEF_ENCOUNTER) == NIGHTMARE_STAGE_HELIX) + _events.ScheduleEvent(EVENT_TALK_HELIX_NIGHTMARE_1, Seconds(1)); + else if (_instance->GetData(DATA_VANESSA_VAN_CLEEF_ENCOUNTER) == NIGHTMARE_STAGE_FOE_REAPER) + _events.ScheduleEvent(EVENT_TALK_MECHANICAL_NIGHTMARE_1, Seconds(1)); + + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_TALK_GLUBTOKS_NIGHTMARE_1: + Talk(SAY_GLUBTOK_INTRO_1); + _events.ScheduleEvent(EVENT_TALK_GLUBTOKS_NIGHTMARE_2, Seconds(8) + Milliseconds(400)); + break; + case EVENT_TALK_GLUBTOKS_NIGHTMARE_2: + Talk(SAY_GLUBTOK_INTRO_2); + _events.ScheduleEvent(EVENT_CANCEL_NIGHTMARE_AURA_TRAP, Seconds(4) + Milliseconds(600)); + break; + case EVENT_CANCEL_NIGHTMARE_AURA_TRAP: + DoCastAOE(SPELL_CANCEL_NIGHTMARE_AURA, true); + DoCastAOE(SPELL_NIGHTMARE_AURA_GLUBTOK, true); + _events.ScheduleEvent(EVENT_ANNOUNCE_ENTERED_GLUBTOKS_NIGHTMARE, Milliseconds(110)); + break; + case EVENT_ANNOUNCE_ENTERED_GLUBTOKS_NIGHTMARE: + Talk(SAY_ANNOUNCE_GLUBTOKS_NIGHTMARE); + _events.ScheduleEvent(EVENT_ANNOUNCE_GET_BACK_TO_THE_SHIP, Seconds(4) + Milliseconds(800)); + break; + case EVENT_ANNOUNCE_GET_BACK_TO_THE_SHIP: + Talk(SAY_ANNOUNCE_GET_BACK_TO_THE_SHIP); + if (Creature* glubtok = me->FindNearestCreature(NPC_GLUBTOK_NIGHTMARE, 10.0f, true)) + glubtok->DespawnOrUnsummon(Seconds(2) + Milliseconds(500)); + me->DespawnOrUnsummon(Seconds(2) + Milliseconds(500)); + break; + case EVENT_TALK_HELIX_NIGHTMARE_1: + Talk(SAY_HELIX_INTRO_1); + _events.ScheduleEvent(EVENT_TALK_HELIX_NIGHTMARE_2, Seconds(6)); + break; + case EVENT_TALK_HELIX_NIGHTMARE_2: + Talk(SAY_HELIX_INTRO_2); + _events.ScheduleEvent(EVENT_CANCEL_NIGHTMARE_AURA_GLUBTOK, Seconds(4) + Milliseconds(600)); + break; + case EVENT_CANCEL_NIGHTMARE_AURA_GLUBTOK: + DoCastAOE(SPELL_CANCEL_NIGHTMARE_AURA, true); + DoCastAOE(SPELL_NIGHTMARE_AURA_HELIX, true); + me->DespawnOrUnsummon(Seconds(3) + Milliseconds(700)); + break; + case EVENT_TALK_MECHANICAL_NIGHTMARE_1: + Talk(SAY_MECHANICAL_INTRO_1); + _events.ScheduleEvent(EVENT_TALK_MECHANICAL_NIGHTMARE_2, Seconds(3) + Milliseconds(600)); + break; + case EVENT_TALK_MECHANICAL_NIGHTMARE_2: + Talk(SAY_MECHANICAL_INTRO_2); + _events.ScheduleEvent(EVENT_CANCEL_NIGHTMARE_AURA_HELIX, Seconds(3) + Milliseconds(400)); + break; + case EVENT_CANCEL_NIGHTMARE_AURA_HELIX: + DoCastAOE(SPELL_CANCEL_NIGHTMARE_AURA, true); + DoCastAOE(SPELL_NIGHTMARE_AURA_MECHANICAL, true); + _events.ScheduleEvent(EVENT_ANNOUNCE_ENTERED_MECHANICAL_NIGHTMARE, Milliseconds(200)); + break; + case EVENT_ANNOUNCE_ENTERED_MECHANICAL_NIGHTMARE: + Talk(SAY_ANNOUNCE_MECHANICAL_NIGHTMARE); + if (Creature* reaper = me->FindNearestCreature(NPC_FOE_REAPER_5000_NIGHTMARE, 20.0f, true)) + reaper->DespawnOrUnsummon(Seconds(2) + Milliseconds(200)); + me->DespawnOrUnsummon(Seconds(2) + Milliseconds(200)); + break; + default: + break; + } + } + } + private: + EventMap _events; + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetDeadminesAI(creature); + } +}; + +enum GlubtokNightmare +{ + EVENT_SPIRIT_STRIKE = 1, + SPELL_SPIRIT_STRIKE = 59304, +}; + +class npc_deadmines_glubtok_nightmare : public CreatureScript +{ + public: + npc_deadmines_glubtok_nightmare() : CreatureScript("npc_deadmines_glubtok_nightmare") { } + + struct npc_deadmines_glubtok_nightmareAI : public ScriptedAI + { + npc_deadmines_glubtok_nightmareAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + + void JustEngagedWith(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_SPIRIT_STRIKE, Seconds(4) + Milliseconds(500)); + } + + void JustDied(Unit* /*killer*/) override + { + me->DespawnOrUnsummon(Seconds(4)); + _instance->SetData(DATA_VANESSA_VAN_CLEEF_ENCOUNTER, NIGHTMARE_STAGE_HELIX); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SPIRIT_STRIKE: + DoCastVictim(SPELL_SPIRIT_STRIKE); + _events.Repeat(Seconds(3) + Milliseconds(600)); + break; + default: + break; + } + } + DoMeleeAttackIfReady(); + } + private: + EventMap _events; + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetDeadminesAI(creature); + } +}; + +enum HelixNightmare +{ + SAY_ANNOUNCE_HELIX_NIGHTMARE = 0, + SAY_ANNOUNCE_NIGHTMAR_SPIDERS = 1, + + SPELL_HELIX_RIDE = 88337, + SPELL_RIDE_FACE_TARGETING = 88349, + SPELL_PESTILENCE = 91939, + SPELL_SHADOW_FOG = 92792, + + EVENT_TALK_NIGHTMARE = 3, + EVENT_MAKE_ATTACKABLE, + EVENT_RIDE_PLAYER, + EVENT_PESTILENCE, + EVENT_SUMMON_NIGHTMARE_SKITTERLINGS, + EVENT_ANNOUNCE_SPIDERS, + +}; + +class npc_deadmines_helix_nightmare : public CreatureScript +{ + public: + npc_deadmines_helix_nightmare() : CreatureScript("npc_deadmines_helix_nightmare") { } + + struct npc_deadmines_helix_nightmareAI : public ScriptedAI + { + npc_deadmines_helix_nightmareAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + + void Reset() override + { + _events.ScheduleEvent(EVENT_MAKE_ATTACKABLE, Seconds(7) + Milliseconds(700)); + _events.ScheduleEvent(EVENT_TALK_NIGHTMARE, Seconds(17) + Milliseconds(800)); + } + + void JustEngagedWith(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_SPIRIT_STRIKE, Seconds(4) + Milliseconds(400)); + _events.ScheduleEvent(EVENT_RIDE_PLAYER, Seconds(2) + Milliseconds(500)); + } + + void JustDied(Unit* /*killer*/) override + { + me->DespawnOrUnsummon(Seconds(5) + Milliseconds(500)); + _instance->SetData(DATA_VANESSA_VAN_CLEEF_ENCOUNTER, NIGHTMARE_STAGE_FOE_REAPER); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_MAKE_ATTACKABLE: + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + break; + case EVENT_SPIRIT_STRIKE: + DoCastVictim(SPELL_SPIRIT_STRIKE); + _events.Repeat(Seconds(3) + Milliseconds(600)); + break; + case EVENT_TALK_NIGHTMARE: + Talk(SAY_ANNOUNCE_HELIX_NIGHTMARE); + _events.ScheduleEvent(EVENT_SUMMON_NIGHTMARE_SKITTERLINGS, Milliseconds(600)); + break; + case EVENT_RIDE_PLAYER: + DoCastAOE(SPELL_RIDE_FACE_TARGETING, true); + _events.Repeat(Seconds(11)); + break; + case EVENT_SUMMON_NIGHTMARE_SKITTERLINGS: + for (uint8 i = 0; i < 100; i++) + me->SummonCreature(NPC_NIGHTMARE_SKITTERLING, nightmareSkitterlingPos[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); + for (uint8 i = 0; i < 3; i++) + me->SummonCreature(NPC_DARKWEB_DEVOURER, DarkwebDevourerPos[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); + + me->SummonCreature(NPC_CHATTERING_HORROR, ChatteringHorrorPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); + + if (Creature* dummy = me->SummonCreature(NPC_GENERAL_PURPOSE_DUMMY_JMF, GeneralPurposeBunnyPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000)) + dummy->CastSpell(dummy, SPELL_SHADOW_FOG, true); + + _events.ScheduleEvent(EVENT_ANNOUNCE_SPIDERS, Milliseconds(800)); + break; + case EVENT_ANNOUNCE_SPIDERS: + Talk(SAY_ANNOUNCE_NIGHTMAR_SPIDERS); + break; + default: + break; + } + } + DoMeleeAttackIfReady(); + } + private: + EventMap _events; + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetDeadminesAI(creature); + } +}; + enum DefiasCannon { // GroupID 0 and 1 are used by Foe Reaper 5000 @@ -287,7 +574,7 @@ class go_deadmines_defias_cannon : public GameObjectScript { go_deadmines_defias_cannonAI(GameObject* go) : GameObjectAI(go), _instance(go->GetInstanceScript()) { } - bool OnReportUse(Player* player) override + bool OnReportUse(Player* /*player*/) override { if (GameObject* cannon = me->ToGameObject()) { @@ -374,12 +661,44 @@ class spell_deadmines_ride_magma_vehicle : public SpellScriptLoader } }; +// We have no dummy npc in sniffs so we use a sniffed coordinate instead +class spell_deadmines_magma_trap_throw_to_location : public SpellScriptLoader +{ + public: + spell_deadmines_magma_trap_throw_to_location() : SpellScriptLoader("spell_deadmines_magma_trap_throw_to_location") { } + + class spell_deadmines_magma_trap_throw_to_location_SpellScript : public SpellScript + { + PrepareSpellScript(spell_deadmines_magma_trap_throw_to_location_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Position const* pos = GetHitDest()) + GetHitDest()->Relocate(-225.1973f, -563.7677f, 51.23737f); + } + + void Register() override + { + OnEffectLaunch += SpellEffectFn(spell_deadmines_magma_trap_throw_to_location_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_JUMP_DEST); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_deadmines_magma_trap_throw_to_location_SpellScript(); + } +}; + void AddSC_deadmines() { new npc_deadmines_defias_watcher(); new npc_deadmines_vanessas_trap_bunny(); new npc_deadmines_steam_valve(); + new npc_deadmines_vanessa_van_cleef_nightmare(); + new npc_deadmines_glubtok_nightmare(); + new npc_deadmines_helix_nightmare(); new go_deadmines_defias_cannon(); new spell_deadmines_on_fire(); new spell_deadmines_ride_magma_vehicle(); + new spell_deadmines_magma_trap_throw_to_location(); } diff --git a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h index e5a4ef001bb..0dec7af3204 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h +++ b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h @@ -46,73 +46,86 @@ enum DMDataTypes DATA_VANESSAS_TRAP_BUNNY = 17, DATA_VANESSA_ANCHOR_BUNNY = 18, DATA_ACTIVATED_VENT = 19, + DATA_FOUNDRY_DOOR = 20, }; enum DMCreatures { // Bosses - BOSS_GLUBTOK = 47162, - BOSS_HELIX_GEARBREAKER = 47296, - BOSS_FOE_REAPER_5000 = 43778, - BOSS_ADMIRAL_RIPSNARL = 47626, - BOSS_CAPTAIN_COOKIE = 47739, - BOSS_VANESSA_VAN_CLEEF = 49541, + BOSS_GLUBTOK = 47162, + BOSS_HELIX_GEARBREAKER = 47296, + BOSS_FOE_REAPER_5000 = 43778, + BOSS_ADMIRAL_RIPSNARL = 47626, + BOSS_CAPTAIN_COOKIE = 47739, + BOSS_VANESSA_VAN_CLEEF = 49541, // Horde Creatures - NPC_SLINKY_SHARPSHIV = 46906, - NPC_KAGTHA = 46889, - NPC_MISS_MAYHEM = 46902, - NPC_SHATTERED_HAND_ASSASSIN = 46890, - NPC_MAYHEM_REAPER_PROTOTYPE = 46903, + NPC_SLINKY_SHARPSHIV = 46906, + NPC_KAGTHA = 46889, + NPC_MISS_MAYHEM = 46902, + NPC_SHATTERED_HAND_ASSASSIN = 46890, + NPC_MAYHEM_REAPER_PROTOTYPE = 46903, // Alliance Creatures - NPC_STORMWIND_INVESTIGATOR = 46614, - NPC_CRIME_SCENE_ALARM_O_BOT = 46613, - NPC_STORMWIND_DEFENDER = 50595, - NPC_LIEUTENANT_HORATIO_LAINE = 46612, - NPC_QUARTERMASTER_LEWIS = 491, + NPC_STORMWIND_INVESTIGATOR = 46614, + NPC_CRIME_SCENE_ALARM_O_BOT = 46613, + NPC_STORMWIND_DEFENDER = 50595, + NPC_LIEUTENANT_HORATIO_LAINE = 46612, + NPC_QUARTERMASTER_LEWIS = 491, // Encounter Related - NPC_GENERAL_PURPOSE_DUMMY_JMF = 45979, - NPC_GLUBTOK_FIREWALL_PLATTER = 48974, - NPC_FIREWALL_PLATTER_1A = 48975, - NPC_FIREWALL_PLATTER_1B = 49039, - NPC_FIREWALL_PLATTER_1C = 49040, - NPC_FIREWALL_PLATTER_2A = 48976, - NPC_FIREWALL_PLATTER_2B = 49041, - NPC_FIREWALL_PLATTER_2C = 49042, - NPC_GENERAL_PURPOSE_BUNNY_L2 = 47242, - NPC_FIRE_BLOSSOM_BUNNY = 47282, - NPC_FROST_BLOSSOM_BUNNY = 47284, - NPC_LUMBERING_OAF = 47297, - NPC_HELIX_CREW = 49139, - NPC_STICKY_BOMB = 47314, - NPC_DEFIAS_REAPER = 47403, - NPC_DEFIAS_WATCHER = 47404, - NPC_FOE_REAPER_TARGETING_BUNNY = 47468, - NPC_PROTOTYPE_REAPER = 49208, - NPC_MOLTEN_SLAG = 49229, - NPC_VAPOR = 47714, - NPC_COOKIES_CAULDRON = 47754, - NPC_CORN = 48006, - NPC_ROTTEN_CORN = 48276, - NPC_MELON = 48294, - NPC_ROTTEN_MELON = 48293, - NPC_STEAK = 48296, - NPC_ROTTEN_STEAK = 48295, - NPC_MYSTERY_MEAT = 48297, - NPC_ROTTEN_MYSTERY_MEAT = 48298, - NPC_LOAF = 48300, - NPC_ROTTEN_LOAF = 48299, - NPC_BUN = 48301, - NPC_ROTTEN_BUN = 48302, + NPC_GENERAL_PURPOSE_DUMMY_JMF = 45979, + NPC_GLUBTOK_FIREWALL_PLATTER = 48974, + NPC_FIREWALL_PLATTER_1A = 48975, + NPC_FIREWALL_PLATTER_1B = 49039, + NPC_FIREWALL_PLATTER_1C = 49040, + NPC_FIREWALL_PLATTER_2A = 48976, + NPC_FIREWALL_PLATTER_2B = 49041, + NPC_FIREWALL_PLATTER_2C = 49042, + NPC_GENERAL_PURPOSE_BUNNY_L2 = 47242, + NPC_FIRE_BLOSSOM_BUNNY = 47282, + NPC_FROST_BLOSSOM_BUNNY = 47284, + NPC_LUMBERING_OAF = 47297, + NPC_HELIX_CREW = 49139, + NPC_STICKY_BOMB = 47314, + NPC_DEFIAS_REAPER = 47403, + NPC_DEFIAS_WATCHER = 47404, + NPC_FOE_REAPER_TARGETING_BUNNY = 47468, + NPC_PROTOTYPE_REAPER = 49208, + NPC_MOLTEN_SLAG = 49229, + NPC_VAPOR = 47714, + NPC_COOKIES_CAULDRON = 47754, + NPC_CORN = 48006, + NPC_ROTTEN_CORN = 48276, + NPC_MELON = 48294, + NPC_ROTTEN_MELON = 48293, + NPC_STEAK = 48296, + NPC_ROTTEN_STEAK = 48295, + NPC_MYSTERY_MEAT = 48297, + NPC_ROTTEN_MYSTERY_MEAT = 48298, + NPC_LOAF = 48300, + NPC_ROTTEN_LOAF = 48299, + NPC_BUN = 48301, + NPC_ROTTEN_BUN = 48302, - NPC_A_NOTE_FROM_VANESSA = 49564, - NPC_VANESSA_VAN_CLEEF_INTRO = 49429, - NPC_VANESSAS_TRAP_BUNNY = 49454, - NPC_VANESSA_ANCHOR_BUNNY_JMF = 51624, - NPC_STEAM_VALVE = 49457, -}; + NPC_A_NOTE_FROM_VANESSA = 49564, + NPC_VANESSA_VAN_CLEEF_INTRO = 49429, + NPC_VANESSAS_TRAP_BUNNY = 49454, + NPC_VANESSA_ANCHOR_BUNNY_JMF = 51624, + NPC_STEAM_VALVE = 49457, + + NPC_VANESSA_VANCLEEF_NIGHTMARE = 49671, + NPC_GLUBTOK_NIGHTMARE_FIRE_BUNNY = 51594, + NPC_GLUBTOK_NIGHTMARE = 49670, + + NPC_HELIX_GEARBREAKER_NIGHTMARE = 49674, + NPC_NIGHTMARE_SKITTERLING = 49493, + NPC_DARKWEB_DEVOURER = 49494, + NPC_CHATTERING_HORROR = 49495, + + NPC_FOE_REAPER_5000_NIGHTMARE = 49681, + NPC_VANESSA_LIGHTNING_PLATTER = 49520, +}; enum DMGameObjects { @@ -137,7 +150,6 @@ enum DMSpells SPELL_FOG = 88768, // -- Vanessa VanCleef Encounter - // Vanessa's Trap Bunny SPELL_RIDE_MAGMA_VEHICLE = 92378, SPELL_MOLTEN_MAGMA = 92424, SPELL_FORCE_MAGMA_TRAP_THROW = 92489, @@ -152,10 +164,11 @@ enum DMSpells enum DMVanessasNightmareStages { NIGHTMARE_STATE_PREPARE_TRAP = 2, - NIGHTMARE_STAGE_GLUBTOK = 3, - NIGHTMARE_STATE_HELIX = 4, - NIGHTMARE_STAGE_FOE_REAPER = 5, - NIGHTMARE_STAGE_RIPSNARL = 6 + NIGHTMARE_STAGE_MAGMA_TRAP = 3, + NIGHTMARE_STAGE_GLUBTOK = 4, + NIGHTMARE_STAGE_HELIX = 5, + NIGHTMARE_STAGE_FOE_REAPER = 6, + NIGHTMARE_STAGE_RIPSNARL = 7 }; Position const captainCookieSpawnPos = { -88.13194f, -819.3299f, 39.23453f }; @@ -163,6 +176,191 @@ Position const captainCookieSpawnPos = { -88.13194f, -819.3299f, 39.23453f }; Position const noteFromVanessaSpawnPos = { -74.36111f, -820.0139f, 40.37145f, 4.014257f }; Position const vanessaVanCleefSpawnPos = { -75.58507f, -819.9636f, 47.06727f, 6.178465f }; +Position const vanessaVanCleefNightmareSpawnPos[] = +{ + { -230.717f, -563.0139f, 51.31293f, 1.047198f }, + { -172.809f, -576.9114f, 19.39756f, 4.817109f }, + { -159.3924f, -580.5174f, 19.39817f, 6.195919f }, +}; + +Position const GlubtokNightmareIntroSpawnPos = { -229.3403f, -560.3629f, 51.31293f, 5.742133f }; +Position const GlubtokNightmareSpawnPos = { -174.8212f, -579.7552f, 19.39602f, 3.193953f }; + +Position const HelixNightmareSpawnPos = { -172.6858f, -580.0469f, 19.39752f, 3.176499f }; +Position const GeneralPurposeBunnyPos = { -205.4688f, -567.2049f, 21.06016f }; + +Position const FoeReaperNightmareIntroSpawnPos = { -155.4705f, -580.6945f, 19.39779f }; +Position const FoeReaperNightmareSpawnPos = { -101.4549f, -663.6493f, 7.505813f, 1.850049f }; + +Position const glubtokNightmareFireBunnyPos[] = +{ + { -192.2031f, -595.9636f, 36.37407f, 2.80998f }, + { -220.625f, -577.9618f, 21.06016f, 2.513274f }, + { -205.3056f, -563.6285f, 21.06016f, 5.253441f }, + { -214.8958f, -546.7136f, 19.3898f, 4.712389f }, + { -207.8004f, -570.6441f, 21.06016f, 1.762783f }, + { -221.4653f, -549.9358f, 19.3898f, 3.211406f }, + { -229.9635f, -559.2552f, 19.3898f, 0.0f }, + { -216.8438f, -568.9011f, 21.06016f, 3.909538f }, + { -235.9045f, -563.3906f, 19.3898f, 0.0f }, + { -226.6736f, -580.8316f, 20.43056f, 2.775074f }, + { -227.5226f, -595.1979f, 20.42358f, 4.206244f }, + { -215.0399f, -576.3941f, 21.06016f, 3.735005f }, + { -210.592f, -583.4739f, 21.06016f, 0.0f }, + { -228.592f, -553.1684f, 19.3898f, 5.550147f }, + { -220.4879f, -596.382f, 21.95116f, 0.0f }, + { -190.4774f, -552.2778f, 51.31293f, 5.305801f }, + { -195.6267f, -550.4393f, 51.31293f, 3.752458f }, + { -209.7257f, -557.1042f, 51.31293f, 3.525565f }, + { -187.9531f, -567.0469f, 51.31293f, 5.305801f }, + { -185.2083f, -562.4844f, 19.3898f, 0.9599311f }, + { -183.4236f, -577.2674f, 46.87183f, 3.944444f }, + { -184.6528f, -572.3663f, 49.27317f, 3.159046f }, + { -191.2205f, -581.4965f, 21.06015f, 2.007129f }, + { -201.224f, -570.6788f, 21.06016f, 3.577925f }, + { -198.4653f, -580.757f, 21.06015f, 0.8901179f }, + { -196.8767f, -574.9688f, 21.06016f, 4.29351f }, + { -194.1302f, -548.3055f, 19.3898f, 4.153883f }, + { -187.3333f, -550.8143f, 19.3898f, 3.385939f }, + { -186.9792f, -556.8472f, 19.3898f, 4.153883f }, + { -196.5504f, -587.7031f, 21.06015f, 1.27409f }, + { -241.5938f, -578.6858f, 19.3898f, 2.775074f }, + { -226.1615f, -573.8021f, 20.40991f, 5.218534f } +}; + +Position const nightmareSkitterlingPos[] = +{ + { -184.9618f, -552.9132f, 19.3898f }, + { -199.1406f, -573.6893f, 21.06016f }, + { -194.5851f, -578.3386f, 21.06015f }, + { -193.3264f, -569.809f, 21.06016f }, + { -185.7622f, -566.6059f, 19.3898f }, + { -181.401f, -561.684f, 19.3898f }, + { -221.2569f, -549.3316f, 19.3898f }, + { -215.125f, -546.0486f, 19.3898f }, + { -210.3854f, -550.6736f, 19.3898f }, + { -206.8715f, -545.3837f, 19.3898f }, + { -208.3247f, -556.5833f, 19.3898f }, + { -203.1233f, -550.8281f, 19.3898f }, + { -198.2465f, -546.9288f, 19.3898f }, + { -178.6389f, -564.4479f, 19.39f }, + { -193.3698f, -581.8663f, 21.06015f }, + { -188.1788f, -578.3715f, 21.06015f }, + { -185.3385f, -562.592f, 19.3898f }, + { -179.6458f, -557.9063f, 19.3898f }, + { -226.5208f, -587.257f, 19.53274f }, + { -199.3351f, -586.7952f, 21.06015f }, + { -207.6545f, -594.809f, 21.06015f }, + { -201.2587f, -593.309f, 21.06016f }, + { -224.2743f, -592.7917f, 20.29579f }, + { -211.9844f, -569.5417f, 21.06016f }, + { -208.9288f, -563.6094f, 21.06016f }, + { -200.8715f, -557.2518f, 19.3898f }, + { -196.2396f, -553.6927f, 19.3898f }, + { -192.1163f, -550.1024f, 19.3898f }, + { -202.4063f, -563.1337f, 21.06016f }, + { -195.9635f, -560.8889f, 20.58139f }, + { -190.1094f, -557.4722f, 19.3898f }, + { -199.3229f, -550.3785f, 19.3898f }, + { -195.2552f, -557.0087f, 19.3898f }, + { -190.1372f, -553.0625f, 19.3898f }, + { -185.2118f, -557.6406f, 19.3898f }, + { -190.6406f, -561.441f, 19.3898f }, + { -197.7413f, -564.3021f, 21.06016f }, + { -215.5365f, -549.8021f, 19.3898f }, + { -212.1719f, -555.0226f, 19.3898f }, + { -213.2344f, -561.8577f, 21.06016f }, + { -208.5451f, -568.1146f, 21.06016f }, + { -202.7257f, -572.5174f, 21.06016f }, + { -205.6354f, -559.1563f, 21.06016f }, + { -206.1615f, -553.3507f, 19.3898f }, + { -202.5451f, -546.118f, 19.3898f }, + { -204.1024f, -596.7518f, 21.06016f }, + { -204.0087f, -590.8386f, 21.06016f }, + { -198.8316f, -591.7239f, 21.06015f }, + { -195.4375f, -586.2934f, 21.06015f }, + { -197.6493f, -582.4653f, 21.06015f }, + { -219.1337f, -559.7899f, 19.3898f }, + { -221.4063f, -553.1406f, 19.3898f }, + { -216.1215f, -564.882f, 21.06016f }, + { -199.3125f, -578.1996f, 21.06016f }, + { -204.684f, -569.3542f, 21.06016f }, + { -197.8576f, -569.3489f, 21.06016f }, + { -191.7656f, -565.8559f, 21.06016f }, + { -213.4635f, -591.625f, 21.06015f }, + { -206.0781f, -588.0712f, 21.06016f }, + { -213.1997f, -585.125f, 21.06015f }, + { -220.5174f, -581.8143f, 21.06016f }, + { -182.8004f, -569.368f, 19.39167f }, + { -189.0191f, -571.2674f, 21.06016f }, + { -193.7674f, -574.7014f, 21.06016f }, + { -226.1285f, -581.059f, 20.79114f }, + { -218.6076f, -581.0746f, 21.06016f }, + { -216.1094f, -576.8264f, 21.06016f }, + { -222.1545f, -555.1077f, 19.3898f }, + { -212.6059f, -567.2239f, 21.06016f }, + { -203.9184f, -551.0608f, 19.3898f }, + { -202.8663f, -590.1371f, 21.06016f }, + { -196.4757f, -573.0833f, 21.06016f }, + { -185.9288f, -558.125f, 19.3898f }, + { -213.8767f, -559.3125f, 20.02806f }, + { -221.8142f, -556.3976f, 19.3898f }, + { -216.5017f, -553.9722f, 19.3898f }, + { -223.7483f, -574.9896f, 21.06015f }, + { -226.1215f, -563.0382f, 19.3898f }, + { -213.8559f, -574.6094f, 21.06016f }, + { -208.3854f, -571.8004f, 21.06016f }, + { -224.5625f, -568.1476f, 19.92673f }, + { -219.7083f, -588.6094f, 21.06015f }, + { -218.8872f, -570.5643f, 21.06016f }, + { -221.8264f, -562.2795f, 19.3898f }, + { -227.9063f, -559.566f, 19.3898f }, + { -230.4948f, -566.0191f, 19.3898f }, + { -227.0243f, -552.6736f, 19.3898f }, + { -231.566f, -572.1979f, 19.3898f }, + { -231.8802f, -578.5677f, 19.3898f }, + { -232.4462f, -562.8837f, 19.3898f }, + { -232.4514f, -586.2518f, 19.3898f }, + { -230.3767f, -592.8577f, 19.3898f }, + { -232.8004f, -591.1805f, 19.3898f }, + { -234.5208f, -559.4809f, 19.3898f }, + { -236.5712f, -565.5573f, 19.3898f }, + { -237.5799f, -571.5903f, 19.3898f }, + { -238.9063f, -578.1528f, 19.3898f }, + { -234.0608f, -598.0f, 19.95063f }, + { -236.5122f, -591.9913f, 19.3898f }, + { -238.8021f, -584.8594f, 19.3898f }, +}; + +Position const DarkwebDevourerPos[] = +{ + { -215.7064f, -553.3212f, 51.29544f, 0.7243207f }, + { -229.285f, -568.6863f, 51.31313f, 0.8218399f }, + { -231.3453f, -584.1043f, 51.31514f, 1.05134f } +}; + +Position const ChatteringHorrorPos = { -233.625f, -570.5868f, 19.3898f }; + +Position const LightningPlatterPos[] = +{ + { -120.0434f, -638.3785f, 14.28754f, 0.03183358f }, // -120.9898 Y: -638.3776 Z: 12.34728 + { -134.4479f, -623.0521f, 16.38484f, 0.03133297f }, // -135.3954 Y: -623.0512 Z: 14.44327 + { -119.2101f, -617.6198f, 16.18771f, 6.252115f }, // -120.1581 Y: -617.6207 Z: 14.24549 + { -135.7899f, -604.6667f, 17.47415f, 0.03079747f }, // -136.7385 Y: -604.6659 Z: 15.53128 + { -129.5313f, -586.5018f, 20.52248f, 0.03022512f }, // -130.4809 Y: -586.5009 Z: 18.57832 + { -142.0538f, -574.9202f, 21.08911f, 6.253215f }, // -143.004 Y: -574.9209 Z: 19.1443 +}; + +Position const LightningPlatterCenterPos[] = +{ + { -120.9898f, -638.3776f, 12.34728f }, + { -135.3954f, -623.0512f, 14.44327f }, + { -120.1581f, -617.6207f, 14.24549f }, + { -136.7385f, -604.6659f, 15.53128f }, + { -130.4809f, -586.5009f, 18.57832f }, + { -143.004f, -574.9209f, 19.1443f } +}; + template AI* GetDeadminesAI(Creature* creature) { diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp index 5c435ceb6bf..8a51c52e4cf 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp @@ -24,14 +24,43 @@ enum EventIds { - EVENT_SUMMON_CAPTAIN_COOKIE = 1 + EVENT_SUMMON_CAPTAIN_COOKIE = 1, + EVENT_CAST_NIGHTMARE_AURA_1, + EVENT_CAST_NIGHTMARE_AURA_2, + EVENT_CAST_NIGHTMARE_AURA_3, + EVENT_ANNOUNCE_NIGHTMARE_ELIXIR_TAKES_HOLD, + EVENT_SETUP_GLUBTOKS_NIGHTMARE, + EVENT_SUMMON_ICICLES, + EVENT_SUMMON_GLUBTOK, + EVENT_ANNOUNCE_NIGHTMARE_SHIFTS, + EVENT_DESPAWN_NIGHTMARE_FIRE, + EVENT_SETUP_HELIX_NIGHTMARE, + EVENT_DESPAWN_NIGHTMARE_SPIDERS, + EVENT_SETUP_MECHANICAL_NIGHTMARE, + EVENT_SUMMON_FOE_REAPER, }; enum TextsIds { // Id's 0 - 1 used by Foe Reaper 5000 // Id 2 used by Defias Cannon - SAY_ANNOUNCE_SHADOWY_FIGURE = 3 + SAY_ANNOUNCE_SHADOWY_FIGURE = 3, + SAY_ANNOUNCE_NIGHTMARE_ELIXIR_TAKES_HOLD = 4, + SAY_ANNOUNCE_NIGHTMARE_SHIFTS = 5, +}; + +enum Spells +{ + SPELL_NIGHTMARE_SLOW = 92559, + SPELL_NIGHTMARE_AURA = 92563, + + SPELL_CANCEL_NIGHTMARE_AURA_GLUBTOK = 92584, + SPELL_CANCEL_NIGHTMARE_AURA_HELIX = 92585, + SPELL_CANCEL_NIGHTMARE_AURA_MECHANICAL = 92586, + SPELL_CANCEL_NIGHTMARE_AURA_RIPSNARL = 92587, + + SPELL_SUMMON_ICICLE = 92189, + SPELL_OFF_LINE = 88348 }; ObjectData const creatureData[] = @@ -53,6 +82,7 @@ ObjectData const creatureData[] = ObjectData const gameobjectData[] = { { GO_IRON_CLAD_DOOR, DATA_IRON_CLAD_DOOR }, + { GO_FOUNDRY_DOOR, DATA_FOUNDRY_DOOR }, { 0, 0 } // END }; @@ -179,6 +209,20 @@ class instance_deadmines : public InstanceMapScript case NPC_STEAM_VALVE: _steamValveGuidSet.insert(creature->GetGUID()); break; + case NPC_GLUBTOK_NIGHTMARE_FIRE_BUNNY: + case NPC_GLUBTOK_NIGHTMARE: + _glubtokNightmareGuidSet.insert(creature->GetGUID()); + break; + case NPC_HELIX_GEARBREAKER_NIGHTMARE: + case NPC_NIGHTMARE_SKITTERLING: + case NPC_DARKWEB_DEVOURER: + case NPC_CHATTERING_HORROR: + _helixNightmareGuidSet.insert(creature->GetGUID()); + break; + case NPC_GENERAL_PURPOSE_DUMMY_JMF: + if (_vanessaVanCleefEncounterState == NIGHTMARE_STAGE_HELIX) + _helixNightmareGuidSet.insert(creature->GetGUID()); + break; default: break; } @@ -276,12 +320,27 @@ class instance_deadmines : public InstanceMapScript case NIGHTMARE_STATE_PREPARE_TRAP: if (Creature* trapBunny = GetCreature(DATA_VANESSAS_TRAP_BUNNY)) if (Creature* anchorBunny = GetCreature(DATA_VANESSA_ANCHOR_BUNNY)) + { + trapBunny->Respawn(); + anchorBunny->Respawn(); anchorBunny->CastSpell(trapBunny, SPELL_ROPE_BEAM, true); + } break; - case NIGHTMARE_STAGE_GLUBTOK: + case NIGHTMARE_STAGE_MAGMA_TRAP: if (Creature* trapBunny = GetCreature(DATA_VANESSAS_TRAP_BUNNY)) trapBunny->CastSpell(trapBunny, SPELL_RIDE_MAGMA_VEHICLE, true); break; + case NIGHTMARE_STAGE_GLUBTOK: + events.ScheduleEvent(EVENT_CAST_NIGHTMARE_AURA_1, Seconds(4)); + events.ScheduleEvent(EVENT_ANNOUNCE_NIGHTMARE_ELIXIR_TAKES_HOLD, Seconds(4) + Milliseconds(200)); + break; + case NIGHTMARE_STAGE_HELIX: + events.CancelEvent(EVENT_SUMMON_ICICLES); + events.ScheduleEvent(EVENT_CAST_NIGHTMARE_AURA_2, Seconds(2) + Milliseconds(900)); + break; + case NIGHTMARE_STAGE_FOE_REAPER: + events.ScheduleEvent(EVENT_DESPAWN_NIGHTMARE_SPIDERS, Seconds(2)); + break; default: break; } @@ -289,8 +348,15 @@ class instance_deadmines : public InstanceMapScript case DATA_ACTIVATED_VENT: _activatedVentCounter++; if (_activatedVentCounter == 4) + { + for (auto itr = _steamValveGuidSet.begin(); itr != _steamValveGuidSet.end(); itr++) + if (Creature* valve = instance->GetCreature((*itr))) + valve->DespawnOrUnsummon(Seconds(10)); + + SetData(DATA_VANESSA_VAN_CLEEF_ENCOUNTER, NIGHTMARE_STAGE_GLUBTOK); if (Creature* trapBunny = GetCreature(DATA_VANESSAS_TRAP_BUNNY)) trapBunny->AI()->DoAction(ACTION_EJECT_PLAYERS); + } break; default: break; @@ -345,6 +411,118 @@ class instance_deadmines : public InstanceMapScript _firstCookieSpawn = false; } break; + case EVENT_CAST_NIGHTMARE_AURA_1: + if (Creature* trapBunny = GetCreature(DATA_VANESSAS_TRAP_BUNNY)) + if (Creature* purposeBunny = trapBunny->FindNearestCreature(NPC_GENERAL_PURPOSE_DUMMY_JMF, 50.0f, true)) + { + purposeBunny->CastSpell(purposeBunny, SPELL_NIGHTMARE_AURA, true); + purposeBunny->CastSpell(purposeBunny, SPELL_NIGHTMARE_SLOW, true); + } + break; + case EVENT_ANNOUNCE_NIGHTMARE_ELIXIR_TAKES_HOLD: + if (Creature* trapBunny = GetCreature(DATA_VANESSAS_TRAP_BUNNY)) + if (Creature* purposeBunny = trapBunny->FindNearestCreature(NPC_GENERAL_PURPOSE_DUMMY_JMF, 50.0f, true)) + purposeBunny->AI()->Talk(SAY_ANNOUNCE_NIGHTMARE_ELIXIR_TAKES_HOLD); + + events.ScheduleEvent(EVENT_SETUP_GLUBTOKS_NIGHTMARE, Milliseconds(600)); + break; + case EVENT_SETUP_GLUBTOKS_NIGHTMARE: + instance->SummonCreature(NPC_VANESSA_VANCLEEF_NIGHTMARE, vanessaVanCleefNightmareSpawnPos[0]); + instance->SummonCreature(NPC_GLUBTOK_NIGHTMARE, GlubtokNightmareIntroSpawnPos); + + for (uint8 i = 0; i < 32; i++) + instance->SummonCreature(NPC_GLUBTOK_NIGHTMARE_FIRE_BUNNY, glubtokNightmareFireBunnyPos[i]); + + events.ScheduleEvent(EVENT_SUMMON_GLUBTOK, Seconds(14) + Milliseconds(400)); + events.ScheduleEvent(EVENT_SUMMON_ICICLES, Seconds(14)); + break; + case EVENT_SUMMON_ICICLES: + if (Creature* trapBunny = GetCreature(DATA_VANESSAS_TRAP_BUNNY)) + if (Creature* purposeBunny = trapBunny->FindNearestCreature(NPC_GENERAL_PURPOSE_DUMMY_JMF, 50.0f, true)) + { + std::list playerList; + purposeBunny->GetPlayerListInGrid(playerList, 100.0f); + if (!playerList.empty()) + if (Player* target = Trinity::Containers::SelectRandomContainerElement(playerList)) + purposeBunny->CastSpell(target, SPELL_SUMMON_ICICLE, true); + } + + events.Repeat(Seconds(3) - Milliseconds(600)); + break; + case EVENT_SUMMON_GLUBTOK: + if (Creature* glubtok = instance->SummonCreature(NPC_GLUBTOK_NIGHTMARE, GlubtokNightmareSpawnPos)) + glubtok->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + break; + case EVENT_CAST_NIGHTMARE_AURA_2: + if (Creature* trapBunny = GetCreature(DATA_VANESSAS_TRAP_BUNNY)) + if (Creature* purposeBunny = trapBunny->FindNearestCreature(NPC_GENERAL_PURPOSE_DUMMY_JMF, 50.0f, true)) + { + purposeBunny->CastSpell(purposeBunny, SPELL_CANCEL_NIGHTMARE_AURA_GLUBTOK, true); + purposeBunny->CastSpell(purposeBunny, SPELL_NIGHTMARE_AURA, true); + purposeBunny->CastSpell(purposeBunny, SPELL_NIGHTMARE_SLOW, true); + } + + events.ScheduleEvent(EVENT_ANNOUNCE_NIGHTMARE_SHIFTS, Milliseconds(200)); + events.ScheduleEvent(EVENT_DESPAWN_NIGHTMARE_FIRE, Milliseconds(400)); + break; + case EVENT_ANNOUNCE_NIGHTMARE_SHIFTS: + if (Creature* trapBunny = GetCreature(DATA_VANESSAS_TRAP_BUNNY)) + if (Creature* purposeBunny = trapBunny->FindNearestCreature(NPC_GENERAL_PURPOSE_DUMMY_JMF, 50.0f, true)) + purposeBunny->AI()->Talk(SAY_ANNOUNCE_NIGHTMARE_SHIFTS); + break; + case EVENT_DESPAWN_NIGHTMARE_FIRE: + for (auto itr = _glubtokNightmareGuidSet.begin(); itr != _glubtokNightmareGuidSet.end(); itr++) + if (Creature* creature = instance->GetCreature(*itr)) + if (creature->GetEntry() == NPC_GLUBTOK_NIGHTMARE_FIRE_BUNNY) + creature->DespawnOrUnsummon(); + + events.ScheduleEvent(EVENT_SETUP_HELIX_NIGHTMARE, Seconds(2) + Milliseconds(800)); + break; + case EVENT_SETUP_HELIX_NIGHTMARE: + instance->SummonCreature(NPC_VANESSA_VANCLEEF_NIGHTMARE, vanessaVanCleefNightmareSpawnPos[1]); + instance->SummonCreature(NPC_HELIX_GEARBREAKER_NIGHTMARE, HelixNightmareSpawnPos); + break; + case EVENT_DESPAWN_NIGHTMARE_SPIDERS: + for (auto itr = _helixNightmareGuidSet.begin(); itr != _helixNightmareGuidSet.end(); itr++) + if (Creature* creature = instance->GetCreature(*itr)) + if (creature->GetEntry() != NPC_HELIX_GEARBREAKER_NIGHTMARE) + creature->DespawnOrUnsummon(); + events.ScheduleEvent(EVENT_ANNOUNCE_NIGHTMARE_SHIFTS, Milliseconds(100)); + events.ScheduleEvent(EVENT_CAST_NIGHTMARE_AURA_3, Milliseconds(200)); + break; + case EVENT_CAST_NIGHTMARE_AURA_3: + if (Creature* trapBunny = GetCreature(DATA_VANESSAS_TRAP_BUNNY)) + if (Creature* purposeBunny = trapBunny->FindNearestCreature(NPC_GENERAL_PURPOSE_DUMMY_JMF, 50.0f, true)) + { + purposeBunny->CastSpell(purposeBunny, SPELL_CANCEL_NIGHTMARE_AURA_HELIX, true); + purposeBunny->CastSpell(purposeBunny, SPELL_NIGHTMARE_AURA, true); + purposeBunny->CastSpell(purposeBunny, SPELL_NIGHTMARE_SLOW, true); + } + events.ScheduleEvent(EVENT_SETUP_MECHANICAL_NIGHTMARE, Seconds(2) + Milliseconds(400)); + break; + case EVENT_SETUP_MECHANICAL_NIGHTMARE: + if (GameObject* door = GetGameObject(DATA_FOUNDRY_DOOR)) + door->SetGoState(GO_STATE_ACTIVE); + instance->SummonCreature(NPC_FOE_REAPER_5000_NIGHTMARE, FoeReaperNightmareIntroSpawnPos); + instance->SummonCreature(NPC_VANESSA_VANCLEEF_NIGHTMARE, vanessaVanCleefNightmareSpawnPos[2]); + for (uint8 i = 0; i < 6; i++) + if (Creature* platter = instance->SummonCreature(NPC_VANESSA_LIGHTNING_PLATTER, LightningPlatterPos[i])) + { + Position const pos = LightningPlatterCenterPos[i]; + float dist = platter->GetPosition().GetExactDist2d(pos); + bool clockwise = RAND(0, 1) == 1; + platter->SetSpeed(MOVE_RUN, 0.25f); + platter->GetMotionMaster()->MoveCirclePath(pos.GetPositionX(), pos.GetPositionY(), platter->GetPositionZ(), dist, clockwise, 10); + } + events.ScheduleEvent(EVENT_SUMMON_FOE_REAPER, Seconds(9) + Milliseconds(500)); + break; + case EVENT_SUMMON_FOE_REAPER: + if (Creature* reaper = instance->SummonCreature(NPC_FOE_REAPER_5000_NIGHTMARE, FoeReaperNightmareSpawnPos)) + { + reaper->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC); + reaper->RemoveAurasDueToSpell(SPELL_OFF_LINE); + } + break; default: break; } @@ -360,6 +538,8 @@ class instance_deadmines : public InstanceMapScript uint32 _vanessaVanCleefEncounterState; GuidSet _generalPurposeBunnyJMF2GuidSet; GuidSet _steamValveGuidSet; + GuidSet _glubtokNightmareGuidSet; + GuidSet _helixNightmareGuidSet; bool _firstCookieSpawn; };