AI Core
Dokumentacja APILib: shared i fivem

Dane panelu

num, int, bool, str, record, vec4, spec, readRecords i withoutSchemaKey: odczyt plików data/*.json edytowanych przez panel administratora.

Ustawienia twojego skryptu są w plikach data/*.json, które właściciel serwera edytuje w panelu administratora ai-core (zobacz Panel administratora). Panel sprawdza wartości względem twojego schema.ts, ale plik i tak może być stary, edytowany ręcznie albo nie mieć jakiegoś pola. Czytniki z tej strony nigdy nie odrzucają: brakująca albo zła wartość daje podaną przez ciebie wartość zastępczą, więc skrypt zawsze startuje.

Dla wartości wysyłanych przez klienta użyj zamiast tego ścisłych czytników ze strony Akcje i wejście z klienta: one odrzucają złą wartość.

TypeScript
import { num, int, bool, str, record, vec4, spec, readRecords, withoutSchemaKey } from "@aicore-fivem/lib/shared";

Lua: żadna z nich nie ma odpowiednika w Lua (panel administratora i jego pliki danych są tylko dla TypeScript).

Czytniki wartości

num

Skończona liczba ograniczona do [min, max], w przeciwnym razie wartość zastępcza.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
num(value: unknown, fallback: number, min?: number, max?: number): number

Parametry

Prop

Type

Zwracana wartość

number: wartość ograniczona do zakresu albo fallback (nieograniczony).

Przykład

import { num } from "@aicore-fivem/lib/shared";

num(25, 2.5, 1, 20);      // 20 (ograniczone)
num("big", 2.5, 1, 20);   // 2.5 (wartość zastępcza)

int

Jak num, potem zaokrąglona do liczby całkowitej.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
int(value: unknown, fallback: number, min?: number, max?: number): number

Parametry

Prop

Type

Zwracana wartość

number: liczba całkowita (wartość zastępcza też jest zaokrąglana).

Przykład

import { int } from "@aicore-fivem/lib/shared";

int(12.6, 10, 0, 100); // 13
int(null, 10, 0, 100); // 10

bool

Wartość logiczna, w przeciwnym razie wartość zastępcza.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
bool(value: unknown, fallback: boolean): boolean

Parametry

Prop

Type

Zwracana wartość

boolean.

Przykład

import { bool } from "@aicore-fivem/lib/shared";

bool(true, false);   // true
bool("yes", false);  // false (wartość zastępcza)

str

Przycięty, niepusty string skrócony do max znaków, w przeciwnym razie wartość zastępcza.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
str(value: unknown, fallback: string, max?: number): string

Parametry

Prop

Type

Zwracana wartość

string.

Przykład

import { str } from "@aicore-fivem/lib/shared";

str("  City Hall ", "Hall", 48); // "City Hall"
str("", "Hall", 48);             // "Hall"

record

Wartość jako zwykły obiekt albo pusty obiekt {}. Używaj go przed odczytem pól wartości, której może brakować.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
record(value: unknown): Record<string, unknown>

Parametry

Prop

Type

Zwracana wartość

Sama value, gdy jest zwykłym obiektem, w przeciwnym razie nowy {} (także dla tablic i null).

Przykład

import { num, record } from "@aicore-fivem/lib/shared";

function readCoords(raw: unknown) {
  const c = record(raw); // {}, gdy brakuje pola
  return { x: num(c.x, 0), y: num(c.y, 0), z: num(c.z, 0) };
}

vec4

Pozycja z kierunkiem; każde brakujące albo złe pole pochodzi z wartości zastępczej.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
vec4(value: unknown, fallback: Vec4): Vec4

Parametry

Prop

Type

Zwracana wartość

Nowy Vec4.

Przykład

import { vec4 } from "@aicore-fivem/lib/shared";

vec4({ x: 10, y: 20, z: 30 }, { x: 0, y: 0, z: 0, heading: 90 }); // { x: 10, y: 20, z: 30, heading: 90 }

Funkcje schematu

spec

Konstruktory pól liczbowych w schema.ts twojego panelu, żebyś nie pisał ręcznie tego samego obiektu DataSpec.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
spec.int(min: number, max: number, optional?: boolean): DataSpec
spec.num(min: number, max: number, optional?: boolean): DataSpec

Parametry

Prop

Type

Zwracana wartość

DataSpec: { type: "number", min, max }, plus integer: true dla spec.int i optional: true na żądanie.

Przykład

resource/server/schema.ts
import { spec } from "@aicore-fivem/lib/shared";
import type { PanelSchema } from "@aicore-fivem/shared";

export const schema: PanelSchema = {
  title: "ADMIN_TITLE",
  icon: "store",
  files: {
    settings: {
      kind: "settings",
      sync: "admin",
      sections: {
        prices: { type: "object", fields: { water: spec.int(0, 1_000_000), tax: spec.num(0, 0.5) } },
      },
    },
  },
  tabs: [], // układ panelu (karty i pola), zobacz Panel administratora
};

withoutSchemaKey

Usuwa klucz "$schema" z zawartości pliku danych. Klucz jest tam tylko po to, żeby edytory kodu mogły sprawdzić plik; twój czytnik nie powinien go widzieć.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
withoutSchemaKey(value: unknown): unknown

Parametry

Prop

Type

Zwracana wartość

Kopia bez $schema, gdy wartość jest obiektem, który go ma; w przeciwnym razie value bez zmian.

Przykład

import { withoutSchemaKey } from "@aicore-fivem/lib/shared";

withoutSchemaKey({ $schema: "./schemas/shops.schema.json", legion: { label: "Legion" } });
// { legion: { label: "Legion" } }

Pliki rekordów

Plik rekordów trzyma wiele wpisów według klucza ({ "legion": {...}, "pillbox": {...} }): sklepy, garaże, ratusze. Każdy wpis jest czytany przez twoją własną funkcję czytnika (RecordReader<T> = (key: string, raw: Record<string, unknown>) => T | null), zbudowaną z czytników wartości wyżej.

readRecords

Czyta cały plik rekordów raz do Map, jeden wpis na klucz, przez twój czytnik. Wpisy, które nie są obiektami albo dla których twój czytnik zwraca null, są pomijane.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
readRecords<T>(raw: unknown, readOne: RecordReader<T>): Map<string, T>

Parametry

Prop

Type

Zwracana wartość

Map<string, T>: sparsowane wpisy według klucza.

Przykład

import { readRecords, str, num, record } from "@aicore-fivem/lib/shared";

type Shop = { label: string; x: number; y: number; z: number };

const readShop = (key: string, v: Record<string, unknown>): Shop => {
  const c = record(v.coords);
  return { label: str(v.label, key, 48), x: num(c.x, 0), y: num(c.y, 0), z: num(c.z, 0) };
};

const shops = readRecords({ legion: { label: "Legion", coords: { x: 25.7, y: -1347.3, z: 29.5 } } }, readShop);
shops.get("legion"); // { label: "Legion", x: 25.7, y: -1347.3, z: 29.5 }

Dla pliku panelu wybieraj raczej panel.records(file, readOne) (serwerowy AdminPanel) albo world.records(file, readOne) (kliencki AdminWorld): zwracają mapę, która pozostaje aktualna podczas edycji przez właściciela i parsuje tylko zmieniony wpis.

RecordObjects

Utrzymuje obiekty świata z pliku rekordów (punkty, blipy, pedy, strefy) zgodne z panelem, po jednym wpisie: edytowany wpis przebudowuje tylko własne obiekty. Jest eksportowany z @aicore-fivem/lib/shared i nie ma odpowiednika w Lua. Jego pełny opis (konstruktor, funkcja build, rebuild, rebuildAll, przykład) jest na stronie Punkty interakcji: RecordObjects.

Na tej stronie