Beispiel #1
0
        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();
        }