AI Core
Referência da APIEventos e estado

State bags

Os valores de estado compartilhado que o ai-core e os scripts ai-* publicam - bags de jogador, bags de veículo e chaves de GlobalState -, o que cada um guarda, quem o escreve e como lê-lo e acompanhá-lo.

Um state bag é um valor que o FiveM mantém sincronizado para todos: no GlobalState (um valor para o servidor inteiro), num jogador ou numa entidade (um veículo). Cada recurso em cada lado pode lê-lo, e ele acompanha as mudanças sem nenhum evento seu. O ai-core e os scripts ai-* os usam para estado de que todos precisam, nunca para dados privados.

Somente leitura. Cada chave abaixo tem um recurso dono, que é o único que a escreve, sempre a partir do servidor. Nunca escreva essas chaves você mesmo, nem do servidor nem do cliente: o dono sobrescreveria você, e outros scripts veriam um estado errado. Para mudar o estado, chame o export do dono (por exemplo o revive do ai-death, o export de serviço do ai-core).

Como lê-los

A lib tem uma classe por tipo. Cada uma guarda uma cópia local, então get não custa nada, e onChange roda seu listener depois de uma mudança.

TipoTypeScript (lib)Lua
Uma chave de GlobalStatenew GlobalKey(key, parse): .get(), .onChange((_, value, old) => ...)GlobalState[key], AddStateBagChangeHandler(key, 'global', fn)
Muitas chaves de GlobalState com um prefixonew GlobalGroup(prefix, parse): .get(id), .ids(), .onChange((id, value, old) => ...)GlobalState[prefix .. id]
O bag de um jogadornew PlayerState(key, parse): .get(serverId), .onChange((serverId, value, old) => ...)Player(serverId).state[key], LocalPlayer.state[key] no cliente
O bag de uma entidadenew EntityState(key, parse): .get(entity), .getByNetId(netId), .onChange((netId, value, old) => ...)Entity(entity).state[key]

parse verifica o valor bruto: stateNumber, stateBoolean, stateString da lib, ou uma função sua que retorna undefined para um valor ruim. Todos vêm de @aicore-fivem/lib/client ou @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 jogador (PLAYER_BAGS)

Chaves que vários recursos leem num jogador. Constante: PLAYER_BAGS em @aicore-fivem/shared.

ChaveConstanteDonoValor
deadPLAYER_BAGS.deadai-deathtrue enquanto o jogador está caído. Ausente ou false caso contrário. Com outro script de morte, use a camada médica (export IsDead, medical da lib): outros scripts de morte usam as próprias chaves.
cuffedPLAYER_BAGS.cuffedai-policetrue enquanto o jogador está algemado.
proximityPLAYER_BAGS.proximityai-voiceO alcance de voz, no formato do pma-voice: { index, distance, mode }.

Bags de veículo (VEHICLE_BAGS)

Chaves em entidades de veículos. Constante: VEHICLE_BAGS em @aicore-fivem/shared.

ChaveConstanteDonoValor
ai:ownedVEHICLE_BAGS.ownedai-vehiclestrue num veículo próprio spawnado.
ai:vidVEHICLE_BAGS.idai-vehiclesO id do veículo no ai-vehicles (número).
ai:propsVEHICLE_BAGS.propsai-vehiclesO visual e o tuning do veículo (VehicleProps). O ai-core os aplica no cliente dono da entidade.
ai:setupVEHICLE_BAGS.setupai-vehiclesUma configuração de spawn (VehicleSetup, por exemplo uma cor escolhida numa loja). O ai-core a aplica uma vez no cliente dono.
fuelVEHICLE_BAGS.fuelo script de combustível (ai-fuel; o ai-core o mantém para scripts de combustível do lado cliente)Nível de combustível, 0-100.

Para ler o combustível, use a camada fuel da lib: ela funciona com qualquer script de combustível, inclusive os que não escrevem o bag fuel eles mesmos.

Chaves de GlobalState do ai-core

ChaveConstanteValor
ai:duty:<job>dutyCountKey(job) (prefixo DUTY_COUNT_PREFIX)Quantos jogadores estão em serviço nesse emprego (número). Só contagens, nunca quem.
ai:interactionCORE.interactionStateKey"prompt" ou "target": como os Points da lib deixam os jogadores interagir (configuração do painel do ai-core).
ai:pvpCORE.pvpStateKeytrue quando os jogadores podem ferir uns aos outros (configuração pvp do painel, comando /togglepvp).
ai:inventoryINVENTORY_STATE_KEYNome do recurso do inventário por trás da camada de inventário do ai-core. Sem valor enquanto nenhum está rodando.
ai:vehicleKeysVEHICLE_KEYS_STATE_KEYNome do recurso do script de chaves de veículos ativo. Sem valor enquanto nenhum está rodando.
ai:appearanceAPPEARANCE_STATE_KEYNome do recurso do script de roupas ativo. Sem valor enquanto nenhum está rodando.
ai:medicalCORE.medicalStateKeyNome do recurso do script de morte ativo.
ai:mdtCORE.mdtStateKeyNome do recurso do MDT ativo.
ai:notifyCORE.notifyStateKeyNome do recurso da UI de notificação para onde vão os cards do ai-lib. Sem valor: o ai-lib desenha os próprios cards.
ai:fuelFUEL_STATE_KEYNome do recurso do script de combustível ativo. Sem valor enquanto nenhum está rodando.
ai:garagesGARAGES_STATE_KEYNome do recurso do script de garagem ativo. Sem valor enquanto nenhum está rodando.

As chaves com nomes de recursos dizem às metades de cliente do ai-core com qual script falar. Leia-as quando precisar saber qual script está rodando (para uma linha de log, uma dica ao jogador), não para chamar esse script diretamente: chame a camada do ai-core.

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"));

Chaves de outros scripts ai-*

Estado compartilhado que alguns scripts ai-* publicam, para scripts que trabalham com eles. A página de desenvolvedor de cada script tem os detalhes.

ChaveOndeDonoValor
door:<id>GlobalStateai-doorlocktrue enquanto a porta está trancada.
ai:clockGlobalStateai-weathersync{ base, at, scale, frozen }: minutos de jogo do dia no horário do servidor at (ms), avançando scale minutos de jogo por minuto real. Os clientes rodam o relógio eles mesmos a partir disto.
ai:weatherGlobalStateai-weathersync{ type, blackout }: o clima atual.
ai:rweather:<id>GlobalStateai-weathersyncO clima atual de uma região de clima.
prop:<id>GlobalStateai-propertiestrue quando a propriedade tem dono.
rob:<id>GlobalStateai-robberiestrue enquanto um alvo de assalto está esvaziado e espera o cooldown dele.
siren:lxVeículoai-sirensTom principal da sirene: 0 desligado, 1-3 um tom.
siren:manuVeículoai-sirensBuzina / sirene manual: 0 desligado, 1 buzina, 2 manual, 3 ambos.
siren:lightbarVeículoai-sirensO modelo de giroflex preso ao veículo; ausente quando não há.

Nesta página