AI Core
Dokumentacja APIZdarzenia i stan

Zdarzenia UI ai-lib

Klienckie zdarzenia, które ai-lib wysyła, gdy gracz odpowiada na menu, okno wprowadzania, wybierak przedmiotów, minigrę lub podpowiedź albo anuluje pasek postępu - dla skryptów, które same wywołują eksporty ai-lib.

ai-lib rysuje wspólne UI gracza: menu, okna wprowadzania, podpowiedzi, pasek postępu, minigry, powiadomienia. Gdy gracz odpowiada, ai-lib wysyła jedno z tych klienckich zdarzeń lokalnych.

Większość skryptów nigdy ich nie nasłuchuje. menu, input, itemPicker, skillCheck, lockpick, onPromptPressed i progress z liba (i te same nazwy w aiLib) otwierają UI, nasłuchują odpowiedzi i oddają ją jako wartość zwracaną. Nasłuchuj sam tylko wtedy, gdy bezpośrednio wywołujesz eksporty ai-lib (OpenMenu, OpenInput, OpenMinigame) albo OpenItemPicker z ai-core.

Każda odpowiedź niesie zasób, który otworzył UI, i wybrane przez niego id żądania. Sprawdzaj oba: każdy zasób na kliencie słyszy każdą odpowiedź.

ai-lib:client:menuResult

Gracz wybrał element menu albo zamknął menu. To samo zdarzenie odpowiada za wybierak przedmiotów ai-core i minigry ai-lib.

Strona: Klient · Stała: MENU_EVENTS.menuResult

Argumenty

Prop

Type

Nasłuchiwanie

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

// menu() z liba robi dokładnie to; pokazane tu, aby wyjaśnić zdarzenie.
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

Wskaźnik lub fokus klawiatury przesunął się na element menu. Używaj tego do podglądów (pokazanie koloru pojazdu, gdy gracz najeżdża na niego). Menu zostaje otwarte.

Strona: Klient · Stała: MENU_EVENTS.menuHover · Lib: menu(request, { onHover })

Argumenty

Prop

Type

Nasłuchiwanie

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

// Lib przekazuje najechania na własne menu do 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

Gracz przestawił wiersz przełącznika (element z checked). Przełącznik przestawia się w miejscu, a menu zostaje otwarte.

Strona: Klient · Stała: MENU_EVENTS.menuToggle · Lib: menu(request, { onToggle })

Argumenty

Prop

Type

Nasłuchiwanie

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

Gracz potwierdził lub zamknął okno wprowadzania.

Strona: Klient · Stała: MENU_EVENTS.inputResult · Lib: input(request)

Argumenty

Prop

Type

Nasłuchiwanie

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

// input() z liba nasłuchuje ai-lib:client:inputResult za ciebie.
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

Gracz nacisnął klawisz interakcji, gdy podpowiedź była na górze listy. Reagować powinien tylko zasób, który pokazał tę podpowiedź.

Strona: Klient · Stała: LIB_UI.promptPressedEvent · Lib: onPromptPressed(handler)

Argumenty

Prop

Type

Nasłuchiwanie

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

showPrompt("atm", "Use ATM");
// onPromptPressed filtruje po twoim zasobie za ciebie.
onPromptPressed((id) => {
  if (id === "atm") console.log("open the ATM");
});

ai-lib:client:cancelProgress

Gracz nacisnął klawisz anulowania ai-lib, gdy pokazywany był pasek postępu. progress z liba z canCancel: true nasłuchuje i kończy pasek z false.

Strona: Klient · Stała: LIB_UI.cancelProgressEvent

Argumenty

Brak.

Nasłuchiwanie

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

// Potrzebne tylko wtedy, gdy sam uruchamiasz ShowProgress z ai-lib zamiast progress() z liba.
on(LIB_UI.cancelProgressEvent, () => console.log("player cancelled the bar"));

Wewnętrzne zdarzenia ai-lib

Zones i Points z liba przekazują swoje sprawdzenia do ai-lib i dostają odpowiedź przez te zdarzenia. Nie wysyłaj ich; używaj Zones i Points.

ZdarzenieStałaArgumenty
ai-lib:client:zoneLIB_UI.zoneEvent(owner: string, key: string, inside: boolean) gracz wszedł do strefy lub ją opuścił, a ai-lib sprawdza ją dla owner.
ai-lib:client:modelPointLIB_UI.modelPointEvent(owner: string, key: string, entity: number) zmienił się najbliższy obiekt punktu modelu (0 = żadnego w pobliżu).

Na tej stronie