Данные панели
num, int, bool, str, record, vec4, spec, readRecords и withoutSchemaKey: чтение файлов data/*.json, которые редактирует админ-панель.
Настройки вашего скрипта хранятся в файлах data/*.json, которые владелец сервера редактирует в админ-панели ai-core (см. Админ-панель). Панель проверяет значения по вашему schema.ts, но файл всё равно может быть старым, отредактированным вручную или без какого-то поля. Функции чтения на этой странице никогда не отказывают: отсутствующее или неверное значение даёт переданное вами запасное значение, поэтому скрипт всегда запускается.
Для значений, которые отправляет клиент, используйте строгие функции чтения со страницы Действия и ввод от клиента: они отклоняют неверное значение.
import { num, int, bool, str, record, vec4, spec, readRecords, withoutSchemaKey } from "@aicore-fivem/lib/shared";Lua: ни у одной из них нет Lua-аналога (админ-панель и её файлы данных есть только в TypeScript).
Функции чтения значений
num
Конечное число, ограниченное диапазоном [min, max], иначе запасное значение.
Сторона: Клиент, сервер и NUI · Ждёт: нет
num(value: unknown, fallback: number, min?: number, max?: number): numberПараметры
Prop
Type
Возвращает
number: значение, ограниченное диапазоном, или fallback (без ограничения).
Пример
import { num } from "@aicore-fivem/lib/shared";
num(25, 2.5, 1, 20); // 20 (ограничено)
num("big", 2.5, 1, 20); // 2.5 (запасное значение)int
Как num, затем округляется до целого.
Сторона: Клиент, сервер и NUI · Ждёт: нет
int(value: unknown, fallback: number, min?: number, max?: number): numberПараметры
Prop
Type
Возвращает
number: целое число (запасное значение тоже округляется).
Пример
import { int } from "@aicore-fivem/lib/shared";
int(12.6, 10, 0, 100); // 13
int(null, 10, 0, 100); // 10bool
Булево значение, иначе запасное значение.
Сторона: Клиент, сервер и NUI · Ждёт: нет
bool(value: unknown, fallback: boolean): booleanПараметры
Prop
Type
Возвращает
boolean.
Пример
import { bool } from "@aicore-fivem/lib/shared";
bool(true, false); // true
bool("yes", false); // false (запасное значение)str
Обрезанная по краям непустая строка, урезанная до max символов, иначе запасное значение.
Сторона: Клиент, сервер и NUI · Ждёт: нет
str(value: unknown, fallback: string, max?: number): stringПараметры
Prop
Type
Возвращает
string.
Пример
import { str } from "@aicore-fivem/lib/shared";
str(" City Hall ", "Hall", 48); // "City Hall"
str("", "Hall", 48); // "Hall"record
Значение как простой объект или пустой объект {}. Используйте перед чтением полей значения, которого может не быть.
Сторона: Клиент, сервер и NUI · Ждёт: нет
record(value: unknown): Record<string, unknown>Параметры
Prop
Type
Возвращает
Сам value, если это простой объект, иначе новый {} (в том числе для массивов и null).
Пример
import { num, record } from "@aicore-fivem/lib/shared";
function readCoords(raw: unknown) {
const c = record(raw); // {}, если поля нет
return { x: num(c.x, 0), y: num(c.y, 0), z: num(c.z, 0) };
}vec4
Позиция с направлением; каждое отсутствующее или неверное поле берётся из запасного значения.
Сторона: Клиент, сервер и NUI · Ждёт: нет
vec4(value: unknown, fallback: Vec4): Vec4Параметры
Prop
Type
Возвращает
Новый Vec4.
Пример
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 }Помощники для схемы
spec
Конструкторы числовых полей для schema.ts вашей панели, чтобы не писать один и тот же объект DataSpec вручную.
Сторона: Клиент, сервер и NUI · Ждёт: нет
spec.int(min: number, max: number, optional?: boolean): DataSpec
spec.num(min: number, max: number, optional?: boolean): DataSpecПараметры
Prop
Type
Возвращает
DataSpec: { type: "number", min, max }, плюс integer: true для spec.int и optional: true, если запрошено.
Пример
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: [], // раскладка панели (карточки и поля), см. Админ-панель
};withoutSchemaKey
Удаляет ключ "$schema" из содержимого файла данных. Ключ нужен только для того, чтобы редакторы кода могли проверять файл; ваша функция чтения не должна его видеть.
Сторона: Клиент, сервер и NUI · Ждёт: нет
withoutSchemaKey(value: unknown): unknownПараметры
Prop
Type
Возвращает
Копия без $schema, если значение является объектом с этим ключом; иначе value без изменений.
Пример
import { withoutSchemaKey } from "@aicore-fivem/lib/shared";
withoutSchemaKey({ $schema: "./schemas/shops.schema.json", legion: { label: "Legion" } });
// { legion: { label: "Legion" } }Файлы записей
Файл записей хранит много записей по ключу ({ "legion": {...}, "pillbox": {...} }): магазины, гаражи, мэрии. Каждую запись читает ваша собственная функция чтения (RecordReader<T> = (key: string, raw: Record<string, unknown>) => T | null), построенная из функций чтения значений выше.
readRecords
Читает весь файл записей один раз в Map, одна запись на ключ, через вашу функцию чтения. Записи, которые не являются объектами или для которых ваша функция возвращает null, пропускаются.
Сторона: Клиент, сервер и NUI · Ждёт: нет
readRecords<T>(raw: unknown, readOne: RecordReader<T>): Map<string, T>Параметры
Prop
Type
Возвращает
Map<string, T>: разобранные записи по ключу.
Пример
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 }Для файла панели лучше использовать panel.records(file, readOne) (серверный AdminPanel) или world.records(file, readOne) (клиентский AdminWorld): они возвращают Map, который остаётся актуальным, пока владелец редактирует, и разбирают только изменённую запись.
RecordObjects
Поддерживает объекты мира из файла записей (точки, блипы, педы, зоны) в соответствии с панелью, по одной записи за раз: изменённая запись перестраивает только свои объекты. Он экспортируется из @aicore-fivem/lib/shared и не имеет Lua-аналога. Полный справочник (конструктор, функция build, rebuild, rebuildAll, пример) находится на странице Точки взаимодействия: RecordObjects.
Транспорт
plateOf, normalizePlate, vehicleTypeOfClass, toVehicleProps и toVehicleSetup: номера как ключи, типы спавна и внешний вид транспорта из недоверенных данных.
Доступ, блипы и NPC мест
readAccess, isPublic, decideAccess, ACCESS_FIELDS, accessFields, readBlipStyle, BLIP_STYLE_FIELDS, PLACE_PED_SPEC, placePedFields и readPlacePed: части панели, общие для всех мест.