AI Core
Référence de l’APIAI Core : exports serveur

Garages

Mettre en fourrière et ranger des véhicules, ouvrir un menu de garage et lister les véhicules garés d’un joueur via le script de garages qu’utilise le serveur.

Les appels de garages passent par ai-core, jamais par les exports ou événements propres à un script de garages (ai-garages compris). ai-core transmet chaque appel au script de garages actif : celui que choisit le réglage Garage script du panneau, ou le premier qui tourne (ai-garages, jg-advancedgarages, tgiann-realparking et les autres de la liste de compatibilité). Chaque script ne répond qu’aux actions qu’il possède vraiment, si bien qu’une action peut répondre false ou null avec un script et fonctionner avec un autre.

Un véhicule est un handle d’entité serveur.

GetGarageSystem

Le nom de ressource du script de garages auquel ai-core transmet.

Côté : Serveur · Attend : non · Lib : garages.provider()

Signature
GetGarageSystem(): string | null
Lua
local system = exports['ai-core']:GetGarageSystem() -- string ou nil

Paramètres

Aucun.

Retour

string | null : le nom de ressource du script de garages. null quand aucun ne tourne.

Exemple

import { addCommand, resourceExport } from "@aicore-fivem/lib/server";

const core = resourceExport("ai-core");

addCommand("garagesystem", { help: "Shows the garage script in use", restricted: true }, () => {
  console.log(core.GetGarageSystem() ?? "none");
});

ImpoundVehicle

Envoie à la fourrière un véhicule présent dans le monde. Avec les scripts de garages qui n’ont qu’un formulaire de fourrière sur l’écran du joueur, il ouvre plutôt ce formulaire pour le joueur by.

Côté : Serveur · Attend : non · Lib : garages.impound

Signature
ImpoundVehicle(vehicle: number, by?: number): boolean
Lua
local taken = exports['ai-core']:ImpoundVehicle(vehicle, source)

Paramètres

Prop

Type

Retour

boolean : true quand le script de garages a pris le véhicule en charge (ou ouvert son formulaire). false quand rien ne l’a pris : aucun script de garages ne tourne, il n’a pas de fourrière, le véhicule n’est pas un véhicule qu’il connaît, ou vehicle n’est pas un véhicule existant. Avec false, le véhicule est toujours dans le monde : supprimez-le vous-même s’il doit partir.

Exemple

import { onClientCallback, resourceExport, vehicleNearPlayer } from "@aicore-fivem/lib/server";
import { fail, oneArg, readId } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");

onClientCallback("myscript:impound", { args: oneArg(readId) }, (source, netId) => {
  if (core.GetDutyJob(source) !== "police") return fail("NOT_POLICE");
  const vehicle = vehicleNearPlayer(source, netId, { metres: 5 });
  if (!vehicle) return fail("TOO_FAR");
  if (!core.ImpoundVehicle(vehicle, source)) DeleteEntity(vehicle);
  return { ok: true };
});

StoreVehicleInGarage

Range un véhicule présent dans le monde dans un garage, avec son état.

Côté : Serveur · Attend : non · Lib : garages.store

Signature
StoreVehicleInGarage(vehicle: number, garage?: string | null, by?: number): boolean
Lua
local stored = exports['ai-core']:StoreVehicleInGarage(vehicle, 'legion', source)

Paramètres

Prop

Type

Retour

boolean : true quand le script de garages a pris le véhicule. false quand rien ne l’a pris (aucun script de garages, pas d’action de rangement, garage inconnu, un véhicule que le script ne possède pas) ou que vehicle n’est pas un véhicule existant.

Exemple

import { onClientCallback, resourceExport, vehicleOf } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");

// Un voiturier range la voiture que conduit le joueur dans le garage le plus proche.
onClientCallback("myscript:valetStore", (source) => {
  const vehicle = vehicleOf(source, { driver: true });
  if (!vehicle) return fail("NOT_DRIVING");
  return core.StoreVehicleInGarage(vehicle, null, source) ? { ok: true } : fail("STORE_FAILED");
});

OpenGarage

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

Côté : Serveur · Attend : non · Lib : garages.open

Signature
OpenGarage(source: number, garage?: string | null): boolean
Lua
local opened = exports['ai-core']:OpenGarage(source, 'legion')

Paramètres

Prop

Type

Retour

boolean : true quand le menu s’est ouvert. false quand le joueur n’est pas en ligne, qu’aucun script de garages ne tourne ou qu’il n’a pas de menu ouvrable depuis l’extérieur.

Exemple

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

const core = resourceExport("ai-core");
const MOTEL_GARAGE = { x: 273.1, y: -343.9, z: 44.9 };

onClientCallback("myscript:motelGarage", { guards: [near(MOTEL_GARAGE, 3)] }, (source) =>
  core.OpenGarage(source, "motel") ? { ok: true } : fail("GARAGE_FAILED"),
);

GetGaragedVehicles

Les véhicules d’un joueur gardés par le script de garages : dans un garage ou à la fourrière.

Côté : Serveur · Attend : non (répond via done) · Lib : garages.stored(source) renvoie une Promise

Signature
GetGaragedVehicles(source: number, done: (vehicles: GaragedVehicle[] | null) => void): void
Lua
exports['ai-core']:GetGaragedVehicles(source, function(vehicles) end) -- liste ou nil

Paramètres

Prop

Type

Retour

Rien. done reçoit une entrée par véhicule avec plate, model (ou null), garage (ou null) et impounded (GaragedVehicle), ou null quand le joueur n’est pas en ligne, qu’aucun script de garages ne tourne, qu’il ne sait pas lister les véhicules ou qu’il a échoué. Sans fonction comme done, l’appel ne fait rien.

Exemple

import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
import type { GaragedVehicle } from "@aicore-fivem/shared";

const core = resourceExport("ai-core");

// Le guichet de la fourrière liste les voitures du joueur mises en fourrière.
onClientCallback("myscript:impoundList", async (source) => {
  const list = await new Promise<GaragedVehicle[] | null>((resolve) => core.GetGaragedVehicles(source, resolve));
  if (!list) return fail("GARAGE_UNKNOWN");
  return { ok: true, plates: list.filter((v) => v.impounded).map((v) => v.plate) };
});

Sur cette page