State Bags
Die Server-Versionen von EntityState, PlayerState, GlobalKey und GlobalGroup: der einzige Weg, auf dem ein ai-*-Skript replizierten Zustand schreibt.
import { EntityState, PlayerState, GlobalKey, GlobalGroup, stateNumber, stateBoolean } from "@aicore-fivem/lib/server";Ein State Bag ist ein Wert, den FiveM vom Server zu den Clients kopiert: auf einer Entity (der Sprit eines Fahrzeugs), auf einem Spieler (dead) oder global (der Zustand einer Tür, den alle sehen). ai-core läuft im strikten State-Bag-Modus, daher schreibt nur der Server: Ein Client, der eine Änderung will, fragt über einen Callback, und der Server setzt den Wert.
Der Server-Einstieg exportiert dieselben vier Klassen wie der Client, plus eine Methode set. Der Konstruktor, get, onChange, EntityState.getByNetId und GlobalGroup.ids sind einmal auf Lib: Shared und fivem dokumentiert. Erstelle jede Instanz einmal auf Modulebene, eine pro Schlüssel.
Ein Wert, den du mit set setzt, ist auf dem Server sofort mit get lesbar, und onChange-Listener laufen einmal. undefined zu setzen entfernt den Wert.
Keine Lua-Zwillinge: Lua liest Entity(entity).state.key selbst und schreibt mit Entity(entity).state:set(key, value, true).
EntityState.set
Schreibt einen Schlüssel in den State Bag einer Entity. Er repliziert an die Spieler, die die Entity in Reichweite haben.
Seite: Server · Wartet: nein
new EntityState<T>(key: string, parse: StateParse<T>)
set(entity: number, value: T | undefined): voidProp
Type
Rückgabewert: void.
import { EntityState, stateNumber } from "@aicore-fivem/lib/server";
const odometer = new EntityState("my:km", stateNumber);
odometer.set(vehicle, (odometer.get(vehicle) ?? 0) + 1);PlayerState.set
Schreibt einen Schlüssel in den State Bag eines Spielers. Er repliziert an diesen Spieler und die Spieler in seiner Nähe.
Seite: Server · Wartet: nein
new PlayerState<T>(key: string, parse: StateParse<T>)
set(source: number, value: T | undefined): voidProp
Type
Rückgabewert: void.
import { PlayerState, stateBoolean } from "@aicore-fivem/lib/server";
const cuffed = new PlayerState("my:cuffed", stateBoolean);
cuffed.set(target, true);
// später
cuffed.set(target, undefined);GlobalKey.set
Schreibt einen GlobalState-Schlüssel. Er repliziert an jeden Spieler: Nutze ihn nur für Zustand, den jeder Spieler braucht.
Seite: Server · Wartet: nein
new GlobalKey<T>(key: string, parse: StateParse<T>)
set(value: T | undefined): voidProp
Type
Rückgabewert: void.
import { GlobalKey, stateBoolean } from "@aicore-fivem/lib/server";
const stormActive = new GlobalKey("my:storm", stateBoolean);
stormActive.set(true);GlobalGroup.set
Schreibt einen Schlüssel aus einer Gruppe von GlobalState-Schlüsseln mit gemeinsamem Präfix (door:<id>, rob:<id>). Er repliziert <prefix><id> an jeden Spieler.
Seite: Server · Wartet: nein
new GlobalGroup<T>(prefix: string, parse: StateParse<T>)
set(id: string, value: T | undefined): voidProp
Type
Rückgabewert: void.
import { GlobalGroup, stateBoolean } from "@aicore-fivem/lib/server";
const robbedStores = new GlobalGroup("my-rob:", stateBoolean);
robbedStores.set("store_12", true); // GlobalState["my-rob:store_12"] = trueState Bags sind für kleine Werte, die viele Spieler lesen. Listen, Daten für genau einen Spieler oder alles, was sich oft ändert, gehen als Snapshot + Delta über Events (siehe AreaStream und KeyWatchers auf Spieler). Gemeinsame Schlüsselnamen liegen in @aicore-fivem/shared (VEHICLE_BAGS, PLAYER_BAGS) oder im common/ deiner Ressource.
Handy und Aussehen
Das Handy des Spielers über ai-core (Nummern, Mails, SMS, Benachrichtigungen) und das gespeicherte Aussehen von Charakteren über das jeweils laufende Kleidungs-Skript.
Logs
aiLog und aiLogChannels: Logs über ai-core an die Konsole, Discord, Fivemanage oder FiveM Stats senden, je nachdem, was der Betreiber im Panel einschaltet.