Exports entre ressources
registerExport, resourceExport, optionalExport, callExport, provideExport et isResourceStarted : proposer et appeler des exports depuis TypeScript.
Un export est une fonction qu’une ressource propose et que d’autres ressources appellent (exports["ai-core"].GetMoney(...)). Ces utilitaires enregistrent les exports sous les deux styles de nom, vous donnent un accès typé aux autres ressources et permettent à votre code de survivre à une ressource qui ne tourne pas.
import { registerExport, resourceExport, optionalExport, callExport, provideExport, isResourceStarted } from "@aicore-fivem/lib/fivem";
// Dans un fichier client ou serveur, les mêmes noms viennent aussi de "@aicore-fivem/lib/client" ou "@aicore-fivem/lib/server".Règles pour chaque export : il est synchrone et renvoie de petites valeurs. Aucune promesse ne franchit la frontière d’une ressource : quand une valeur demande du temps, l’export prend un callback (done). Dans un chemin chaud (chaque frame, chaque seconde), recopiez les données à partir des événements au lieu d’appeler un export à chaque fois.
registerExport
Propose une fonction aux autres ressources sous name, et aussi sous le même nom avec la casse de la première lettre inversée (GetPrice et getPrice), pour que les scripts écrits dans l’un ou l’autre style la trouvent. Utilisez-le à la place de exports(name, fn) de FiveM.
Côté : client et serveur · Attend : non
registerExport(name: string, handler: (...args: any[]) => unknown): voidLua : pas d’équivalent ; utilisez le exports('GetPrice', function(...) end) propre à FiveM.
Paramètres
Prop
Type
Retour
void.
Exemple
import { registerExport } from "@aicore-fivem/lib/server";
import { readText } from "@aicore-fivem/lib/shared";
const prices = new Map<string, number>([["water", 5], ["bread", 3]]);
// Autres ressources : exports["my-shop"].GetPrice("water") ou exports["my-shop"].getPrice("water")
registerExport("GetPrice", (item: unknown) => {
const name = readText(item, 64);
return name === null ? null : (prices.get(name) ?? null);
});Un nom que vous enregistrez vous-même l’emporte toujours sur un jumeau. Enregistrer getPrice après GetPrice remplace le jumeau par votre propre gestionnaire getPrice.
resourceExport
Un accès typé aux exports d’une autre ressource. Les types viennent de CitizenExports dans @aicore-fivem/shared (ai-core, ai-lib, ai-target, ai-vehicles, ai-inventory et les autres scripts ai-* qui ont des exports), donc votre éditeur connaît chaque export, ses arguments et son type de retour.
Côté : client et serveur · Attend : non
resourceExport<K extends keyof CitizenExports & string>(resource: K): CitizenExports[K]Lua : pas d’équivalent ; utilisez exports['ai-core']:GetMoney(source, 'cash').
Paramètres
Prop
Type
Retour
L’objet des exports de la ressource. Appeler une méthode appelle l’export.
Exemple
import { resourceExport } from "@aicore-fivem/lib/server";
// Un handle par fichier, en haut.
const core = resourceExport("ai-core");
export function payBonus(source: number): boolean {
return core.AddMoney(source, "bank", 500, "Bonus");
}Le handle ne vérifie pas que la ressource tourne. Appeler un export d’une ressource arrêtée lève une erreur. Pour une ressource qui peut manquer, utilisez optionalExport.
optionalExport
Les mêmes exports typés que resourceExport, mais null tant que la ressource n’est pas démarrée. Utilisez-le pour une dépendance facultative : votre script continue de fonctionner quand le serveur ne fait pas tourner cette ressource.
Côté : client et serveur · Attend : non
optionalExport<K extends keyof CitizenExports & string>(resource: K): CitizenExports[K] | nullLua : pas d’équivalent ; vérifiez GetResourceState('ai-vehicles') == 'started' avant l’appel.
Paramètres
Prop
Type
Retour
L’objet des exports tant que la ressource est démarrée, null sinon.
Exemple
import { optionalExport } from "@aicore-fivem/lib/server";
function plateOfVehicleId(vehicleId: number): string | null {
// Redemander à chaque fois : ai-vehicles peut démarrer ou s’arrêter pendant que le serveur tourne.
return optionalExport("ai-vehicles")?.GetVehicle(vehicleId)?.plate ?? null;
}Appelez optionalExport au moment où vous en avez besoin, pas une seule fois en haut du fichier : un handle pris pendant que la ressource était arrêtée reste null.
callExport
Appelle un export d’une ressource qui n’a pas de types dans CitizenExports (un script tiers). Le résultat est unknown : vérifiez sa forme avant de l’utiliser.
Côté : client et serveur · Attend : non
callExport(resource: string, name: string, ...args: unknown[]): unknownLua : pas d’équivalent ; utilisez exports[resource][name](nil, ...) ou exports[resource]:Name(...).
Paramètres
Prop
Type
Retour
unknown : ce que l’export a renvoyé.
Exemple
import { callExport, isResourceStarted } from "@aicore-fivem/lib/client";
function otherHudVisible(): boolean {
if (!isResourceStarted("some-hud")) return true;
const visible = callExport("some-hud", "IsVisible");
return typeof visible === "boolean" ? visible : true;
}Lève Error("<resource> has no export <name>") quand la ressource n’a pas cet export (aussi quand elle est arrêtée). Vérifiez d’abord isResourceStarted, ou entourez l’appel d’un try / catch.
provideExport
Répond à exports["<resource>"].<name> pour un nom de ressource que votre ressource remplace avec provide dans son fxmanifest.lua. Le provide de FiveM fait exister le nom (les lignes dependency passent donc) mais ne transmet pas ses exports ; cet utilitaire répond à un export de ce nom. ai-banking s’en sert pour répondre aux appels de qb-banking et Renewed-Banking.
Côté : client et serveur · Attend : non
provideExport(resource: string, name: string, fn: (...args: any[]) => unknown): voidLua : pas d’équivalent.
Paramètres
Prop
Type
Retour
void.
Exemple
provide 'old-banking'import { provideExport, resourceExport } from "@aicore-fivem/lib/server";
import { readText } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
// Les scripts écrits pour old-banking continuent de fonctionner : exports["old-banking"].GetAccountBalance("police")
provideExport("old-banking", "GetAccountBalance", (job: unknown) => {
const name = readText(job, 32);
return name === null ? 0 : (core.GetSharedMoney("job", name, "bank") ?? 0);
});Enregistrez-le au démarrage de la ressource, pas plus tard : un script qui appelle l’export avant que votre gestionnaire existe reçoit une erreur. Utilisez aussi registerExport si votre propre nom doit répondre avec la même fonction.
isResourceStarted
Indique si une ressource tourne en ce moment (son état est "started").
Côté : client et serveur · Attend : non
isResourceStarted(resource: string): booleanLua : pas d’équivalent ; utilisez GetResourceState(resource) == 'started'.
Paramètres
Prop
Type
Retour
true tant que la ressource est démarrée. false quand elle est arrêtée, en cours de démarrage, en cours d’arrêt ou pas installée.
Exemple
import { isResourceStarted } from "@aicore-fivem/lib/server";
if (!isResourceStarted("ai-inventory")) console.warn("ai-inventory is not running: shop items will not work.");Lib : shared et fivem
@aicore-fivem/lib/shared et /fivem : les utilitaires qui fonctionnent des deux côtés, le rôle de chaque entrée et toutes les pages thématiques.
Planification et cycle de vie
every, onStop, caller, ByResource, Reasons, sleep et waitFor : travail périodique, attente et données qui appartiennent à la ressource qui les a enregistrées.