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
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
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
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
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
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
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.
| Zdarzenie | Stała | Argumenty |
|---|---|---|
ai-lib:client:zone | LIB_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:modelPoint | LIB_UI.modelPointEvent | (owner: string, key: string, entity: number) zmienił się najbliższy obiekt punktu modelu (0 = żadnego w pobliżu). |
Zdarzenia sieciowe
Zdarzenia sieciowe, których może nasłuchiwać skrypt kliencki (kanał danych gracza ai-core), i własny ruch sieciowy ai-core, którego inne skrypty nie mogą wywoływać.
State bagi
Wspólne wartości stanu publikowane przez ai-core i skrypty ai-* - bagi graczy, bagi pojazdów i klucze GlobalState - co trzyma każda, kto ją zapisuje i jak ją czytać i śledzić.