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

Véhicules

spawnVehicle, vehicleType, randomPlate, véhicules les plus proches, entités depuis les net ids du client, vehicleKeys, carburant et garages.

TypeScript
import { spawnVehicle, vehicleKeys, fuel, garages, vehicleFromNet } from "@aicore-fivem/lib/server";

Faire apparaître

spawnVehicle

Crée un véhicule réseau sur le serveur et le configure en un seul appel : plaque, carburant, apparence, verrouillage, routing bucket, clés pour le bon usage, un conducteur et des passagers. Utilisez-la pour chaque véhicule de script (véhicules de métier, locations, véhicules de garage, apparitions par un admin).

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

Signature
spawnVehicle(options: SpawnVehicleOptions): Promise<number | null>
Lua
local vehicle = aiLib.spawnVehicle(options) -- entité ou nil, à appeler dans un thread

Paramètres

Prop

Type

SpawnVehicleOptions

Prop

Type

Retour

Promise<number | null> : le handle d’entité du véhicule. null quand le modèle n’existe pas (le client asker l’a dit), que l’entité n’a pas été créée en 5 secondes, ou que le type est inconnu.

Exemple

import { onClientCallback, spawnVehicle, hasCharacter, near } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const DEPOT = { x: 895.4, y: -179.3, z: 74.7 };

onClientCallback(
  "my-taxi:start",
  async (source) => {
    const vehicle = await spawnVehicle({
      model: "taxi",
      coords: { x: 899.1, y: -180.6, z: 73.8, heading: 238 },
      asker: source,
      keysTo: source,
      purpose: "job",
      driver: source,
      fuel: 100,
      setup: { dirt: 0 },
    });
    if (!vehicle) return fail("SPAWN_FAILED");
    return { ok: true, netId: NetworkGetNetworkIdFromEntity(vehicle) };
  },
  { guards: [hasCharacter(), near(DEPOT, 5)], lock: true },
);

Les clés attendent (jusqu’à 3 secondes) que le serveur lise la plaque : avant la première synchronisation du client propriétaire, le serveur lit une plaque vide. Les joueurs installés sont replacés pendant jusqu’à 2 secondes, jusqu’à ce qu’ils soient assis. En TypeScript, le type d’un modèle donné par un client ne sert qu’à ce joueur jusqu’à ce que le client d’un deuxième joueur donne la même réponse ; l’équivalent Lua garde la première réponse reçue.

vehicleType

Le type d’apparition d’un modèle, demandé au client d’un joueur. Utilisez-la pour vérifier qu’un modèle existe avant de prendre l’argent.

Côté : serveur · Attend : oui (Promise)

Signature
vehicleType(model: string, asker: number): Promise<string | null>

Pas d’équivalent Lua : aiLib.spawnVehicle avec asker le vérifie et renvoie nil pour un modèle inconnu.

Prop

Type

Retour

Promise<string | null> : automobile, bike, boat, heli, plane, submarine, trailer ou train ; null quand le jeu n’a pas ce véhicule ou que le client n’a donné aucune réponse valide. Une réponse est gardée pour tout le monde dès que les clients de deux joueurs différents sont d’accord, si bien qu’un client modifié ne peut casser que ses propres apparitions.

Exemple

import { onClientCallback, vehicleType } from "@aicore-fivem/lib/server";
import { fail, oneArg, readText } from "@aicore-fivem/lib/shared";

onClientCallback("my-dealer:buy", { args: oneArg((v) => readText(v, 32)), lock: true }, async (source, model) => {
  if (!(await vehicleType(model, source))) return fail("UNKNOWN_MODEL");
  // prendre l’argent, puis spawnVehicle(...)
  return { ok: true };
});

randomPlate

Une plaque aléatoire comme celles du jeu (deux chiffres, trois lettres, trois chiffres), ou votre préfixe suivi de chiffres.

Côté : serveur · Attend : non

Signature
randomPlate(prefix?: string): string

Pas d’équivalent Lua (aiLib.spawnVehicle applique une plaque aléatoire quand vous n’en passez pas).

Prop

Type

Retour une plaque de 8 caractères (42ABC123, ou TAXI1234 pour randomPlate("TAXI")). Son unicité n’est pas vérifiée : vérifiez votre propre table avant de l’enregistrer.

const plate = randomPlate("RENT");

Trouver des véhicules

nearestVehicleTo

Le véhicule le plus proche dans un rayon de metres autour d’un joueur qui passe votre filtre. Le véhicule dans lequel le joueur est assis passe en premier.

Côté : serveur · Attend : non

Signature
nearestVehicleTo(source: number, metres: number, filter?: (vehicle: number) => boolean): number
Lua
local vehicle = aiLib.nearestVehicleTo(source, metres, filter) -- entité ou 0

Prop

Type

Retour l’entité du véhicule, ou 0 s’il n’y en a aucun.

const vehicle = nearestVehicleTo(source, 5);
if (!vehicle) return fail("NO_VEHICLE");

Elle parcourt tous les véhicules du serveur : utilisez-la pour des commandes et des actions (avec limite de fréquence), jamais dans un tick.

nearestVehicleAt

Le véhicule le plus proche dans un rayon de metres autour d’un point. Utilisez-la pour vérifier qu’un emplacement d’apparition est libre.

Côté : serveur · Attend : non

Signature
nearestVehicleAt(point: { x: number; y: number; z: number }, metres: number, filter?: (vehicle: number) => boolean): number

Pas d’équivalent Lua.

Retour l’entité du véhicule, ou 0 s’il n’y en a aucun. Parcourt tous les véhicules, comme nearestVehicleTo.

const SPOT = { x: 899.1, y: -180.6, z: 73.8 };
if (nearestVehicleAt(SPOT, 3)) return fail("SPOT_BLOCKED");

Entités depuis une entrée client

Un client envoie un network id, jamais un handle d’entité. Ces fonctions transforment un net id en entité serveur vivante et la vérifient, pour que vous n’appeliez jamais NetworkGetEntityFromNetworkId + DoesEntityExist + GetEntityType à la main.

entityFromNet

L’entité vivante derrière le network id d’un client.

Côté : serveur · Attend : non

Signature
entityFromNet(netId: unknown, type?: 1 | 2 | 3): number

Pas d’équivalent Lua (Lua a vehicleFromNet).

Prop

Type

Retour l’entité, ou 0 quand la valeur n’est pas un nombre entier positif, n’est pas en réseau, a disparu ou est d’un autre type.

const prop = entityFromNet(rawNetId, 3);
if (!prop) return fail("NOT_FOUND");

pedFromNet

entityFromNet(netId, 1) : le ped vivant, ou 0.

Côté : serveur · Attend : non

Signature
pedFromNet(netId: unknown): number

Pas d’équivalent Lua.

const ped = pedFromNet(rawNetId);

vehicleFromNet

entityFromNet(netId, 2) : le véhicule vivant, ou 0.

Côté : serveur · Attend : non

Signature
vehicleFromNet(netId: unknown): number
Lua
local vehicle = aiLib.vehicleFromNet(netId) -- entité ou 0
const vehicle = vehicleFromNet(rawNetId);
if (!vehicle) return fail("NO_VEHICLE");

vehicleNearPlayer

Le véhicule derrière le network id d’un client, mais seulement quand le joueur est près de lui (ou au volant).

Côté : serveur · Attend : non

Signature
vehicleNearPlayer(source: number, netId: unknown, options?: { metres?: number; driver?: boolean }): number
Lua
local vehicle = aiLib.vehicleNearPlayer(source, netId, options) -- entité ou 0

Prop

Type

Retour le véhicule, ou 0 quand l’id est mauvais, que le véhicule a disparu, ou que le joueur est trop loin / n’est pas le conducteur.

onClientCallback("my-tow:hook", { args: oneArg(readId), lock: true }, (source, netId) => {
  const vehicle = vehicleNearPlayer(source, netId, { metres: 6 });
  if (!vehicle) return fail("TOO_FAR");
  return { ok: true };
});

Clés

vehicleKeys passe par la couche clés d’ai-core : le script de clés que le serveur utilise (ai-vehiclekeys, ou un autre choisi par le propriétaire du serveur) répond. Un véhicule est un handle d’entité serveur ou une plaque.

vehicleKeys.give

Donne à un joueur les clés d’un véhicule.

Côté : serveur · Attend : non

Signature
vehicleKeys.give(source: number, vehicle: number | string, purpose?: KeyPurpose): void
Lua
aiLib.vehicleKeys.give(source, vehicle, purpose)

Prop

Type

Retour void.

vehicleKeys.give(source, vehicle, "rental");

vehicleKeys.remove

Retire à un joueur les clés d’un véhicule.

Côté : serveur · Attend : non

Signature
vehicleKeys.remove(source: number, vehicle: number | string): void
Lua
aiLib.vehicleKeys.remove(source, vehicle)

Retour void.

vehicleKeys.remove(source, "RENT1234");

vehicleKeys.has

Indique si un joueur possède les clés.

Côté : serveur · Attend : non

Signature
vehicleKeys.has(source: number, vehicle: number | string): boolean
Lua
local has = aiLib.vehicleKeys.has(source, vehicle)

Retour boolean. true aussi quand le script de clés ne peut pas le dire ou qu’aucun ne tourne, ne l’utilisez donc pas comme seule protection pour quelque chose de précieux.

if (!vehicleKeys.has(source, vehicle)) return fail("NO_KEYS");

Carburant

fuel lit et fixe le carburant d’un véhicule (de 0 à 100) via la couche carburant d’ai-core, quel que soit le script de carburant qui tourne. Pas d’équivalent Lua côté serveur : appelez les exports d’ai-core GetVehicleFuel / SetVehicleFuel.

fuel.get

Côté : serveur · Attend : non

Signature
fuel.get(vehicle: number): number | null

Retour le niveau d’une entité de véhicule serveur (de 0 à 100), ou null quand il n’en a pas.

const level = fuel.get(vehicle) ?? 0;

fuel.set

Côté : serveur · Attend : non

Signature
fuel.set(vehicle: number, level: number): boolean

Prop

Type

Retour true quand il est fixé, false pour un véhicule incorrect.

fuel.set(vehicle, 100);

fuel.provider

Côté : serveur · Attend : non

Signature
fuel.provider(): string | null

Retour le nom de ressource du script de carburant qui répond (ai-fuel, ox_fuel, LegacyFuel...), ou null quand aucun ne tourne.

console.log(`fuel through ${fuel.provider() ?? "nothing"}`);

Garages

garages passe par la couche garage d’ai-core, quel que soit le script de garage qui tourne ; chaque script ne répond qu’à ce qu’il expose. Pas d’équivalent Lua.

garages.impound

Envoie un véhicule à la fourrière, ou ouvre le formulaire de fourrière du script de garage pour by.

Côté : serveur · Attend : non

Signature
garages.impound(vehicle: number, by?: number): boolean

Prop

Type

Retour true quand le script de garage l’a pris en charge. false quand rien ne l’a pris : supprimez le véhicule vous-même.

if (!garages.impound(vehicle, source)) DeleteEntity(vehicle);

garages.store

Range un véhicule dans un garage.

Côté : serveur · Attend : non

Signature
garages.store(vehicle: number, garage?: string | null, by?: number): boolean

Prop

Type

Retour true quand il est rangé, false quand rien ne l’a pris.

if (!garages.store(vehicle, "legion", source)) return fail("STORE_FAILED");

garages.open

Ouvre le menu de garage du script de garage pour un joueur.

Côté : serveur · Attend : non

Signature
garages.open(source: number, garage?: string | null): boolean

Retour true quand il s’ouvre, false quand le script n’a pas ce menu.

garages.open(source, "pillbox");

garages.stored

Les véhicules d’un joueur dans les garages ou à la fourrière.

Côté : serveur · Attend : oui (Promise)

Signature
garages.stored(source: number): Promise<GaragedVehicle[] | null>

Retour GaragedVehicle[] (plate, model, garage, impounded), ou null quand le script ne peut pas le dire ou qu’ai-core est arrêté.

const list = await garages.stored(source);
const impounded = list?.filter((v) => v.impounded).length ?? 0;

garages.provider

Côté : serveur · Attend : non

Signature
garages.provider(): string | null

Retour le script de garage qui répond, ou null quand aucun ne tourne.

if (!garages.provider()) console.warn("no garage script runs");

Sur cette page