void MovementInform(uint32 type, uint32 id) { if (type != POINT_MOTION_TYPE) return; if (id == POINT_ANVIL) { me->SetSpeed(MOVE_RUN, 1.2f,true); me->SetReactState(REACT_AGGRESSIVE); me->CastSpell(me, SPELL_TEMPER, false); PointID = 0; ScheduleEvents(true); // update orientation at server me->SetOrientation(2.19f); // and client WorldPacket data; me->BuildHeartBeatMsg(&data); me->SendMessageToSet(&data, false); me->SetControlled(true, UNIT_STATE_ROOT); } else events.ScheduleEvent(EVENT_MOVE_TO_ANVIL, 0, 0, 2); }
void EnterCombat(Unit* /*who*/) override { me->SetCombatPulseDelay(5); me->setActive(true); if (Creature* illidari = instance->GetCreature(DATA_ILLIDARI_COUNCIL)) DoZoneInCombat(illidari); ScheduleEvents(); }
void EnterCombat(Unit*) { me->SetInCombatWithZone(); Talk(SAY_AGGRO); if (m_pInstance) m_pInstance->SetData(TYPE_IONAR, IN_PROGRESS); ScheduleEvents(false); }
void UpdateAI(uint32 diff) override { // Only update events if Millhouse is aggressive if (me->GetReactState() != REACT_AGGRESSIVE) return; events.Update(diff); // Impending Doom is exception because it needs to be interrupted. if (me->HasUnitState(UNIT_STATE_CASTING) && !me->GetCurrentSpell(SPELL_IMPENDING_DOOM)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_FROSTBOLT_VOLLEY: DoCast(SPELL_FROSTBOLT_VOLLEY); events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, 7000); break; case EVENT_SHADOWFURY: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) DoCast(target, SPELL_SHADOWFURY); events.ScheduleEvent(EVENT_SHADOWFURY, 7000); break; case EVENT_FEAR: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) DoCast(target, SPELL_FEAR); events.ScheduleEvent(EVENT_FEAR, 18000); break; case EVENT_READY_FOR_COMBAT: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); me->SetReactState(REACT_AGGRESSIVE); ScheduleEvents(); break; case EVENT_CAST_IMPENDING_DOOM: DoCast(SPELL_IMPENDING_DOOM); DoCast(SPELL_IMPENDING_DOOM_CHANNEL); events.ScheduleEvent(EVENT_INTERRUPT_IMPENDING_DOOM, urand(15000,20000)); break; case EVENT_INTERRUPT_IMPENDING_DOOM: me->InterruptNonMeleeSpells(true); me->RemoveAllAuras(); me->HandleEmoteCommand(EMOTE_ONESHOT_KNOCKDOWN); events.ScheduleEvent(EVENT_CAST_IMPENDING_DOOM, 3000); break; default: break; } } DoSpellAttackIfReady(SPELL_SHADOW_BOLT); }
void UpdateAI(uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (events.GetEvent()) { case EVENT_BALL_LIGHTNING: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) me->CastSpell(target, me->GetMap()->IsHeroic() ? SPELL_BALL_LIGHTNING_H : SPELL_BALL_LIGHTNING_N, false); events.RepeatEvent(10000 + rand()%1000); break; case EVENT_STATIC_OVERLOAD: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) me->CastSpell(target, me->GetMap()->IsHeroic() ? SPELL_STATIC_OVERLOAD_H : SPELL_STATIC_OVERLOAD_N, false); events.RepeatEvent(5000 + rand()%1000); break; case EVENT_CHECK_HEALTH: if (HealthBelowPct(HealthCheck)) me->CastSpell(me, SPELL_DISPERSE, false); events.RepeatEvent(1000); return; case EVENT_CALL_SPARKS: { EntryCheckPredicate pred(NPC_SPARK_OF_IONAR); summons.DoAction(ACTION_CALLBACK, pred); events.PopEvent(); events.ScheduleEvent(EVENT_RESTORE, 2000, 0, 2); return; } case EVENT_RESTORE: EntryCheckPredicate pred(NPC_SPARK_OF_IONAR); summons.DoAction(ACTION_SPARK_DESPAWN, pred); events.PopEvent(); me->SetVisible(true); me->SetControlled(false, UNIT_STATE_STUNNED); ScheduleEvents(true); return; } DoMeleeAttackIfReady(); }