Véhicules
spawnVehicle, vehicleType, randomPlate, véhicules les plus proches, entités depuis les net ids du client, vehicleKeys, carburant et garages.
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)
spawnVehicle(options: SpawnVehicleOptions): Promise<number | null>local vehicle = aiLib.spawnVehicle(options) -- entité ou nil, à appeler dans un threadParamè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)
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
randomPlate(prefix?: string): stringPas 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
nearestVehicleTo(source: number, metres: number, filter?: (vehicle: number) => boolean): numberlocal vehicle = aiLib.nearestVehicleTo(source, metres, filter) -- entité ou 0Prop
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
nearestVehicleAt(point: { x: number; y: number; z: number }, metres: number, filter?: (vehicle: number) => boolean): numberPas 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
entityFromNet(netId: unknown, type?: 1 | 2 | 3): numberPas 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
pedFromNet(netId: unknown): numberPas d’équivalent Lua.
const ped = pedFromNet(rawNetId);vehicleFromNet
entityFromNet(netId, 2) : le véhicule vivant, ou 0.
Côté : serveur · Attend : non
vehicleFromNet(netId: unknown): numberlocal vehicle = aiLib.vehicleFromNet(netId) -- entité ou 0const 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
vehicleNearPlayer(source: number, netId: unknown, options?: { metres?: number; driver?: boolean }): numberlocal vehicle = aiLib.vehicleNearPlayer(source, netId, options) -- entité ou 0Prop
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
vehicleKeys.give(source: number, vehicle: number | string, purpose?: KeyPurpose): voidaiLib.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
vehicleKeys.remove(source: number, vehicle: number | string): voidaiLib.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
vehicleKeys.has(source: number, vehicle: number | string): booleanlocal 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
fuel.get(vehicle: number): number | nullRetour 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
fuel.set(vehicle: number, level: number): booleanProp
Type
Retour true quand il est fixé, false pour un véhicule incorrect.
fuel.set(vehicle, 100);fuel.provider
Côté : serveur · Attend : non
fuel.provider(): string | nullRetour 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
garages.impound(vehicle: number, by?: number): booleanProp
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
garages.store(vehicle: number, garage?: string | null, by?: number): booleanProp
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
garages.open(source: number, garage?: string | null): booleanRetour 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)
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
garages.provider(): string | nullRetour le script de garage qui répond, ou null quand aucun ne tourne.
if (!garages.provider()) console.warn("no garage script runs");