UI-Events von ai-lib
Die Client-Events, die ai-lib auslöst, wenn ein Spieler ein Menü, einen Eingabedialog, eine Item-Auswahl, ein Minispiel oder eine Aufforderung beantwortet oder einen Fortschrittsbalken abbricht - für Skripte, die die Exports von ai-lib selbst aufrufen.
ai-lib zeichnet die gemeinsame Spieler-UI: Menüs, Eingabedialoge, Aufforderungen, den Fortschrittsbalken, Minispiele, Benachrichtigungen. Wenn der Spieler antwortet, löst ai-lib eines dieser lokalen Client-Events aus.
Die meisten Skripte hören nie auf sie. menu, input, itemPicker, skillCheck, lockpick, onPromptPressed und progress der Lib (und dieselben Namen auf aiLib) öffnen die UI, hören auf die Antwort und geben sie dir als Rückgabewert zurück. Höre nur selbst zu, wenn du die Exports von ai-lib (OpenMenu, OpenInput, OpenMinigame) oder OpenItemPicker von ai-core direkt aufrufst.
Jede Antwort trägt die Ressource, die die UI geöffnet hat, und die Anfrage-ID, die sie gewählt hat. Prüfe beides: Jede Ressource auf dem Client hört jede Antwort.
ai-lib:client:menuResult
Der Spieler hat einen Menüeintrag gewählt oder das Menü geschlossen. Dasselbe Event beantwortet die Item-Auswahl von ai-core und die Minispiele von ai-lib.
Seite: Client · Konstante: MENU_EVENTS.menuResult
Argumente
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);
});
// menu() der Lib tut genau das; hier gezeigt, um das Event zu erklären.
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
Der Zeiger oder der Tastaturfokus ist auf einen Menüeintrag gewandert. Nutze es für Vorschauen (eine Fahrzeugfarbe zeigen, während der Spieler darüberfährt). Das Menü bleibt offen.
Seite: Client · Konstante: MENU_EVENTS.menuHover · Lib: menu(request, { onHover })
Argumente
Prop
Type
Listener
import { menu } from "@aicore-fivem/lib/client";
// Die Lib gibt Hover-Ereignisse ihres eigenen Menüs an onHover weiter.
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
Der Spieler hat eine Schalterzeile umgelegt (ein Eintrag mit checked). Der Schalter wechselt an Ort und Stelle, und das Menü bleibt offen.
Seite: Client · Konstante: MENU_EVENTS.menuToggle · Lib: menu(request, { onToggle })
Argumente
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
Der Spieler hat einen Eingabedialog bestätigt oder geschlossen.
Seite: Client · Konstante: MENU_EVENTS.inputResult · Lib: input(request)
Argumente
Prop
Type
Listener
import { input } from "@aicore-fivem/lib/client";
// input() der Lib hört für dich auf ai-lib:client:inputResult.
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
Der Spieler hat die Interaktionstaste gedrückt, während eine Aufforderung oben in der Liste stand. Nur die Ressource, die diese Aufforderung gezeigt hat, sollte reagieren.
Seite: Client · Konstante: LIB_UI.promptPressedEvent · Lib: onPromptPressed(handler)
Argumente
Prop
Type
Listener
import { onPromptPressed, showPrompt } from "@aicore-fivem/lib/client";
showPrompt("atm", "Use ATM");
// onPromptPressed filtert für dich nach deiner Ressource.
onPromptPressed((id) => {
if (id === "atm") console.log("open the ATM");
});ai-lib:client:cancelProgress
Der Spieler hat die Abbrechen-Taste von ai-lib gedrückt, während der Fortschrittsbalken angezeigt wurde. progress der Lib mit canCancel: true hört darauf und beendet den Balken mit false.
Seite: Client · Konstante: LIB_UI.cancelProgressEvent
Argumente
Keine.
Listener
import { LIB_UI } from "@aicore-fivem/shared";
// Nur nötig, wenn du ShowProgress von ai-lib selbst ausführst statt progress() der Lib.
on(LIB_UI.cancelProgressEvent, () => console.log("player cancelled the bar"));Interne Events von ai-lib
Zones und Points der Lib übergeben ihre Prüfungen an ai-lib und hören über diese Events zurück. Löse sie nicht aus; nutze Zones und Points.
| Event | Konstante | Argumente |
|---|---|---|
ai-lib:client:zone | LIB_UI.zoneEvent | (owner: string, key: string, inside: boolean) der Spieler hat eine Zone betreten oder verlassen, die ai-lib für owner prüft. |
ai-lib:client:modelPoint | LIB_UI.modelPointEvent | (owner: string, key: string, entity: number) das nächste Objekt eines Modellpunkts hat sich geändert (0 = keines in der Nähe). |
Net-Events
Die Net-Events, auf die ein Client-Skript hören darf (der Spielerdaten-Kanal von ai-core), und der eigene Netzwerkverkehr von ai-core, den andere Skripte nicht auslösen dürfen.
State Bags
Die gemeinsamen Zustandswerte, die ai-core und die ai-*-Skripte veröffentlichen - Spieler-Bags, Fahrzeug-Bags und GlobalState-Schlüssel - was jeder enthält, wer ihn schreibt und wie du ihn liest und ihm folgst.