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(); }
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(); }