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.
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
num(value: unknown, fallback: number, min?: number, max?: number): numberPará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
int(value: unknown, fallback: number, min?: number, max?: number): numberPará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); // 10bool
Un booleano, o si no el valor de reserva.
Lado: Cliente, servidor y NUI · Espera: no
bool(value: unknown, fallback: boolean): booleanPará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
str(value: unknown, fallback: string, max?: number): stringPará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
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
vec4(value: unknown, fallback: Vec4): Vec4Pará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
spec.int(min: number, max: number, optional?: boolean): DataSpec
spec.num(min: number, max: number, optional?: boolean): DataSpecParámetros
Prop
Type
Devuelve
DataSpec: { type: "number", min, max }, más integer: true para spec.int y optional: true cuando se pide.
Ejemplo
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
withoutSchemaKey(value: unknown): unknownPará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
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.
Vehículos
plateOf, normalizePlate, vehicleTypeOfClass, toVehicleProps y toVehicleSetup: matrículas como claves, tipos de spawn y aspecto de vehículos a partir de datos no fiables.
Acceso, blips y NPC de lugares
readAccess, isPublic, decideAccess, ACCESS_FIELDS, accessFields, readBlipStyle, BLIP_STYLE_FIELDS, PLACE_PED_SPEC, placePedFields y readPlacePed: las partes del panel que comparten todos los lugares.