diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index 64678db31..72a4cc615 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -633,6 +633,7 @@ void BossAI::_Reset() me->ResetLootMode(); events.Reset(); scheduler.CancelAll(); + me->m_Events.KillAllEvents(false); summons.DespawnAll(); ClearUniqueTimedEventsDone(); _healthCheckEvents.clear(); @@ -787,6 +788,20 @@ void BossAI::ScheduleHealthCheckEvent(std::initializer_list healthPct, st _nextHealthCheck = _healthCheckEvents.front(); } +void BossAI::ScheduleEnrageTimer(uint32 spellId, Milliseconds timer, uint8 textId /*= 0*/) +{ + me->m_Events.AddEventAtOffset([this, spellId, textId] + { + if (!me->IsAlive()) + return; + + if (textId) + Talk(textId); + + DoCastSelf(spellId, true); + }, timer); +} + // WorldBossAI - for non-instanced bosses WorldBossAI::WorldBossAI(Creature* creature) : diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index d5f7f729f..9cb004a89 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -485,6 +485,12 @@ public: void ScheduleHealthCheckEvent(uint32 healthPct, std::function exec); void ScheduleHealthCheckEvent(std::initializer_list healthPct, std::function exec); + // @brief Casts the spell after the fixed time and says the text id if provided. Timer will run even if the creature is casting or out of combat. + // @param spellId The spell to cast. + // @param timer The time to wait before casting the spell. + // @param textId The text id to say. + void ScheduleEnrageTimer(uint32 spellId, Milliseconds timer, uint8 textId = 0); + // Hook used to execute events scheduled into EventMap without the need // to override UpdateAI // note: You must re-schedule the event within this method if the event diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp index 75de3d41c..4a325c5ef 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp @@ -83,7 +83,6 @@ struct boss_sacrolash : public BossAI _isSisterDead = false; BossAI::Reset(); me->SetLootMode(0); - me->m_Events.KillAllEvents(false); } void DoAction(int32 param) override @@ -124,10 +123,7 @@ struct boss_sacrolash : public BossAI if (alythess->IsAlive() && !alythess->IsInCombat()) alythess->AI()->AttackStart(who); - me->m_Events.AddEventAtOffset([&] { - Talk(YELL_BERSERK); - DoCastSelf(SPELL_ENRAGE, true); - }, 6min); + ScheduleEnrageTimer(SPELL_ENRAGE, 6min, YELL_BERSERK); ScheduleTimedEvent(10s, [&] { DoCastSelf(SPELL_SHADOW_BLADES); @@ -195,7 +191,6 @@ struct boss_alythess : public BossAI _isSisterDead = false; BossAI::Reset(); me->SetLootMode(0); - me->m_Events.KillAllEvents(false); } void DoAction(int32 param) override @@ -236,10 +231,7 @@ struct boss_alythess : public BossAI if (sacrolash->IsAlive() && !sacrolash->IsInCombat()) sacrolash->AI()->AttackStart(who); - me->m_Events.AddEventAtOffset([&] { - Talk(YELL_BERSERK); - DoCastSelf(SPELL_ENRAGE, true); - }, 6min); + ScheduleEnrageTimer(SPELL_ENRAGE, 6min, YELL_BERSERK); ScheduleTimedEvent(1s, [&] { DoCastVictim(SPELL_BLAZE);