From 78384368ba57c78732cd043f3c96c9a8415dde92 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 9 Apr 2023 16:26:35 -0300 Subject: [PATCH] fix(Scripts/Steamvault): Rework Mekgineer Steamrigger (#15896) --- .../rev_1681055530554169200.sql | 16 ++ .../game/AI/SmartScripts/SmartScriptMgr.h | 2 +- .../SteamVault/boss_mekgineer_steamrigger.cpp | 176 ++++++------------ 3 files changed, 77 insertions(+), 117 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1681055530554169200.sql diff --git a/data/sql/updates/pending_db_world/rev_1681055530554169200.sql b/data/sql/updates/pending_db_world/rev_1681055530554169200.sql new file mode 100644 index 000000000..0778bd13e --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1681055530554169200.sql @@ -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); diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 3e28906b0..0c1385ea8 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -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 diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp index 6f29d3544..25ef2b8e7 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp @@ -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); }