AI Core
Referencia de la APIEventos y estado

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

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);
});

// 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

resource/client/preview.ts
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

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

El jugador confirmó o cerró un diálogo de entrada.

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

Argumentos

Prop

Type

Oyente

resource/client/rename.ts
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

resource/client/atm.ts
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

resource/client/index.ts
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.

EventoConstanteArgumentos
ai-lib:client:zoneLIB_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:modelPointLIB_UI.modelPointEvent(owner: string, key: string, entity: number) cambió el objeto más cercano de un punto de modelo (0 = ninguno cerca).

En esta página