AI Core
Référence de l’APILib : client

Appartenance et données du joueur

hasJob, inGang, onDutyIn, allows, onMembershipChange, getPlayerData, onPlayerData et seedPlayerData : le personnage, l’argent, les métiers, le service et les gangs du joueur local tels qu’ai-core les pousse.

ai-core pousse les données propres au joueur local vers son client : un snapshot quand le personnage se charge, puis seulement les valeurs qui changent. Ces helpers lisent cette copie, si bien qu’une vérification coûte une lecture en mémoire et n’interroge jamais le serveur.

Utilisez-les pour ce que le joueur voit (le canShow d’un point, une entrée radiale, une ligne de menu). Le serveur décide de ce que le joueur peut faire avec les mêmes données (online sur Joueurs et personnages) : une vérification client n’est jamais une preuve.

Données du joueur

Les valeurs qu’ai-core conserve, par clé (AiPlayerData) :

Prop

Type

Les types des membres sont CharacterInfo, JobMembership et GangMembership.

getPlayerData

La dernière valeur d’une clé. À la première utilisation dans votre ressource, il lit aussi tout ce qu’ai-core a déjà poussé (depuis l’export GetPlayerData d’ai-core), si bien qu’une ressource redémarrée après le chargement du joueur a les valeurs immédiatement.

Côté : client · Attend : non

Signature
getPlayerData<K extends keyof AiPlayerData>(key: K): AiPlayerData[K] | undefined
Lua
local value = aiLib.playerData.get(key)

Paramètres

Prop

Type

Retour

AiPlayerData[K] | undefined : la valeur, ou undefined (nil en Lua) quand rien n’est encore arrivé (aucun personnage chargé, ai-core pas démarré).

Exemple

import { getPlayerData, notify } from "@aicore-fivem/lib/client";

RegisterCommand(
  "whoami",
  () => {
    const character = getPlayerData("character");
    const job = getPlayerData("job");
    const cash = getPlayerData("money")?.cash ?? 0;
    if (!character) return notify("No character loaded", "error");
    notify(`${job?.job ?? "unemployed"} (${job?.grade ?? 0}), $${cash}`, "info");
  },
  false,
);

onPlayerData

Exécute un gestionnaire chaque fois qu’ai-core pousse une clé pour ce joueur.

Côté : client · Attend : non

Signature
onPlayerData<K extends keyof AiPlayerData>(key: K, handler: (value: AiPlayerData[K]) => void): () => void
Lua
aiLib.playerData.onChange(key, function(value) end)

Paramètres

Prop

Type

Retour

TypeScript : () => void, une fonction qui retire le gestionnaire. Lua ne renvoie rien.

Exemple

import { onPlayerData } from "@aicore-fivem/lib/client";

const stop = onPlayerData("money", (money) => {
  SendNUIMessage({ action: "money", data: { cash: money.cash ?? 0, bank: money.bank ?? 0 } });
});
// stop() quand le HUD se ferme définitivement

Les valeurs poussées avant le démarrage de votre ressource ne sont pas rejouées pour le gestionnaire. Lisez la valeur actuelle une fois avec getPlayerData au démarrage, puis suivez les changements avec onPlayerData.

seedPlayerData

Remplit des valeurs à la main. Les clés qui ont déjà une valeur sont conservées. Vous n’en avez pas besoin : la lib s’initialise elle-même depuis ai-core à la première utilisation.

Côté : client · Attend : non

Signature
seedPlayerData(data: Partial<AiPlayerData>): void

Pas d’équivalent Lua.

Paramètres

Prop

Type

Retour

void.

Exemple

import { seedPlayerData } from "@aicore-fivem/lib/client";

// Un banc de test sans ai-core.
seedPlayerData({ jobs: [{ job: "police", grade: 3 }], duty: "police" });

Vérifications d’appartenance

hasJob

Indique si le joueur occupe l’un des métiers à un grade minimum, en service ou non.

Côté : client · Attend : non

Signature
hasJob(jobs: readonly string[], minGrade?: number): boolean

Pas d’équivalent Lua : parcourez aiLib.playerData.get('jobs') (voir l’exemple Lua de points.add).

Paramètres

Prop

Type

Retour

boolean : true quand la liste est vide, ou quand le joueur occupe l’un des jobs au grade minGrade ou au-dessus.

Exemple

import { hasJob, onMembershipChange, Points } from "@aicore-fivem/lib/client";

const points = new Points();
points.add("armory", {
  coords: { x: 482.6, y: -995.2, z: 30.7 },
  label: "Armory",
  canShow: () => hasJob(["police", "sheriff"], 1),
  onPressed: () => emitNet("mypolice:armory"),
});
onMembershipChange(() => points.refresh());

inGang

Indique si le joueur fait partie de l’un des gangs à un grade minimum.

Côté : client · Attend : non

Signature
inGang(gangs: readonly string[], minGrade?: number): boolean

Pas d’équivalent Lua : parcourez aiLib.playerData.get('gangs').

Paramètres

Prop

Type

Retour

boolean : true quand la liste est vide, ou quand le joueur fait partie de l’un des gangs au grade minGrade ou au-dessus.

Exemple

import { inGang, radial } from "@aicore-fivem/lib/client";

radial.add({
  id: "mygang:stash",
  label: "Gang stash",
  icon: "box",
  canShow: () => inGang(["ballas", "vagos"], 2),
  onPressed: () => emitNet("mygang:stash"),
});

onDutyIn

Indique si le joueur est en service dans l’un des métiers.

Côté : client · Attend : non

Signature
onDutyIn(jobs: readonly string[]): boolean

Pas d’équivalent Lua : aiLib.playerData.get('duty') est le métier en service.

Paramètres

Prop

Type

Retour

boolean : true quand le métier en service du joueur est dans jobs.

Exemple

import { onDutyIn, Points } from "@aicore-fivem/lib/client";

const points = new Points();
points.addVehicle("mymech:repair", {
  label: "Repair",
  icon: "wrench",
  canShow: () => onDutyIn(["mechanic"]),
  onPressed: (vehicle) => emitNet("mymech:repair", NetworkGetNetworkIdFromEntity(vehicle)),
});

onMembershipChange

Exécute une fonction quand les métiers, le service ou les gangs du joueur changent. Utilisez-le pour rafraîchir les points et les blips dont le canShow les lit.

Côté : client · Attend : non

Signature
onMembershipChange(fn: () => void): void

Pas d’équivalent Lua : aiLib.playerData.onChange pour jobs, duty et gangs.

Paramètres

Prop

Type

Retour

void.

Exemple

import { onMembershipChange, Points, radial } from "@aicore-fivem/lib/client";

const points = new Points();
onMembershipChange(() => {
  points.refresh();
  radial.refresh();
});

allows

Indique si le joueur local peut utiliser un lieu soumis à une règle d’accès. Le online.allows(source, rule) du serveur décide avec la même règle, si bien que ce que le joueur voit correspond exactement à ce que le serveur le laisse utiliser. Lisez la règle depuis un enregistrement du panneau avec readAccess(record) (@aicore-fivem/lib/shared).

Côté : client · Attend : non

Signature
allows(rule: AccessRule): boolean

Pas d’équivalent Lua.

Paramètres

Prop

Type

AccessRule

Prop

Type

Le type est AccessRule.

Retour

boolean : true quand les deux listes sont vides (tout le monde) ; quand le joueur fait partie de l’un des gangs à son grade minimum ; ou quand le joueur occupe l’un des jobs à son grade minimum (et y est en service quand onDuty est activé). Sinon false.

Exemple

resource/client/index.ts
import { AdminWorld, allows, callAction, onMembershipChange, Points } from "@aicore-fivem/lib/client";
import { readAccess, readVec3, RecordObjects, type AccessRule } from "@aicore-fivem/lib/shared";

const world = new AdminWorld(["stashes"]);
const points = new Points();

interface Stash { coords: { x: number; y: number; z: number }; access: AccessRule }
const readStash = (_key: string, raw: Record<string, unknown>): Stash | null => {
  const coords = readVec3(raw.coords);
  return coords ? { coords, access: readAccess(raw) } : null;
};

new RecordObjects(world, "stashes", readStash, (id, stash) => {
  points.add(id, {
    coords: stash.coords,
    label: "Stash",
    canShow: () => allows(stash.access),
    onPressed: () => callAction("mystash:open", [id], { fallback: "STASH_FAILED" }),
  });
  return () => points.remove(id);
});

onMembershipChange(() => points.refresh());

Sur cette page