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)
new LocalPed(options: LocalPedOptions)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
createBlip(options: BlipOptions): numberlocal 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
new Blips()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)
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
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)
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();
}Zones
Zones : des zones avec des callbacks d’entrée et de sortie (sphère, cylindre, polygone), vérifiées à leur propre intervalle, jamais à chaque frame.
Interface partagée
notify, progress, menu, input, invites, skillCheck, lockpick et itemPicker : l’interface joueur qu’ai-lib dessine pour chaque ressource.