void UpdateAI(const uint32 diff) { if (!UpdateVictim() || me->HasUnitState(UNIT_STAT_CASTING)) return; events.Update(diff); _DoAggroPulse(diff); if(me->GetHealthPct() < 25 && phase != PHASE_FINAL) { // Enter Final Phase uint32 uiBerserker = events.GetNextEventTime(EVENT_BERSERK); events.Reset(); events.ScheduleEvent(EVENT_BERSERK, uiBerserker); phase = PHASE_FINAL; me->InterruptNonMeleeSpells(true); DoCast(SPELL_RELEASE_ALL_ABBERATIONS); DoScriptText(SAY_LOW_HEALTH, me); }; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { // General and Phase Switching case EVENT_NEW_PHASE: UpdatePhase(urand(PHASE_RED, PHASE_BLUE)); spellsLocked = true; events.ScheduleEvent(EVENT_NEW_PHASE, TIMER_PHASE); break; case EVENT_DRINK_BOTTLE: if(GameObject* cauldron = me->FindNearestGameObject(GOB_MALORIAKS_CAULDRON,100.f)) { switch(phase) { case PHASE_RED: DoCast(cauldron->ToCreature(), SPELL_THROW_RED_BOTTLE); break; case PHASE_BLUE: DoCast(cauldron->ToCreature(), SPELL_THROW_BLUE_BOTTLE); break; case PHASE_GREEN: DoCast(cauldron->ToCreature(), SPELL_THROW_GREEN_BOTTLE); break; case PHASE_BLACK: DoCast(cauldron->ToCreature(), SPELL_THROW_BLACK_BOTTLE); me->AddAura(SPELL_SHADOW_IMBUED, me); break; } } events.ScheduleEvent(EVENT_WAIT_SWITCH_PHASE, 1000); break; case EVENT_WAIT_SWITCH_PHASE: me->SetReactState(REACT_AGGRESSIVE); me->GetMotionMaster()->MoveChase(me->getVictim()); // Intialize Phase Events switch(phase) { case PHASE_RED: events.ScheduleEvent(EVENT_SCORCHING_BLAST, 7000); events.ScheduleEvent(EVENT_CONSUMING_FLAMES, 3000); break; case PHASE_BLUE: events.ScheduleEvent(EVENT_BITING_CHILL, 7000); events.ScheduleEvent(EVENT_FLASH_FREEZE, 9000); break; case PHASE_GREEN: events.ScheduleEvent(EVENT_CAULDRON_EXPLODE, 2000); break; case PHASE_BLACK: events.ScheduleEvent(EVENT_SUMMON_VILE_SWILL, urand(4000,6000)); events.ScheduleEvent(EVENT_ENGULFING_DARKNESS, 9000); break; } if(phase != PHASE_BLACK) { events.ScheduleEvent(EVENT_RELEASE_ABBERATIONS, urand(12000,17000)); DoScriptText(SAY_VIAL-phase, me); } events.ScheduleEvent(EVENT_UNLOCK_SPELLS, 1500); break; // Misc case EVENT_UNLOCK_SPELLS: spellsLocked = false; break; case EVENT_BERSERK: DoCast(me,SPELL_BERSERK); break; case EVENT_REMEDY: if(spellsLocked) events.ScheduleEvent(EVENT_REMEDY, 1500); else { DoCast(me,SPELL_REMEDY); events.ScheduleEvent(EVENT_REMEDY, urand(15000,18000)); } break; case EVENT_ARCANE_STORM: if(spellsLocked) events.ScheduleEvent(EVENT_ARCANE_STORM, 1500); else { me->AttackStop(); DoCastAOE(SPELL_ARCANE_STORM); events.ScheduleEvent(EVENT_ARCANE_STORM, urand(27000,29000)); } break; // Red Phase case EVENT_SCORCHING_BLAST: DoCastAOE(SPELL_SCORCHING_BLAST); events.ScheduleEvent(EVENT_SCORCHING_BLAST, urand(15000, 17000)); break; case EVENT_CONSUMING_FLAMES: if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true)) DoCast(target, SPELL_CONSUMING_FLAMES); events.ScheduleEvent(EVENT_CONSUMING_FLAMES, urand(7000, 8500)); break; // Blue Phase case EVENT_BITING_CHILL: if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true)) DoCast(target, SPELL_BITING_CHILL); events.ScheduleEvent(EVENT_BITING_CHILL, urand(8000, 10000)); break; case EVENT_FLASH_FREEZE: if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true)) target->CastSpell(target, SPELL_FLASH_FREEZE_SUMMON, true); events.ScheduleEvent(EVENT_FLASH_FREEZE, urand(11000, 13000)); break; // Green Phase case EVENT_CAULDRON_EXPLODE: me->FindNearestCreature(NPC_SLIME_TRIGGER, 100.f)->AI()->DoCastAOE(SPELL_DEBILITATING_SLIME); DoCastCausticSlime(); events.ScheduleEvent(EVENT_CAULDRON_EXPLODE, 15000); break; case EVENT_RELEASE_ABBERATIONS: DoCast(SPELL_RELEASE_ABBERATIONS); break; // Black Phase case EVENT_SUMMON_VILE_SWILL: me->SummonCreature(NPC_VILE_SWILL, MaloriakPositions[urand(1,4)]); events.ScheduleEvent(EVENT_SUMMON_VILE_SWILL, urand(4000,5000)); break; case EVENT_ENGULFING_DARKNESS: DoCastAOE(SPELL_ENGULFING_DARKNESS); events.ScheduleEvent(EVENT_ENGULFING_DARKNESS, 16000); break; // Final Phase default: break; } } DoMeleeAttackIfReady(); }