AI Core
Referencia de la APILib: compartido y fivem

Datos del panel

num, int, bool, str, record, vec4, spec, readRecords y withoutSchemaKey: leer los archivos data/*.json que edita el panel de administración.

Los ajustes de tu script viven en archivos data/*.json que el dueño del servidor edita en el panel de administración de ai-core (consulta Panel de administración). El panel comprueba los valores contra tu schema.ts, pero un archivo aún puede ser antiguo, estar editado a mano o no tener un campo. Los lectores de esta página nunca rechazan: un valor ausente o incorrecto da el valor de reserva que pasas, así que el script siempre arranca.

Para los valores que envía un cliente, usa en su lugar los lectores estrictos de Acciones y entrada del cliente: esos rechazan un valor incorrecto.

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

Lua: ninguna de estas tiene equivalente en Lua (el panel de administración y sus archivos de datos son solo para TypeScript).

Lectores de valores

num

Un número finito limitado a [min, max], o si no el valor de reserva.

Lado: Cliente, servidor y NUI · Espera: no

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

Parámetros

Prop

Type

Devuelve

number: el valor limitado al rango, o fallback (sin limitar).

Ejemplo

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, y después redondeado a un número entero.

Lado: Cliente, servidor y NUI · Espera: no

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

Parámetros

Prop

Type

Devuelve

number: un número entero (el valor de reserva también se redondea).

Ejemplo

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

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

bool

Un booleano, o si no el valor de reserva.

Lado: Cliente, servidor y NUI · Espera: no

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

Parámetros

Prop

Type

Devuelve

boolean.

Ejemplo

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

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

str

Un string recortado y no vacío, cortado a max caracteres, o si no el valor de reserva.

Lado: Cliente, servidor y NUI · Espera: no

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

Parámetros

Prop

Type

Devuelve

string.

Ejemplo

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

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

record

El valor como objeto simple, o un objeto vacío {}. Úsalo antes de leer campos de un valor que puede faltar.

Lado: Cliente, servidor y NUI · Espera: no

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

Parámetros

Prop

Type

Devuelve

El propio value cuando es un objeto simple; en otro caso, un {} nuevo (también para arrays y null).

Ejemplo

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

function readCoords(raw: unknown) {
  const c = record(raw); // {} cuando falta el campo
  return { x: num(c.x, 0), y: num(c.y, 0), z: num(c.z, 0) };
}

vec4

Una posición con heading; cada campo ausente o incorrecto viene del valor de reserva.

Lado: Cliente, servidor y NUI · Espera: no

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

Parámetros

Prop

Type

Devuelve

Un Vec4 nuevo.

Ejemplo

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 }

Utilidades de esquema

spec

Constructores para los campos numéricos de tu schema.ts del panel, para que no escribas a mano el mismo objeto DataSpec.

Lado: Cliente, servidor y NUI · Espera: no

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

Parámetros

Prop

Type

Devuelve

DataSpec: { type: "number", min, max }, más integer: true para spec.int y optional: true cuando se pide.

Ejemplo

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: [], // la disposición del panel (tarjetas y campos), consulta Admin panel
};

withoutSchemaKey

Quita la clave "$schema" del contenido de un archivo de datos. La clave solo está ahí para que los editores de código puedan comprobar el archivo; tu lector no debería verla.

Lado: Cliente, servidor y NUI · Espera: no

Firma
withoutSchemaKey(value: unknown): unknown

Parámetros

Prop

Type

Devuelve

Una copia sin $schema cuando el valor es un objeto que la tiene; en otro caso, value sin cambios.

Ejemplo

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

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

Archivos de registros

Un archivo de registros guarda muchas entradas por clave ({ "legion": {...}, "pillbox": {...} }): tiendas, garajes, ayuntamientos. Cada entrada la lee tu propia función lectora (RecordReader<T> = (key: string, raw: Record<string, unknown>) => T | null), construida con los lectores de valores de arriba.

readRecords

Lee un archivo de registros entero una sola vez en un Map, una entrada por clave, mediante tu lector. Las entradas que no son objetos, o para las que tu lector devuelve null, se dejan fuera.

Lado: Cliente, servidor y NUI · Espera: no

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

Parámetros

Prop

Type

Devuelve

Map<string, T>: las entradas procesadas por clave.

Ejemplo

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 un archivo del panel, es preferible panel.records(file, readOne) (AdminPanel del servidor) o world.records(file, readOne) (AdminWorld del cliente): devuelven un mapa que se mantiene al día mientras el dueño edita, procesando solo la entrada cambiada.

RecordObjects

Mantiene los objetos del mundo de un archivo de registros (puntos, blips, peds, zonas) al día con el panel, entrada a entrada: una entrada editada solo reconstruye sus propios objetos. Se exporta desde @aicore-fivem/lib/shared y no tiene equivalente en Lua. Su referencia completa (constructor, función build, rebuild, rebuildAll, ejemplo) está en Puntos de interacción: RecordObjects.

En esta página