void UpdateAI(uint32 diff) { if (!sWorld->getBoolConfig(CONFIG_MINIGOB_MANABONK)) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_SELECT_TARGET: me->SetVisible(true); DoCast(me, SPELL_TELEPORT_VISUAL); if (Player* player = SelectTargetInDalaran()) { me->NearTeleportTo(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f); DoCast(player, SPELL_MANABONKED); SendMailToPlayer(player); } events.ScheduleEvent(EVENT_BLINK, 3*IN_MILLISECONDS); break; case EVENT_BLINK: { DoCast(me, SPELL_IMPROVED_BLINK); Position pos; me->GetRandomNearPosition(pos, (urand(15, 40))); me->GetMotionMaster()->MovePoint(0, pos.m_positionX, pos.m_positionY, pos.m_positionZ); events.ScheduleEvent(EVENT_DESPAWN, 3 * IN_MILLISECONDS); events.ScheduleEvent(EVENT_DESPAWN_VISUAL, 2.5*IN_MILLISECONDS); break; } case EVENT_DESPAWN_VISUAL: DoCast(me, SPELL_TELEPORT_VISUAL); break; case EVENT_DESPAWN: me->DespawnOrUnsummon(); break; default: break; } } }
void UpdateAI(uint32 diff) override { events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_SELECT_TARGET: { std::vector<Player*> PlayerInDalaranList; GetPlayersInDalaran(PlayerInDalaranList); // Increases chance of event based on player count in Dalaran (100 players or more = 100% else player count%) if (PlayerInDalaranList.empty() || urand(1, 100) > PlayerInDalaranList.size()) me->AddObjectToRemoveList(); me->SetVisible(true); DoCastSelf(SPELL_TELEPORT_VISUAL); if (Player* player = SelectTargetInDalaran(PlayerInDalaranList)) { playerGuid = player->GetGUID(); Position pos = player->GetPosition(); float dist = frand(10.0f, 30.0f); float angle = frand(0.0f, 1.0f) * M_PI * 2.0f; player->MovePositionToFirstCollision(pos, dist, angle); me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); } events.ScheduleEvent(EVENT_LAUGH_1, Seconds(2)); break; } case EVENT_LAUGH_1: me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH_NO_SHEATHE); events.ScheduleEvent(EVENT_WANDER, 3s); break; case EVENT_WANDER: me->GetMotionMaster()->MoveRandom(8); events.ScheduleEvent(EVENT_PAUSE, 1min); break; case EVENT_PAUSE: me->GetMotionMaster()->MoveIdle(); events.ScheduleEvent(EVENT_CAST, 2s); break; case EVENT_CAST: if (Player* player = me->GetMap()->GetPlayer(playerGuid)) { DoCast(player, SPELL_MANABONKED); SendMailToPlayer(player); } else me->AddObjectToRemoveList(); events.ScheduleEvent(EVENT_LAUGH_2, Seconds(8)); break; case EVENT_LAUGH_2: me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH_NO_SHEATHE); events.ScheduleEvent(EVENT_BLINK, 3s); break; case EVENT_BLINK: DoCastSelf(SPELL_IMPROVED_BLINK); events.ScheduleEvent(EVENT_DESPAWN, 4s); break; case EVENT_DESPAWN: me->AddObjectToRemoveList(); break; default: break; } } }