Eventos de la interfaz de ai-lib
Los eventos de cliente que dispara ai-lib cuando un jugador responde a un menú, un diálogo de entrada, el selector de objetos, un minijuego o un aviso, o cancela una barra de progreso - para scripts que llaman ellos mismos a los exports de ai-lib.
ai-lib dibuja la interfaz compartida del jugador: menús, diálogos de entrada, avisos, la barra de progreso, minijuegos, notificaciones. Cuando el jugador responde, ai-lib dispara uno de estos eventos locales de cliente.
La mayoría de los scripts nunca los escuchan. menu, input, itemPicker, skillCheck, lockpick, onPromptPressed y progress de la lib (y los mismos nombres en aiLib) abren la interfaz, escuchan la respuesta y te la devuelven como valor de retorno. Escúchalos tú solo cuando llamas directamente a los exports de ai-lib (OpenMenu, OpenInput, OpenMinigame) o al OpenItemPicker de ai-core.
Cada respuesta lleva el recurso que abrió la interfaz y el id de petición que eligió. Comprueba ambos: cada recurso del cliente oye cada respuesta.
ai-lib:client:menuResult
El jugador eligió un elemento del menú o cerró el menú. El mismo evento responde al selector de objetos de ai-core y a los minijuegos de ai-lib.
Lado: Cliente · Constante: MENU_EVENTS.menuResult
Argumentos
Prop
Type
Oyente
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);
});
// El menu() de la lib hace exactamente esto; se muestra aquí para explicar el 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
El puntero o el foco del teclado pasó a un elemento del menú. Úsalo para vistas previas (mostrar un color de vehículo mientras el jugador pasa por encima). El menú sigue abierto.
Lado: Cliente · Constante: MENU_EVENTS.menuHover · Lib: menu(request, { onHover })
Argumentos
Prop
Type
Oyente
import { menu } from "@aicore-fivem/lib/client";
// La lib pasa a onHover los hovers de su propio menú.
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
El jugador cambió una fila de interruptor (un elemento con checked). El interruptor cambia en el sitio y el menú sigue abierto.
Lado: Cliente · Constante: MENU_EVENTS.menuToggle · Lib: menu(request, { onToggle })
Argumentos
Prop
Type
Oyente
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
El jugador confirmó o cerró un diálogo de entrada.
Lado: Cliente · Constante: MENU_EVENTS.inputResult · Lib: input(request)
Argumentos
Prop
Type
Oyente
import { input } from "@aicore-fivem/lib/client";
// El input() de la lib escucha ai-lib:client:inputResult por ti.
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
El jugador pulsó la tecla de interacción mientras un aviso estaba en lo alto de la lista. Solo debe reaccionar el recurso que mostró ese aviso.
Lado: Cliente · Constante: LIB_UI.promptPressedEvent · Lib: onPromptPressed(handler)
Argumentos
Prop
Type
Oyente
import { onPromptPressed, showPrompt } from "@aicore-fivem/lib/client";
showPrompt("atm", "Use ATM");
// onPromptPressed filtra por tu recurso por ti.
onPromptPressed((id) => {
if (id === "atm") console.log("open the ATM");
});ai-lib:client:cancelProgress
El jugador pulsó la tecla de cancelar de ai-lib mientras se mostraba la barra de progreso. El progress de la lib con canCancel: true lo escucha y termina la barra con false.
Lado: Cliente · Constante: LIB_UI.cancelProgressEvent
Argumentos
Ninguno.
Oyente
import { LIB_UI } from "@aicore-fivem/shared";
// Solo hace falta si ejecutas tú el ShowProgress de ai-lib en lugar del progress() de la lib.
on(LIB_UI.cancelProgressEvent, () => console.log("player cancelled the bar"));Eventos internos de ai-lib
Las Zones y los Points de la lib entregan sus comprobaciones a ai-lib y reciben la respuesta con estos eventos. No los dispares; usa Zones y Points.
| Evento | Constante | Argumentos |
|---|---|---|
ai-lib:client:zone | LIB_UI.zoneEvent | (owner: string, key: string, inside: boolean) el jugador entró o salió de una zona que ai-lib comprueba para owner. |
ai-lib:client:modelPoint | LIB_UI.modelPointEvent | (owner: string, key: string, entity: number) cambió el objeto más cercano de un punto de modelo (0 = ninguno cerca). |
Eventos de red
Los eventos de red que puede escuchar un script de cliente (el canal de datos del jugador de ai-core), y el tráfico de red propio de ai-core que los demás scripts no deben disparar.
State bags
Los valores de estado compartido que publican ai-core y los scripts ai-* - bags de jugador, bags de vehículo y claves de GlobalState - qué contiene cada uno, quién lo escribe y cómo leerlo y seguirlo.