AI Core
Référence de l’APIÉvénements et état

State bags

Les valeurs d’état partagées que publient ai-core et les scripts ai-* - bags de joueur, bags de véhicule et clés GlobalState - ce que contient chacune, qui l’écrit, et comment la lire et la suivre.

Un state bag est une valeur que FiveM garde synchronisée pour tout le monde : sur GlobalState (une valeur pour tout le serveur), sur un joueur ou sur une entité (un véhicule). Chaque ressource de chaque côté peut la lire, et elle suit les changements sans aucun événement de votre part. ai-core et les scripts ai-* les utilisent pour l’état dont tout le monde a besoin, jamais pour des données privées.

Lecture seule. Chaque clé ci-dessous a une ressource propriétaire, la seule à l’écrire, toujours depuis le serveur. N’écrivez jamais ces clés vous-même, ni depuis le serveur ni depuis le client : le propriétaire écraserait votre valeur, et les autres scripts verraient un état faux. Pour changer l’état, appelez l’export du propriétaire (par exemple la réanimation d’ai-death, l’export de service d’ai-core).

Comment les lire

La lib a une classe par sorte. Chacune garde une copie locale, si bien que get ne coûte rien, et onChange exécute votre écouteur après un changement.

SorteTypeScript (lib)Lua
Une clé GlobalStatenew GlobalKey(key, parse) : .get(), .onChange((_, value, old) => ...)GlobalState[key], AddStateBagChangeHandler(key, 'global', fn)
Plusieurs clés GlobalState avec un même préfixenew GlobalGroup(prefix, parse) : .get(id), .ids(), .onChange((id, value, old) => ...)GlobalState[prefix .. id]
Le bag d’un joueurnew PlayerState(key, parse) : .get(serverId), .onChange((serverId, value, old) => ...)Player(serverId).state[key], LocalPlayer.state[key] sur le client
Le bag d’une entiténew EntityState(key, parse) : .get(entity), .getByNetId(netId), .onChange((netId, value, old) => ...)Entity(entity).state[key]

parse vérifie la valeur brute : stateNumber, stateBoolean, stateString de la lib, ou votre propre fonction qui renvoie undefined pour une valeur invalide. Ils viennent tous 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 joueur (PLAYER_BAGS)

Clés que plusieurs ressources lisent sur un joueur. Constante : PLAYER_BAGS dans @aicore-fivem/shared.

CléConstantePropriétaireValeur
deadPLAYER_BAGS.deadai-deathtrue tant que le joueur est à terre. Absente ou false sinon. Avec un autre script de mort, utilisez plutôt la couche médicale (export IsDead, medical de la lib) : les autres scripts de mort utilisent leurs propres clés.
cuffedPLAYER_BAGS.cuffedai-policetrue tant que le joueur est menotté.
proximityPLAYER_BAGS.proximityai-voiceLa portée de la voix, au format de pma-voice : { index, distance, mode }.

Bags de véhicule (VEHICLE_BAGS)

Clés sur les entités de véhicule. Constante : VEHICLE_BAGS dans @aicore-fivem/shared.

CléConstantePropriétaireValeur
ai:ownedVEHICLE_BAGS.ownedai-vehiclestrue sur un véhicule possédé apparu.
ai:vidVEHICLE_BAGS.idai-vehiclesL’id du véhicule dans ai-vehicles (number).
ai:propsVEHICLE_BAGS.propsai-vehiclesL’apparence et le tuning du véhicule (VehicleProps). ai-core l’applique sur le client propriétaire de l’entité.
ai:setupVEHICLE_BAGS.setupai-vehiclesUne configuration d’apparition (VehicleSetup, par exemple une couleur choisie dans un magasin). ai-core l’applique une fois sur le client propriétaire.
fuelVEHICLE_BAGS.fuelle script de carburant (ai-fuel ; ai-core la tient pour les scripts de carburant côté client)Niveau de carburant, 0-100.

Pour lire le carburant, utilisez la couche fuel de la lib : elle fonctionne avec n’importe quel script de carburant, y compris ceux qui n’écrivent pas eux-mêmes le bag fuel.

Clés GlobalState d’ai-core

CléConstanteValeur
ai:duty:<job>dutyCountKey(job) (préfixe DUTY_COUNT_PREFIX)Combien de joueurs sont en service dans ce métier (number). Seulement le nombre, jamais qui.
ai:interactionCORE.interactionStateKey"prompt" ou "target" : comment les Points de la lib laissent les joueurs interagir (réglage du panneau d’ai-core).
ai:pvpCORE.pvpStateKeytrue quand les joueurs peuvent se blesser entre eux (réglage pvp du panneau, commande /togglepvp).
ai:inventoryINVENTORY_STATE_KEYNom de ressource de l’inventaire derrière la couche d’inventaire d’ai-core. Non définie tant qu’aucun ne tourne.
ai:vehicleKeysVEHICLE_KEYS_STATE_KEYNom de ressource du script de clés de véhicule actif. Non définie tant qu’aucun ne tourne.
ai:appearanceAPPEARANCE_STATE_KEYNom de ressource du script de vêtements actif. Non définie tant qu’aucun ne tourne.
ai:medicalCORE.medicalStateKeyNom de ressource du script de mort actif.
ai:mdtCORE.mdtStateKeyNom de ressource du MDT actif.
ai:notifyCORE.notifyStateKeyNom de ressource de l’interface de notifications vers laquelle vont les cartes d’ai-lib. Non définie : ai-lib dessine ses propres cartes.
ai:fuelFUEL_STATE_KEYNom de ressource du script de carburant actif. Non définie tant qu’aucun ne tourne.
ai:garagesGARAGES_STATE_KEYNom de ressource du script de garages actif. Non définie tant qu’aucun ne tourne.

Les clés de nom de ressource indiquent aux moitiés client d’ai-core à quel script parler. Lisez-les quand vous devez savoir quel script tourne (pour une ligne de log, une indication au joueur), pas pour appeler ce script directement : appelez plutôt la couche d’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"));

Clés des autres scripts ai-*

L’état partagé que publient certains scripts ai-*, pour les scripts qui travaillent avec eux. La page développeur de chaque script donne les détails.

CléOùPropriétaireValeur
door:<id>GlobalStateai-doorlocktrue tant que la porte est verrouillée.
ai:clockGlobalStateai-weathersync{ base, at, scale, frozen } : minutes de jeu de la journée à l’heure serveur at (ms), avançant de scale minutes de jeu par minute réelle. Les clients font tourner l’horloge eux-mêmes à partir de là.
ai:weatherGlobalStateai-weathersync{ type, blackout } : la météo actuelle.
ai:rweather:<id>GlobalStateai-weathersyncLa météo actuelle d’une région météo.
prop:<id>GlobalStateai-propertiestrue quand la propriété a un propriétaire.
rob:<id>GlobalStateai-robberiestrue tant qu’une cible de braquage est vidée et attend la fin de son délai.
siren:lxVéhiculeai-sirensTonalité principale de la sirène : 0 coupée, 1-3 une tonalité.
siren:manuVéhiculeai-sirensKlaxon pneumatique / sirène manuelle : 0 coupé, 1 klaxon, 2 manuelle, 3 les deux.
siren:lightbarVéhiculeai-sirensLe modèle de rampe lumineuse attaché au véhicule ; absent s’il n’y en a pas.

Sur cette page