State bags
Les versions serveur d’EntityState, PlayerState, GlobalKey et GlobalGroup : la seule façon dont un script ai-* écrit un état répliqué.
import { EntityState, PlayerState, GlobalKey, GlobalGroup, stateNumber, stateBoolean } from "@aicore-fivem/lib/server";Un state bag est une valeur que FiveM copie du serveur vers les clients : sur une entité (le carburant d’un véhicule), sur un joueur (dead), ou globale (l’état d’une porte que tout le monde voit). ai-core tourne en mode state bag strict, donc seul le serveur écrit : un client qui veut un changement le demande via un callback, et le serveur fixe la valeur.
L’entrée serveur exporte les quatre mêmes classes que le client, plus une méthode set. Le constructeur, get, onChange, EntityState.getByNetId et GlobalGroup.ids sont documentés une seule fois sur Lib : shared et fivem. Créez chaque instance une seule fois au niveau du module, une par clé.
Une valeur que vous fixez avec set est lisible immédiatement avec get sur le serveur, et les écouteurs onChange s’exécutent une fois. Fixer undefined retire la valeur.
Pas d’équivalents Lua : Lua lit Entity(entity).state.key lui-même, et écrit avec Entity(entity).state:set(key, value, true).
EntityState.set
Écrit une clé dans le state bag d’une entité. Elle est répliquée aux joueurs qui ont l’entité à portée.
Côté : serveur · Attend : non
new EntityState<T>(key: string, parse: StateParse<T>)
set(entity: number, value: T | undefined): voidProp
Type
Retour 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
Écrit une clé dans le state bag d’un joueur. Elle est répliquée à ce joueur et aux joueurs proches de lui.
Côté : serveur · Attend : non
new PlayerState<T>(key: string, parse: StateParse<T>)
set(source: number, value: T | undefined): voidProp
Type
Retour void.
import { PlayerState, stateBoolean } from "@aicore-fivem/lib/server";
const cuffed = new PlayerState("my:cuffed", stateBoolean);
cuffed.set(target, true);
// plus tard
cuffed.set(target, undefined);GlobalKey.set
Écrit une clé GlobalState. Elle est répliquée à tous les joueurs : ne l’utilisez que pour un état dont tous les joueurs ont besoin.
Côté : serveur · Attend : non
new GlobalKey<T>(key: string, parse: StateParse<T>)
set(value: T | undefined): voidProp
Type
Retour void.
import { GlobalKey, stateBoolean } from "@aicore-fivem/lib/server";
const stormActive = new GlobalKey("my:storm", stateBoolean);
stormActive.set(true);GlobalGroup.set
Écrit une clé d’un groupe de clés GlobalState qui partagent un préfixe (door:<id>, rob:<id>). Elle réplique <prefix><id> à tous les joueurs.
Côté : serveur · Attend : non
new GlobalGroup<T>(prefix: string, parse: StateParse<T>)
set(id: string, value: T | undefined): voidProp
Type
Retour 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"] = trueLes state bags sont faits pour de petites valeurs lues par beaucoup de joueurs. Les listes, les données propres à un seul joueur, ou tout ce qui change souvent passent en snapshot + delta via des événements (voir AreaStream et KeyWatchers sur Joueurs). Les noms de clés partagés se trouvent dans @aicore-fivem/shared (VEHICLE_BAGS, PLAYER_BAGS) ou dans le common/ de votre ressource.
Téléphone et apparence
Le téléphone du joueur via ai-core (numéros, mails, SMS, notifications) et l’apparence enregistrée des personnages via le script de vêtements qui tourne.
Journaux
aiLog et aiLogChannels : envoyez des journaux via ai-core vers la console, Discord, Fivemanage ou FiveM Stats, selon ce que le propriétaire du serveur active dans le panneau.