void UpdateAI(uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_CHECK_ROOM_POSITION: { if (me->GetExactDist2dSq(RoomCenter[0], RoomCenter[1]) > 1500.0f || !BoosSP.HasInArc(M_PI, me)) { BossAI::EnterEvadeMode(); return; } events.ScheduleEvent(EVENT_CHECK_ROOM_POSITION, 1000); } break; case EVENT_VENOMOUS_EFFUSION: VenomousEffusion(); break; case EVENT_REMOVE_EFFUSION_VISUAL: { for (int i = 0; i < 2; ++i) if (Creature* totem = ObjectAccessor::GetCreature(*me, TotemGUID[i])) totem->CastStop(); } break; case EVENT_WHISPERS_OF_HETHISS: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true)) me->CastSpell(target, 96466, false); events.ScheduleEvent(EVENT_WHISPERS_OF_HETHISS, urand(10000, 20000)); } break; case EVENT_TOXIC_LINK: Talk(SAY_TOXIC_LINK); me->CastSpell((Unit*)NULL, 96475, false); events.ScheduleEvent(EVENT_TOXIC_LINK, 10000); break; case EVENT_BLESSING_OF_THE_SNAKE_GOD: Talk(SAY_TRANSFROM); me->CastSpell(me, 96602, false); me->CastSpell(me, 97354, false); events.Reset(); events.ScheduleEvent(EVENT_POOL_OF_ACRID_TEARS, urand(3000, 7000)); events.ScheduleEvent(EVENT_BREATH_OF_HETHISS, urand(4000, 8000)); events.ScheduleEvent(EVENT_TRANSFORM_REMOVAL_PRIMER, 30000); events.ScheduleEvent(EVENT_CHECK_ROOM_POSITION, 1000); break; case EVENT_POOL_OF_ACRID_TEARS: { if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 100.0f, true)) me->CastSpell(target, 96515, false); events.ScheduleEvent(EVENT_POOL_OF_ACRID_TEARS, urand(3000, 7000)); } break; case EVENT_BREATH_OF_HETHISS: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 15.0f, true)) { me->SetReactState(REACT_PASSIVE); me->AttackStop(); me->StopMoving(); me->SetFacingTo(me->GetAngle(target)); events.ScheduleEvent(EVENT_RETURN_TO_FIGHT, 3000); } me->CastSpell(me, 96509, false); events.ScheduleEvent(EVENT_BREATH_OF_HETHISS, urand(5000, 10000)); } break; case EVENT_RETURN_TO_FIGHT: me->SetReactState(REACT_AGGRESSIVE); break; case EVENT_TRANSFORM_REMOVAL_PRIMER: me->CastSpell(me, 96617, false); me->SetReactState(REACT_PASSIVE); me->AttackStop(); me->GetMotionMaster()->MoveTargetedHome(); events.Reset(); break; case EVENT_VENOM_WITHDRAWAL: { for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ) { if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) { summon->CastStop(); summon->RemoveAllAuras(); summon->DespawnOrUnsummon(2000); } itr = summons.erase(itr); } Talk(EMOTE_VENOM_WITHDRAWAL); BloodVenoms.DespawnAll(); me->RemoveAura(97354); me->RemoveAura(96602); me->CastSpell(me, 96653, false); me->SetReactState(REACT_AGGRESSIVE); events.ScheduleEvent(EVENT_VENOMOUS_EFFUSION, 11000); events.ScheduleEvent(EVENT_BLESSING_OF_THE_SNAKE_GOD, 40000); events.ScheduleEvent(EVENT_WHISPERS_OF_HETHISS, urand(15000, 20000)); events.ScheduleEvent(EVENT_TOXIC_LINK, urand(12000, 15000)); events.ScheduleEvent(EVENT_CHECK_ROOM_POSITION, 1000); } break; case EVENT_SET_BLOODVENOM_PLAYER: SetBloodvenomTarget(); events.ScheduleEvent(EVENT_CHANGE_BLOODVENOM_PLAYER, 6000); break; case EVENT_CHANGE_BLOODVENOM_PLAYER: SetBloodvenomTarget(); break; } } DoMeleeAttackIfReady(); }