AI Core
Справочник APILib: общее и fivem

Данные панели

num, int, bool, str, record, vec4, spec, readRecords и withoutSchemaKey: чтение файлов data/*.json, которые редактирует админ-панель.

Настройки вашего скрипта хранятся в файлах data/*.json, которые владелец сервера редактирует в админ-панели ai-core (см. Админ-панель). Панель проверяет значения по вашему schema.ts, но файл всё равно может быть старым, отредактированным вручную или без какого-то поля. Функции чтения на этой странице никогда не отказывают: отсутствующее или неверное значение даёт переданное вами запасное значение, поэтому скрипт всегда запускается.

Для значений, которые отправляет клиент, используйте строгие функции чтения со страницы Действия и ввод от клиента: они отклоняют неверное значение.

TypeScript
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); // 10

bool

Булево значение, иначе запасное значение.

Сторона: Клиент, сервер и 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, если запрошено.

Пример

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: [], // раскладка панели (карточки и поля), см. Админ-панель
};

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.

На этой странице