AI Core
Referencia de la APILib: compartido y fivem

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.

TypeScript
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

Firma
registerExport(name: string, handler: (...args: any[]) => unknown): void

Lua: sin equivalente; usa el propio exports('GetPrice', function(...) end) de FiveM.

Parámetros

Prop

Type

Devuelve

void.

Ejemplo

resource/server/index.ts
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

Firma
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

resource/server/index.ts
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

Firma
optionalExport<K extends keyof CitizenExports & string>(resource: K): CitizenExports[K] | null

Lua: 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

resource/server/index.ts
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

Firma
callExport(resource: string, name: string, ...args: unknown[]): unknown

Lua: sin equivalente; usa exports[resource][name](nil, ...) o exports[resource]:Name(...).

Parámetros

Prop

Type

Devuelve

unknown: lo que haya devuelto el export.

Ejemplo

resource/client/index.ts
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

Firma
provideExport(resource: string, name: string, fn: (...args: any[]) => unknown): void

Lua: sin equivalente.

Parámetros

Prop

Type

Devuelve

void.

Ejemplo

fxmanifest.lua
provide 'old-banking'
resource/server/index.ts
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

Firma
isResourceStarted(resource: string): boolean

Lua: 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

resource/server/index.ts
import { isResourceStarted } from "@aicore-fivem/lib/server";

if (!isResourceStarted("ai-inventory")) console.warn("ai-inventory is not running: shop items will not work.");

En esta página