AI Core
Referência da APIEventos e estado

Eventos de UI do ai-lib

Os eventos de cliente que o ai-lib dispara quando um jogador responde a um menu, caixa de entrada, seletor de itens, minigame ou prompt, ou cancela uma barra de progresso - para scripts que chamam os exports do ai-lib eles mesmos.

O ai-lib desenha a UI compartilhada do jogador: menus, caixas de entrada, prompts, a barra de progresso, minigames, notificações. Quando o jogador responde, o ai-lib dispara um destes eventos locais de cliente.

A maioria dos scripts nunca os escuta. menu, input, itemPicker, skillCheck, lockpick, onPromptPressed e progress da lib (e os mesmos nomes no aiLib) abrem a UI, escutam a resposta e a devolvem a você como valor de retorno. Escute você mesmo só quando chamar os exports do ai-lib (OpenMenu, OpenInput, OpenMinigame) ou o OpenItemPicker do ai-core diretamente.

Cada resposta traz o recurso que abriu a UI e o id do pedido que ele escolheu. Verifique os dois: cada recurso no cliente ouve cada resposta.

ai-lib:client:menuResult

O jogador escolheu um item do menu ou fechou o menu. O mesmo evento responde ao seletor de itens do ai-core e aos minigames do ai-lib.

Lado: Cliente · Constante: MENU_EVENTS.menuResult

Argumentos

Prop

Type

Listener

resource/client/menu.ts
import { resourceExport } from "@aicore-fivem/lib/client";
import { MENU_EVENTS } from "@aicore-fivem/shared";

const ui = resourceExport("ai-lib");
const me = GetCurrentResourceName();
let nextId = 0;
const waiting = new Map<number, (value: unknown) => void>();

on(MENU_EVENTS.menuResult, (resource: string, requestId: number, value: unknown) => {
  if (resource !== me) return;
  waiting.get(requestId)?.(value);
  waiting.delete(requestId);
});

// O menu() da lib faz exatamente isto; mostrado aqui para explicar o evento.
export function pickColor(): Promise<string | null> {
  const id = ++nextId;
  return new Promise((resolve) => {
    waiting.set(id, (value) => resolve(typeof value === "string" ? value : null));
    ui.OpenMenu(id, {
      title: "Color",
      items: [
        { id: "red", label: "Red" },
        { id: "blue", label: "Blue" },
      ],
    });
  });
}

ai-lib:client:menuHover

O ponteiro ou o foco do teclado passou para um item do menu. Use para prévias (mostrar uma cor de veículo enquanto o jogador passa por ela). O menu continua aberto.

Lado: Cliente · Constante: MENU_EVENTS.menuHover · Lib: menu(request, { onHover })

Argumentos

Prop

Type

Listener

resource/client/preview.ts
import { menu } from "@aicore-fivem/lib/client";

// A lib passa os hovers do próprio menu dela para onHover.
export async function chooseColor(): Promise<string | null> {
  return menu(
    { title: "Color", items: [{ id: "red", label: "Red" }, { id: "blue", label: "Blue" }] },
    { onHover: (item) => console.log(`previewing ${item}`) },
  );
}

ai-lib:client:menuToggle

O jogador virou uma linha de interruptor (um item com checked). O interruptor vira no lugar e o menu continua aberto.

Lado: Cliente · Constante: MENU_EVENTS.menuToggle · Lib: menu(request, { onToggle })

Argumentos

Prop

Type

Listener

resource/client/settings.ts
import { menu } from "@aicore-fivem/lib/client";

let sounds = true;

export async function openSettings(): Promise<void> {
  await menu(
    { title: "Settings", items: [{ id: "sounds", label: "Sounds", checked: sounds }] },
    { onToggle: (item, checked) => { if (item === "sounds") sounds = checked; } },
  );
}

ai-lib:client:inputResult

O jogador confirmou ou fechou uma caixa de entrada.

Lado: Cliente · Constante: MENU_EVENTS.inputResult · Lib: input(request)

Argumentos

Prop

Type

Listener

resource/client/rename.ts
import { input } from "@aicore-fivem/lib/client";

// O input() da lib escuta ai-lib:client:inputResult por você.
export async function askName(): Promise<string | null> {
  const values = await input({
    title: "Rename",
    confirm: "Save",
    fields: [{ name: "name", label: "Name", type: "text", maxLength: 32 }],
  });
  return values && typeof values.name === "string" ? values.name : null;
}

ai-lib:client:promptPressed

O jogador apertou a tecla de interação enquanto um prompt estava no topo da lista. Só o recurso que mostrou esse prompt deve reagir.

Lado: Cliente · Constante: LIB_UI.promptPressedEvent · Lib: onPromptPressed(handler)

Argumentos

Prop

Type

Listener

resource/client/atm.ts
import { onPromptPressed, showPrompt } from "@aicore-fivem/lib/client";

showPrompt("atm", "Use ATM");
// onPromptPressed filtra pelo seu recurso por você.
onPromptPressed((id) => {
  if (id === "atm") console.log("open the ATM");
});

ai-lib:client:cancelProgress

O jogador apertou a tecla de cancelar do ai-lib enquanto a barra de progresso aparecia. O progress da lib com canCancel: true escuta e encerra a barra com false.

Lado: Cliente · Constante: LIB_UI.cancelProgressEvent

Argumentos

Nenhum.

Listener

resource/client/index.ts
import { LIB_UI } from "@aicore-fivem/shared";

// Só é necessário se você roda o ShowProgress do ai-lib você mesmo em vez do progress() da lib.
on(LIB_UI.cancelProgressEvent, () => console.log("player cancelled the bar"));

Eventos internos do ai-lib

Os Zones e Points da lib entregam as verificações deles ao ai-lib e recebem a resposta por estes eventos. Não os dispare; use Zones e Points.

EventoConstanteArgumentos
ai-lib:client:zoneLIB_UI.zoneEvent(owner: string, key: string, inside: boolean) o jogador entrou ou saiu de uma zona que o ai-lib verifica para owner.
ai-lib:client:modelPointLIB_UI.modelPointEvent(owner: string, key: string, entity: number) o objeto mais próximo de um ponto por modelo mudou (0 = nenhum perto).

Nesta página