From 433bd5a1bb6859d096a700836ecdbb7f6ee1be44 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Mon, 22 Apr 2019 19:36:16 +0200 Subject: [PATCH] Scripts/BWD: use sniffed exit coordinate for passenger ejection and initial work on Nefarian's heroic intro --- sql/updates/WIP/magmaw.sql | 36 +++-- .../BlackwingDescent/blackwing_descent.h | 40 +++--- .../BlackwingDescent/boss_magmaw.cpp | 130 +++++++++++++++--- .../instance_blackwing_descent.cpp | 5 +- src/server/scripts/Spells/spell_generic.cpp | 41 ------ 5 files changed, 163 insertions(+), 89 deletions(-) diff --git a/sql/updates/WIP/magmaw.sql b/sql/updates/WIP/magmaw.sql index 41b4e678311..cfe6ba54eef 100644 --- a/sql/updates/WIP/magmaw.sql +++ b/sql/updates/WIP/magmaw.sql @@ -9,12 +9,15 @@ UPDATE `creature_template` SET `unit_flags`= 33587264, `unit_flags2`= 34816, `fl -- Lava Parasite UPDATE `creature_template` SET `speed_run`= 0.3571, `speed_walk`= 1 WHERE `entry`= 41806; -- Exposed Head of Magmaw -UPDATE `creature_template` SET `AIName`= '' WHERE `entry` IN (42347, 51248, 51249, 51250); +UPDATE `creature_template` SET `ScriptName`= '' WHERE `entry`= 42347; +-- Nefarian +UPDATE `creature_template` SET `speed_run`= 1.7142, `unit_flags`= 33587264 WHERE `entry`= 49427; -- Addons -DELETE FROM `creature_template_addon` WHERE `entry` IN (41806); -INSERT INTO `creature_template_addon` (`entry`, `auras`) VALUES -(41806, '78019'); +DELETE FROM `creature_template_addon` WHERE `entry` IN (41806, 49427); +INSERT INTO `creature_template_addon` (`entry`, `bytes1`, `bytes2`, `auras`) VALUES +(41806, 0, 1, '78019'), +(49427, 50331648, 1, ''); -- Vehicle accessory DELETE FROM `vehicle_template_accessory` WHERE `entry`= 41570; @@ -27,7 +30,7 @@ INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `use (51102, 77901, 1, 0), (51103, 77901, 1, 0); -DELETE FROM `creature_template_movement` WHERE `CreatureId` IN (41570, 51101, 51102, 51103, 41620, 41789, 42347, 51248, 51249, 51250); +DELETE FROM `creature_template_movement` WHERE `CreatureId` IN (41570, 51101, 51102, 51103, 41620, 41789, 42347, 51248, 51249, 51250, 49427); INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`) VALUES -- Magmaw (41570, 1, 0, 1, 1), @@ -41,7 +44,9 @@ INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Fligh (42347, 0, 0, 1, 0), (51248, 0, 0, 1, 0), (51249, 0, 0, 1, 0), -(51250, 0, 0, 1, 0); +(51250, 0, 0, 1, 0), +-- Nefarian +(49427, 0, 0, 2, 0); -- Spells DELETE FROM `spell_script_names` WHERE `ScriptName` IN @@ -50,7 +55,9 @@ DELETE FROM `spell_script_names` WHERE `ScriptName` IN 'spell_magmaw_pillar_of_flame_dummy', 'spell_magmaw_pillar_of_flame_forcecast', 'spell_magmaw_ride_vehicle', -'spell_magmaw_launch_hook'); +'spell_magmaw_launch_hook', +'spell_magmaw_eject_passenger_1', +'spell_magmaw_eject_passenger_3'); DELETE FROM `spell_script_names` WHERE `ScriptName`= 'spell_gen_eject_passenger' AND `spell_id` IN (77946, 95204); DELETE FROM `spell_script_names` WHERE `ScriptName`= 'spell_gen_eject_passenger_1' AND `spell_id`= 77946; @@ -62,8 +69,8 @@ INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (78017, 'spell_magmaw_pillar_of_flame_dummy'), (77998, 'spell_magmaw_pillar_of_flame_forcecast'), (77901, 'spell_magmaw_ride_vehicle'), -(77946, 'spell_gen_eject_passenger_1'), -(95204, 'spell_gen_eject_passenger_3'), +(77946, 'spell_magmaw_eject_passenger_1'), +(95204, 'spell_magmaw_eject_passenger_3'), (77917, 'spell_magmaw_launch_hook'), (77941, 'spell_magmaw_launch_hook'); @@ -82,12 +89,19 @@ INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry (13, 1, 77929, 0, 0, 31, 0, 3, 41570, 0, 0, 0, '', 'Chain Visual - Target Magmaw'); -- Texts -DELETE FROM `creature_text` WHERE `CreatureID` IN (41570); +DELETE FROM `creature_text` WHERE `CreatureID` IN (41570, 49427); INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `comment`) VALUES +-- Magmaw (41570, 0, 0, '%s begins to erupt, spewing Lava Parasites onto the ground!', 41, 0, 100, 0, 0, 8717, 51464, 'Magmaw - Announce Lava Parasites'), (41570, 1, 0, '%s slumps forward, exposing his pincers!', 41, 0, 100, 0, 0, 8717, 47603, 'Magmaw - Announce Exposing Pincers'), -(41570, 2, 0, '%s becomes impaled on the spike, exposing his head!', 41, 0, 100, 0, 0, 8717, 41614, 'Magmaw - Announce Exposed Head'); +(41570, 2, 0, '%s becomes impaled on the spike, exposing his head!', 41, 0, 100, 0, 0, 8717, 41614, 'Magmaw - Announce Exposed Head'), +-- Nefarian +(49427, 0, 0, 'I found this fascinating specimen in the lava underneath this very room. Magmaw should provide an adequate challenge for your pathetic little band.', 14, 0, 100, 0, 0, 23367, 49060, 'Nefarian - Intro 1'), +(49427, 1, 0, 'On second thought, what fun is an "adequate" challenge?', 14, 0, 100, 0, 0, 23369, 49061, 'Nefarian - Intro 2'), +(49427, 2, 0, 'Inconceivable! You may actually defeat my lava worm! Perhaps I can help... tip the scales.', 14, 0, 100, 0, 0, 23368, 49782, 'Nefarian - Low Health Heroic'), +(49427, 3, 0, 'You won? How... disappointing. I could have easily watched you all continue to stand in the fire.', 14, 0, 100, 0, 0, 23366, 49062, 'Nefarian - Death Heroic'); -- Delete encounter related creatures DELETE FROM `creature` WHERE `guid` IN (250054, 250053, 250052); DELETE FROM `creature_addon` WHERE `guid` IN (250054, 250053, 250052); + diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/blackwing_descent.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/blackwing_descent.h index dec706cdcd4..8dc4e89f8b8 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/blackwing_descent.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/blackwing_descent.h @@ -36,33 +36,35 @@ enum BWDDataTypes DATA_NEFARIANS_END = 5, // Encounter Data - DATA_PREPARE_MASSIVE_CRASH_AND_GET_TARGET_GUID + DATA_PREPARE_MASSIVE_CRASH_AND_GET_TARGET_GUID, + DATA_NEFARIAN_MAGMAW, }; enum BWDCreatureIds { // Bosses - BOSS_MAGMAW = 41570, - BOSS_MAGMATRON = 42178, - BOSS_ARCANOTRON = 42166, - BOSS_TOXITRON = 42180, - BOSS_ELECTRON = 42179, - BOSS_CHIMAERON = 43296, - BOSS_ATRAMEDES = 41442, - BOSS_MALORIAK = 41378, - BOSS_NEFARIAN = 41376, + BOSS_MAGMAW = 41570, + BOSS_MAGMATRON = 42178, + BOSS_ARCANOTRON = 42166, + BOSS_TOXITRON = 42180, + BOSS_ELECTRON = 42179, + BOSS_CHIMAERON = 43296, + BOSS_ATRAMEDES = 41442, + BOSS_MALORIAK = 41378, + BOSS_NEFARIAN = 41376, // Encounter related creatures /*Magmaw*/ - NPC_MAGMAWS_PINCER_1 = 41620, - NPC_MAGMAWS_PINCER_2 = 41789, - NPC_EXPOSED_HEAD_OF_MAGMAW = 42347, - NPC_EXPOSED_HEAD_OF_MAGMAW_2 = 48270, - NPC_PILLAR_OF_FLAME = 41843, - NPC_LAVA_PARASITE = 41806, - NPC_MASSIVE_CRASH = 47330, - NPC_ROOM_STALKER = 47196, - NPC_MAGMAW_SPIKE_STALKER = 41767, + NPC_MAGMAWS_PINCER_1 = 41620, + NPC_MAGMAWS_PINCER_2 = 41789, + NPC_EXPOSED_HEAD_OF_MAGMAW = 42347, + NPC_EXPOSED_HEAD_OF_MAGMAW_2 = 48270, + NPC_PILLAR_OF_FLAME = 41843, + NPC_LAVA_PARASITE = 41806, + NPC_MASSIVE_CRASH = 47330, + NPC_ROOM_STALKER = 47196, + NPC_MAGMAW_SPIKE_STALKER = 41767, + NPC_NEFARIAN_MAGMAW = 49427 }; enum BWDGameObjectIds diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/boss_magmaw.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/boss_magmaw.cpp index 26d9a61df30..2b5c3b65dd2 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/boss_magmaw.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/boss_magmaw.cpp @@ -78,7 +78,7 @@ enum Events EVENT_EJECT_PASSENGER_1, EVENT_EXPOSE_HEAD, EVENT_HIDE_HEAD, - EVENT_FINISH_IMPALE_SELF, + EVENT_FINISH_IMPALE_SELF }; enum Actions @@ -91,15 +91,26 @@ enum Texts // Magmaw SAY_ANNOUNCE_LAVA_PARASITES = 0, SAY_ANNOUNCE_EXPOSE_PINCERS = 1, - SAY_ANNOUNCE_EXPOSED_HEAD = 2 + SAY_ANNOUNCE_EXPOSED_HEAD = 2, + + // Nefarian + SAY_INTRO_1 = 0, + SAY_INTRO_2 = 1, + SAY_MAGMAW_LOW_HEALTH = 2, + SAY_MAGMAW_DEFEATED = 3 }; enum VehicleSeats { + // Magmaw SEAT_MAGMAWS_PINCER_1 = 0, SEAT_MAGMAWS_PINCER_2 = 1, + SEAT_MANGLE = 2, SEAT_EXPOSED_HEAD_OF_MAGMAW_1 = 3, SEAT_EXPOSED_HEAD_OF_MAGMAW_2 = 4, + + // Magmaw's Pincer + SEAT_PINCER = 0 }; enum Data @@ -107,7 +118,15 @@ enum Data DATA_FREE_PINCER = 0 }; -Position const ExposedHeadOfMagmawPos = { -299.0f, -28.9861f, 191.0293f, 4.118977f }; +enum MovePoints +{ + POINT_NONE = 0 +}; + +Position const ExposedHeadOfMagmawPos = { -299.0f, -28.9861f, 191.0293f, 4.118977f }; +Position const MagmawVehicleExitPos = { -311.4653f, -48.59722f, 212.8065f, 1.064651f }; +Position const NefarianIntroSummonPos = { -390.1042f, 40.88411f, 207.8586f, 0.196609f }; +Position const NefarianIntroFlightPos = { -315.9445f, -6.895832f, 246.8446f }; struct boss_magmaw : public BossAI { @@ -125,6 +144,7 @@ struct boss_magmaw : public BossAI _pincer2 = nullptr; _hasExposedHead = false; _headEngaged = false; + _lowHealthTextTriggered = !IsHeroic(); } void Reset() override @@ -149,6 +169,22 @@ struct boss_magmaw : public BossAI _exposedHead1->SetInCombatWithZone(); _exposedHead2->SetInCombatWithZone(); + + if (IsHeroic()) + { + if (Creature* nefarian = DoSummon(NPC_NEFARIAN_MAGMAW, NefarianIntroSummonPos, 0, TEMPSUMMON_MANUAL_DESPAWN)) + { + nefarian->GetMotionMaster()->MovePoint(POINT_NONE, NefarianIntroFlightPos); + nefarian->m_Events.AddEventAtOffset([nefarian]() + { + nefarian->AI()->Talk(SAY_INTRO_1); + nefarian->m_Events.AddEventAtOffset([nefarian]() + { + nefarian->AI()->Talk(SAY_INTRO_2); + }, 16s); + }, 11s); + } + } } void EnterEvadeMode(EvadeReason /*why*/) override @@ -157,6 +193,11 @@ struct boss_magmaw : public BossAI instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); if (_headEngaged) instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, _exposedHead1); + + DoCastSelf(SPELL_EJECT_PASSENGER_3, true); + _pincer1->CastSpell(_pincer1, SPELL_EJECT_PASSENGER_1, true); + _pincer2->CastSpell(_pincer2, SPELL_EJECT_PASSENGER_1, true); + instance->SetData(DATA_MAGMAW, FAIL); summons.DespawnAll(); _DespawnAtEvade(); @@ -206,7 +247,7 @@ struct boss_magmaw : public BossAI break; } case SPELL_IMPALE_SELF: - DoCastSelf(SPELL_EJECT_PASSENGER_3); + DoCastSelf(SPELL_EJECT_PASSENGER_3, true); Talk(SAY_ANNOUNCE_EXPOSED_HEAD); me->RemoveAurasDueToSpell(SPELL_CHAIN_VISUAL_1); me->RemoveAurasDueToSpell(SPELL_CHAIN_VISUAL_2); @@ -218,12 +259,6 @@ struct boss_magmaw : public BossAI } } - void PassengerBoarded(Unit* passenger, int8 seatId, bool apply) override - { - if (!passenger) - return; - } - ObjectGuid GetGUID(int32 type) const override { switch (type) @@ -240,6 +275,23 @@ struct boss_magmaw : public BossAI return ObjectGuid::Empty; } + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (me->HealthBelowPctDamaged(30, damage) && !_lowHealthTextTriggered) + { + // Todo: Nefarian text + _lowHealthTextTriggered = true; + } + + if (damage >= me->GetHealth()) + { + // Make sure we eject all passengers nicely before we die so they wont end up in the lava + DoCastSelf(SPELL_EJECT_PASSENGER_3, true); + _pincer1->CastSpell(_pincer1, SPELL_EJECT_PASSENGER_1, true); + _pincer2->CastSpell(_pincer2, SPELL_EJECT_PASSENGER_1, true); + } + } + void DoAction(int32 action) override { switch (action) @@ -248,11 +300,15 @@ struct boss_magmaw : public BossAI events.Reset(); me->AttackStop(); me->SetReactState(REACT_PASSIVE); + me->CastStop(); me->RemoveAurasDueToSpell(SPELL_MASSIVE_CRASH); me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_ALLOW_ENEMY_INTERACT); - if (Creature* spikeStalker = me->FindNearestCreature(NPC_MAGMAW_SPIKE_STALKER, 50.0f)) + me->RemoveAurasDueToSpell(SPELL_PILLAR_OF_FLAME_MISSILE_PERIODIC); + + if (Creature* spikeStalker = me->FindNearestCreature(NPC_MAGMAW_SPIKE_STALKER, 60.0f)) me->SetFacingToObject(spikeStalker); + events.ScheduleEvent(EVENT_IMPALE_SELF, 1s); events.ScheduleEvent(EVENT_EJECT_PASSENGER_1, 2s + 300ms); events.ScheduleEvent(EVENT_EXPOSE_HEAD, 4s + 700ms); @@ -312,8 +368,8 @@ struct boss_magmaw : public BossAI break; case EVENT_MASSIVE_CRASH: DoCast(SPELL_MASSIVE_CRASH); - _pincer1->CastSpell(_pincer1, SPELL_EJECT_PASSENGER_1); - _pincer2->CastSpell(_pincer2, SPELL_EJECT_PASSENGER_1); + _pincer1->CastSpell(_pincer1, SPELL_EJECT_PASSENGER_1, true); + _pincer2->CastSpell(_pincer2, SPELL_EJECT_PASSENGER_1, true); break; case EVENT_ANNOUNCE_PINCERS_EXPOSED: Talk(SAY_ANNOUNCE_EXPOSE_PINCERS); @@ -327,8 +383,8 @@ struct boss_magmaw : public BossAI DoCastSelf(SPELL_IMPALE_SELF); break; case EVENT_EJECT_PASSENGER_1: - _pincer1->CastSpell(_pincer1, SPELL_EJECT_PASSENGER_1); - _pincer2->CastSpell(_pincer2, SPELL_EJECT_PASSENGER_1); + _pincer1->CastSpell(_pincer1, SPELL_EJECT_PASSENGER_1, true); + _pincer2->CastSpell(_pincer2, SPELL_EJECT_PASSENGER_1, true); break; case EVENT_EXPOSE_HEAD: if (!_headEngaged) @@ -418,6 +474,7 @@ private: uint8 _magmaProjectileCount; bool _hasExposedHead; bool _headEngaged; + bool _lowHealthTextTriggered; }; class IsOnVehicleCheck @@ -615,12 +672,13 @@ class spell_magmaw_launch_hook : public AuraScript { Unit* target = GetTarget(); - if (target->HasAura(SPELL_LAUNCH_HOOK_1) /*&&*/ || target->HasAura(SPELL_LAUNCH_HOOK_2)) + if (target->HasAura(SPELL_LAUNCH_HOOK_1) && target->HasAura(SPELL_LAUNCH_HOOK_2)) { if (InstanceScript* instance = target->GetInstanceScript()) if (Creature* magmaw = instance->GetCreature(DATA_MAGMAW)) magmaw->AI()->DoAction(ACTION_IMPALE_MAGMAW); + target->RemoveAllAuras(); target->CastSpell(target, SPELL_CHAIN_VISUAL_1); target->CastSpell(target, SPELL_CHAIN_VISUAL_2); } @@ -632,6 +690,44 @@ class spell_magmaw_launch_hook : public AuraScript } }; +class spell_magmaw_eject_passenger_1 : public SpellScript +{ + PrepareSpellScript(spell_magmaw_eject_passenger_1); + + void EjectPassenger(SpellEffIndex /*effIndex*/) + { + if (Vehicle* vehicle = GetHitUnit()->GetVehicleKit()) + { + if (Unit* passenger = vehicle->GetPassenger(SEAT_PINCER)) + passenger->_ExitVehicle(&MagmawVehicleExitPos); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_magmaw_eject_passenger_1::EjectPassenger, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_magmaw_eject_passenger_3 : public SpellScript +{ + PrepareSpellScript(spell_magmaw_eject_passenger_3); + + void EjectPassenger(SpellEffIndex /*effIndex*/) + { + if (Vehicle* vehicle = GetHitUnit()->GetVehicleKit()) + { + if (Unit* passenger = vehicle->GetPassenger(SEAT_MANGLE)) + passenger->_ExitVehicle(&MagmawVehicleExitPos); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_magmaw_eject_passenger_3::EjectPassenger, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_boss_magmaw() { RegisterBlackwingDescentCreatureAI(boss_magmaw); @@ -641,4 +737,6 @@ void AddSC_boss_magmaw() RegisterSpellScript(spell_magmaw_pillar_of_flame_forcecast); RegisterSpellScript(spell_magmaw_ride_vehicle); RegisterAuraScript(spell_magmaw_launch_hook); + RegisterSpellScript(spell_magmaw_eject_passenger_1); + RegisterSpellScript(spell_magmaw_eject_passenger_3); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/instance_blackwing_descent.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/instance_blackwing_descent.cpp index b6fa50ac17d..63744ce8d4c 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/instance_blackwing_descent.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/instance_blackwing_descent.cpp @@ -23,8 +23,9 @@ ObjectData const creatureData[] = { - { BOSS_MAGMAW, DATA_MAGMAW }, - { 0, 0 }// END + { BOSS_MAGMAW, DATA_MAGMAW }, + { NPC_NEFARIAN_MAGMAW, DATA_NEFARIAN_MAGMAW }, + { 0, 0 } // END }; ObjectData const gameobjectData[] = diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 8abe7df73ff..25cb637c389 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -3836,45 +3836,6 @@ class spell_gen_eject_passenger : public SpellScriptLoader } }; - -class spell_gen_eject_passenger_1 : public SpellScript -{ - PrepareSpellScript(spell_gen_eject_passenger_1); - - void EjectPassenger(SpellEffIndex /*effIndex*/) - { - if (Vehicle* vehicle = GetHitUnit()->GetVehicleKit()) - { - if (Unit* passenger = vehicle->GetPassenger(0)) - passenger->ExitVehicle(); - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_gen_eject_passenger_1::EjectPassenger, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } -}; - -class spell_gen_eject_passenger_3 : public SpellScript -{ - PrepareSpellScript(spell_gen_eject_passenger_3); - - void EjectPassenger(SpellEffIndex /*effIndex*/) - { - if (Vehicle* vehicle = GetHitUnit()->GetVehicleKit()) - { - if (Unit* passenger = vehicle->GetPassenger(2)) - passenger->ExitVehicle(); - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_gen_eject_passenger_3::EjectPassenger, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } -}; - enum GMFreeze { SPELL_GM_FREEZE = 9454 @@ -5022,8 +4983,6 @@ void AddSC_generic_spell_scripts() new spell_gen_whisper_gulch_yogg_saron_whisper(); new spell_gen_eject_all_passengers(); new spell_gen_eject_passenger(); - RegisterSpellScript(spell_gen_eject_passenger_1); - RegisterSpellScript(spell_gen_eject_passenger_3); new spell_gen_gm_freeze(); new spell_gen_stand(); new spell_gen_mixology_bonus();