AI Core
Referência da APILib: compartilhada e fivem

Dados do painel

num, int, bool, str, record, vec4, spec, readRecords e withoutSchemaKey: ler os arquivos data/*.json que o painel de administração edita.

As configurações do seu script ficam em arquivos data/*.json que o dono do servidor edita no painel de administração do ai-core (veja Painel de administração). O painel verifica os valores contra o seu schema.ts, mas um arquivo ainda pode estar antigo, editado à mão ou sem um campo. Os leitores desta página nunca recusam: um valor ausente ou errado dá o valor de reserva que você passa, então o script sempre inicia.

Para valores que um cliente envia, use os leitores rígidos de Ações e entrada do cliente: esses recusam um valor inválido.

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

Lua: nenhum destes tem equivalente em Lua (o painel de administração e os arquivos de dados dele são só TypeScript).

Leitores de valores

num

Um número finito limitado a [min, max], senão o valor de reserva.

Lado: Cliente, servidor e NUI · Espera: não

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

Parâmetros

Prop

Type

Retorno

number: o valor limitado à faixa, ou fallback (sem limitar).

Exemplo

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

num(25, 2.5, 1, 20);      // 20 (limitado)
num("big", 2.5, 1, 20);   // 2.5 (valor de reserva)

int

Como num, depois arredondado para um número inteiro.

Lado: Cliente, servidor e NUI · Espera: não

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

Parâmetros

Prop

Type

Retorno

number: um número inteiro (o valor de reserva também é arredondado).

Exemplo

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

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

bool

Um booleano, senão o valor de reserva.

Lado: Cliente, servidor e NUI · Espera: não

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

Parâmetros

Prop

Type

Retorno

boolean.

Exemplo

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

bool(true, false);   // true
bool("yes", false);  // false (valor de reserva)

str

Uma string sem espaços nas pontas, não vazia, cortada em max caracteres, senão o valor de reserva.

Lado: Cliente, servidor e NUI · Espera: não

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

Parâmetros

Prop

Type

Retorno

string.

Exemplo

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

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

record

O valor como objeto simples, ou um objeto vazio {}. Use antes de ler campos de um valor que pode estar ausente.

Lado: Cliente, servidor e NUI · Espera: não

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

Parâmetros

Prop

Type

Retorno

O próprio value quando é um objeto simples, senão um novo {} (também para arrays e null).

Exemplo

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

function readCoords(raw: unknown) {
  const c = record(raw); // {} quando o campo está ausente
  return { x: num(c.x, 0), y: num(c.y, 0), z: num(c.z, 0) };
}

vec4

Uma posição com heading; cada campo ausente ou errado vem do valor de reserva.

Lado: Cliente, servidor e NUI · Espera: não

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

Parâmetros

Prop

Type

Retorno

Um novo Vec4.

Exemplo

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 }

Helpers de schema

spec

Construtores para campos numéricos no schema.ts do seu painel, para que você não escreva o mesmo objeto DataSpec à mão.

Lado: Cliente, servidor e NUI · Espera: não

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

Parâmetros

Prop

Type

Retorno

DataSpec: { type: "number", min, max }, mais integer: true para spec.int e optional: true quando pedido.

Exemplo

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: [], // o layout do painel (cards e campos), veja Painel de administração
};

withoutSchemaKey

Remove a chave "$schema" do conteúdo de um arquivo de dados. A chave só existe para que os editores de código possam verificar o arquivo; o seu leitor não deveria vê-la.

Lado: Cliente, servidor e NUI · Espera: não

Signature
withoutSchemaKey(value: unknown): unknown

Parâmetros

Prop

Type

Retorno

Uma cópia sem $schema quando o valor é um objeto que a tem; caso contrário value sem mudanças.

Exemplo

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

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

Arquivos de records

Um arquivo records guarda muitas entradas por chave ({ "legion": {...}, "pillbox": {...} }): lojas, garagens, prefeituras. Cada entrada é lida pela sua própria função leitora (RecordReader<T> = (key: string, raw: Record<string, unknown>) => T | null), construída com os leitores de valores acima.

readRecords

Lê um arquivo de records inteiro uma vez para um Map, uma entrada por chave, pelo seu leitor. Entradas que não são objetos, ou para as quais o seu leitor retorna null, ficam de fora.

Lado: Cliente, servidor e NUI · Espera: não

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

Parâmetros

Prop

Type

Retorno

Map<string, T>: as entradas interpretadas por chave.

Exemplo

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 }

Para um arquivo do painel, prefira panel.records(file, readOne) (AdminPanel do servidor) ou world.records(file, readOne) (AdminWorld do cliente): eles retornam um mapa que fica atualizado enquanto o dono edita, interpretando só a entrada alterada.

RecordObjects

Mantém os objetos do mundo de um arquivo de records (pontos, blips, peds, zonas) em sincronia com o painel, uma entrada por vez: uma entrada editada reconstrói só os próprios objetos. É exportado de @aicore-fivem/lib/shared e não tem equivalente em Lua. A referência completa (construtor, função build, rebuild, rebuildAll, exemplo) está em Pontos de interação: RecordObjects.

Nesta página