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
getPlayerData<K extends keyof AiPlayerData>(key: K): AiPlayerData[K] | undefinedlocal 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
onPlayerData<K extends keyof AiPlayerData>(key: K, handler: (value: AiPlayerData[K]) => void): () => voidaiLib.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éfinitivementLes 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
seedPlayerData(data: Partial<AiPlayerData>): voidPas 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
hasJob(jobs: readonly string[], minGrade?: number): booleanPas 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
inGang(gangs: readonly string[], minGrade?: number): booleanPas 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
onDutyIn(jobs: readonly string[]): booleanPas 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
onMembershipChange(fn: () => void): voidPas 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
allows(rule: AccessRule): booleanPas 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
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());Caméra et timing
ScriptCamera, TickLoop, AreaFollower et ServerClock : caméras scriptées, tâches par frame qui ne tournent que lorsque c’est nécessaire, signalement de la zone du joueur au serveur, et l’horloge du serveur côté client.
Lib : serveur
@aicore-fivem/lib/server et le côté serveur d’aiLib : ce qu’ils sont, comment les charger en TypeScript et en Lua, et toutes les pages thématiques.