void UpdateAI(uint32 diff) { if (!UpdateVictim() || !CheckInRoom()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_DISRUPT: DoCastAOE(SPELL_SPELL_DISRUPTION); events.ScheduleEvent(EVENT_DISRUPT, urand(5000, 10000)); break; case EVENT_FEVER: DoCastAOE(SPELL_DECREPIT_FEVER); events.ScheduleEvent(EVENT_FEVER, urand(20000, 25000)); break; case EVENT_PHASE1: TalkToMap(EMOTE_TELEPORT2); me->SetReactState(REACT_AGGRESSIVE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DoZoneInCombat(); events.Reset(); eruptSection = 3; events.ScheduleEvent(EVENT_DISRUPT, urand(10000, 25000)); events.ScheduleEvent(EVENT_FEVER, urand(15000, 20000)); events.ScheduleEvent(EVENT_PHASE2, 90000); events.ScheduleEvent(EVENT_ERUPT, 15000); phase = PHASE_1; break; case EVENT_PHASE2: TalkToMap(SAY_PHASE); TalkToMap(EMOTE_TELEPORT1); me->SetReactState(REACT_PASSIVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->AttackStop(); me->RemoveAllAuras(); DoCast(SPELL_TELEPORT_SELF); DoCastAOE(SPELL_PLAGUE_CLOUD); events.Reset(); events.ScheduleEvent(EVENT_PHASE1, 45000); events.ScheduleEvent(EVENT_ERUPT, 8000); phase = PHASE_2; break; case EVENT_ERUPT: instance->SetData(DATA_HEIGAN_ERUPT, eruptSection); TeleportCheaters(); if (eruptSection == 0) eruptDirection = true; else if (eruptSection == 3) eruptDirection = false; eruptDirection ? ++eruptSection : --eruptSection; events.ScheduleEvent(EVENT_ERUPT, EVENT_PHASE1 ? 10000 : 3000); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!UpdateVictim() || !CheckInRoom()) return; if (!enraged && HealthBelowPct(30)) { enraged = true; events.ScheduleEvent(EVENT_FRENZY, 0); } events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_WRAP: TalkToMap(EMOTE_WRAP); for (uint8 i = 0; i < RAID_MODE(1, 2); ++i) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0, true, -SPELL_WEB_WRAP)) { target->RemoveAura(SPELL_WEB_SPRAY); uint8 pos = rand()%MAX_POS_WRAP; target->GetMotionMaster()->MoveJump(PosWrap[pos].GetPositionX(), PosWrap[pos].GetPositionY(), PosWrap[pos].GetPositionZ(), 20, 20); if (Creature* wrap = DoSummon(MOB_WEB_WRAP, PosWrap[pos], 0, TEMPSUMMON_CORPSE_DESPAWN)) wrap->AI()->SetGUID(target->GetGUID()); } } events.ScheduleEvent(EVENT_WRAP, 40000); break; case EVENT_SPRAY: DoCastAOE(SPELL_WEB_SPRAY); events.ScheduleEvent(EVENT_SPRAY, 40000); break; case EVENT_SHOCK: DoCastAOE(SPELL_POISON_SHOCK); events.ScheduleEvent(EVENT_SHOCK, urand(10000, 20000)); break; case EVENT_POISON: DoCast(me->getVictim(), SPELL_NECROTIC_POISON); events.ScheduleEvent(EVENT_POISON, urand(10000, 20000)); break; case EVENT_FRENZY: DoCast(me, SPELL_FRENZY, true); events.ScheduleEvent(EVENT_FRENZY, 600000); break; case EVENT_SUMMON: TalkToMap(EMOTE_SPIDER); uint8 amount = urand(8, 10); for (uint8 i = 0; i < amount; ++i) DoSummon(MOB_SPIDERLING, me, 0, TEMPSUMMON_CORPSE_DESPAWN); events.ScheduleEvent(EVENT_SUMMON, 40000); break; } } DoMeleeAttackIfReady(); }
void KilledUnit(Unit* victim) { if (!(rand()%5)) if (victim->GetTypeId() == TYPEID_PLAYER) victim->CastSpell(victim, SPELL_SUMMON_CORPSE_SCARABS_PLR, true, 0, 0, me->GetGUID()); TalkToMap(EMOTE_CORPSE_SCARAB); TalkToMap(SAY_SLAY); }
void UpdateAI(uint32 diff) { if (!UpdateVictimWithGaze() || !CheckInRoom()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_WOUND: DoCast(me->GetVictim(), SPELL_MORTAL_WOUND); events.ScheduleEvent(EVENT_WOUND, 10000); break; case EVENT_ENRAGE: TalkToMap(EMOTE_ENRAGE); DoCast(me, SPELL_ENRAGE); events.ScheduleEvent(EVENT_ENRAGE, 15000); break; case EVENT_DECIMATE: TalkToMap(EMOTE_DECIMATE); DoCastAOE(SPELL_DECIMATE); events.ScheduleEvent(EVENT_DECIMATE, 105000); break; case EVENT_BERSERK: DoCast(me, SPELL_BERSERK); events.ScheduleEvent(EVENT_BERSERK, 300000); break; case EVENT_SUMMON: for (int32 i = 0; i < RAID_MODE(1, 2); ++i) DoSummon(MOB_ZOMBIE, PosSummon[rand() % RAID_MODE(1, 3)]); events.ScheduleEvent(EVENT_SUMMON, 10000); break; } } if (me->GetVictim() && me->GetVictim()->GetEntry() == MOB_ZOMBIE) { if (me->IsWithinMeleeRange(me->GetVictim())) { me->Kill(me->GetVictim()); me->ModifyHealth(int32(me->CountPctFromMaxHealth(5))); } } else DoMeleeAttackIfReady(); }
void EnterCombat(Unit* /*who*/) { _EnterCombat(); TalkToMap(SAY_AGGRO); EnterPhaseFight(); safetyDance = true; }
void MoveInLineOfSight(Unit* who) { if (who->GetEntry() == MOB_ZOMBIE && me->IsWithinDistInMap(who, 7)) { SetGazeOn(who); TalkToMap(EMOTE_NEARBY); } else BossAI::MoveInLineOfSight(who); }
void EnterCombat(Unit* /*who*/) { _EnterCombat(); TalkToMap(SAY_AGGRO); events.ScheduleEvent(EVENT_IMPALE, urand(10000, 20000)); events.ScheduleEvent(EVENT_LOCUST, 90000); events.ScheduleEvent(EVENT_BERSERK, 600000); if (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, urand(15000, 20000)); }
void DoAction(int32 action) { switch (action) { case ACTION_INTRO: if (!_introDone) { TalkToMap(SAY_GREET); _introDone = true; } break; } }
void UpdateAI(uint32 diff) { if (!UpdateVictim() || !CheckInRoom()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_IMPALE: if (!me->HasAura(SPELL_LOCUST_SWARM)) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_IMPALE); events.ScheduleEvent(EVENT_IMPALE, urand(10000, 20000)); break; case EVENT_LOCUST: TalkToMap(EMOTE_LOCUST); DoCast(me, SPELL_LOCUST_SWARM); me->SummonCreature(NPC_CRYPT_GUARD, GuardSummonPos, TEMPSUMMON_CORPSE_DESPAWN, 5000); events.ScheduleEvent(EVENT_LOCUST, 90000); events.RescheduleEvent(EVENT_IMPALE, 20000); break; case EVENT_SUMMON_GUARDIAN: TalkToMap(EMOTE_CRYPT); me->SummonCreature(NPC_CRYPT_GUARD, GuardSummonPos, TEMPSUMMON_CORPSE_DESPAWN, 5000); break; case EVENT_BERSERK: DoCastAOE(SPELL_BERSERK); events.ScheduleEvent(EVENT_BERSERK, 600000); break; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_NECROTIC_AURA: DoCastAOE(SPELL_NECROTIC_AURA); DoCast(me, SPELL_WARN_NECROTIC_AURA); events.ScheduleEvent(EVENT_NECROTIC_AURA, 20000); events.ScheduleEvent(EVENT_NECROTIC_AURA_FADING, 14000); break; case EVENT_DEATHBLOOM: DoCastAOE(SPELL_DEATHBLOOM); events.ScheduleEvent(EVENT_DEATHBLOOM, 30000); break; case EVENT_INEVITABLE_DOOM: _doomCounter++; DoCastAOE(SPELL_INEVITABLE_DOOM); events.ScheduleEvent(EVENT_INEVITABLE_DOOM, std::max(120000 - _doomCounter * 15000, 15000)); // needs to be confirmed break; case EVENT_SPORE: DoCast(me, SPELL_SUMMON_SPORE, false); events.ScheduleEvent(EVENT_SPORE, IsHeroic() ? 18000 : 36000); break; case EVENT_NECROTIC_AURA_FADING: TalkToMap(SAY_NECROTIC_AURA_FADING); break; default: break; } } DoMeleeAttackIfReady(); }
void JustDied(Unit* /*killer*/) { _JustDied(); TalkToMap(SAY_DEATH); }
void KilledUnit(Unit* who) { TalkToMap(SAY_SLAY); if (who->GetTypeId() == TYPEID_PLAYER) safetyDance = false; }