Exports entre recursos
registerExport, resourceExport, optionalExport, callExport, provideExport e isResourceStarted: oferecer e chamar exports a partir de TypeScript.
Um export é uma função que um recurso oferece e outros recursos chamam (exports["ai-core"].GetMoney(...)). Estes helpers registram exports com os dois estilos de nome, dão acesso tipado aos exports de outros recursos, e deixam o seu código sobreviver a um recurso que não está rodando.
import { registerExport, resourceExport, optionalExport, callExport, provideExport, isResourceStarted } from "@aicore-fivem/lib/fivem";
// Em um arquivo de cliente ou de servidor, os mesmos nomes também vêm de "@aicore-fivem/lib/client" ou "@aicore-fivem/lib/server".Regras para todo export: ele é síncrono e retorna valores pequenos. Nenhuma promise atravessa a fronteira de um recurso: quando um valor precisa de tempo, o export recebe um callback (done). Em um caminho quente (a cada frame, a cada segundo), espelhe os dados a partir de eventos em vez de chamar um export toda vez.
registerExport
Oferece uma função a outros recursos sob name, e também sob o mesmo nome com a primeira letra trocada entre maiúscula e minúscula (GetPrice e getPrice), para que scripts escritos em qualquer um dos estilos a encontrem. Use em vez do exports(name, fn) do FiveM.
Lado: Cliente e servidor · Espera: não
registerExport(name: string, handler: (...args: any[]) => unknown): voidLua: sem equivalente; use o próprio exports('GetPrice', function(...) end) do FiveM.
Parâmetros
Prop
Type
Retorno
void.
Exemplo
import { registerExport } from "@aicore-fivem/lib/server";
import { readText } from "@aicore-fivem/lib/shared";
const prices = new Map<string, number>([["water", 5], ["bread", 3]]);
// Outros recursos: 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);
});Um nome que você mesmo registra sempre vence uma variante. Registrar getPrice depois de GetPrice substitui a variante pelo seu próprio handler de getPrice.
resourceExport
Acesso tipado aos exports de outro recurso. Os tipos vêm de CitizenExports em @aicore-fivem/shared (ai-core, ai-lib, ai-target, ai-vehicles, ai-inventory e os outros scripts ai-* com exports), então o seu editor conhece todo export, os argumentos dele e o tipo de retorno.
Lado: Cliente e servidor · Espera: não
resourceExport<K extends keyof CitizenExports & string>(resource: K): CitizenExports[K]Lua: sem equivalente; use exports['ai-core']:GetMoney(source, 'cash').
Parâmetros
Prop
Type
Retorno
O objeto de exports do recurso. Chamar um método chama o export.
Exemplo
import { resourceExport } from "@aicore-fivem/lib/server";
// Um handle por arquivo, no topo.
const core = resourceExport("ai-core");
export function payBonus(source: number): boolean {
return core.AddMoney(source, "bank", 500, "Bonus");
}O handle não verifica se o recurso está rodando. Chamar um export de um recurso parado lança um erro. Para um recurso que pode faltar, use optionalExport.
optionalExport
Os mesmos exports tipados de resourceExport, mas null enquanto o recurso não está iniciado. Use para uma dependência opcional: o seu script continua funcionando quando o servidor não roda esse recurso.
Lado: Cliente e servidor · Espera: não
optionalExport<K extends keyof CitizenExports & string>(resource: K): CitizenExports[K] | nullLua: sem equivalente; verifique GetResourceState('ai-vehicles') == 'started' antes de chamar.
Parâmetros
Prop
Type
Retorno
O objeto de exports enquanto o recurso está iniciado, null caso contrário.
Exemplo
import { optionalExport } from "@aicore-fivem/lib/server";
function plateOfVehicleId(vehicleId: number): string | null {
// Pergunte de novo toda vez: o ai-vehicles pode iniciar ou parar enquanto o servidor roda.
return optionalExport("ai-vehicles")?.GetVehicle(vehicleId)?.plate ?? null;
}Chame optionalExport no momento em que precisa, não uma vez no topo do arquivo: um handle pego enquanto o recurso estava parado continua null.
callExport
Chama um export de um recurso que não tem tipos em CitizenExports (um script de terceiros). O resultado é unknown: verifique o formato antes de usar.
Lado: Cliente e servidor · Espera: não
callExport(resource: string, name: string, ...args: unknown[]): unknownLua: sem equivalente; use exports[resource][name](nil, ...) ou exports[resource]:Name(...).
Parâmetros
Prop
Type
Retorno
unknown: o que quer que o export tenha retornado.
Exemplo
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;
}Lança Error("<resource> has no export <name>") quando o recurso não tem esse export (também quando está parado). Verifique isResourceStarted antes, ou envolva a chamada em try / catch.
provideExport
Responde exports["<resource>"].<name> para um nome de recurso que o seu recurso substitui com provide no fxmanifest.lua dele. O provide do FiveM faz o nome existir (para que as linhas dependency passem), mas não encaminha os exports dele; este helper responde um export desse nome. O ai-banking o usa para responder chamadas de qb-banking e Renewed-Banking.
Lado: Cliente e servidor · Espera: não
provideExport(resource: string, name: string, fn: (...args: any[]) => unknown): voidLua: sem equivalente.
Parâmetros
Prop
Type
Retorno
void.
Exemplo
provide 'old-banking'import { provideExport, resourceExport } from "@aicore-fivem/lib/server";
import { readText } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
// Scripts escritos para old-banking continuam 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);
});Registre na inicialização do recurso, não depois: um script que chama o export antes de o seu handler existir recebe um erro. Use também registerExport se o seu próprio nome tiver que responder com a mesma função.
isResourceStarted
Se um recurso está rodando agora (o estado dele é "started").
Lado: Cliente e servidor · Espera: não
isResourceStarted(resource: string): booleanLua: sem equivalente; use GetResourceState(resource) == 'started'.
Parâmetros
Prop
Type
Retorno
true enquanto o recurso está iniciado. false quando está parado, iniciando, parando ou não instalado.
Exemplo
import { isResourceStarted } from "@aicore-fivem/lib/server";
if (!isResourceStarted("ai-inventory")) console.warn("ai-inventory is not running: shop items will not work.");Lib: compartilhada e fivem
@aicore-fivem/lib/shared e /fivem: os helpers que funcionam nos dois lados, para que serve cada entrada, e todas as páginas de tópicos.
Agendamento e ciclo de vida
every, onStop, caller, ByResource, Reasons, sleep e waitFor: trabalho periódico, espera, e dados que pertencem ao recurso que os registrou.