void UpdateAI(const uint32 diff) { if (!UpdateCombatState() || !CheckInRoom()) return; events.Update(diff); while(uint32 eventId = events.ExecuteEvent()) { switch(eventId) { case EVENT_CURSE: DoCastAOE(SPELL_CURSE_PLAGUEBRINGER); events.ScheduleEvent(EVENT_CURSE, 20000+rand()%10000); return; case EVENT_WARRIOR: DoScriptText(SAY_SUMMON, me); SummonUndead(MOB_WARRIOR, HEROIC(2,3)); events.ScheduleEvent(EVENT_WARRIOR, 30000); return; case EVENT_BLINK: DoCastAOE(SPELL_CRIPPLE, true); DoCastAOE(SPELL_BLINK); DoResetThreat(); events.ScheduleEvent(EVENT_BLINK, 20000+rand()%10000); return; case EVENT_BALCONY: me->SetReactState(REACT_PASSIVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->AttackStop(); me->RemoveAllAuras(); me->NearTeleportTo(TELE_X, TELE_Y, TELE_Z, TELE_O); events.Reset(); events.ScheduleEvent(EVENT_WAVE, 2000); waveCount = 0; return; case EVENT_WAVE: DoScriptText(SAY_SUMMON, me); switch(balconyCount) { case 0: SummonUndead(MOB_CHAMPION, HEROIC(2,4)); break; case 1: SummonUndead(MOB_CHAMPION, HEROIC(1,2)); SummonUndead(MOB_GUARDIAN, HEROIC(1,2)); break; case 2: SummonUndead(MOB_GUARDIAN, HEROIC(2,4)); break; default:SummonUndead(MOB_CHAMPION, HEROIC(5,10)); SummonUndead(MOB_GUARDIAN, HEROIC(5,10));break; } ++waveCount; events.ScheduleEvent(waveCount < 2 ? EVENT_WAVE : EVENT_GROUND, 34000); return; case EVENT_GROUND: { ++balconyCount; float x, y, z, o; me->GetHomePosition(x, y, z, o); me->NearTeleportTo(x, y, z, o); EnterPhaseGround(); return; } } } if (me->HasReactState(REACT_AGGRESSIVE)) DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) override { if (!UpdateVictim() || !CheckInRoom()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_CURSE: DoCastAOE(SPELL_CURSE_PLAGUEBRINGER); events.ScheduleEvent(EVENT_CURSE, urand(50000, 60000)); return; case EVENT_WARRIOR: Talk(SAY_SUMMON); SummonUndead(NPC_WARRIOR, RAID_MODE(2, 3)); events.ScheduleEvent(EVENT_WARRIOR, 30000); return; case EVENT_BLINK: DoCastAOE(SPELL_CRIPPLE, true); DoCastAOE(SPELL_BLINK); DoResetThreat(); events.ScheduleEvent(EVENT_BLINK, 40000); return; case EVENT_BALCONY: me->SetReactState(REACT_PASSIVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->AttackStop(); me->RemoveAllAuras(); me->NearTeleportTo(Teleport.GetPositionX(), Teleport.GetPositionY(), Teleport.GetPositionZ(), Teleport.GetOrientation()); events.Reset(); events.ScheduleEvent(EVENT_WAVE, urand(2000, 5000)); waveCount = 0; return; case EVENT_WAVE: Talk(SAY_SUMMON); switch (balconyCount) { case 0: SummonUndead(NPC_CHAMPION, RAID_MODE(2, 4)); break; case 1: SummonUndead(NPC_CHAMPION, RAID_MODE(1, 2)); SummonUndead(NPC_GUARDIAN, RAID_MODE(1, 2)); break; case 2: SummonUndead(NPC_GUARDIAN, RAID_MODE(2, 4)); break; default: SummonUndead(NPC_CHAMPION, RAID_MODE(5, 10)); SummonUndead(NPC_GUARDIAN, RAID_MODE(5, 10)); break; } ++waveCount; events.ScheduleEvent(waveCount < 2 ? EVENT_WAVE : EVENT_GROUND, urand(30000, 45000)); return; case EVENT_GROUND: { ++balconyCount; float x, y, z, o; me->GetHomePosition(x, y, z, o); me->NearTeleportTo(x, y, z, o); events.ScheduleEvent(EVENT_BALCONY, 110000); EnterPhaseGround(); return; } } } if (me->HasReactState(REACT_AGGRESSIVE)) DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim() || !CheckInRoom()) return; _DoAggroPulse(diff); events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_CURSE: if(!me->IsNonMeleeSpellCasted(false)) { DoCastAOE(SPELL_CURSE_PLAGUEBRINGER); events.ScheduleEvent(EVENT_CURSE, urand(50000, 60000)); } return; case EVENT_WARRIOR: DoScriptText(SAY_SUMMON, me); SummonUndead(MOB_WARRIOR, RAID_MODE(2, 3)); events.ScheduleEvent(EVENT_WARRIOR, 30000); return; case EVENT_BLINK: if(!me->IsNonMeleeSpellCasted(false)) { DoCastAOE(SPELL_CRIPPLE, true); DoCastAOE(SPELL_BLINK); DoResetThreat(); events.ScheduleEvent(EVENT_BLINK, 20000); } return; case EVENT_BALCONY: me->SetReactState(REACT_PASSIVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->AttackStop(); me->RemoveAllAuras(); me->NearTeleportTo(TELE_X, TELE_Y, TELE_Z, TELE_O); me->getThreatManager().resetAllAggro(); events.Reset(); events.ScheduleEvent(EVENT_WAVE, 10000); waveCount = 0; return; case EVENT_WAVE: DoScriptText(SAY_SUMMON, me); switch (balconyCount) { case 0: SummonUndead(MOB_CHAMPION, RAID_MODE(2, 4)); break; case 1: SummonUndead(MOB_CHAMPION, RAID_MODE(1, 2)); SummonUndead(MOB_GUARDIAN, RAID_MODE(1, 2)); break; case 2: SummonUndead(MOB_GUARDIAN, RAID_MODE(2, 4)); break; default:SummonUndead(MOB_CHAMPION, RAID_MODE(5, 10)); SummonUndead(MOB_GUARDIAN, RAID_MODE(5, 10));break; } ++waveCount; events.ScheduleEvent(waveCount < 2 ? EVENT_WAVE : EVENT_GROUND, 30000); return; case EVENT_GROUND: { ++balconyCount; float x, y, z, o; me->GetHomePosition(x, y, z, o); me->NearTeleportTo(x, y, z, o); events.ScheduleEvent(EVENT_BALCONY, 110000); EnterPhaseGround(); return; } } } if(balconyCount > 3) { if(!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE) && !me->HasAura(SPELL_BERSERK)) DoCast(me,SPELL_BERSERK,true); } if (me->HasReactState(REACT_AGGRESSIVE)) DoMeleeAttackIfReady(); }