State bags
Las versiones de servidor de EntityState, PlayerState, GlobalKey y GlobalGroup: la única forma en que un script ai-* escribe estado replicado.
import { EntityState, PlayerState, GlobalKey, GlobalGroup, stateNumber, stateBoolean } from "@aicore-fivem/lib/server";Un state bag es un valor que FiveM copia del servidor a los clientes: en una entidad (el combustible de un vehículo), en un jugador (dead) o global (el estado de una puerta que todos ven). ai-core funciona con el modo estricto de state bags, así que solo escribe el servidor: un cliente que quiere un cambio lo pide mediante un callback, y el servidor fija el valor.
La entrada de servidor exporta las mismas cuatro clases que el cliente, más un método set. El constructor, get, onChange, EntityState.getByNetId y GlobalGroup.ids se documentan una sola vez en Lib: compartido y fivem. Crea cada instancia una vez a nivel de módulo, una por clave.
Un valor que fijas con set se puede leer al momento con get en el servidor, y los listeners de onChange se ejecutan una vez. Fijar undefined elimina el valor.
Sin equivalentes en Lua: Lua lee Entity(entity).state.key por sí mismo y escribe con Entity(entity).state:set(key, value, true).
EntityState.set
Escribe una clave en el state bag de una entidad. Se replica a los jugadores que tienen la entidad en su alcance.
Lado: Servidor · Espera: no
new EntityState<T>(key: string, parse: StateParse<T>)
set(entity: number, value: T | undefined): voidProp
Type
Devuelve 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
Escribe una clave en el state bag de un jugador. Se replica a ese jugador y a los jugadores cercanos.
Lado: Servidor · Espera: no
new PlayerState<T>(key: string, parse: StateParse<T>)
set(source: number, value: T | undefined): voidProp
Type
Devuelve void.
import { PlayerState, stateBoolean } from "@aicore-fivem/lib/server";
const cuffed = new PlayerState("my:cuffed", stateBoolean);
cuffed.set(target, true);
// más tarde
cuffed.set(target, undefined);GlobalKey.set
Escribe una clave de GlobalState. Se replica a todos los jugadores: úsalo solo para estado que todos los jugadores necesitan.
Lado: Servidor · Espera: no
new GlobalKey<T>(key: string, parse: StateParse<T>)
set(value: T | undefined): voidProp
Type
Devuelve void.
import { GlobalKey, stateBoolean } from "@aicore-fivem/lib/server";
const stormActive = new GlobalKey("my:storm", stateBoolean);
stormActive.set(true);GlobalGroup.set
Escribe una clave de un grupo de claves de GlobalState que comparten un prefijo (door:<id>, rob:<id>). Replica <prefix><id> a todos los jugadores.
Lado: Servidor · Espera: no
new GlobalGroup<T>(prefix: string, parse: StateParse<T>)
set(id: string, value: T | undefined): voidProp
Type
Devuelve 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"] = trueLos state bags son para valores pequeños que leen muchos jugadores. Las listas, los datos de un solo jugador o cualquier cosa que cambie a menudo van como snapshot + delta mediante eventos (consulta AreaStream y KeyWatchers en Jugadores). Los nombres de claves compartidos viven en @aicore-fivem/shared (VEHICLE_BAGS, PLAYER_BAGS) o en el common/ de tu recurso.
Teléfono y apariencia
El teléfono del jugador a través de ai-core (números, correos, mensajes, notificaciones) y el aspecto guardado de los personajes a través del script de ropa que funcione.
Logs
aiLog y aiLogChannels: envía logs a través de ai-core a la consola, Discord, Fivemanage o FiveM Stats, lo que el dueño active en el panel.