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

Sondes et chargement

raycast, groundZ, locationName, vehicleLabel, waypoint, pedHeadshot, onShot et les chargeurs request : interroger le jeu sur le monde et charger les assets du jeu.

Des questions posées au jeu sur le monde (ce qui se trouve devant le joueur, la hauteur du sol, le nom de cette rue) et les chargeurs dont chaque modèle, animation et effet a besoin avant usage.

Sondes

raycast

Une sonde linéaire qui répond dans la même frame : ce que la ligne de from à to touche en premier. Utilisez-la pour « ce que le joueur regarde », pour poser des objets au sol ou pour la ligne de vue.

Côté : client · Attend : non (elle bloque la frame jusqu’à la fin du test)

Signature
raycast(from: Vec3, to: Vec3, options?: RaycastOptions): RayHit | null
Lua
local hit = aiLib.raycast(from, to, options) -- table ou nil ; from / to sont des vector3

Paramètres

Prop

Type

RaycastOptions

Prop

Type

Retour

RayHit | null : { coords, normal, entity } pour le premier impact, ou null (nil) quand la ligne ne touche rien.

Prop

Type

Exemple

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

/** Ce que la caméra regarde dans un rayon de 10 m. */
export function lookedAt(): number {
  const [cx = 0, cy = 0, cz = 0] = GetGameplayCamCoord();
  const [rx = 0, , rz = 0] = GetGameplayCamRot(2);
  const pitch = (rx * Math.PI) / 180;
  const yaw = (rz * Math.PI) / 180;
  const dir = { x: -Math.sin(yaw) * Math.cos(pitch), y: Math.cos(yaw) * Math.cos(pitch), z: Math.sin(pitch) };
  const hit = raycast(
    { x: cx, y: cy, z: cz },
    { x: cx + dir.x * 10, y: cy + dir.y * 10, z: cz + dir.z * 10 },
    { flags: 2 | 4 | 16 },
  );
  return hit?.entity ?? 0;
}

C’est une sonde synchrone : limitez-vous à une ou deux par frame.

groundZ

La hauteur du sol sous un point, en sondant vers le bas depuis z.

Côté : client · Attend : non

Signature
groundZ(x: number, y: number, z?: number): number | null
Lua
local ground = aiLib.groundZ(x, y, z) -- nombre ou nil

Paramètres

Prop

Type

Retour

number | null : la hauteur du sol, ou null (nil) tant que la collision à cet endroit n’est pas chargée (la zone est loin du joueur).

Exemple

import { groundZ, player } from "@aicore-fivem/lib/client";

const { x, y, z } = player.coords();
const ground = groundZ(x, y, z + 2);
if (ground !== null) console.log(`ground is ${(z - ground).toFixed(2)} m below`);

Pour déplacer le joueur sur un sol inconnu, utilisez player.teleport sans z : il attend la collision à chaque hauteur.

locationName

Les noms de la rue, de la rue transversale et du secteur en un point. Utilisez-le dans les alertes de dispatch, les messages de téléphone et les HUD.

Côté : client · Attend : non

Signature
locationName(coords?: Vec3): LocationName
Lua
local where = aiLib.locationName(coords) -- coords est un vector3, facultatif

Paramètres

Prop

Type

Retour

LocationName :

Prop

Type

Exemple

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

const { street, crossing, zone } = locationName();
const text = crossing ? `${street} / ${crossing}, ${zone}` : `${street}, ${zone}`;

vehicleLabel

Le nom affiché d’un véhicule (Sultan RS) à partir d’un nom de modèle, d’un hash de modèle ou d’une entité véhicule.

Côté : client · Attend : non

Signature
vehicleLabel(vehicle: string | number): string
Lua
local name = aiLib.vehicleLabel(vehicle)

Paramètres

Prop

Type

Retour

string : le libellé du jeu pour le modèle ; le nom d’affichage du modèle quand le jeu n’a pas de texte pour lui (véhicules add-on sans entrée de texte) ; le nom du modèle ou le hash sous forme de texte quand même celui-ci manque.

Exemple

import { cache, notify, onCache, vehicleLabel } from "@aicore-fivem/lib/client";

onCache("vehicle", (vehicle) => {
  if (vehicle !== false && cache.seat === -1) notify(vehicleLabel(vehicle), "info", 2000);
});

waypoint

Le point de passage que le joueur a placé sur la carte.

Côté : client · Attend : non

Signature
waypoint(): { x: number; y: number } | null
Lua
local target = aiLib.waypoint() -- { x, y } ou nil

Retour

{ x: number; y: number } | null : la position du point de passage (sans hauteur : les points de passage de la carte n’en ont pas), ou null (nil) quand aucun point de passage n’est placé.

Exemple

Voir player.teleport : se téléporter au point de passage.

pedHeadshot

Prend une photo du visage d’un ped et attend que le jeu l’ait rendue. Utilisez le nom de texture dans une page NUI sous la forme https://nui-img/<txd>/<txd>.

Côté : client · Attend : oui (Promise en TypeScript, cède la main (yield) du thread en Lua)

Signature
pedHeadshot(ped: number, transparent?: boolean, timeoutMs?: number): Promise<{ handle: number; txd: string } | null>
Lua
local handle, txd = aiLib.pedHeadshot(ped, transparent, timeout) -- à appeler dans un thread

Paramètres

Prop

Type

Retour

Promise<{ handle: number; txd: string } | null> : le handle de la photo et son nom de texture ; null quand le ped n’existe pas ou que le rendu a pris plus de temps que le délai. Lua renvoie handle, txd, ou nil.

Exemple

import { cache, pedHeadshot } from "@aicore-fivem/lib/client";

export async function sendMugshot(): Promise<void> {
  const shot = await pedHeadshot(cache.ped, true);
  if (!shot) return;
  SendNUIMessage({ action: "photo", data: `https://nui-img/${shot.txd}/${shot.txd}` });
  setTimeout(() => UnregisterPedheadshot(shot.handle), 10_000);
}

Appelez UnregisterPedheadshot(handle) dès que la photo n’est plus affichée.

onShot

Exécute un gestionnaire dans la frame où le ped local tire (stress, alertes de tirs, douilles). Une seule vérification par frame pour votre ressource, active uniquement quand une arme est en main.

Côté : client · Attend : non

Signature
onShot(handler: (weapon: number) => void): () => void
Lua
aiLib.onShot(function(weapon) end) -- ne renvoie rien

Paramètres

Prop

Type

Retour

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

Exemple

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

let lastAlert = 0;
onShot(() => {
  if (GetGameTimer() - lastAlert < 30_000) return; // une alerte toutes les 30 s
  lastAlert = GetGameTimer();
  emitNet("mypolice:shots");
});

Charger les assets du jeu

Les modèles, animations, effets et textures doivent être chargés avant usage. Chaque chargeur demande l’asset et attend qu’il soit prêt. Libérez-le quand vous avez terminé, comme l’indique chaque entrée.

requestModel

Charge un modèle (ped, véhicule, objet) et donne son hash.

Côté : client · Attend : oui (Promise en TypeScript, cède la main (yield) du thread en Lua)

Signature
requestModel(model: string | number, timeoutMs?: number): Promise<number>
Lua
local hash = aiLib.requestModel(model, timeout) -- entier ou nil, à appeler dans un thread

Paramètres

Prop

Type

Retour

Promise<number> : le hash du modèle une fois chargé. Elle est rejetée quand le modèle n’existe pas dans les fichiers du jeu ou ne se charge pas à temps. Lua renvoie le hash, ou nil dans les deux cas.

Exemple

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

export async function placeCone(x: number, y: number, z: number): Promise<number> {
  const hash = await requestModel("prop_roadcone02a");
  const cone = CreateObject(hash, x, y, z, false, false, false);
  SetModelAsNoLongerNeeded(hash);
  PlaceObjectOnGroundProperly(cone);
  return cone;
}

Appelez SetModelAsNoLongerNeeded(hash) une fois l’entité créée.

requestAnimDict

Charge un dictionnaire d’animations.

Côté : client · Attend : oui (Promise en TypeScript, cède la main (yield) du thread en Lua)

Signature
requestAnimDict(dict: string, timeoutMs?: number): Promise<string>
Lua
local dict = aiLib.requestAnimDict(dict, timeout) -- chaîne ou nil, à appeler dans un thread

Paramètres

Prop

Type

Retour

Promise<string> : le nom du dictionnaire une fois chargé. Elle est rejetée quand le dictionnaire n’existe pas ou ne se charge pas à temps. Lua renvoie le nom, ou nil.

Exemple

import { cache, requestAnimDict } from "@aicore-fivem/lib/client";

export async function dance(): Promise<void> {
  const dict = await requestAnimDict("anim@amb@nightclub@dancers@crowddance_facedj@");
  TaskPlayAnim(cache.ped, dict, "hi_dance_facedj_09_v2_male^1", 8, -8, -1, 1, 0, false, false, false);
  RemoveAnimDict(dict);
}

Appelez RemoveAnimDict(dict) quand l’animation n’est plus jouée. player.playAnim charge et libère le dictionnaire pour vous.

requestAnimSet

Charge un clipset de déplacement (marche accroupie, marche blessée).

Côté : client · Attend : oui (Promise en TypeScript, cède la main (yield) du thread en Lua)

Signature
requestAnimSet(set: string, timeoutMs?: number): Promise<string>
Lua
local set = aiLib.requestAnimSet(set, timeout) -- chaîne ou nil, à appeler dans un thread

Paramètres

Prop

Type

Retour

Promise<string> : le nom du clipset une fois chargé. Elle est rejetée quand il ne se charge pas à temps. Lua renvoie le nom, ou nil.

Exemple

import { cache, requestAnimSet } from "@aicore-fivem/lib/client";

export async function limp(): Promise<void> {
  const set = await requestAnimSet("move_m@injured");
  SetPedMovementClipset(cache.ped, set, 0.2);
}

Appelez RemoveAnimSet(set) quand il n’est plus utilisé.

requestPtfxAsset

Charge un asset d’effets de particules.

Côté : client · Attend : oui (Promise en TypeScript, cède la main (yield) du thread en Lua)

Signature
requestPtfxAsset(asset: string, timeoutMs?: number): Promise<string>
Lua
local asset = aiLib.requestPtfxAsset(asset, timeout) -- chaîne ou nil, à appeler dans un thread

Paramètres

Prop

Type

Retour

Promise<string> : le nom de l’asset une fois chargé. Elle est rejetée quand il ne se charge pas à temps. Lua renvoie le nom, ou nil.

Exemple

import { player, requestPtfxAsset } from "@aicore-fivem/lib/client";

export async function sparks(): Promise<void> {
  const asset = await requestPtfxAsset("core");
  const { x, y, z } = player.coords();
  UseParticleFxAsset(asset);
  StartParticleFxNonLoopedAtCoord("ent_sht_electrical_box", x, y, z, 0, 0, 0, 1, false, false, false);
  RemoveNamedPtfxAsset(asset);
}

Appelez RemoveNamedPtfxAsset(asset) quand vous avez terminé.

requestTextureDict

Charge un dictionnaire de textures streamé (pour DrawSprite et similaires).

Côté : client · Attend : oui (Promise en TypeScript, cède la main (yield) du thread en Lua)

Signature
requestTextureDict(dict: string, timeoutMs?: number): Promise<string>
Lua
local dict = aiLib.requestTextureDict(dict, timeout) -- chaîne ou nil, à appeler dans un thread

Paramètres

Prop

Type

Retour

Promise<string> : le nom du dictionnaire une fois chargé. Elle est rejetée quand il ne se charge pas à temps. Lua renvoie le nom, ou nil.

Exemple

import { every, requestTextureDict } from "@aicore-fivem/lib/client";

export async function showCrosshair(): Promise<void> {
  const dict = await requestTextureDict("shared");
  every(0, () => DrawSprite(dict, "emptydot_32", 0.5, 0.5, 0.01, 0.018, 0, 255, 255, 255, 200));
}

Appelez SetStreamedTextureDictAsNoLongerNeeded(dict) quand vous avez terminé.

requestWeaponAsset

Charge le modèle et les assets d’une arme et donne son hash.

Côté : client · Attend : oui (Promise en TypeScript, cède la main (yield) du thread en Lua)

Signature
requestWeaponAsset(weapon: string | number, timeoutMs?: number): Promise<number>
Lua
local hash = aiLib.requestWeaponAsset(weapon, timeout) -- entier ou nil, à appeler dans un thread

Paramètres

Prop

Type

Retour

Promise<number> : le hash de l’arme une fois chargée. Elle est rejetée quand elle ne se charge pas à temps. Lua renvoie le hash, ou nil.

Exemple

import { player, requestWeaponAsset } from "@aicore-fivem/lib/client";

export async function showcasePistol(): Promise<number> {
  const hash = await requestWeaponAsset("WEAPON_PISTOL");
  const { x, y, z } = player.coords();
  const object = CreateWeaponObject(hash, 0, x, y, z + 1, true, 1, 0);
  RemoveWeaponAsset(hash);
  return object;
}

Appelez RemoveWeaponAsset(hash) quand vous avez terminé.

Sur cette page