AI Core
Справочник APIСобытия и состояние

State bag

Общие значения состояния, которые публикуют ai-core и скрипты ai-* - bag игроков, bag транспорта и ключи GlobalState - что хранит каждый, кто его пишет и как его читать и следить за ним.

State bag - это значение, которое FiveM синхронизирует для всех: в GlobalState (одно значение на весь сервер), у игрока или у сущности (транспорта). Каждый ресурс на любой стороне может его читать, и оно следует за изменениями без каких-либо ваших событий. ai-core и скрипты ai-* используют их для состояния, которое нужно всем, и никогда для приватных данных.

Только чтение. У каждого ключа ниже есть один ресурс-владелец, и только он его пишет, всегда с сервера. Никогда не пишите эти ключи сами, ни с сервера, ни с клиента: владелец перезапишет вас, а другие скрипты увидят неверное состояние. Чтобы изменить состояние, вызовите экспорт владельца (например, реанимацию ai-death, экспорт дежурства ai-core).

Как их читать

В библиотеке есть класс на каждый вид. Каждый хранит локальную копию, поэтому get ничего не стоит, а onChange вызывает ваш обработчик после изменения.

ВидTypeScript (библиотека)Lua
Один ключ GlobalStatenew GlobalKey(key, parse): .get(), .onChange((_, value, old) => ...)GlobalState[key], AddStateBagChangeHandler(key, 'global', fn)
Много ключей GlobalState с одним префиксомnew GlobalGroup(prefix, parse): .get(id), .ids(), .onChange((id, value, old) => ...)GlobalState[prefix .. id]
Bag игрокаnew PlayerState(key, parse): .get(serverId), .onChange((serverId, value, old) => ...)Player(serverId).state[key], LocalPlayer.state[key] на клиенте
Bag сущностиnew EntityState(key, parse): .get(entity), .getByNetId(netId), .onChange((netId, value, old) => ...)Entity(entity).state[key]

parse проверяет сырое значение: stateNumber, stateBoolean, stateString из библиотеки или ваша собственная функция, которая возвращает undefined для плохого значения. Все они берутся из @aicore-fivem/lib/client или @aicore-fivem/lib/server.

resource/client/index.ts
import { cache, GlobalKey, PlayerState, stateBoolean, stateNumber } from "@aicore-fivem/lib/client";
import { dutyCountKey, PLAYER_BAGS } from "@aicore-fivem/shared";

const policeOnDuty = new GlobalKey(dutyCountKey("police"), stateNumber);
const cuffed = new PlayerState(PLAYER_BAGS.cuffed, stateBoolean);

console.log(`police on duty: ${policeOnDuty.get() ?? 0}`);
policeOnDuty.onChange((_, count) => console.log(`police on duty now: ${count ?? 0}`));

cuffed.onChange((serverId, value) => {
  if (serverId === cache.serverId) console.log(value ? "you are cuffed" : "you are free");
});

Bag игроков (PLAYER_BAGS)

Ключи у игрока, которые читают несколько ресурсов. Константа: PLAYER_BAGS в @aicore-fivem/shared.

КлючКонстантаВладелецЗначение
deadPLAYER_BAGS.deadai-deathtrue, пока игрок лежит. Иначе отсутствует или false. С другим скриптом смерти используйте медицинский слой (экспорт IsDead, medical из библиотеки): другие скрипты смерти используют свои ключи.
cuffedPLAYER_BAGS.cuffedai-policetrue, пока игрок в наручниках.
proximityPLAYER_BAGS.proximityai-voiceДальность голоса в формате pma-voice: { index, distance, mode }.

Bag транспорта (VEHICLE_BAGS)

Ключи у сущностей транспорта. Константа: VEHICLE_BAGS в @aicore-fivem/shared.

КлючКонстантаВладелецЗначение
ai:ownedVEHICLE_BAGS.ownedai-vehiclestrue у заспавненного личного транспорта.
ai:vidVEHICLE_BAGS.idai-vehiclesId транспорта в ai-vehicles (число).
ai:propsVEHICLE_BAGS.propsai-vehiclesВнешний вид и тюнинг транспорта (VehicleProps). ai-core применяет его на клиенте, который владеет сущностью.
ai:setupVEHICLE_BAGS.setupai-vehiclesНастройка при спавне (VehicleSetup, например цвет, выбранный в магазине). ai-core применяет её один раз на клиенте-владельце.
fuelVEHICLE_BAGS.fuelскрипт топлива (ai-fuel; ai-core ведёт его для клиентских скриптов топлива)Уровень топлива, 0-100.

Чтобы прочитать топливо, используйте слой fuel из библиотеки: он работает с любым скриптом топлива, в том числе с теми, которые сами не пишут bag fuel.

Ключи GlobalState в ai-core

КлючКонстантаЗначение
ai:duty:<job>dutyCountKey(job) (префикс DUTY_COUNT_PREFIX)Сколько игроков на дежурстве по этой работе (число). Только количество, никогда не кто именно.
ai:interactionCORE.interactionStateKey"prompt" или "target": как Points из библиотеки дают игрокам взаимодействовать (настройка панели ai-core).
ai:pvpCORE.pvpStateKeytrue, когда игроки могут ранить друг друга (настройка панели pvp, команда /togglepvp).
ai:inventoryINVENTORY_STATE_KEYИмя ресурса инвентаря за слоем инвентаря ai-core. Не задано, пока ни один не работает.
ai:vehicleKeysVEHICLE_KEYS_STATE_KEYИмя ресурса активного скрипта ключей от транспорта. Не задано, пока ни один не работает.
ai:appearanceAPPEARANCE_STATE_KEYИмя ресурса активного скрипта одежды. Не задано, пока ни один не работает.
ai:medicalCORE.medicalStateKeyИмя ресурса активного скрипта смерти.
ai:mdtCORE.mdtStateKeyИмя ресурса активного MDT.
ai:notifyCORE.notifyStateKeyИмя ресурса интерфейса уведомлений, куда идут карточки ai-lib. Не задано: ai-lib рисует собственные карточки.
ai:fuelFUEL_STATE_KEYИмя ресурса активного скрипта топлива. Не задано, пока ни один не работает.
ai:garagesGARAGES_STATE_KEYИмя ресурса активного скрипта гаражей. Не задано, пока ни один не работает.

Ключи с именами ресурсов сообщают клиентским частям ai-core, с каким скриптом говорить. Читайте их, когда нужно знать, какой скрипт работает (для строки лога, подсказки игроку), а не чтобы вызвать этот скрипт напрямую: вместо этого вызывайте слой ai-core.

resource/server/index.ts
import { GlobalKey, stateBoolean } from "@aicore-fivem/lib/server";
import { CORE } from "@aicore-fivem/shared";

const pvp = new GlobalKey(CORE.pvpStateKey, stateBoolean);

pvp.onChange((_, on) => console.log(on ? "PvP is on" : "PvP is off"));

Ключи других скриптов ai-*

Общее состояние, которое публикуют некоторые скрипты ai-*, для скриптов, работающих с ними. Подробности на странице разработчика каждого скрипта.

КлючГдеВладелецЗначение
door:<id>GlobalStateai-doorlocktrue, пока дверь заперта.
ai:clockGlobalStateai-weathersync{ base, at, scale, frozen }: игровые минуты дня на серверное время at (мс), продвигаются на scale игровых минут за реальную минуту. Клиенты сами ведут часы по этому значению.
ai:weatherGlobalStateai-weathersync{ type, blackout }: текущая погода.
ai:rweather:<id>GlobalStateai-weathersyncТекущая погода погодного региона.
prop:<id>GlobalStateai-propertiestrue, когда у недвижимости есть владелец.
rob:<id>GlobalStateai-robberiestrue, пока цель ограбления опустошена и ждёт окончания задержки.
siren:lxТранспортai-sirensОсновной тон сирены: 0 выкл., 1-3 тон.
siren:manuТранспортai-sirensВоздушный гудок / ручная сирена: 0 выкл., 1 гудок, 2 ручная, 3 обе.
siren:lightbarТранспортai-sirensМодель световой балки на транспорте; отсутствует, если её нет.

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