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

Peds, blips et props

LocalPed, Blips, createBlip, attachProp, PreviewVehicle et player.holdAnim : PNJ locaux, blips sur la carte, props tenus en main, véhicules de showroom et animations maintenues.

Des choses que seul ce client voit : un PNJ derrière un comptoir, des blips sur la carte, un prop dans la main du joueur, une voiture de showroom. Aucune n’est synchronisée sur le réseau, si bien qu’elles n’entrent jamais en conflit avec le verrouillage des entités (entity lockdown) et ne coûtent rien au serveur. Un point crée déjà son propre PNJ et son propre blip (ped et blip de points.add) ; utilisez ces classes pour ceux qui n’ont pas de point.

Peds locaux

new LocalPed

Un ped que seul ce client voit (un commerçant, un PNJ de métier). Il est créé quand le joueur arrive à moins de distance de coords et supprimé quand il s’éloigne, si bien qu’un millier de PNJ sur la carte ne coûtent rien tant que personne ne s’en approche. Il reste figé, ne peut pas être blessé et ignore les événements (coups de feu, bousculades).

Côté : client · Attend : non (le modèle se charge en arrière-plan quand le joueur approche)

Signature
new LocalPed(options: LocalPedOptions)
Lua
local ped = aiLib.LocalPed.new(options)

Paramètres

Prop

Type

LocalPedOptions

Prop

Type

Membres

Prop

Type

Exemple

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

const guard = new LocalPed({
  model: "s_m_m_security_01",
  coords: { x: -1037.6, y: -2737.8, z: 20.2, heading: 330 },
  scenario: "WORLD_HUMAN_GUARD_STAND",
  distance: 80,
  onSpawn: (ped) => SetPedComponentVariation(ped, 0, 1, 0, 0),
});

// Plus tard, quand le métier se termine :
guard.remove();

La distance est mesurée depuis coords, pas depuis un parent auquel il est attaché. Un ped qui suit une entité en mouvement (attach ou seat sur un véhicule qui s’en va) a besoin d’une grande distance et de sa propre vérification de portée, sinon il reste là où il a été créé.

Blips

createBlip

Crée un blip nommé sur la carte et renvoie son handle. Vous le retirez vous-même avec RemoveBlip(handle) ; pour les blips que vous reconstruisez quand le panneau change, utilisez un groupe Blips.

Côté : client · Attend : non

Signature
createBlip(options: BlipOptions): number
Lua
local blip = aiLib.Blips.create(options)

Paramètres

Prop

Type

BlipOptions

Prop

Type

Un style de blip choisi dans votre panneau d’administration (le widget blip, lu avec readBlipStyle) se déploie directement dans ces options : createBlip({ ...style, coords, label }).

Retour

number : le handle du blip.

Exemple

import { createBlip, createLocale } from "@aicore-fivem/lib/client";

const Locale = createLocale<typeof import("../../locales/en.json")>();

// Une cible de livraison avec un itinéraire GPS ; retirée à la livraison.
const target = createBlip({
  coords: { x: 1197.4, y: -3253.6, z: 7.1 },
  sprite: 478,
  color: 5,
  label: Locale("DELIVERY"),
  shortRange: false,
  route: true,
});
// ... à la livraison :
RemoveBlip(target);

new Blips

Un groupe de blips par id : add remplace un blip ayant le même id et clear les retire tous. Utilisez un groupe par fonctionnalité.

Côté : client · Attend : non

Signature
new Blips()
Lua
local blips = aiLib.Blips.new()

Méthodes

Prop

Type

En Lua, appelez les méthodes avec deux-points : blips:add(id, options).

Exemple

import { Blips, createLocale } from "@aicore-fivem/lib/client";

const Locale = createLocale<typeof import("../../locales/en.json")>();
const blips = new Blips();

const GARAGES = [
  { id: "legion", coords: { x: 215.8, y: -810.1, z: 30.7 } },
  { id: "airport", coords: { x: -796.5, y: -2023.3, z: 9.2 } },
];

for (const garage of GARAGES)
  blips.add(garage.id, { coords: garage.coords, sprite: 357, color: 3, label: Locale("GARAGE") });

// Un garage a été fermé :
blips.remove("airport");

Props et animations maintenues

attachProp

Crée un prop local et l’attache à un os d’un ped (un téléphone dans la main, une caisse portée devant soi). Le prop n’a pas de collision, sauf si vous la demandez.

Côté : client · Attend : oui (Promise : il charge d’abord le modèle)

Signature
attachProp(model: string | number, options: AttachPropOptions): Promise<number>

Pas d’équivalent Lua : créez l’objet et appelez AttachEntityToEntity vous-même.

Paramètres

Prop

Type

AttachPropOptions

Prop

Type

Retour

Promise<number> : l’entité du prop, ou 0 quand le modèle ne se charge pas ou que le ped n’existe plus. Elle n’est jamais rejetée.

Exemple

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

export async function readNewspaper(): Promise<void> {
  const paper = await attachProp("prop_cliff_paper", {
    bone: 18905,
    offset: { x: 0.12, y: 0.03, z: 0.02 },
    rotation: { x: 10, y: 0, z: 0 },
  });
  const hold = player.holdAnim("amb@world_human_tourist_map@male@base", "base");
  setTimeout(() => {
    hold.stop();
    if (paper) DeleteEntity(paper);
  }, 10_000);
}

Vous supprimez le prop vous-même avec DeleteEntity. Les props oubliés sont supprimés quand votre ressource s’arrête.

player.holdAnim

Maintient une animation jusqu’à ce que vous l’arrêtiez. Quand une chute, un choc ou un ragdoll l’interrompt, elle est relancée en moins d’une demi-seconde. Utilisez-le pour porter quelque chose, tenir un téléphone ou une boucle de travail. Un seul maintien par ressource : un nouveau remplace l’ancien.

Côté : client · Attend : non

Signature
player.holdAnim(dict: string, clip: string, options?: HoldAnimOptions): { stop(): void }

Pas d’équivalent Lua : jouez l’animation avec aiLib.player.playAnim et vérifiez-la avec une tâche aiLib.every.

Paramètres

Prop

Type

HoldAnimOptions

Prop

Type

Retour

{ stop(): void } : appelez stop() pour mettre fin au maintien et vider les tâches du ped. Appeler stop() sur un maintien déjà remplacé ne fait rien.

Exemple

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

export async function carryBox(): Promise<void> {
  const box = await attachProp("hei_prop_heist_box", {
    bone: 60309,
    offset: { x: 0.025, y: 0.08, z: 0.255 },
    rotation: { x: -145, y: 290, z: 0 },
  });
  // Se termine tout seul quand le joueur monte dans un véhicule.
  player.holdAnim("anim@heists@box_carry@", "idle", {
    while: () => cache.vehicle === false,
  });
  setTimeout(() => box && DeleteEntity(box), 60_000);
}

Véhicules de showroom

new PreviewVehicle

Un véhicule d’aperçu local pour les showrooms et les boutiques : figé, indestructible, verrouillé et propre. Afficher un nouveau modèle remplace l’ancien, et le dernier appel l’emporte toujours (un appel plus ancien qui charge encore son modèle ne fait rien). Supprimé par clear() et quand votre ressource s’arrête. Rien n’est synchronisé sur le réseau.

Côté : client · Attend : show oui (Promise)

Signature
new PreviewVehicle()

Pas d’équivalent Lua.

Membres

Prop

Type

Exemple

import { PreviewVehicle, setVehicleSetup } from "@aicore-fivem/lib/client";

const preview = new PreviewVehicle();
const STAGE = { x: -44.4, y: -1097.1, z: 26.4, heading: 120 };

export async function showCar(model: string, color: number): Promise<void> {
  const vehicle = await preview.show(model, STAGE, (v) => setVehicleSetup(v, { colors: [color, color] }));
  if (vehicle) SetVehicleNumberPlateText(vehicle, "SHOWROOM");
}

export function leaveShowroom(): void {
  preview.clear();
}

Sur cette page