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)
raycast(from: Vec3, to: Vec3, options?: RaycastOptions): RayHit | nulllocal hit = aiLib.raycast(from, to, options) -- table ou nil ; from / to sont des vector3Paramè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
groundZ(x: number, y: number, z?: number): number | nulllocal ground = aiLib.groundZ(x, y, z) -- nombre ou nilParamè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
locationName(coords?: Vec3): LocationNamelocal where = aiLib.locationName(coords) -- coords est un vector3, facultatifParamè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
vehicleLabel(vehicle: string | number): stringlocal 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
waypoint(): { x: number; y: number } | nulllocal target = aiLib.waypoint() -- { x, y } ou nilRetour
{ 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)
pedHeadshot(ped: number, transparent?: boolean, timeoutMs?: number): Promise<{ handle: number; txd: string } | null>local handle, txd = aiLib.pedHeadshot(ped, transparent, timeout) -- à appeler dans un threadParamè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
onShot(handler: (weapon: number) => void): () => voidaiLib.onShot(function(weapon) end) -- ne renvoie rienParamè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)
requestModel(model: string | number, timeoutMs?: number): Promise<number>local hash = aiLib.requestModel(model, timeout) -- entier ou nil, à appeler dans un threadParamè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)
requestAnimDict(dict: string, timeoutMs?: number): Promise<string>local dict = aiLib.requestAnimDict(dict, timeout) -- chaîne ou nil, à appeler dans un threadParamè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)
requestAnimSet(set: string, timeoutMs?: number): Promise<string>local set = aiLib.requestAnimSet(set, timeout) -- chaîne ou nil, à appeler dans un threadParamè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)
requestPtfxAsset(asset: string, timeoutMs?: number): Promise<string>local asset = aiLib.requestPtfxAsset(asset, timeout) -- chaîne ou nil, à appeler dans un threadParamè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)
requestTextureDict(dict: string, timeoutMs?: number): Promise<string>local dict = aiLib.requestTextureDict(dict, timeout) -- chaîne ou nil, à appeler dans un threadParamè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)
requestWeaponAsset(weapon: string | number, timeoutMs?: number): Promise<number>local hash = aiLib.requestWeaponAsset(weapon, timeout) -- entier ou nil, à appeler dans un threadParamè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é.
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.
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.