mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-23 18:36:31 +01:00
Scripts/BWD: use sniffed exit coordinate for passenger ejection and initial work on Nefarian's heroic intro
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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[] =
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user