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

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

Signature
medical.isDead(): boolean

Pas 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

Signature
medical.onChange(fn: (dead: boolean) => void): void

Pas 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

Signature
appearance.apply(ped: number, look: CharacterAppearance): boolean
Lua
local 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

Signature
appearance.read(ped: number): CharacterAppearance | null
Lua
local look = aiLib.appearance.read(ped) -- table ou nil

Paramè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.apply

appearance.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

Signature
appearance.openMenu(menu: ClothingMenu): boolean
Lua
local 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

Signature
appearance.wearOutfit(outfit: JobOutfit): boolean
Lua
local 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

Signature
appearance.reloadSkin(): boolean
Lua
local 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

Signature
gestures.isHandsUp(): boolean
Lua
local 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

Signature
gestures.isPointing(): boolean
Lua
local 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 pointage

gestures.provider

Le script d’emotes qui répond pour les mains en l’air et le pointage.

Côté : client · Attend : non

Signature
gestures.provider(): string | null
Lua
local 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

Signature
gestures.playEmote(name: string): boolean
Lua
local 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

Signature
gestures.cancelEmote(): boolean
Lua
local 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

Signature
gestures.emoteProvider(): string | null
Lua
local 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

Signature
seatbelt.isOn(): boolean | null
Lua
local worn = aiLib.seatbelt.isOn() -- booléen ou nil

Retour

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

Signature
seatbelt.onChange(fn: (worn: boolean | null) => void): void
Lua
aiLib.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

Signature
seatbelt.provider(): string | null
Lua
local 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

Signature
fuel.get(vehicle: number): number

Pas 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

Signature
mdt.open(): boolean
Lua
local 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

Signature
radial.add(item: RadialItem): void
Lua
aiLib.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

Signature
radial.remove(id: string): void
Lua
aiLib.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

Signature
radial.refresh(): void
Lua
aiLib.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

Signature
world.pauseSync(reason: string): void
Lua
aiLib.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

Signature
world.resumeSync(reason: string): void
Lua
aiLib.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

Signature
inventory.openInventory(): void
Lua
aiLib.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

Signature
inventory.hasItem(item: string, count?: number): boolean
Lua
local 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

Signature
inventory.currentWeapon(): HeldWeapon | null
Lua
local weapon = aiLib.inventory.currentWeapon() -- table ou nil

Retour

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() }));

Sur cette page