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

View File

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

View File

@@ -1428,7 +1428,7 @@ enum SMARTAI_TARGETS
SMART_TARGET_SUMMONED_CREATURES = 204, // Entry
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

View File

@@ -33,20 +33,22 @@ enum MekgineerSteamrigger
SPELL_REPAIR_N = 31532,
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,
EVENT_CHECK_HP50 = 2,
EVENT_CHECK_HP75 = 3,
EVENT_SPELL_SHRINK = 4,
EVENT_SPELL_SAW = 5,
EVENT_SPELL_NET = 6,
EVENT_ENRAGE = 7
NPC_STREAMRIGGER_MECHANIC = 17951
};
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
{
@@ -57,131 +59,73 @@ struct boss_mekgineer_steamrigger : public BossAI
void KilledUnit(Unit* victim) override
{
if (victim->IsPlayer())
{
Talk(SAY_SLAY);
}
}
void JustEngagedWith(Unit* /*who*/) override
{
Talk(SAY_AGGRO);
_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()
{
Talk(SAY_MECHANICS);
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);
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 (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);
}
void JustSummoned(Creature* cr) override
{
cr->GetMotionMaster()->MoveFollow(me, 0.0f, 0.0f);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
switch (uint32 eventId = events.ExecuteEvent())
scheduler.Schedule(26550ms, [this](TaskContext context)
{
DoCastVictim(SPELL_SUPER_SHRINK_RAY);
context.Repeat(35100ms, 54100ms);
}).Schedule(6050ms, 17650ms, [this](TaskContext context)
{
if (DoCastRandomTarget(SPELL_SAW_BLADE, 1) != SPELL_CAST_OK)
{
DoCastVictim(SPELL_SAW_BLADE);
}
context.Repeat(6050ms, 17650ms);
}).Schedule(14400ms, [this](TaskContext context)
{
DoCastRandomTarget(SPELL_ELECTRIFIED_NET);
context.Repeat(21800ms, 34200ms);
}).Schedule(5min, [this](TaskContext /*context*/)
{
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);
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 UpdateAI(uint32 diff) override
void JustSummoned(Creature* creature) override
{
if (!UpdateVictim())
return;
_scheduler.Update(diff,
std::bind(&BossAI::DoMeleeAttackIfReady, this));
if (creature->GetEntry() == NPC_STREAMRIGGER_MECHANIC)
{
creature->GetMotionMaster()->MoveFollow(me, 5.0f, 0.0f);
}
}
private:
TaskScheduler _scheduler;
};
void AddSC_boss_mekgineer_steamrigger()
{
RegisterSteamvaultCreatureAI(boss_mekgineer_steamrigger);
RegisterSteamvaultCreatureAI(npc_steamrigger_mechanic);
}