Scripts/BWD: use sniffed exit coordinate for passenger ejection and initial work on Nefarian's heroic intro

This commit is contained in:
Ovahlord
2019-04-22 19:36:16 +02:00
parent 6af3c166a0
commit 433bd5a1bb
5 changed files with 163 additions and 89 deletions

View File

@@ -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);

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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[] =

View File

@@ -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();