Exports zwischen Ressourcen
registerExport, resourceExport, optionalExport, callExport, provideExport und isResourceStarted: Exports aus TypeScript anbieten und aufrufen.
Ein Export ist eine Funktion, die eine Ressource anbietet und andere Ressourcen aufrufen (exports["ai-core"].GetMoney(...)). Diese Helfer registrieren Exports in beiden Namensstilen, geben dir typisierten Zugriff auf andere Ressourcen und lassen deinen Code eine Ressource überstehen, die nicht läuft.
import { registerExport, resourceExport, optionalExport, callExport, provideExport, isResourceStarted } from "@aicore-fivem/lib/fivem";
// In einer Client- oder Server-Datei kommen dieselben Namen auch aus "@aicore-fivem/lib/client" oder "@aicore-fivem/lib/server".Regeln für jeden Export: Er ist synchron und gibt kleine Werte zurück. Kein Promise überquert eine Ressourcengrenze: Wenn ein Wert Zeit braucht, nimmt der Export einen Callback (done). In einem heißen Pfad (jeden Frame, jede Sekunde) spiegle die Daten aus Events, statt jedes Mal einen Export aufzurufen.
registerExport
Bietet anderen Ressourcen eine Funktion unter name an, und auch unter demselben Namen mit vertauschter Groß-/Kleinschreibung des ersten Buchstabens (GetPrice und getPrice), damit Skripte in beiden Stilen sie finden. Nutze es statt exports(name, fn) von FiveM.
Seite: Client und Server · Wartet: nein
registerExport(name: string, handler: (...args: any[]) => unknown): voidLua: kein Zwilling; nutze das eigene exports('GetPrice', function(...) end) von FiveM.
Parameter
Prop
Type
Rückgabewert
void.
Beispiel
import { registerExport } from "@aicore-fivem/lib/server";
import { readText } from "@aicore-fivem/lib/shared";
const prices = new Map<string, number>([["water", 5], ["bread", 3]]);
// Andere Ressourcen: exports["my-shop"].GetPrice("water") oder exports["my-shop"].getPrice("water")
registerExport("GetPrice", (item: unknown) => {
const name = readText(item, 64);
return name === null ? null : (prices.get(name) ?? null);
});Ein Name, den du selbst registrierst, gewinnt immer gegen einen Zwilling. getPrice nach GetPrice zu registrieren ersetzt den Zwilling durch deinen eigenen getPrice-Handler.
resourceExport
Typisierter Zugriff auf die Exports einer anderen Ressource. Die Typen kommen aus CitizenExports in @aicore-fivem/shared (ai-core, ai-lib, ai-target, ai-vehicles, ai-inventory und die anderen ai-*-Skripte mit Exports), daher kennt dein Editor jeden Export, seine Argumente und seinen Rückgabetyp.
Seite: Client und Server · Wartet: nein
resourceExport<K extends keyof CitizenExports & string>(resource: K): CitizenExports[K]Lua: kein Zwilling; nutze exports['ai-core']:GetMoney(source, 'cash').
Parameter
Prop
Type
Rückgabewert
Das Exports-Objekt der Ressource. Eine Methode aufzurufen ruft den Export auf.
Beispiel
import { resourceExport } from "@aicore-fivem/lib/server";
// Ein Handle pro Datei, ganz oben.
const core = resourceExport("ai-core");
export function payBonus(source: number): boolean {
return core.AddMoney(source, "bank", 500, "Bonus");
}Das Handle prüft nicht, ob die Ressource läuft. Einen Export einer gestoppten Ressource aufzurufen wirft. Für eine Ressource, die fehlen kann, nutze optionalExport.
optionalExport
Dieselben typisierten Exports wie resourceExport, aber null, solange die Ressource nicht gestartet ist. Nutze es für eine optionale Abhängigkeit: Dein Skript funktioniert weiter, wenn der Server diese Ressource nicht betreibt.
Seite: Client und Server · Wartet: nein
optionalExport<K extends keyof CitizenExports & string>(resource: K): CitizenExports[K] | nullLua: kein Zwilling; prüfe GetResourceState('ai-vehicles') == 'started' vor dem Aufruf.
Parameter
Prop
Type
Rückgabewert
Das Exports-Objekt, solange die Ressource gestartet ist, sonst null.
Beispiel
import { optionalExport } from "@aicore-fivem/lib/server";
function plateOfVehicleId(vehicleId: number): string | null {
// Jedes Mal neu fragen: ai-vehicles kann starten oder stoppen, während der Server läuft.
return optionalExport("ai-vehicles")?.GetVehicle(vehicleId)?.plate ?? null;
}Rufe optionalExport in dem Moment auf, in dem du es brauchst, nicht einmal am Anfang der Datei: Ein Handle, das genommen wurde, als die Ressource gestoppt war, bleibt null.
callExport
Ruft einen Export einer Ressource auf, die keine Typen in CitizenExports hat (ein Skript von Drittanbietern). Das Ergebnis ist unknown: Prüfe seine Form, bevor du es nutzt.
Seite: Client und Server · Wartet: nein
callExport(resource: string, name: string, ...args: unknown[]): unknownLua: kein Zwilling; nutze exports[resource][name](nil, ...) oder exports[resource]:Name(...).
Parameter
Prop
Type
Rückgabewert
unknown: was auch immer der Export zurückgegeben hat.
Beispiel
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;
}Wirft Error("<resource> has no export <name>"), wenn die Ressource keinen solchen Export hat (auch wenn sie gestoppt ist). Prüfe zuerst isResourceStarted oder packe den Aufruf in try / catch.
provideExport
Beantwortet exports["<resource>"].<name> für einen Ressourcennamen, für den deine Ressource mit provide in ihrer fxmanifest.lua einspringt. FiveMs provide lässt den Namen existieren (sodass dependency-Zeilen durchgehen), leitet aber seine Exports nicht weiter; dieser Helfer beantwortet einen Export dieses Namens. ai-banking nutzt ihn, um Aufrufe von qb-banking und Renewed-Banking zu beantworten.
Seite: Client und Server · Wartet: nein
provideExport(resource: string, name: string, fn: (...args: any[]) => unknown): voidLua: kein Zwilling.
Parameter
Prop
Type
Rückgabewert
void.
Beispiel
provide 'old-banking'import { provideExport, resourceExport } from "@aicore-fivem/lib/server";
import { readText } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
// Skripte, die für old-banking geschrieben wurden, funktionieren weiter: 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);
});Registriere es beim Start der Ressource, nicht später: Ein Skript, das den Export aufruft, bevor dein Handler existiert, bekommt einen Fehler. Nutze zusätzlich registerExport, wenn auch dein eigener Name dieselbe Funktion beantworten soll.
isResourceStarted
Ob eine Ressource gerade läuft (ihr Zustand ist "started").
Seite: Client und Server · Wartet: nein
isResourceStarted(resource: string): booleanLua: kein Zwilling; nutze GetResourceState(resource) == 'started'.
Parameter
Prop
Type
Rückgabewert
true, solange die Ressource gestartet ist. false, wenn sie gestoppt ist, startet, stoppt oder nicht installiert ist.
Beispiel
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 und fivem
@aicore-fivem/lib/shared und /fivem: die Helfer, die auf beiden Seiten funktionieren, wofür jeder Einstieg da ist, und jede Themenseite.
Scheduling und Lebenszyklus
every, onStop, caller, ByResource, Reasons, sleep und waitFor: periodische Arbeit, Warten und Daten, die der Ressource gehören, die sie registriert hat.