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
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
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
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
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
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
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.
| Evento | Constante | Argumentos |
|---|---|---|
ai-lib:client:zone | LIB_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:modelPoint | LIB_UI.modelPointEvent | (owner: string, key: string, entity: number) o objeto mais próximo de um ponto por modelo mudou (0 = nenhum perto). |
Net events
Os net events que um script de cliente pode escutar (o canal de dados do jogador do ai-core) e o tráfego de rede próprio do ai-core que outros scripts não devem disparar.
State bags
Os valores de estado compartilhado que o ai-core e os scripts ai-* publicam - bags de jogador, bags de veículo e chaves de GlobalState -, o que cada um guarda, quem o escreve e como lê-lo e acompanhá-lo.