Couches via ai-core
medical, appearance, gestures, seatbelt, fuel, mdt, radial, world et inventory : des appels client qui atteignent le script de mort, de vêtements, d’emotes, de ceinture, de carburant, de MDT, de menu radial, de météo ou d’inventaire que fait tourner le serveur.
Ces objets ne parlent jamais à un script précis. Ils interrogent ai-core, et ai-core transmet au script que le serveur fait tourner pour cette tâche : ai-death ou un autre script de mort, ai-appearance ou tgiann-clothing, n’importe quel script d’emotes ou de menu radial pris en charge. Votre script continue de fonctionner quand le propriétaire en change. Le fonctionnement des couches est décrit dans Couches et pont.
Quand aucun script de ce type ne tourne, les appels répondent false, null ou la valeur propre au jeu, comme l’indique chaque entrée.
medical
medical.isDead
Indique si le joueur local est à terre (mort ou en last stand), quel que soit le script de mort qui tourne. Les scripts de mort gardent en vie un ped à terre pour l’animer, si bien que IsEntityDead seul ne les détecte pas. Une lecture en mémoire après le premier appel.
Côté : client · Attend : non
medical.isDead(): booleanPas d’équivalent Lua : appelez exports['ai-core']:IsDead() et écoutez l’événement local ai-core:client:dead (dead).
Retour
boolean : true quand la couche médicale d’ai-core indique que le joueur est à terre, ou que le ped est mort pour le jeu.
Exemple
import { medical, notify } from "@aicore-fivem/lib/client";
RegisterCommand(
"phone",
() => {
if (medical.isDead()) return notify("You cannot use the phone now", "error");
SetNuiFocus(true, true);
},
false,
);medical.onChange
Exécute un gestionnaire quand le joueur local tombe à terre ou se relève.
Côté : client · Attend : non
medical.onChange(fn: (dead: boolean) => void): voidPas d’équivalent Lua : AddEventHandler('ai-core:client:dead', function(dead) end).
Paramètres
Prop
Type
Retour
void.
Exemple
import { medical, Points } from "@aicore-fivem/lib/client";
const points = new Points();
medical.onChange(() => points.refresh()); // les points dont canShow lit medical.isDead()appearance
L’apparence des peds via la couche d’apparence d’ai-core, quel que soit le script de vêtements qui tourne.
appearance.apply
Applique une apparence enregistrée à un ped du modèle de cette apparence. Récupérez l’apparence sur le serveur avec appearance.get(charId), créez le ped avec look.model, puis appliquez-la. Sur le ped du joueur lui-même, cela change ses vêtements.
Côté : client · Attend : non
appearance.apply(ped: number, look: CharacterAppearance): booleanlocal ok = aiLib.appearance.apply(ped, look)Paramètres
Prop
Type
Le type est CharacterAppearance.
Retour
boolean : false quand le ped a disparu, que le modèle diffère ou qu’aucun script de vêtements ne tourne.
Exemple
import { appearance, LocalPed, triggerServerCallback } from "@aicore-fivem/lib/client";
import type { CharacterAppearance } from "@aicore-fivem/shared";
// Une copie endormie d’un personnage, habillée comme lui.
export async function showSleeper(charId: number): Promise<void> {
const look = (await triggerServerCallback("mysleep:look", [charId]).catch(() => null)) as CharacterAppearance | null;
if (!look) return;
new LocalPed({
model: look.model,
coords: { x: 151.2, y: -1004.6, z: 29.4, heading: 90 },
onSpawn: (ped) => appearance.apply(ped, look),
});
}Vérifiez ce que le serveur envoie avant de le convertir. Un ped créé avec un autre modèle que look.model ne peut pas prendre l’apparence : apply répond false.
appearance.read
L’apparence qu’un ped porte en ce moment.
Côté : client · Attend : non
appearance.read(ped: number): CharacterAppearance | nulllocal look = aiLib.appearance.read(ped) -- table ou nilParamètres
Prop
Type
Retour
CharacterAppearance | null : l’apparence, ou null (nil en Lua) quand le script de vêtements ne peut pas la déterminer ou qu’aucun ne tourne.
Exemple
import { appearance, cache } from "@aicore-fivem/lib/client";
const before = appearance.read(cache.ped); // à remettre plus tard avec appearance.applyappearance.openMenu
Ouvre pour le joueur la boutique de vêtements, le barbier ou les tenues enregistrées du script de vêtements.
Côté : client · Attend : non
appearance.openMenu(menu: ClothingMenu): booleanlocal ok = aiLib.appearance.openMenu(menu)Paramètres
Prop
Type
Le type est ClothingMenu.
Retour
boolean : false quand le script de vêtements n’a pas ce menu ou qu’aucun ne tourne.
Exemple
import { appearance, Points } from "@aicore-fivem/lib/client";
const points = new Points();
points.add("barber", {
coords: { x: -814.3, y: -183.8, z: 37.6 },
label: "Barber",
onPressed: () => appearance.openMenu("barber"),
});appearance.wearOutfit
Fait porter au joueur une tenue de métier (un uniforme) jusqu’à reloadSkin. Elle n’est pas enregistrée : une reconnexion ou reloadSkin rend au joueur ses propres vêtements. Seules les pièces listées changent.
Côté : client · Attend : non
appearance.wearOutfit(outfit: JobOutfit): booleanlocal ok = aiLib.appearance.wearOutfit(outfit)Paramètres
Prop
Type
Les types sont JobOutfit et OutfitPiece.
Retour
boolean : false quand ce n’est pas possible (aucun script de vêtements, un modèle qu’il ne prend pas en charge).
Exemple
import { appearance } from "@aicore-fivem/lib/client";
appearance.wearOutfit({
components: [
{ id: 11, collection: "", index: 55, texture: 0 },
{ id: 4, collection: "", index: 35, texture: 0 },
],
props: [{ id: 0, collection: "", index: -1, texture: 0 }],
});appearance.reloadSkin
Remet au joueur son apparence enregistrée (retire une tenue de métier).
Côté : client · Attend : non
appearance.reloadSkin(): booleanlocal ok = aiLib.appearance.reloadSkin()Retour
boolean : false sans script de vêtements.
Exemple
import { appearance } from "@aicore-fivem/lib/client";
RegisterCommand("offduty", () => appearance.reloadSkin(), false);gestures
Mains en l’air, pointer du doigt et emotes du script d’emotes qui tourne, via ai-core.
gestures.isHandsUp
Indique si le joueur local a les mains en l’air.
Côté : client · Attend : non
gestures.isHandsUp(): booleanlocal up = aiLib.gestures.isHandsUp()Retour
boolean : true tant que les mains sont en l’air dans le script d’emotes en cours.
Exemple
import { gestures, onServerCallback } from "@aicore-fivem/lib/client";
// Avant un braquage, le serveur demande si la victime s’est rendue.
onServerCallback("myrob:surrendered", () => gestures.isHandsUp());gestures.isPointing
Indique si le joueur local pointe du doigt.
Côté : client · Attend : non
gestures.isPointing(): booleanlocal pointing = aiLib.gestures.isPointing()Retour
boolean : true tant qu’il pointe du doigt.
Exemple
if (gestures.isPointing()) return; // ne pas lancer une emote par-dessus le pointagegestures.provider
Le script d’emotes qui répond pour les mains en l’air et le pointage.
Côté : client · Attend : non
gestures.provider(): string | nulllocal name = aiLib.gestures.provider()Retour
string | null : son nom de ressource, ou null (nil) quand aucun ne tourne.
Exemple
console.log(`hands up from ${gestures.provider() ?? "nothing"}`);gestures.playEmote
Joue une emote par son nom de commande (ce que les joueurs tapent après e) dans le script d’emotes en cours.
Côté : client · Attend : non
gestures.playEmote(name: string): booleanlocal ok = aiLib.gestures.playEmote(name)Paramètres
Prop
Type
Retour
boolean : false sans script d’emotes.
Exemple
import { gestures } from "@aicore-fivem/lib/client";
RegisterCommand("hi", () => gestures.playEmote("wave"), false);gestures.cancelEmote
Arrête l’emote que joue le joueur (menotté, mis à terre).
Côté : client · Attend : non
gestures.cancelEmote(): booleanlocal ok = aiLib.gestures.cancelEmote()Retour
boolean : false sans script d’emotes.
Exemple
onServerEvent("mypolice:cuffed", () => gestures.cancelEmote());gestures.emoteProvider
Le script d’emotes qui joue les emotes (il peut différer de celui qui répond pour les mains en l’air).
Côté : client · Attend : non
gestures.emoteProvider(): string | nulllocal name = aiLib.gestures.emoteProvider()Retour
string | null : son nom de ressource, ou null (nil) quand aucun ne tourne.
Exemple
if (gestures.emoteProvider() === null) console.log("no emote script: skipping the emote");seatbelt
La ceinture de sécurité du joueur local via ai-core, quel que soit le script de ceinture qui tourne.
seatbelt.isOn
Indique si la ceinture est attachée. Demandez-le au besoin, pas à chaque frame.
Côté : client · Attend : non
seatbelt.isOn(): boolean | nulllocal worn = aiLib.seatbelt.isOn() -- booléen ou nilRetour
boolean | null : true ou false ; null (nil) quand aucun script de ceinture ne répond.
Exemple
import { cache, notify, onCache, seatbelt } from "@aicore-fivem/lib/client";
onCache("vehicle", (vehicle) => {
if (vehicle !== false && seatbelt.isOn() === false) notify("Buckle up", "warning");
});seatbelt.onChange
Exécute un gestionnaire quand l’état de la ceinture change. Seuls les scripts de ceinture qui signalent les changements le déclenchent.
Côté : client · Attend : non
seatbelt.onChange(fn: (worn: boolean | null) => void): voidaiLib.seatbelt.onChange(function(worn) end)Paramètres
Prop
Type
Retour
void.
Exemple
seatbelt.onChange((worn) => SendNUIMessage({ action: "belt", data: worn === true }));seatbelt.provider
Le script de ceinture qui répond.
Côté : client · Attend : non
seatbelt.provider(): string | nulllocal name = aiLib.seatbelt.provider()Retour
string | null : son nom de ressource, ou null (nil) quand aucun ne répond.
Exemple
if (seatbelt.provider() === null) console.log("no seat belt script runs");fuel
fuel.get
Le niveau de carburant d’un véhicule. Le serveur tient un state bag fuel pour chaque véhicule quel que soit le script de carburant qui tourne, c’est donc une lecture en mémoire ; sans ce state bag, c’est le niveau du réservoir du jeu.
Côté : client · Attend : non
fuel.get(vehicle: number): numberPas d’équivalent Lua : lisez Entity(vehicle).state.fuel. Régler le carburant se fait uniquement côté serveur (fuel.set dans Véhicules).
Paramètres
Prop
Type
Retour
number : 0-100.
Exemple
import { cache, every, fuel } from "@aicore-fivem/lib/client";
every(1000, () => {
if (cache.vehicle !== false) SendNUIMessage({ action: "fuel", data: Math.round(fuel.get(cache.vehicle)) });
});mdt
mdt.open
Ouvre le MDT de police actif pour le joueur local. Le MDT vérifie lui-même le métier.
Côté : client · Attend : non
mdt.open(): booleanlocal ok = aiLib.mdt.open()Retour
boolean : false quand aucun MDT ne tourne ou qu’il ne peut pas être ouvert depuis l’extérieur.
Exemple
import { mdt, notify } from "@aicore-fivem/lib/client";
RegisterCommand("mdt", () => {
if (!mdt.open()) notify("No MDT available", "error");
}, false);radial
Des éléments dans le menu radial qui tourne (ai-radialmenu, ou un autre via la couche radiale d’ai-core). ai-core les conserve lors des redémarrages du menu radial et les retire quand votre ressource s’arrête : ajoutez-les une seule fois au démarrage.
radial.add
Ajoute un élément à la roue, ou remplace l’élément portant le même id.
Côté : client · Attend : non
radial.add(item: RadialItem): voidaiLib.radial.add(item)Paramètres
Prop
Type
RadialItem
Prop
Type
Le type est RadialItem.
Retour
void.
Exemple
import { cache, createLocale, hasJob, radial } from "@aicore-fivem/lib/client";
import { RADIAL_VEHICLE } from "@aicore-fivem/shared";
const Locale = createLocale<typeof import("../../locales/en.json")>();
radial.add({
id: "myscript:engine",
label: Locale("ENGINE"),
icon: "power-off",
parent: RADIAL_VEHICLE,
keepOpen: true,
canShow: () => cache.seat === -1,
onPressed: () => {
if (cache.vehicle === false) return;
SetVehicleEngineOn(cache.vehicle, !GetIsVehicleEngineRunning(cache.vehicle), false, true);
},
});
radial.add({
id: "myscript:police",
label: Locale("POLICE"),
icon: "shield-halved",
canShow: () => hasJob(["police"]),
items: [
{ id: "myscript:cuff", label: Locale("CUFF"), icon: "handcuffs", onPressed: () => emitNet("mypolice:cuff") },
],
});radial.remove
Retire l’un de vos éléments. Un id inconnu ne fait rien.
Côté : client · Attend : non
radial.remove(id: string): voidaiLib.radial.remove(id)Paramètres
Prop
Type
Retour
void.
Exemple
radial.remove("myscript:engine");radial.refresh
Relit chaque canShow d’une roue ouverte. Appelez-la après qu’une chose qu’ils lisent a changé alors que la roue est peut-être ouverte.
Côté : client · Attend : non
radial.refresh(): voidaiLib.radial.refresh()Retour
void.
Exemple
onMembershipChange(() => radial.refresh());world
La synchronisation de la météo et de l’heure du script de météo qui tourne, mise en pause tant qu’une raison est active.
world.pauseSync
Met en pause la synchronisation de la météo et de l’heure pour une raison : dans un intérieur, pendant une scène, ou pendant que votre script règle sa propre météo.
Côté : client · Attend : non
world.pauseSync(reason: string): voidaiLib.world.pauseSync(reason)Paramètres
Prop
Type
Retour
void.
Exemple
import { world } from "@aicore-fivem/lib/client";
export function enterApartment(): void {
world.pauseSync("apartment");
NetworkOverrideClockTime(12, 0, 0);
SetWeatherTypeNowPersist("EXTRASUNNY");
}
export function leaveApartment(): void {
world.resumeSync("apartment");
}world.resumeSync
Retire une raison de pause ; la synchronisation reprend quand il ne reste aucune raison.
Côté : client · Attend : non
world.resumeSync(reason: string): voidaiLib.world.resumeSync(reason)Paramètres
Prop
Type
Retour
void. Voir l’exemple de world.pauseSync.
inventory
L’inventaire du joueur local via la couche d’inventaire d’ai-core : l’inventaire choisi par le serveur répond. Donner et retirer des objets se fait uniquement côté serveur (Objets).
inventory.openInventory
Ouvre l’écran d’inventaire du joueur lui-même.
Côté : client · Attend : non
inventory.openInventory(): voidaiLib.inventory.openInventory()Retour
void.
Exemple
import { inventory } from "@aicore-fivem/lib/client";
RegisterCommand("bag", () => inventory.openInventory(), false);inventory.hasItem
Indique si le joueur possède au moins count exemplaires d’un objet. Utilisez-la dans canShow pour que le joueur ne voie que ce qu’il peut faire ; le serveur vérifie de nouveau.
Côté : client · Attend : non
inventory.hasItem(item: string, count?: number): booleanlocal has = aiLib.inventory.hasItem(item, count)Paramètres
Prop
Type
Retour
boolean : true quand le joueur en a assez.
Exemple
import { inventory, Points } from "@aicore-fivem/lib/client";
const points = new Points();
points.addVehicle("lockpick", {
label: "Lockpick",
icon: "unlock",
canShow: (vehicle) => GetVehicleDoorLockStatus(vehicle) >= 2 && inventory.hasItem("lockpick"),
onPressed: (vehicle) => emitNet("mykeys:lockpick", NetworkGetNetworkIdFromEntity(vehicle)),
});inventory.currentWeapon
L’objet arme dans la main du joueur : son nom, son libellé et son image.
Côté : client · Attend : non
inventory.currentWeapon(): HeldWeapon | nulllocal weapon = aiLib.inventory.currentWeapon() -- table ou nilRetour
HeldWeapon { name: string; label: string; image?: string } (name comme WEAPON_PISTOL, image une url nui:// quand l’inventaire en a une), ou null (nil) quand la main est vide.
Exemple
import { inventory, onCache } from "@aicore-fivem/lib/client";
// À lire quand l’arme change, jamais à chaque frame.
onCache("weapon", () => SendNUIMessage({ action: "weapon", data: inventory.currentWeapon() }));Raccourcis clavier
Keybind : une touche que le joueur peut réassigner dans les réglages de GTA et dont le propriétaire du serveur peut changer la touche par défaut dans le panneau d’administration d’ai-core.
Véhicules et entités
nearestVehicle, drivenVehicle, waitForEntity, entityFromNetId et les helpers de propriétés de véhicule : trouver des véhicules et des entités côté client, et lire ou appliquer l’apparence d’un véhicule.