fix(Scripts/Steamvault): Rework Mekgineer Steamrigger (#15896)

This commit is contained in:
Skjalf
2023-04-09 16:26:35 -03:00
committed by GitHub
parent 0581206ce9
commit 78384368ba
3 changed files with 77 additions and 117 deletions
@@ -0,0 +1,16 @@
--
DELETE FROM `spell_target_position` WHERE `ID` IN (31528, 31529, 31530);
INSERT INTO `spell_target_position` (`ID`, `EffectIndex`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `VerifiedBuild`) VALUES
(31528, 0, 545, -316.102, -166.444, -7.66667, 0, 48749),
(31529, 0, 545, -348.497, -161.719, -7.66667, 0, 48749),
(31530, 0, 545, -331.162, -112.213, -7.66667, 0, 48749);
UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = 17951;
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17951) AND (`source_type` = 0) AND (`id` IN (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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(17951, 0, 0, 0, 0, 0, 100, 0, 2000, 2000, 2000, 2000, 0, 11, 31532, 0, 0, 0, 0, 0, 205, 1, 1, 0, 0, 0, 0, 0, 0, 'Steamrigger Mechanic - In Combat - Cast \'Repair\'');
DELETE FROM `spelldifficulty_dbc` WHERE `ID` = 31532;
INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`) VALUES
(31532, 31532, 37936);
@@ -1428,7 +1428,7 @@ enum SMARTAI_TARGETS
SMART_TARGET_SUMMONED_CREATURES = 204, // Entry SMART_TARGET_SUMMONED_CREATURES = 204, // Entry
SMART_TARGET_INSTANCE_STORAGE = 205, // Instance data index, Type (creature (1), gameobject (2)) SMART_TARGET_INSTANCE_STORAGE = 205, // Instance data index, Type (creature (1), gameobject (2))
SMART_TARGET_AC_END = 205 // placeholder SMART_TARGET_AC_END = 206 // placeholder
}; };
struct SmartTarget struct SmartTarget
@@ -33,20 +33,22 @@ enum MekgineerSteamrigger
SPELL_REPAIR_N = 31532, SPELL_REPAIR_N = 31532,
SPELL_REPAIR_H = 37936, SPELL_REPAIR_H = 37936,
NPC_STREAMRIGGER_MECHANIC = 17951, SPELL_SUMMON_MECHANICS_1 = 31528,
SPELL_SUMMON_MECHANICS_2 = 31529,
SPELL_SUMMON_MECHANICS_3 = 31530,
EVENT_CHECK_HP25 = 1, NPC_STREAMRIGGER_MECHANIC = 17951
EVENT_CHECK_HP50 = 2,
EVENT_CHECK_HP75 = 3,
EVENT_SPELL_SHRINK = 4,
EVENT_SPELL_SAW = 5,
EVENT_SPELL_NET = 6,
EVENT_ENRAGE = 7
}; };
struct boss_mekgineer_steamrigger : public BossAI struct boss_mekgineer_steamrigger : public BossAI
{ {
boss_mekgineer_steamrigger(Creature* creature) : BossAI(creature, DATA_MEKGINEER_STEAMRIGGER) { } boss_mekgineer_steamrigger(Creature* creature) : BossAI(creature, DATA_MEKGINEER_STEAMRIGGER)
{
scheduler.SetValidator([this]
{
return !me->HasUnitState(UNIT_STATE_CASTING);
});
}
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
@@ -57,131 +59,73 @@ struct boss_mekgineer_steamrigger : public BossAI
void KilledUnit(Unit* victim) override void KilledUnit(Unit* victim) override
{ {
if (victim->IsPlayer()) if (victim->IsPlayer())
{
Talk(SAY_SLAY); Talk(SAY_SLAY);
}
} }
void JustEngagedWith(Unit* /*who*/) override void JustEngagedWith(Unit* /*who*/) override
{ {
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
_JustEngagedWith(); _JustEngagedWith();
events.ScheduleEvent(EVENT_SPELL_SHRINK, 26550);
events.ScheduleEvent(EVENT_SPELL_SAW, 6050, 17650);
events.ScheduleEvent(EVENT_SPELL_NET, 14400);
events.ScheduleEvent(EVENT_ENRAGE, 300000);
events.ScheduleEvent(EVENT_CHECK_HP75, 5000);
events.ScheduleEvent(EVENT_CHECK_HP50, 5000);
events.ScheduleEvent(EVENT_CHECK_HP25, 5000);
}
void SummonMechanics() scheduler.Schedule(26550ms, [this](TaskContext context)
{ {
Talk(SAY_MECHANICS); DoCastVictim(SPELL_SUPER_SHRINK_RAY);
context.Repeat(35100ms, 54100ms);
me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX() + 15.0f, me->GetPositionY() + 15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); }).Schedule(6050ms, 17650ms, [this](TaskContext context)
me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX() - 15.0f, me->GetPositionY() + 15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); {
me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX() - 15.0f, me->GetPositionY() - 15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); if (DoCastRandomTarget(SPELL_SAW_BLADE, 1) != SPELL_CAST_OK)
if (urand(0, 1)) {
me->SummonCreature(NPC_STREAMRIGGER_MECHANIC, me->GetPositionX() + 15.0f, me->GetPositionY() - 15.0f, me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); DoCastVictim(SPELL_SAW_BLADE);
} }
void JustSummoned(Creature* cr) override context.Repeat(6050ms, 17650ms);
{ }).Schedule(14400ms, [this](TaskContext context)
cr->GetMotionMaster()->MoveFollow(me, 0.0f, 0.0f); {
} DoCastRandomTarget(SPELL_ELECTRIFIED_NET);
context.Repeat(21800ms, 34200ms);
void UpdateAI(uint32 diff) override }).Schedule(5min, [this](TaskContext /*context*/)
{
if (!UpdateVictim())
return;
events.Update(diff);
switch (uint32 eventId = events.ExecuteEvent())
{ {
case EVENT_SPELL_SHRINK:
me->CastSpell(me->GetVictim(), SPELL_SUPER_SHRINK_RAY, false);
events.Repeat(35100ms, 54100ms);
break;
case EVENT_SPELL_SAW:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1))
me->CastSpell(target, SPELL_SAW_BLADE, false);
else
me->CastSpell(me->GetVictim(), SPELL_SAW_BLADE, false);
events.Repeat(6050ms, 17650ms);
break;
case EVENT_SPELL_NET:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
me->CastSpell(target, SPELL_ELECTRIFIED_NET, false);
events.Repeat(21800ms, 34200ms);
break;
case EVENT_ENRAGE:
DoCastSelf(SPELL_ENRAGE, true); DoCastSelf(SPELL_ENRAGE, true);
break;
case EVENT_CHECK_HP25:
case EVENT_CHECK_HP50:
case EVENT_CHECK_HP75:
if (me->HealthBelowPct(eventId * 25))
{
SummonMechanics();
return;
}
events.RepeatEvent(2000);
break;
}
DoMeleeAttackIfReady();
}
};
struct npc_steamrigger_mechanic : public ScriptedAI
{
npc_steamrigger_mechanic(Creature* creature) : ScriptedAI(creature) { }
void Reset() override
{
_scheduler.CancelAll();
}
void JustEngagedWith(Unit* victim) override
{
ScriptedAI::JustEngagedWith(victim);
_scheduler.Schedule(2s, [this](TaskContext context)
{
if (InstanceScript* instance = me->GetInstanceScript())
{
if (Creature* boss = instance->GetCreature(DATA_MEKGINEER_STEAMRIGGER))
{
if (me->IsWithinDistInMap(boss, 13.0f))
{
if (!me->HasUnitState(UNIT_STATE_CASTING))
{
me->CastSpell(me, DUNGEON_MODE(SPELL_REPAIR_N, SPELL_REPAIR_H), false);
}
}
}
}
context.Repeat();
}); });
if (!IsHeroic())
{
ScheduleHealthCheckEvent({ 75, 50, 25 }, [&] {
Talk(SAY_MECHANICS);
for (auto const& spell : { SPELL_SUMMON_MECHANICS_1, SPELL_SUMMON_MECHANICS_2, SPELL_SUMMON_MECHANICS_3 })
{
DoCastAOE(spell, true);
}
});
}
else
{
scheduler.Schedule(15600ms, [this](TaskContext context)
{
if (roll_chance_i(15))
{
Talk(SAY_MECHANICS);
}
DoCastAOE(RAND(SPELL_SUMMON_MECHANICS_1, SPELL_SUMMON_MECHANICS_2, SPELL_SUMMON_MECHANICS_3), true);
context.Repeat(15600ms, 25400ms);
});
}
} }
void MoveInLineOfSight(Unit* /*who*/) override {} void JustSummoned(Creature* creature) override
void UpdateAI(uint32 diff) override
{ {
if (!UpdateVictim()) if (creature->GetEntry() == NPC_STREAMRIGGER_MECHANIC)
return; {
creature->GetMotionMaster()->MoveFollow(me, 5.0f, 0.0f);
_scheduler.Update(diff, }
std::bind(&BossAI::DoMeleeAttackIfReady, this));
} }
private:
TaskScheduler _scheduler;
}; };
void AddSC_boss_mekgineer_steamrigger() void AddSC_boss_mekgineer_steamrigger()
{ {
RegisterSteamvaultCreatureAI(boss_mekgineer_steamrigger); RegisterSteamvaultCreatureAI(boss_mekgineer_steamrigger);
RegisterSteamvaultCreatureAI(npc_steamrigger_mechanic);
} }