AI Core
Справочник APILib: сервер

State bags

Серверные версии EntityState, PlayerState, GlobalKey и GlobalGroup: единственный способ, которым скрипт ai-* пишет реплицируемое состояние.

TypeScript
import { EntityState, PlayerState, GlobalKey, GlobalGroup, stateNumber, stateBoolean } from "@aicore-fivem/lib/server";

State bag это значение, которое FiveM копирует с сервера на клиенты: на сущности (топливо транспорта), на игроке (dead) или глобально (состояние двери, которое видят все). ai-core работает в строгом режиме state bags, поэтому пишет только сервер: клиент, которому нужно изменение, просит через колбэк, а сервер задаёт значение.

Серверная точка входа экспортирует те же четыре класса, что и клиентская, плюс метод set. Конструктор, get, onChange, EntityState.getByNetId и GlobalGroup.ids описаны один раз на странице Lib: общее и fivem. Создавайте каждый экземпляр один раз на уровне модуля, по одному на ключ.

Значение, которое вы задали через set, сразу читается через get на сервере, а обработчики onChange выполняются один раз. Задание undefined удаляет значение.

Lua-аналогов нет: Lua сам читает Entity(entity).state.key и пишет через Entity(entity).state:set(key, value, true).

EntityState.set

Записывает один ключ в state bag сущности. Он реплицируется игрокам, у которых сущность в зоне видимости.

Сторона: Сервер · Ждёт: нет

Сигнатура
new EntityState<T>(key: string, parse: StateParse<T>)
set(entity: number, value: T | undefined): void

Prop

Type

Возвращает void.

import { EntityState, stateNumber } from "@aicore-fivem/lib/server";

const odometer = new EntityState("my:km", stateNumber);

odometer.set(vehicle, (odometer.get(vehicle) ?? 0) + 1);

PlayerState.set

Записывает один ключ в state bag игрока. Он реплицируется этому игроку и игрокам рядом с ним.

Сторона: Сервер · Ждёт: нет

Сигнатура
new PlayerState<T>(key: string, parse: StateParse<T>)
set(source: number, value: T | undefined): void

Prop

Type

Возвращает void.

import { PlayerState, stateBoolean } from "@aicore-fivem/lib/server";

const cuffed = new PlayerState("my:cuffed", stateBoolean);

cuffed.set(target, true);
// позже
cuffed.set(target, undefined);

GlobalKey.set

Записывает один ключ GlobalState. Он реплицируется каждому игроку: используйте только для состояния, которое нужно каждому игроку.

Сторона: Сервер · Ждёт: нет

Сигнатура
new GlobalKey<T>(key: string, parse: StateParse<T>)
set(value: T | undefined): void

Prop

Type

Возвращает void.

import { GlobalKey, stateBoolean } from "@aicore-fivem/lib/server";

const stormActive = new GlobalKey("my:storm", stateBoolean);

stormActive.set(true);

GlobalGroup.set

Записывает один ключ из группы ключей GlobalState с общим префиксом (door:<id>, rob:<id>). Реплицирует <prefix><id> каждому игроку.

Сторона: Сервер · Ждёт: нет

Сигнатура
new GlobalGroup<T>(prefix: string, parse: StateParse<T>)
set(id: string, value: T | undefined): void

Prop

Type

Возвращает void.

import { GlobalGroup, stateBoolean } from "@aicore-fivem/lib/server";

const robbedStores = new GlobalGroup("my-rob:", stateBoolean);

robbedStores.set("store_12", true); // GlobalState["my-rob:store_12"] = true

State bags предназначены для небольших значений, которые читают многие игроки. Списки, данные одного игрока или всё, что часто меняется, отправляются как снимок + изменения через события (см. AreaStream и KeyWatchers на странице Игроки). Общие имена ключей находятся в @aicore-fivem/shared (VEHICLE_BAGS, PLAYER_BAGS) или в common/ вашего ресурса.

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