AI Core
Dokumentacja APILib: shared i fivem

Eksporty między zasobami

registerExport, resourceExport, optionalExport, callExport, provideExport i isResourceStarted: udostępnianie i wywoływanie eksportów z TypeScript.

Eksport to funkcja, którą jeden zasób udostępnia, a inne zasoby wywołują (exports["ai-core"].GetMoney(...)). Te funkcje rejestrują eksporty w obu stylach nazw, dają typowany dostęp do innych zasobów i pozwalają twojemu kodowi przetrwać zasób, który nie działa.

TypeScript
import { registerExport, resourceExport, optionalExport, callExport, provideExport, isResourceStarted } from "@aicore-fivem/lib/fivem";
// W pliku klienta lub serwera te same nazwy są też dostępne z "@aicore-fivem/lib/client" albo "@aicore-fivem/lib/server".

Zasady dla każdego eksportu: jest synchroniczny i zwraca małe wartości. Żaden promise nie przechodzi przez granicę zasobu: gdy wartość wymaga czasu, eksport przyjmuje callback (done). Na gorącej ścieżce (co klatkę, co sekundę) odwzoruj dane ze zdarzeń zamiast za każdym razem wywoływać eksport.

registerExport

Udostępnia funkcję innym zasobom pod nazwą name oraz pod tą samą nazwą z zamienioną wielkością pierwszej litery (GetPrice i getPrice), więc skrypty napisane w każdym ze stylów ją znajdą. Używaj jej zamiast exports(name, fn) z FiveM.

Strona: Klient i serwer · Czeka: nie

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

Lua: brak odpowiednika; użyj własnego exports('GetPrice', function(...) end) z FiveM.

Parametry

Prop

Type

Zwracana wartość

void.

Przykład

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]]);

// Inne zasoby: exports["my-shop"].GetPrice("water") albo exports["my-shop"].getPrice("water")
registerExport("GetPrice", (item: unknown) => {
  const name = readText(item, 64);
  return name === null ? null : (prices.get(name) ?? null);
});

Nazwa, którą rejestrujesz sam, zawsze wygrywa z bliźniaczą. Zarejestrowanie getPrice po GetPrice zastępuje bliźniaczą nazwę twoim własnym handlerem getPrice.

resourceExport

Typowany dostęp do eksportów innego zasobu. Typy pochodzą z CitizenExports w @aicore-fivem/shared (ai-core, ai-lib, ai-target, ai-vehicles, ai-inventory i inne skrypty ai-* z eksportami), więc twój edytor zna każdy eksport, jego argumenty i typ zwracany.

Strona: Klient i serwer · Czeka: nie

Sygnatura
resourceExport<K extends keyof CitizenExports & string>(resource: K): CitizenExports[K]

Lua: brak odpowiednika; użyj exports['ai-core']:GetMoney(source, 'cash').

Parametry

Prop

Type

Zwracana wartość

Obiekt eksportów zasobu. Wywołanie metody wywołuje eksport.

Przykład

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

// Jeden uchwyt na plik, na górze.
const core = resourceExport("ai-core");

export function payBonus(source: number): boolean {
  return core.AddMoney(source, "bank", 500, "Bonus");
}

Uchwyt nie sprawdza, czy zasób działa. Wywołanie eksportu zatrzymanego zasobu rzuca wyjątek. Dla zasobu, którego może brakować, użyj optionalExport.

optionalExport

Te same typowane eksporty co resourceExport, ale null, dopóki zasób nie jest uruchomiony. Używaj go dla opcjonalnej zależności: twój skrypt działa dalej, gdy serwer nie uruchamia tego zasobu.

Strona: Klient i serwer · Czeka: nie

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

Lua: brak odpowiednika; przed wywołaniem sprawdź GetResourceState('ai-vehicles') == 'started'.

Parametry

Prop

Type

Zwracana wartość

Obiekt eksportów, gdy zasób jest uruchomiony, w przeciwnym razie null.

Przykład

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

function plateOfVehicleId(vehicleId: number): string | null {
  // Pytaj za każdym razem: ai-vehicles może się uruchomić albo zatrzymać w trakcie działania serwera.
  return optionalExport("ai-vehicles")?.GetVehicle(vehicleId)?.plate ?? null;
}

Wywołuj optionalExport w chwili, gdy go potrzebujesz, a nie raz na górze pliku: uchwyt pobrany, gdy zasób był zatrzymany, zostaje null.

callExport

Wywołuje eksport zasobu, który nie ma typów w CitizenExports (skrypt zewnętrzny). Wynik to unknown: sprawdź jego kształt, zanim go użyjesz.

Strona: Klient i serwer · Czeka: nie

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

Lua: brak odpowiednika; użyj exports[resource][name](nil, ...) albo exports[resource]:Name(...).

Parametry

Prop

Type

Zwracana wartość

unknown: cokolwiek zwrócił eksport.

Przykład

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;
}

Rzuca Error("<resource> has no export <name>"), gdy zasób nie ma takiego eksportu (także gdy jest zatrzymany). Najpierw sprawdź isResourceStarted albo opakuj wywołanie w try / catch.

provideExport

Odpowiada na exports["<resource>"].<name> dla nazwy zasobu, którą twój zasób zastępuje przez provide w swoim fxmanifest.lua. provide z FiveM sprawia, że nazwa istnieje (więc linie dependency przechodzą), ale nie przekazuje jej eksportów; ta funkcja odpowiada na jeden eksport tej nazwy. ai-banking używa jej, żeby odpowiadać na wywołania qb-banking i Renewed-Banking.

Strona: Klient i serwer · Czeka: nie

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

Lua: brak odpowiednika.

Parametry

Prop

Type

Zwracana wartość

void.

Przykład

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");

// Skrypty napisane dla old-banking działają dalej: 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);
});

Zarejestruj go przy starcie zasobu, nie później: skrypt, który wywoła eksport, zanim istnieje twój handler, dostaje błąd. Użyj też registerExport, jeśli twoja własna nazwa ma odpowiadać tą samą funkcją.

isResourceStarted

Czy zasób działa w tej chwili (jego stan to "started").

Strona: Klient i serwer · Czeka: nie

Sygnatura
isResourceStarted(resource: string): boolean

Lua: brak odpowiednika; użyj GetResourceState(resource) == 'started'.

Parametry

Prop

Type

Zwracana wartość

true, gdy zasób jest uruchomiony. false, gdy jest zatrzymany, uruchamia się, zatrzymuje albo nie jest zainstalowany.

Przykład

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.");

Na tej stronie