From c3e1d7a9cc210e98b2cb45f6b5fda70527b189ac Mon Sep 17 00:00:00 2001 From: killerwife Date: Sat, 15 Jul 2023 16:41:23 +0200 Subject: [PATCH] SV: Port Mekgineer to CombatAI, spell lists, bct and spell scripts https://github.com/cmangos/issues/issues/3444 --- sql/base/dbc/cmangos_fixes/Spell.sql | 4 + sql/scriptdev2/scriptdev2.sql | 10 - sql/scriptdev2/spell.sql | 1 + .../boss_mekgineer_steamrigger.cpp | 245 ++++++------------ 4 files changed, 81 insertions(+), 179 deletions(-) diff --git a/sql/base/dbc/cmangos_fixes/Spell.sql b/sql/base/dbc/cmangos_fixes/Spell.sql index ec175bd1c7..727145b3f8 100644 --- a/sql/base/dbc/cmangos_fixes/Spell.sql +++ b/sql/base/dbc/cmangos_fixes/Spell.sql @@ -3052,6 +3052,10 @@ INSERT INTO spell_template(Id, SchoolMask, Category, Dispel, Mechanic, Attribute INSERT INTO spell_template(Id, SchoolMask, Category, Dispel, Mechanic, Attributes, AttributesEx, AttributesEx2, AttributesEx3, AttributesEx4, AttributesEx5, Stances, StancesNot, Targets, TargetCreatureType, RequiresSpellFocus, CasterAuraState, TargetAuraState, CasterAuraStateNot, TargetAuraStateNot, CastingTimeIndex, RecoveryTime, CategoryRecoveryTime, InterruptFlags, AuraInterruptFlags, ChannelInterruptFlags, procFlags, procChance, procCharges, maxLevel, baseLevel, spellLevel, DurationIndex, powerType, manaCost, manaCostPerLevel, manaPerSecond, manaPerSecondPerLevel, rangeIndex, speed, StackAmount, Totem1, Totem2, Reagent1, Reagent2, Reagent3, Reagent4, Reagent5, Reagent6, Reagent7, Reagent8, ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8, EquippedItemClass, EquippedItemSubClassMask, EquippedItemInventoryTypeMask, Effect1, Effect2, Effect3, EffectDieSides1, EffectDieSides2, EffectDieSides3, EffectBaseDice1, EffectBaseDice2, EffectBaseDice3, EffectDicePerLevel1, EffectDicePerLevel2, EffectDicePerLevel3, EffectRealPointsPerLevel1, EffectRealPointsPerLevel2, EffectRealPointsPerLevel3, EffectBasePoints1, EffectBasePoints2, EffectBasePoints3, EffectMechanic1, EffectMechanic2, EffectMechanic3, EffectImplicitTargetA1, EffectImplicitTargetA2, EffectImplicitTargetA3, EffectImplicitTargetB1, EffectImplicitTargetB2, EffectImplicitTargetB3, EffectRadiusIndex1, EffectRadiusIndex2, EffectRadiusIndex3, EffectApplyAuraName1, EffectApplyAuraName2, EffectApplyAuraName3, EffectAmplitude1, EffectAmplitude2, EffectAmplitude3, EffectMultipleValue1, EffectMultipleValue2, EffectMultipleValue3, EffectChainTarget1, EffectChainTarget2, EffectChainTarget3, EffectItemType1, EffectItemType2, EffectItemType3, EffectMiscValue1, EffectMiscValue2, EffectMiscValue3, EffectMiscValueB1, EffectMiscValueB2, EffectMiscValueB3, EffectTriggerSpell1, EffectTriggerSpell2, EffectTriggerSpell3, EffectPointsPerComboPoint1, EffectPointsPerComboPoint2, EffectPointsPerComboPoint3, SpellVisual, SpellIconID, activeIconID, spellPriority, SpellName, SpellName2, SpellName3, SpellName4, SpellName5, SpellName6, SpellName7, SpellName8, ManaCostPercentage, StartRecoveryCategory, StartRecoveryTime, MaxTargetLevel, SpellFamilyName, SpellFamilyFlags, MaxAffectedTargets, DmgClass, PreventionType, DmgMultiplier1, DmgMultiplier2, DmgMultiplier3, TotemCategory1, TotemCategory2, AreaId) VALUES ('38756', '1', '0', '0', '0', '256', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '101', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-1', '0', '0', '77', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '458', '0', '0', 'Summon Spore Strider', '', '', '', '', '', '', '', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0'); +-- Steamrigger Main gnome summon spell +INSERT INTO spell_template(Id, SchoolMask, Category, Dispel, Mechanic, Attributes, AttributesEx, AttributesEx2, AttributesEx3, AttributesEx4, AttributesEx5, Stances, StancesNot, Targets, TargetCreatureType, RequiresSpellFocus, CasterAuraState, TargetAuraState, CasterAuraStateNot, TargetAuraStateNot, CastingTimeIndex, RecoveryTime, CategoryRecoveryTime, InterruptFlags, AuraInterruptFlags, ChannelInterruptFlags, procFlags, procChance, procCharges, maxLevel, baseLevel, spellLevel, DurationIndex, powerType, manaCost, manaCostPerLevel, manaPerSecond, manaPerSecondPerLevel, rangeIndex, speed, StackAmount, Totem1, Totem2, Reagent1, Reagent2, Reagent3, Reagent4, Reagent5, Reagent6, Reagent7, Reagent8, ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8, EquippedItemClass, EquippedItemSubClassMask, EquippedItemInventoryTypeMask, Effect1, Effect2, Effect3, EffectDieSides1, EffectDieSides2, EffectDieSides3, EffectBaseDice1, EffectBaseDice2, EffectBaseDice3, EffectDicePerLevel1, EffectDicePerLevel2, EffectDicePerLevel3, EffectRealPointsPerLevel1, EffectRealPointsPerLevel2, EffectRealPointsPerLevel3, EffectBasePoints1, EffectBasePoints2, EffectBasePoints3, EffectMechanic1, EffectMechanic2, EffectMechanic3, EffectImplicitTargetA1, EffectImplicitTargetA2, EffectImplicitTargetA3, EffectImplicitTargetB1, EffectImplicitTargetB2, EffectImplicitTargetB3, EffectRadiusIndex1, EffectRadiusIndex2, EffectRadiusIndex3, EffectApplyAuraName1, EffectApplyAuraName2, EffectApplyAuraName3, EffectAmplitude1, EffectAmplitude2, EffectAmplitude3, EffectMultipleValue1, EffectMultipleValue2, EffectMultipleValue3, EffectChainTarget1, EffectChainTarget2, EffectChainTarget3, EffectItemType1, EffectItemType2, EffectItemType3, EffectMiscValue1, EffectMiscValue2, EffectMiscValue3, EffectMiscValueB1, EffectMiscValueB2, EffectMiscValueB3, EffectTriggerSpell1, EffectTriggerSpell2, EffectTriggerSpell3, EffectPointsPerComboPoint1, EffectPointsPerComboPoint2, EffectPointsPerComboPoint3, SpellVisual, SpellIconID, activeIconID, spellPriority, SpellName, SpellName2, SpellName3, SpellName4, SpellName5, SpellName6, SpellName7, SpellName8, ManaCostPercentage, StartRecoveryCategory, StartRecoveryTime, MaxTargetLevel, SpellFamilyName, SpellFamilyFlags, MaxAffectedTargets, DmgClass, PreventionType, DmgMultiplier1, DmgMultiplier2, DmgMultiplier3, TotemCategory1, TotemCategory2, AreaId) VALUES +('31531', '1', '0', '0', '0', '256', '268435456', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '101', '0', '0', '0', '0', '27', '0', '0', '0', '0', '0', '4', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-1', '0', '0', '6', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '23', '0', '0', '3000', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', 'Summon Gnomes', '', '', '', '', '', '', '', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0'); + -- ============================================================ -- WOTLK section -- ============================================================ diff --git a/sql/scriptdev2/scriptdev2.sql b/sql/scriptdev2/scriptdev2.sql index d9242123b8..74ac95ebc7 100644 --- a/sql/scriptdev2/scriptdev2.sql +++ b/sql/scriptdev2/scriptdev2.sql @@ -4103,16 +4103,6 @@ INSERT INTO script_texts (entry,content_default,sound,type,language,emote,broadc INSERT INTO script_texts (entry,content_default,sound,type,language,emote,broadcast_text_id,comment) VALUES ('-1545000','Surge forth my pets!','10360','1','0','0','0','thespia SAY_SUMMON'), -('-1545007','I''m bringin'' the pain!','10367','1','0','0','17719','mekgineer SAY_MECHANICS'), -('-1545008','You''re in for a world o'' hurt!','10368','1','0','0','17716','mekgineer SAY_AGGRO_1'), -('-1545009','Eat hot metal, scumbag!','10369','1','0','0','17717','mekgineer SAY_AGGRO_2'), -('-1545010','I''ll come over there!','10370','1','0','0','17718','mekgineer SAY_AGGRO_3'), -('-1545011','I''m bringin'' the pain!','10371','1','0','0','17719','mekgineer SAY_AGGRO_4'), -('-1545012','You just got served, punk!','10372','1','0','0','17720','mekgineer SOUND_SLAY_1'), -('-1545013','I own you!','10373','1','0','0','17721','mekgineer SOUND_SLAY_2'), -('-1545014','Have fun dyin'', cupcake!','10374','1','0','0','17722','mekgineer SOUND_SLAY_3'), -('-1545015','Mommy.','10375','1','0','0','17723','mekgineer SAY_DEATH'), - ('-1545016','You deem yourselves worthy simply because you bested my guards? Our work here will not be compromised!','10390','1','0','0','17724','kalithresh SAY_INTRO'), ('-1545017','This is not nearly over...','10391','1','0','0','17725','kalithresh SAY_REGEN'), ('-1545018','Your head will roll!','10392','1','0','0','17726','kalithresh SAY_AGGRO1'), diff --git a/sql/scriptdev2/spell.sql b/sql/scriptdev2/spell.sql index 431e278e88..6aaac0715e 100644 --- a/sql/scriptdev2/spell.sql +++ b/sql/scriptdev2/spell.sql @@ -279,6 +279,7 @@ INSERT INTO spell_scripts(Id, ScriptName) VALUES (31617,'spell_raise_dead_hyjal'), (31624,'spell_raise_dead_hyjal'), (31625,'spell_raise_dead_hyjal'), +(31531,'spell_summon_gnomes'), (35781,'spell_countercharge'), (37866,'spell_summon_water_globules'), (38028,'spell_watery_grave'), diff --git a/src/game/AI/ScriptDevAI/scripts/outland/coilfang_reservoir/steam_vault/boss_mekgineer_steamrigger.cpp b/src/game/AI/ScriptDevAI/scripts/outland/coilfang_reservoir/steam_vault/boss_mekgineer_steamrigger.cpp index 947fd63412..273fdd5c2e 100644 --- a/src/game/AI/ScriptDevAI/scripts/outland/coilfang_reservoir/steam_vault/boss_mekgineer_steamrigger.cpp +++ b/src/game/AI/ScriptDevAI/scripts/outland/coilfang_reservoir/steam_vault/boss_mekgineer_steamrigger.cpp @@ -27,30 +27,34 @@ mob_steamrigger_mechanic EndContentData */ #include "AI/ScriptDevAI/include/sc_common.h" +#include "AI/ScriptDevAI/base/CombatAI.h" #include "steam_vault.h" enum { - SAY_MECHANICS = -1545007, - SAY_AGGRO_1 = -1545008, - SAY_AGGRO_2 = -1545009, - SAY_AGGRO_3 = -1545010, - SAY_AGGRO_4 = -1545011, - SAY_SLAY_1 = -1545012, - SAY_SLAY_2 = -1545013, - SAY_SLAY_3 = -1545014, - SAY_DEATH = -1545015, + SAY_MECHANICS = 14602, + SAY_AGGRO_1 = 17716, + SAY_AGGRO_2 = 17717, + SAY_AGGRO_3 = 17718, + SAY_AGGRO_4 = 17719, + SAY_SLAY_1 = 17720, + SAY_SLAY_2 = 17721, + SAY_SLAY_3 = 17722, + SAY_DEATH = 17723, SPELL_SUPER_SHRINK_RAY = 31485, SPELL_SAW_BLADE = 31486, SPELL_ELECTRIFIED_NET = 35107, SPELL_BERSERK = 26662, + SPELL_INVIS_AND_STEALTH_DET = 18950, + NPC_STEAMRIGGER_MECHANIC = 17951, SPELL_SUMMON_GNOME_1 = 31528, SPELL_SUMMON_GNOME_2 = 31529, SPELL_SUMMON_GNOME_3 = 31530, + SPELL_SUMMON_GNOMES = 31531, // Mechanic spells SPELL_DISPEL_MAGIC = 17201, @@ -58,89 +62,70 @@ enum SPELL_REPAIR_H = 37936, }; -struct SummonLocation -{ - float m_fX, m_fY, m_fZ, m_ori; -}; +static const uint32 gnomeSpells[] = { SPELL_SUMMON_GNOME_1, SPELL_SUMMON_GNOME_2, SPELL_SUMMON_GNOME_3 }; -// Spawn locations used in spell_target_position -static const SummonLocation aSteamriggerSpawnLocs[] = +enum MekgineerActions { - { -316.101f, -166.444f, -7.66f, 2.5f }, // TODO: this orientation is guesswork - { -348.497f, -161.719f, -7.66f, 0.3621517f }, - { -331.161f, -112.212f, -7.66f, 5.259035f }, + MEKGINEER_SUMMON_GNOMES, + MEKGINEER_ACTION_MAX, + MEKGINEER_SPAWN_GNOME }; -static const uint32 gnomeSpells[] = { SPELL_SUMMON_GNOME_1, SPELL_SUMMON_GNOME_2, SPELL_SUMMON_GNOME_3 }; - -struct boss_mekgineer_steamriggerAI : public ScriptedAI +struct boss_mekgineer_steamriggerAI : public CombatAI { - boss_mekgineer_steamriggerAI(Creature* pCreature) : ScriptedAI(pCreature) + boss_mekgineer_steamriggerAI(Creature* creature) : CombatAI(creature, MEKGINEER_ACTION_MAX), + m_instance(static_cast(creature->GetInstanceData())), m_isRegularMode(creature->GetMap()->IsRegularDifficulty()) { - m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); - m_bIsRegularMode = pCreature->GetMap()->IsRegularDifficulty(); - Reset(); + AddOnKillText(SAY_SLAY_1, SAY_SLAY_2, SAY_SLAY_3); + AddTimerlessCombatAction(MEKGINEER_SUMMON_GNOMES, true); + if (!m_isRegularMode) + AddCustomAction(MEKGINEER_SPAWN_GNOME, 20000u, [&]() + { + m_creature->CastSpell(nullptr, gnomeSpells[urand(0, 2)], TRIGGERED_OLD_TRIGGERED); + }, TIMER_COMBAT_COMBAT); } - ScriptedInstance* m_pInstance; - bool m_bIsRegularMode; + ScriptedInstance* m_instance; + bool m_isRegularMode; - uint32 m_uiShrinkTimer; - uint32 m_uiSawBladeTimer; - uint32 m_uiElectrifiedNetTimer; - uint32 m_uiMechanicTimer; - uint32 m_uiBerserkTimer; - uint8 m_uiMechanicPhaseCount; + uint8 m_mechanicPhaseCount; GuidVector m_spawns; void Reset() override { - m_uiShrinkTimer = 20000; - m_uiSawBladeTimer = 15000; - m_uiElectrifiedNetTimer = 10000; - m_uiMechanicTimer = 20000; - m_uiMechanicPhaseCount = 1; - m_uiBerserkTimer = 300000; + CombatAI::Reset(); + DoCastSpellIfCan(nullptr, SPELL_INVIS_AND_STEALTH_DET, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT); + m_mechanicPhaseCount = 1; DespawnGuids(m_spawns); } void JustReachedHome() override { - if (m_pInstance) - m_pInstance->SetData(TYPE_MEKGINEER_STEAMRIGGER, FAIL); + if (m_instance) + m_instance->SetData(TYPE_MEKGINEER_STEAMRIGGER, FAIL); } void JustDied(Unit* /*killer*/) override { - DoScriptText(SAY_DEATH, m_creature); - - if (m_pInstance) - m_pInstance->SetData(TYPE_MEKGINEER_STEAMRIGGER, DONE); - } + DoBroadcastText(SAY_DEATH, m_creature); - void KilledUnit(Unit* /*victim*/) override - { - switch (urand(0, 2)) - { - case 0: DoScriptText(SAY_SLAY_1, m_creature); break; - case 1: DoScriptText(SAY_SLAY_2, m_creature); break; - case 2: DoScriptText(SAY_SLAY_3, m_creature); break; - } + if (m_instance) + m_instance->SetData(TYPE_MEKGINEER_STEAMRIGGER, DONE); } void Aggro(Unit* /*who*/) override { switch (urand(0, 2)) { - case 0: DoScriptText(SAY_AGGRO_1, m_creature); break; - case 1: DoScriptText(SAY_AGGRO_2, m_creature); break; - case 2: DoScriptText(SAY_AGGRO_3, m_creature); break; + case 0: DoBroadcastText(SAY_AGGRO_1, m_creature); break; + case 1: DoBroadcastText(SAY_AGGRO_2, m_creature); break; + case 2: DoBroadcastText(SAY_AGGRO_3, m_creature); break; } - if (m_pInstance) - m_pInstance->SetData(TYPE_MEKGINEER_STEAMRIGGER, IN_PROGRESS); + if (m_instance) + m_instance->SetData(TYPE_MEKGINEER_STEAMRIGGER, IN_PROGRESS); } void JustSummoned(Creature* summoned) override @@ -152,142 +137,62 @@ struct boss_mekgineer_steamriggerAI : public ScriptedAI } } - // Wrapper to summon three Mechanics - void SummonMechanichs() + void ExecuteAction(uint32 action) override { - DoScriptText(SAY_MECHANICS, m_creature); - - m_creature->CastSpell(nullptr, SPELL_SUMMON_GNOME_1, TRIGGERED_OLD_TRIGGERED); - m_creature->CastSpell(nullptr, SPELL_SUMMON_GNOME_2, TRIGGERED_OLD_TRIGGERED); - m_creature->CastSpell(nullptr, SPELL_SUMMON_GNOME_3, TRIGGERED_OLD_TRIGGERED); - } - - void UpdateAI(const uint32 uiDiff) override - { - if (!m_creature->SelectHostileTarget() || !m_creature->GetVictim()) - return; - - if (m_uiShrinkTimer < uiDiff) - { - if (DoCastSpellIfCan(m_creature, SPELL_SUPER_SHRINK_RAY) == CAST_OK) - m_uiShrinkTimer = 20000; - } - else - m_uiShrinkTimer -= uiDiff; - - if (m_uiSawBladeTimer < uiDiff) - { - Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1, nullptr, SELECT_FLAG_PLAYER); - if (!pTarget) - pTarget = m_creature->GetVictim(); - - if (pTarget) - { - if (DoCastSpellIfCan(pTarget, SPELL_SAW_BLADE) == CAST_OK) - m_uiSawBladeTimer = 15000; - } - } - else - m_uiSawBladeTimer -= uiDiff; - - if (m_uiElectrifiedNetTimer < uiDiff) + if (action == MEKGINEER_SUMMON_GNOMES) { - if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0, nullptr, SELECT_FLAG_PLAYER)) + if (m_creature->GetHealthPercent() < (100 - 25 * m_mechanicPhaseCount)) { - if (DoCastSpellIfCan(pTarget, SPELL_ELECTRIFIED_NET) == CAST_OK) - m_uiElectrifiedNetTimer = 10000; - } - } - else - m_uiElectrifiedNetTimer -= uiDiff; - - // On Heroic mode summon a mechanic at each 20 secs - if (!m_bIsRegularMode) - { - if (m_uiBerserkTimer <= uiDiff) - { - if (DoCastSpellIfCan(m_creature, SPELL_BERSERK, CAST_INTERRUPT_PREVIOUS) == CAST_OK) + if (DoCastSpellIfCan(nullptr, SPELL_SUMMON_GNOMES) == CAST_OK) { - m_uiBerserkTimer = 0; + DoBroadcastText(SAY_MECHANICS, m_creature); + ++m_mechanicPhaseCount; } } - else - m_uiBerserkTimer -= uiDiff; - - if (m_uiMechanicTimer < uiDiff) - { - m_creature->CastSpell(nullptr, gnomeSpells[urand(0, 2)], TRIGGERED_OLD_TRIGGERED); - m_uiMechanicTimer = 20000; - } - else - m_uiMechanicTimer -= uiDiff; - } - - if (m_creature->GetHealthPercent() < (100 - 25 * m_uiMechanicPhaseCount)) - { - SummonMechanichs(); - ++m_uiMechanicPhaseCount; } - - DoMeleeAttackIfReady(); } }; -struct mob_steamrigger_mechanicAI : public ScriptedAI +struct mob_steamrigger_mechanicAI : public CombatAI { - mob_steamrigger_mechanicAI(Creature* pCreature) : ScriptedAI(pCreature) - { - m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); - m_bIsRegularMode = pCreature->GetMap()->IsRegularDifficulty(); - Reset(); - } - - ScriptedInstance* m_pInstance; - bool m_bIsRegularMode; - - bool m_bCanStartAttack; - - void Reset() override + mob_steamrigger_mechanicAI(Creature* creature) : CombatAI(creature, 0), + m_instance(static_cast(creature->GetInstanceData())), m_isRegularMode(creature->GetMap()->IsRegularDifficulty()) { - m_bCanStartAttack = false; + SetReactState(REACT_DEFENSIVE); } - void AttackStart(Unit* pWho) override - { - // Trigger attack only for players - if (pWho->GetTypeId() != TYPEID_PLAYER) - return; - - m_creature->InterruptNonMeleeSpells(false); - ScriptedAI::AttackStart(pWho); - m_bCanStartAttack = true; - } + ScriptedInstance* m_instance; + bool m_isRegularMode; - void MoveInLineOfSight(Unit* pWho) override + void MoveInLineOfSight(Unit* who) override { - // Return if already in combat - if (m_bCanStartAttack) - return; - // Don't attack players unless attacked - if (pWho->GetEntry() == NPC_STEAMRIGGER) + if (who->GetEntry() == NPC_STEAMRIGGER) { - if (m_pInstance->GetData(TYPE_MEKGINEER_STEAMRIGGER) == IN_PROGRESS) + if (m_instance->GetData(TYPE_MEKGINEER_STEAMRIGGER) == IN_PROGRESS) { // Channel the repair spell on Steamrigger // This will also stop creature movement and will allow them to continue to follow the boss after channeling is finished or the boss is out of range - if (m_creature->IsWithinDistInMap(pWho, 2 * INTERACTION_DISTANCE)) - DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_REPAIR : SPELL_REPAIR_H); + if (m_creature->IsWithinDistInMap(who, 2 * INTERACTION_DISTANCE)) + { + DoCastSpellIfCan(m_creature, m_isRegularMode ? SPELL_REPAIR : SPELL_REPAIR_H); + SetReactState(REACT_AGGRESSIVE); + } } } + ScriptedAI::MoveInLineOfSight(who); } +}; - void UpdateAI(const uint32 /*uiDiff*/) override +// 31531 - Summon Gnomes +struct SummonGnomes : public AuraScript +{ + void OnPeriodicTickEnd(Aura* aura) const override { - if (!m_creature->SelectHostileTarget() || !m_creature->GetVictim()) - return; - - DoMeleeAttackIfReady(); + Unit* target = aura->GetTarget(); + target->CastSpell(nullptr, SPELL_SUMMON_GNOME_1, TRIGGERED_OLD_TRIGGERED); + target->CastSpell(nullptr, SPELL_SUMMON_GNOME_2, TRIGGERED_OLD_TRIGGERED); + target->CastSpell(nullptr, SPELL_SUMMON_GNOME_3, TRIGGERED_OLD_TRIGGERED); } }; @@ -302,4 +207,6 @@ void AddSC_boss_mekgineer_steamrigger() pNewScript->Name = "mob_steamrigger_mechanic"; pNewScript->GetAI = &GetNewAIInstance; pNewScript->RegisterSelf(); + + RegisterSpellScript("spell_summon_gnomes"); }