AI Core
Referencia de la APIEventos y estado

State bags

Los valores de estado compartido que publican ai-core y los scripts ai-* - bags de jugador, bags de vehículo y claves de GlobalState - qué contiene cada uno, quién lo escribe y cómo leerlo y seguirlo.

Un state bag es un valor que FiveM mantiene sincronizado para todo el mundo: en GlobalState (un valor para todo el servidor), en un jugador o en una entidad (un vehículo). Cualquier recurso de cualquier lado puede leerlo, y sigue los cambios sin ningún evento propio. ai-core y los scripts ai-* los usan para el estado que necesita todo el mundo, nunca para datos privados.

Solo lectura. Cada clave de abajo tiene un recurso dueño, que es el único que la escribe, siempre desde el servidor. Nunca escribas tú estas claves, ni desde el servidor ni desde el cliente: el dueño te sobrescribiría y los demás scripts verían un estado erróneo. Para cambiar el estado, llama al export del dueño (por ejemplo la reanimación de ai-death, el export de servicio de ai-core).

Cómo leerlos

La lib tiene una clase por tipo. Cada una mantiene una copia local, así que get no cuesta nada, y onChange ejecuta tu listener después de un cambio.

TipoTypeScript (lib)Lua
Una clave de GlobalStatenew GlobalKey(key, parse): .get(), .onChange((_, value, old) => ...)GlobalState[key], AddStateBagChangeHandler(key, 'global', fn)
Muchas claves de GlobalState con un mismo prefijonew GlobalGroup(prefix, parse): .get(id), .ids(), .onChange((id, value, old) => ...)GlobalState[prefix .. id]
El bag de un jugadornew PlayerState(key, parse): .get(serverId), .onChange((serverId, value, old) => ...)Player(serverId).state[key], LocalPlayer.state[key] en el cliente
El bag de una entidadnew EntityState(key, parse): .get(entity), .getByNetId(netId), .onChange((netId, value, old) => ...)Entity(entity).state[key]

parse comprueba el valor en bruto: stateNumber, stateBoolean, stateString de la lib, o tu propia función que devuelve undefined para un valor erróneo. Todos vienen de @aicore-fivem/lib/client o @aicore-fivem/lib/server.

resource/client/index.ts
import { cache, GlobalKey, PlayerState, stateBoolean, stateNumber } from "@aicore-fivem/lib/client";
import { dutyCountKey, PLAYER_BAGS } from "@aicore-fivem/shared";

const policeOnDuty = new GlobalKey(dutyCountKey("police"), stateNumber);
const cuffed = new PlayerState(PLAYER_BAGS.cuffed, stateBoolean);

console.log(`police on duty: ${policeOnDuty.get() ?? 0}`);
policeOnDuty.onChange((_, count) => console.log(`police on duty now: ${count ?? 0}`));

cuffed.onChange((serverId, value) => {
  if (serverId === cache.serverId) console.log(value ? "you are cuffed" : "you are free");
});

Bags de jugador (PLAYER_BAGS)

Claves que leen varios recursos en un jugador. Constante: PLAYER_BAGS en @aicore-fivem/shared.

ClaveConstanteDueñoValor
deadPLAYER_BAGS.deadai-deathtrue mientras el jugador está caído. Ausente o false en otro caso. Con otro script de muerte, usa la capa médica (export IsDead, medical de la lib) en su lugar: los demás scripts de muerte usan sus propias claves.
cuffedPLAYER_BAGS.cuffedai-policetrue mientras el jugador está esposado.
proximityPLAYER_BAGS.proximityai-voiceEl alcance de la voz, con la forma de pma-voice: { index, distance, mode }.

Bags de vehículo (VEHICLE_BAGS)

Claves en entidades de vehículo. Constante: VEHICLE_BAGS en @aicore-fivem/shared.

ClaveConstanteDueñoValor
ai:ownedVEHICLE_BAGS.ownedai-vehiclestrue en un vehículo en propiedad que ha aparecido.
ai:vidVEHICLE_BAGS.idai-vehiclesEl id del vehículo en ai-vehicles (número).
ai:propsVEHICLE_BAGS.propsai-vehiclesEl aspecto y el tuning del vehículo (VehicleProps). ai-core lo aplica en el cliente dueño de la entidad.
ai:setupVEHICLE_BAGS.setupai-vehiclesUna configuración de aparición (VehicleSetup, por ejemplo un color elegido en una tienda). ai-core la aplica una vez en el cliente dueño.
fuelVEHICLE_BAGS.fuelel script de combustible (ai-fuel; ai-core lo mantiene para los scripts de combustible del lado del cliente)Nivel de combustible, 0-100.

Para leer el combustible, usa la capa fuel de la lib: funciona con cualquier script de combustible, también con los que no escriben ellos mismos el bag fuel.

Claves de GlobalState de ai-core

ClaveConstanteValor
ai:duty:<job>dutyCountKey(job) (prefijo DUTY_COUNT_PREFIX)Cuántos jugadores están de servicio en ese trabajo (número). Solo recuentos, nunca quién.
ai:interactionCORE.interactionStateKey"prompt" o "target": cómo dejan interactuar a los jugadores los Points de la lib (ajuste del panel de ai-core).
ai:pvpCORE.pvpStateKeytrue cuando los jugadores pueden hacerse daño entre sí (ajuste pvp del panel, comando /togglepvp).
ai:inventoryINVENTORY_STATE_KEYNombre de recurso del inventario que hay detrás de la capa de inventario de ai-core. Sin definir mientras no hay ninguno en marcha.
ai:vehicleKeysVEHICLE_KEYS_STATE_KEYNombre de recurso del script de llaves de vehículos activo. Sin definir mientras no hay ninguno en marcha.
ai:appearanceAPPEARANCE_STATE_KEYNombre de recurso del script de ropa activo. Sin definir mientras no hay ninguno en marcha.
ai:medicalCORE.medicalStateKeyNombre de recurso del script de muerte activo.
ai:mdtCORE.mdtStateKeyNombre de recurso del MDT activo.
ai:notifyCORE.notifyStateKeyNombre de recurso de la interfaz de notificaciones a la que van las tarjetas de ai-lib. Sin definir: ai-lib dibuja sus propias tarjetas.
ai:fuelFUEL_STATE_KEYNombre de recurso del script de combustible activo. Sin definir mientras no hay ninguno en marcha.
ai:garagesGARAGES_STATE_KEYNombre de recurso del script de garajes activo. Sin definir mientras no hay ninguno en marcha.

Las claves con nombres de recurso indican a las mitades de cliente de ai-core con qué script hablar. Léelas cuando necesites saber qué script está en marcha (para una línea de log, una ayuda al jugador), no para llamar directamente a ese script: llama a la capa de ai-core en su lugar.

resource/server/index.ts
import { GlobalKey, stateBoolean } from "@aicore-fivem/lib/server";
import { CORE } from "@aicore-fivem/shared";

const pvp = new GlobalKey(CORE.pvpStateKey, stateBoolean);

pvp.onChange((_, on) => console.log(on ? "PvP is on" : "PvP is off"));

Claves de otros scripts ai-*

Estado compartido que publican algunos scripts ai-*, para los scripts que trabajan con ellos. La página para desarrolladores de cada script tiene los detalles.

ClaveDóndeDueñoValor
door:<id>GlobalStateai-doorlocktrue mientras la puerta está cerrada con llave.
ai:clockGlobalStateai-weathersync{ base, at, scale, frozen }: minutos de juego del día en la hora del servidor at (ms), avanzando scale minutos de juego por cada minuto real. Los clientes llevan el reloj ellos mismos a partir de esto.
ai:weatherGlobalStateai-weathersync{ type, blackout }: el clima actual.
ai:rweather:<id>GlobalStateai-weathersyncEl clima actual de una región de clima.
prop:<id>GlobalStateai-propertiestrue cuando la propiedad tiene dueño.
rob:<id>GlobalStateai-robberiestrue mientras un objetivo de robo está vaciado y espera su tiempo de recarga.
siren:lxVehículoai-sirensTono principal de la sirena: 0 apagada, 1-3 un tono.
siren:manuVehículoai-sirensBocina / sirena manual: 0 apagada, 1 bocina, 2 manual, 3 ambas.
siren:lightbarVehículoai-sirensEl modelo de barra de luces montado en el vehículo; ausente si no hay ninguno.

En esta página