State bags
Серверные версии EntityState, PlayerState, GlobalKey и GlobalGroup: единственный способ, которым скрипт ai-* пишет реплицируемое состояние.
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): voidProp
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): voidProp
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): voidProp
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): voidProp
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"] = trueState bags предназначены для небольших значений, которые читают многие игроки. Списки, данные одного игрока или всё, что часто меняется, отправляются как снимок + изменения через события (см. AreaStream и KeyWatchers на странице Игроки). Общие имена ключей находятся в @aicore-fivem/shared (VEHICLE_BAGS, PLAYER_BAGS) или в common/ вашего ресурса.
Телефон и внешность
Телефон игрока через ai-core (номера, письма, сообщения, уведомления) и сохранённая внешность персонажей через тот скрипт одежды, который запущен.
Логи
aiLog и aiLogChannels: отправка логов через ai-core в консоль, Discord, Fivemanage или FiveM Stats, что бы владелец ни включил в панели.