Le joueur local
Le ped, le véhicule, le siège et l’arme en cache, l’objet player (position, téléportation, animations), les fondus d’écran, les peds des autres joueurs et le joueur le plus proche.
Tout ce qui concerne le joueur assis devant cet ordinateur. Lisez les valeurs dans cache au lieu d’appeler PlayerPedId() dans des boucles : ai-core garde un seul observateur pour toutes les ressources et pousse les changements, si bien qu’aucun script ne les interroge en boucle.
cache
Les valeurs du joueur local les plus lues, tenues à jour par l’observateur unique d’ai-core. Comme le cache d’ox_lib : lisez cache.ped au lieu d’appeler PlayerPedId(), et cache.vehicle au lieu de GetVehiclePedIsIn à chaque frame. Lire une clé est une simple lecture en mémoire, sûre dans les boucles et dans le code exécuté à chaque frame.
Côté : client · Attend : non
const cache: PlayerCache // lecture seulelocal ped = aiLib.cache.pedClés
Prop
Type
Le type est PlayerCache.
Exemple
import { cache, every } from "@aicore-fivem/lib/client";
// Vitesse affichée pendant la conduite, lue dans le cache toutes les 200 ms.
every(200, () => {
if (cache.vehicle === false || cache.seat !== -1) return;
const kmh = GetEntitySpeed(cache.vehicle) * 3.6;
SendNUIMessage({ action: "speed", data: Math.round(kmh) });
});cache.ped suit un changement de modèle avec jusqu’à 100 ms de retard. Juste après avoir changé le modèle (SetPlayerModel), appelez PlayerPedId() une fois. Les actions player ci-dessous lisent déjà le ped à jour.
onCache
Exécute un gestionnaire chaque fois qu’une valeur en cache change : le joueur est monté dans un véhicule ou en est descendu, a changé de siège, a sorti ou rangé une arme, ou a reçu un nouveau ped. Utilisez-le au lieu de vérifier la valeur avec un minuteur.
Côté : client · Attend : non
onCache<K extends keyof PlayerCache>(key: K, handler: (value: PlayerCache[K], old: PlayerCache[K]) => void): voidaiLib.cache.onChange(key, function(value, old) end)Paramètres
Prop
Type
Retour
void. Il n’y a aucun moyen de retirer le gestionnaire ; gardez-en un par fonctionnalité en haut du fichier.
Exemple
import { onCache, inventory, Points } from "@aicore-fivem/lib/client";
const points = new Points();
// Les points dont canShow lit cache.vehicle sont vérifiés à nouveau.
onCache("vehicle", () => points.refresh());
// L’objet arme en main, lu seulement quand l’arme change.
onCache("weapon", (weapon) => {
const item = weapon === false ? null : inventory.currentWeapon();
SendNUIMessage({ action: "weapon", data: item });
});readPlayerState
Lit le véhicule, le siège et l’arme d’un ped à l’instant, sans le cache. L’observateur d’ai-core l’utilise ; vous n’en avez besoin que pour un ped qui n’est pas le ped local, ou pour comparer avec le cache à la main.
Côté : client · Attend : non
readPlayerState(ped: number): { vehicle: number | false; seat: number | false; weapon: number | false }Pas d’équivalent Lua.
Paramètres
Prop
Type
Retour
Un objet avec vehicle (le handle du véhicule, false à pied), seat (-1 conducteur et plus, false à pied) et weapon (le hash en main, false quand il est désarmé).
Exemple
import { playerPed, readPlayerState } from "@aicore-fivem/lib/client";
const ped = playerPed(12);
if (ped !== 0 && readPlayerState(ped).seat === -1) console.log("player 12 is driving");readWeapon
L’arme dans la main d’un ped à l’instant, false quand il est désarmé.
Côté : client · Attend : non
readWeapon(ped: number): number | falsePas d’équivalent Lua.
Paramètres
Prop
Type
Retour
number | false : le hash de l’arme, ou false quand le ped tient WEAPON_UNARMED.
Exemple
import { nearestPlayer, playerPed, readWeapon } from "@aicore-fivem/lib/client";
const id = nearestPlayer(5);
if (id !== null && readWeapon(playerPed(id)) !== false) console.log("the player next to you is armed");player
Un seul objet pour le ped local : où il se trouve, le déplacer, les animations. Les lectures utilisent cache.ped ; les actions lisent le ped à jour, elles fonctionnent donc aussi juste après un changement de modèle.
player.ped
Le handle du ped local (la même valeur que cache.ped).
Côté : client · Attend : non
player.ped: number // propriété en lecture seulePas d’équivalent Lua : utilisez aiLib.cache.ped.
Retour
number : le handle du ped.
Exemple
import { player } from "@aicore-fivem/lib/client";
SetPedArmour(player.ped, 100);player.coords
La position actuelle du ped.
Côté : client · Attend : non
player.coords(): Vec3local coords = aiLib.player.coords() -- vector3Retour
Un Vec3 { x, y, z } en TypeScript (z est la racine du ped, environ 1 m au-dessus du sol). Lua renvoie un vector3.
Exemple
import { locationName, player } from "@aicore-fivem/lib/client";
const here = player.coords();
console.log(`${locationName(here).street} at ${here.x.toFixed(1)}, ${here.y.toFixed(1)}`);player.heading
La direction vers laquelle le ped est tourné, en degrés (0-360, 0 = nord).
Côté : client · Attend : non
player.heading(): numberlocal heading = aiLib.player.heading()Retour
number : le cap en degrés.
Exemple
import { player } from "@aicore-fivem/lib/client";
// Enregistre l’emplacement et la direction pour un enregistrement du panneau.
const spot = { ...player.coords(), heading: player.heading() };player.distanceTo
La distance en ligne droite entre le ped et un point, en mètres.
Côté : client · Attend : non
player.distanceTo(point: Vec3): numberlocal metres = aiLib.player.distanceTo(point) -- vector3 ou { x, y, z }Paramètres
Prop
Type
Retour
number : des mètres, mesurés en 3D.
Exemple
import { notify, player } from "@aicore-fivem/lib/client";
const counter = { x: 25.7, y: -1347.3, z: 29.5 };
if (player.distanceTo(counter) > 3) notify("Walk to the counter first", "error");player.freeze
Fige le ped sur place, ou le laisse bouger à nouveau.
Côté : client · Attend : non
player.freeze(state: boolean): voidaiLib.player.freeze(frozen)Paramètres
Prop
Type
Retour
void.
Exemple
import { player } from "@aicore-fivem/lib/client";
player.freeze(true);
setTimeout(() => player.freeze(false), 5000);player.teleport
Déplace le joueur et attend que le monde autour du nouvel emplacement soit chargé, derrière un fondu au noir. Sans z (ou avec ground: "find"), il cherche le sol sous x et y : utilisez cela pour le point de passage de la carte.
Côté : client · Attend : oui (Promise en TypeScript, cède la main (yield) du thread en Lua)
player.teleport(to: { x: number; y: number; z?: number }, options?: TeleportOptions): Promise<void>aiLib.player.teleport(to, options) -- à appeler dans un threadParamètres
Prop
Type
TeleportOptions
Prop
Type
Retour
Promise<void> qui se résout une fois que le joueur se tient au nouvel emplacement et que la collision y est chargée (ou après 5 secondes sans elle). Lua ne renvoie rien.
Exemple
import { notify, player, waypoint } from "@aicore-fivem/lib/client";
RegisterCommand(
"tpm",
async () => {
const target = waypoint();
if (!target) return notify("Set a waypoint first", "error");
await player.teleport(target, { keepVehicle: true }); // pas de z : atterrit sur le sol
},
false,
);La recherche du sol en TypeScript place le ped figé à des hauteurs croissantes, attend la collision à chacune, et ignore les surfaces à l’intérieur des intérieurs MLO ou IPL, si bien qu’elle n’atterrit jamais sur un toit ni dans un bâtiment au-dessus de la rue. La version Lua prend le premier sol qu’elle trouve et attend la collision 3 secondes au plus.
player.playAnim
Joue une animation sur le ped. Il charge d’abord le dictionnaire d’animations.
Côté : client · Attend : oui en TypeScript (se résout quand l’animation a démarré) ; cède la main (yield) en Lua pendant le chargement du dictionnaire
player.playAnim(dict: string, clip: string, options?: AnimOptions): Promise<void>aiLib.player.playAnim(dict, clip, options) -- à appeler dans un threadParamètres
Prop
Type
AnimOptions
Prop
Type
Retour
Promise<void> qui se résout quand l’animation a démarré. Elle est rejetée quand le dictionnaire n’existe pas ou ne se charge pas en 10 secondes. Lua ne renvoie rien et ne fait rien quand le dictionnaire ne se charge pas.
Exemple
import { player } from "@aicore-fivem/lib/client";
export async function handOver(): Promise<void> {
await player.playAnim("mp_common", "givetake1_a", { flag: 48, duration: 1500 });
}player.stopAnim
Arrête tout ce que fait le ped (ClearPedTasks) : animations et scénarios.
Côté : client · Attend : non
player.stopAnim(): voidaiLib.player.stopAnim()Retour
void.
Exemple
import { player } from "@aicore-fivem/lib/client";
export async function readClipboard(): Promise<void> {
await player.playAnim("amb@world_human_clipboard@male@idle_a", "idle_c");
setTimeout(() => player.stopAnim(), 4000);
}player.holdAnim
Maintient une animation jusqu’à ce que vous l’arrêtiez, en la relançant quand une chute ou un choc l’interrompt. Documenté avec les props sur Peds, blips et props.
Fondus et autres joueurs
fadeOut
Fait un fondu de l’écran au noir et attend qu’il soit complètement noir. Utilisez-le pour cacher une téléportation, un changement de modèle ou un changement de scène.
Côté : client · Attend : oui (Promise en TypeScript, cède la main (yield) du thread en Lua)
fadeOut(ms?: number): Promise<void>aiLib.fadeOut(ms) -- à appeler dans un threadParamètres
Prop
Type
Retour
Promise<void> qui se résout quand l’écran est noir, ou au plus tard après ms + 2 secondes. Elle n’est jamais rejetée.
Exemple
import { fadeIn, fadeOut } from "@aicore-fivem/lib/client";
export async function moveToSquare(): Promise<void> {
await fadeOut();
SetEntityCoords(PlayerPedId(), -269.4, -955.3, 31.2, false, false, false, false);
await fadeIn();
}fadeIn
Ramène l’image à l’écran par un fondu et attend qu’elle soit nette. Le pendant de fadeOut.
Côté : client · Attend : oui (Promise en TypeScript, cède la main (yield) du thread en Lua)
fadeIn(ms?: number): Promise<void>aiLib.fadeIn(ms) -- à appeler dans un threadParamètres
Prop
Type
Retour
Promise<void> qui se résout quand l’écran est net, ou au plus tard après ms + 2 secondes. Elle n’est jamais rejetée.
Exemple
Voir fadeOut : les deux s’utilisent toujours ensemble.
playerPed
Le ped d’un joueur d’après son id serveur. Pour le joueur local, il renvoie cache.ped ; pour un autre joueur, il renvoie 0 quand ce joueur n’est pas assez proche pour être streamé vers ce client.
Côté : client · Attend : non
playerPed(serverId: number): numberlocal ped = aiLib.playerPed(serverId)Paramètres
Prop
Type
Retour
number : le handle du ped, ou 0 quand le joueur n’est pas à portée sur ce client.
Exemple
import { onServerEvent, playerPed } from "@aicore-fivem/lib/client";
// Le serveur prévient tous ceux qui sont proches qu’un joueur a été menotté.
onServerEvent(
"myscript:cuffed",
{ args: ([id]) => (typeof id === "number" ? [id] : null) },
(id) => {
const ped = playerPed(id);
if (ped !== 0) SetEnableHandcuffs(ped, true);
},
);N’utilisez jamais GetPlayerPed(-1) ou GetPlayerPed(GetPlayerFromServerId(id)) à la main : un id inconnu donne -1, et GetPlayerPed(-1) est le ped local, si bien que l’action touche le mauvais joueur.
nearestPlayer
L’autre joueur le plus proche dans un rayon donné, sous forme d’id serveur. Ne parcourt que les joueurs streamés vers ce client. Utilisez-le pour choisir la cible des actions donner, fouiller, menotter ou plaquer, puis envoyez cet id au serveur, qui vérifie à nouveau la distance.
Côté : client · Attend : non
nearestPlayer(metres: number, options?: { from?: Vec3; filter?: (serverId: number, ped: number) => boolean }): number | nulllocal serverId = aiLib.nearestPlayer(metres, options) -- entier ou nilParamètres
Prop
Type
Options
Prop
Type
Retour
number | null : l’id serveur du joueur le plus proche ayant passé filter, ou null (nil en Lua) quand personne n’est dans le rayon metres. Le joueur local n’est jamais renvoyé.
Exemple
import { callAction, nearestPlayer, notify } from "@aicore-fivem/lib/client";
RegisterCommand(
"givecash",
async (_src: number, args: string[]) => {
const target = nearestPlayer(3, { filter: (_id, ped) => !IsPedInAnyVehicle(ped, false) });
if (target === null) return notify("Nobody is close enough", "error");
await callAction("myscript:give", [target, Number(args[0])], { fallback: "GIVE_FAILED" });
},
false,
);Parler au serveur
Interroger le serveur et attendre sa réponse, lancer des actions serveur avec des refus traduits, écouter les événements serveur et répondre aux callbacks serveur.
Points d’interaction
Points : chaque endroit qu’un joueur utilise (comptoirs, boutiques, portes, PNJ, distributeurs, coffres de véhicules) sous forme d’invite ou d’option de ciblage, avec peds, blips et points construits à partir des enregistrements du panneau.