События и состояние
События, которые отправляют ai-core и скрипты ai-*, с данными, state bag, которые они пишут, и события ESX / QB, которые отправляет мост.
Имена событий - константы в @aicore-fivem/shared (CORE, KEY_HINTS, MENU_EVENTS, LIB_UI, VEHICLES_EVENTS, SEATBELT_EVENT), поэтому код на TypeScript никогда не пишет строку руками.
import { CORE, type CharacterInfo } from "@aicore-fivem/shared";
on(CORE.playerLoadedEvent, (src: number, character: CharacterInfo) => {
console.log(`${character.firstname} joined as ${src}`);
});AddEventHandler('ai-core:playerLoaded', function(src, character)
print(('%s joined as %d'):format(character.firstname, src))
end)Для всей жизни персонажа (загрузка, выгрузка, персонажи, загруженные до перезапуска) используйте onCharacter из библиотеки (aiLib.onCharacter в Lua), а не эти два события вручную.
Локальные события сервера
Отправляются через TriggerEvent на сервере; другие ресурсы и мост повторяют по ним состояние игроков.
| Событие | Константа | Данные |
|---|---|---|
ai-core:playerLoaded | CORE.playerLoadedEvent | (src, character: CharacterInfo) после загрузки и появления персонажа. |
ai-core:playerUnloaded | CORE.playerUnloadedEvent | (src, charId, reason: "dropped" | "switch") перед удалением состояния персонажа. |
ai-core:moneyChanged | CORE.moneyChangedEvent | (src, account: string, balance: number, delta: number, reason: string) |
ai-core:jobsChanged | CORE.jobsChangedEvent | (src, jobs: JobMembership[]) |
ai-core:dutyChanged | CORE.dutyChangedEvent | (src, job: string | null) |
ai-core:gangsChanged | CORE.gangsChangedEvent | (src, gangs: GangMembership[]) |
ai-core:activeGangChanged | CORE.activeGangChangedEvent | (src, gang: string | null) |
ai-core:metaChanged | CORE.metaChangedEvent | (src, key, value | null) изменилось значение метаданных. |
ai-core:definitionsChanged | CORE.definitionsChangedEvent | (file: "jobs" | "gangs", name) работа или банда изменена в панели. |
ai-core:characterScreen | CORE.characterScreenEvent | (src, charIds: number[]) загружается экран персонажей; скрипт одежды может ответить портретами. |
ai-core:inventoryChanged | CORE.inventoryChangedEvent | (resource: string | null) сменился инвентарь за слоем инвентаря. |
ai-core:itemUsed | CORE.itemUsedEvent | (src, name: string, status: Record<string, number> | null) игрок использовал предмет; status = потребности, которые он даёт (голод, жажда, стресс). |
ai-core:playerDied | CORE.playerDiedEvent | (src, killer: number | null, weaponHash: number) погиб игрок с загруженным персонажем. |
ai-inventory:usedItem | (source, name, slot, metadata, status) после каждого использования в ai-inventory. Другие скрипты слушают ai-core:itemUsed. | |
ai-vehicles:owners | VEHICLES_EVENTS.owners | (puts: [plate, ownerType, ownerId][], removes: plate[]) сменились владельцы транспорта в памяти (одна пачка за тик). |
chatMessage | (source, author, text) перед тем, как ai-chat доставит сообщение; CancelEvent() его отбрасывает. |
Локальные события клиента
| Событие | Константа | Данные |
|---|---|---|
ai-core:client:playerLoaded | CORE.clientPlayerLoadedEvent | (data: AiPlayerData) локальный персонаж загружен. |
ai-core:client:playerUnloaded | CORE.clientPlayerUnloadedEvent | () |
ai-core:client:dead | CORE.clientDeadEvent | (dead: boolean) локальный игрок упал или встал, в любом скрипте смерти. |
ai-core:client:cache | CORE.clientCacheEvent | (key, value) изменилось кэшированное значение: ped, vehicle, seat, weapon. |
ai-core:client:hudVisible | CORE.clientHudVisibleEvent | (visible: boolean) HUD показываются или скрываются. |
ai-core:client:worldSync | CORE.clientWorldSyncEvent | (paused: boolean) синхронизация погоды и времени приостановлена или снова работает. |
ai-core:client:definitions | CORE.clientDefinitionsEvent | (file: "jobs" | "gangs", name, definition | null) |
ai-core:client:characterPortrait | CORE.clientCharacterPortraitEvent | (charId: number, url: string) портрет для экрана персонажей. |
ai-core:client:keyHints | KEY_HINTS.changedEvent | (hints: KeyHintView[]) подсказки клавиш, которые HUD показывают сейчас. |
ai-smallresources:seatbelt | SEATBELT_EVENT | (worn: boolean | null) изменился ремень безопасности. |
Ответы интерфейса ai-lib
Нужны, только если вы сами вызываете экспорты ai-lib (menu, input, skillCheck и подсказки библиотеки слушают за вас).
| Событие | Константа | Данные |
|---|---|---|
ai-lib:client:menuResult | MENU_EVENTS.menuResult | (resource, requestId, itemId | null) выбор или закрытие (меню, выбор предметов, мини-игры). |
ai-lib:client:menuHover | MENU_EVENTS.menuHover | (resource, requestId, itemId) пункт под указателем. |
ai-lib:client:menuToggle | MENU_EVENTS.menuToggle | (resource, requestId, itemId, checked) переключена строка-переключатель. |
ai-lib:client:inputResult | MENU_EVENTS.inputResult | (resource, requestId, values | null) диалог ввода подтверждён или закрыт. |
ai-lib:client:promptPressed | LIB_UI.promptPressedEvent | (resource, id) нажата клавиша взаимодействия на подсказке этого ресурса. |
ai-lib:client:cancelProgress | LIB_UI.cancelProgressEvent | () нажата клавиша отмены во время полосы прогресса. |
State bag
Читайте их классами состояния библиотеки (GlobalKey, PlayerState, EntityState, GlobalGroup) или через GlobalState[...], Player(src).state[...], Entity(e).state[...] в Lua. Пишет только ресурс-владелец.
| Ключ | Где | Значение |
|---|---|---|
ai:duty:<job> | GlobalState | Сколько игроков на смене в работе (dutyCountKey(job)). |
ai:inventory | GlobalState | Имя ресурса активного инвентаря. |
ai:vehicleKeys | GlobalState | Имя ресурса активной системы ключей. |
ai:appearance | GlobalState | Имя ресурса активного скрипта одежды. |
ai:medical | GlobalState | Имя ресурса активного скрипта смерти. |
ai:interaction | GlobalState | "prompt" или "target": как Points библиотеки дают взаимодействовать. |
ai:pvp | GlobalState | Могут ли игроки наносить друг другу урон. |
ai:clock, ai:weather | GlobalState | Часы и погода ai-weathersync. |
door:<id> | GlobalState | ai-doorlock: заперта ли дверь. |
dead | Игрок | true, пока игрок лежит (ai-death). |
cuffed | Игрок | true в наручниках (ai-police). |
proximity | Игрок | Дальность голоса { index, distance, mode } (ai-voice). |
radioChannel, callChannel, callSpeaker, muted, submix | Игрок | Состояние рации, звонков и мьюта ai-voice. |
ai:owned, ai:vid | Транспорт | Личный транспорт и его id в ai-vehicles. |
ai:props, ai:setup | Транспорт | Внешний вид, который ai-core применяет на клиенте-владельце. |
fuel | Транспорт | 0-100, ведёт скрипт топлива. |
siren:lx, siren:manu, siren:lightbar | Транспорт | Огни, ручной тон и световая балка ai-sirens. |
События фреймворков (мост)
Мост ai-core отправляет события ESX и QB с теми же аргументами, поэтому скрипты для этих фреймворков их слышат.
| Сторона | QB / Qbox | ESX |
|---|---|---|
| Сервер | QBCore:Server:PlayerLoaded, QBCore:Server:OnPlayerUnload, QBCore:Server:OnMoneyChange, QBCore:Server:OnJobUpdate, QBCore:Server:OnGangUpdate | esx:playerLoaded, esx:playerDropped, esx:playerLogout, esx:setJob |
| Клиент | QBCore:Client:OnPlayerLoaded, QBCore:Client:OnPlayerUnload, QBCore:Player:SetPlayerData, QBCore:Client:OnJobUpdate, QBCore:Client:SetDuty, QBCore:Client:OnGangUpdate, QBCore:Client:OnMoneyChange | esx:playerLoaded, esx:onPlayerLogout, esx:setAccountMoney, esx:setJob |
События других скриптов, на которые отвечает AI Core:
| Событие | Кто отвечает |
|---|---|
QBCore:GetObject, esx:getSharedObject | Мост: объект core. |
QBCore:Server:TriggerCallback, esx:triggerServerCallback | Мост: callback фреймворка. |
QBCore:Notify, esx:showNotification, esx:showAdvancedNotification, esx:showHelpNotification | Мост: уведомление или подсказка AI Core. |
police:server:policeAlert | ai-core: клиент (text), сервер (text, camId, playerSource), передаётся активной системе оповещений. |
hospital:client:Revive | ai-death: поднимает игрока. |
qb-weathersync:client:DisableSync / EnableSync, cd_easytime:PauseSync, vSync:toggle | ai-core: считаются причинами паузы синхронизации мира. |