void JustDied(Unit* /*pKiller*/)
 {
     ForceSpellCastWithScriptText(me, SPELL_SUMMON_DEATH_CLOUD, YELL_DEATH, INTERRUPT_AND_CAST_INSTANTLY);
     pInstance->SetData(DATA_BRUTALLUS_EVENT, DONE);
 }
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_COMBAT_N_EVADE, 135.0f);

        if (!evocating && m_creature->GetPower(POWER_MANA) <= 1000)
        {
            evocating = true;
            ForceSpellCastWithScriptText(SPELL_EVOCATION, CAST_SELF, SAY_EVOCATE);
        }

        if (!enraged && !evocating)
        {
            if (addTimer < diff)
            {
                //Summon Astral Flare
                Creature* astralFlare = DoSpawnCreature(17096, rand()%37, rand()%37, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
                Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0);

                if (astralFlare && target)
                {
                    astralFlare->CastSpell(astralFlare, SPELL_ASTRAL_FLARE_PASSIVE, false);
                    astralFlare->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, true);
                    astralFlare->AI()->AttackStart(target);
                }

                //Reduce Mana by 10%
                int32 mana = (int32)(0.1f*(m_creature->GetMaxPower(POWER_MANA)));
                m_creature->ModifyPower(POWER_MANA, -mana);

                DoScriptText(RAND(SAY_SUMMON1, SAY_SUMMON2, 0, 0), m_creature);

                addTimer = 10000;
            }
            else
                addTimer -= diff;

            if (hatefulBoltTimer < diff)
            {
                AddSpellToCast(SPELL_HATEFUL_BOLT, CAST_THREAT_SECOND);
                hatefulBoltTimer = enraged ? 7000 : 15000;
            }
            else
                hatefulBoltTimer -= diff;

            if (!enraged && HealthBelowPct(15))
            {
                enraged = true;
                ForceSpellCastWithScriptText(SPELL_ENRAGE, CAST_SELF, SAY_ENRAGE);
            }
        }

        if (berserkTimer < diff)
        {
            ForceSpellCastWithScriptText(SPELL_BERSERK, CAST_SELF, SAY_ENRAGE);
            berserkTimer = 60000;
        }
        else
            berserkTimer -= diff;

        CastNextSpellIfAnyAndReady();

        if (!evocating)
            DoMeleeAttackIfReady();
    }
Beispiel #3
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_EVERYTHING, 120.0f);

        events.Update(diff);
        uint32 eventId;
        while (eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_ICE_BOLT:
                {
                    AddSpellToCast(SPELL_ICEBOLT, CAST_RANDOM);

                    if (++iceboltCount < 5)
                        events.ScheduleEvent(EVENT_ICE_BOLT, 4000);
                    else
                        events.ScheduleEvent(EVENT_FROST_BREATH, 2000);

                    break;
                }
                case EVENT_FROST_BREATH:
                {
                    AddSpellToCastWithScriptText(SPELL_FROST_BREATH, CAST_SELF, EMOTE_BREATH);
                    events.ScheduleEvent(EVENT_PHASE_1, 2000);
                    break;
                }
                case EVENT_LIFE_DRAIN:
                {
                    AddSpellToCast(SPELL_LIFE_DRAIN, CAST_RANDOM);
                    events.ScheduleEvent(EVENT_LIFE_DRAIN, 24000);
                    break;
                }
                case EVENT_BLIZZARD:
                {
                    AddSpellToCast(SPELL_BLIZZARD, CAST_SELF);
                    events.ScheduleEvent(EVENT_BLIZZARD, 20000);
                    break;
                }
                case EVENT_PHASE_2:
                {
                    if (HealthBelowPct(10))
                        break;

                    iceboltCount = 0;
                    phase = SAPPHIRON_AIR_PHASE;
                    events.CancelEvent(EVENT_BLIZZARD);
                    events.CancelEvent(EVENT_LIFE_DRAIN);
                    events.ScheduleEvent(EVENT_ICE_BOLT, 4000);

                    m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
                    m_creature->SetLevitate(true);
                    m_creature->GetMotionMaster()->Clear(false);
                    m_creature->GetMotionMaster()->MoveIdle();

                    break;
                }
                case EVENT_PHASE_1:
                {
                    phase = SAPPHIRON_GROUND_PHASE;
                    events.ScheduleEvent(EVENT_BLIZZARD, urand(10000, 20000));
                    events.ScheduleEvent(EVENT_LIFE_DRAIN, urand(12000, 24000));
                    events.ScheduleEvent(EVENT_PHASE_2, 67000);

                    m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
                    m_creature->SetLevitate(false);
                    m_creature->GetMotionMaster()->Clear(false);
                    m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());

                    break;
                }
            }
        }

        if (!berserk && HealthBelowPct(10))
        {
            berserk = true;
            ForceSpellCastWithScriptText(SPELL_BERSERK, CAST_SELF, EMOTE_ENRAGE);
        }

        CastNextSpellIfAnyAndReady();

        if (phase == SAPPHIRON_GROUND_PHASE)
            DoMeleeAttackIfReady();
    }