Exports entre recursos
registerExport, resourceExport, optionalExport, callExport, provideExport e isResourceStarted: ofrecer y llamar exports desde TypeScript.
Un export es una función que un recurso ofrece y otros recursos llaman (exports["ai-core"].GetMoney(...)). Estas utilidades registran exports con ambos estilos de nombre, te dan acceso tipado a otros recursos y permiten que tu código sobreviva a un recurso que no está en marcha.
import { registerExport, resourceExport, optionalExport, callExport, provideExport, isResourceStarted } from "@aicore-fivem/lib/fivem";
// En un archivo de cliente o de servidor, los mismos nombres también vienen de "@aicore-fivem/lib/client" o "@aicore-fivem/lib/server".Reglas para cada export: es síncrono y devuelve valores pequeños. Ninguna promise cruza la frontera de un recurso: cuando un valor necesita tiempo, el export recibe un callback (done). En una ruta caliente (cada frame, cada segundo), refleja los datos a partir de eventos en lugar de llamar a un export cada vez.
registerExport
Ofrece una función a otros recursos bajo name, y también bajo el mismo nombre con la primera letra en la otra caja (GetPrice y getPrice), para que los scripts escritos en cualquiera de los dos estilos la encuentren. Úsalo en lugar de exports(name, fn) de FiveM.
Lado: Cliente y servidor · Espera: no
registerExport(name: string, handler: (...args: any[]) => unknown): voidLua: sin equivalente; usa el propio exports('GetPrice', function(...) end) de FiveM.
Parámetros
Prop
Type
Devuelve
void.
Ejemplo
import { registerExport } from "@aicore-fivem/lib/server";
import { readText } from "@aicore-fivem/lib/shared";
const prices = new Map<string, number>([["water", 5], ["bread", 3]]);
// Otros recursos: exports["my-shop"].GetPrice("water") o exports["my-shop"].getPrice("water")
registerExport("GetPrice", (item: unknown) => {
const name = readText(item, 64);
return name === null ? null : (prices.get(name) ?? null);
});Un nombre que registras tú mismo siempre gana a un gemelo. Registrar getPrice después de GetPrice reemplaza el gemelo con tu propio handler getPrice.
resourceExport
Acceso tipado a los exports de otro recurso. Los tipos vienen de CitizenExports en @aicore-fivem/shared (ai-core, ai-lib, ai-target, ai-vehicles, ai-inventory y los demás scripts ai-* con exports), así que tu editor conoce cada export, sus argumentos y su tipo de retorno.
Lado: Cliente y servidor · Espera: no
resourceExport<K extends keyof CitizenExports & string>(resource: K): CitizenExports[K]Lua: sin equivalente; usa exports['ai-core']:GetMoney(source, 'cash').
Parámetros
Prop
Type
Devuelve
El objeto de exports del recurso. Llamar a un método llama al export.
Ejemplo
import { resourceExport } from "@aicore-fivem/lib/server";
// Un handle por archivo, al principio.
const core = resourceExport("ai-core");
export function payBonus(source: number): boolean {
return core.AddMoney(source, "bank", 500, "Bonus");
}El handle no comprueba que el recurso esté en marcha. Llamar a un export de un recurso detenido lanza un error. Para un recurso que puede faltar, usa optionalExport.
optionalExport
Los mismos exports tipados que resourceExport, pero null mientras el recurso no está arrancado. Úsalo para una dependencia opcional: tu script sigue funcionando cuando el servidor no usa ese recurso.
Lado: Cliente y servidor · Espera: no
optionalExport<K extends keyof CitizenExports & string>(resource: K): CitizenExports[K] | nullLua: sin equivalente; comprueba GetResourceState('ai-vehicles') == 'started' antes de llamar.
Parámetros
Prop
Type
Devuelve
El objeto de exports mientras el recurso está arrancado, null en caso contrario.
Ejemplo
import { optionalExport } from "@aicore-fivem/lib/server";
function plateOfVehicleId(vehicleId: number): string | null {
// Pregunta cada vez: ai-vehicles puede arrancar o detenerse mientras el servidor funciona.
return optionalExport("ai-vehicles")?.GetVehicle(vehicleId)?.plate ?? null;
}Llama a optionalExport en el momento en que lo necesitas, no una vez al principio del archivo: un handle tomado mientras el recurso estaba detenido se queda en null.
callExport
Llama a un export de un recurso que no tiene tipos en CitizenExports (un script de terceros). El resultado es unknown: comprueba su forma antes de usarlo.
Lado: Cliente y servidor · Espera: no
callExport(resource: string, name: string, ...args: unknown[]): unknownLua: sin equivalente; usa exports[resource][name](nil, ...) o exports[resource]:Name(...).
Parámetros
Prop
Type
Devuelve
unknown: lo que haya devuelto el export.
Ejemplo
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;
}Lanza Error("<resource> has no export <name>") cuando el recurso no tiene ese export (también cuando está detenido). Comprueba antes isResourceStarted, o envuelve la llamada en try / catch.
provideExport
Responde a exports["<resource>"].<name> para un nombre de recurso al que tu recurso sustituye con provide en su fxmanifest.lua. El provide de FiveM hace que el nombre exista (para que pasen las líneas dependency) pero no reenvía sus exports; esta utilidad responde a un export de ese nombre. ai-banking lo usa para responder a las llamadas de qb-banking y Renewed-Banking.
Lado: Cliente y servidor · Espera: no
provideExport(resource: string, name: string, fn: (...args: any[]) => unknown): voidLua: sin equivalente.
Parámetros
Prop
Type
Devuelve
void.
Ejemplo
provide 'old-banking'import { provideExport, resourceExport } from "@aicore-fivem/lib/server";
import { readText } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
// Los scripts escritos para old-banking siguen funcionando: 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);
});Regístralo al arrancar el recurso, no más tarde: un script que llama al export antes de que exista tu handler recibe un error. Usa también registerExport si tu propio nombre debe responder a la misma función.
isResourceStarted
Si un recurso está en marcha ahora mismo (su estado es "started").
Lado: Cliente y servidor · Espera: no
isResourceStarted(resource: string): booleanLua: sin equivalente; usa GetResourceState(resource) == 'started'.
Parámetros
Prop
Type
Devuelve
true mientras el recurso está arrancado. false cuando está detenido, arrancando, deteniéndose o no instalado.
Ejemplo
import { isResourceStarted } from "@aicore-fivem/lib/server";
if (!isResourceStarted("ai-inventory")) console.warn("ai-inventory is not running: shop items will not work.");Lib: compartido y fivem
@aicore-fivem/lib/shared y /fivem: las utilidades que funcionan en ambos lados, para qué sirve cada entrada y cada página temática.
Planificación y ciclo de vida
every, onStop, caller, ByResource, Reasons, sleep y waitFor: trabajo periódico, esperas y datos que pertenecen al recurso que los registró.