События моста фреймворков
События ESX, QB / Qbox и vRP, которые отправляет ai-core, чтобы скрипты, написанные под эти фреймворки, продолжали работать, с их точными аргументами, и события фреймворков, на которые отвечает ai-core.
ai-core представляется как es_extended, qb-core, qbx_core и vrp, поэтому скрипты, написанные под эти фреймворки, работают без изменений. Частью этого является отправка собственных событий фреймворка, когда в ai-core что-то меняется: загружается персонаж, перемещаются деньги, меняется работа. На этой странице перечислены все события фреймворков, которые отправляет мост, с аргументами в том виде, в каком их отправляет мост, и события фреймворков, на которые он отвечает.
Новый код не должен их использовать. Пишите под собственные события ai-core (серверные, клиентские) и библиотеку: они несут больше (несколько работ, банды, дежурство) и не зависят от формы фреймворка. Эта страница нужна для запуска и исправления существующих скриптов ESX / QB / vRP.
Представления фреймворков хранят одну работу на игрока: работу, на которой игрок на дежурстве, иначе его первую работу. Сам ai-core разрешает несколько работ. В ESX нет банд; счёт money в ESX - это cash в ai-core.
QBCore и Qbox: сервер
Мост отправляет их на сервере через TriggerEvent. Скрипты Qbox слушают те же имена QBCore; мост не отправляет событий, существующих только в Qbox.
QBCore:Server:PlayerLoaded
Персонаж загружен (из ai-core:playerLoaded).
Сторона: сервер
Prop
Type
on("QBCore:Server:PlayerLoaded", (player: { PlayerData: { source: number; citizenid: string } }) => {
console.log(`${player.PlayerData.citizenid} loaded (src ${player.PlayerData.source})`);
});QBCore:Server:OnPlayerUnload
Персонаж отпущен: игрок ушёл или вернулся на экран персонажей (из ai-core:playerUnloaded).
Сторона: сервер
Prop
Type
on("QBCore:Server:OnPlayerUnload", (source: number) => console.log(`${source} unloaded`));QBCore:Server:OnMoneyChange
Изменился баланс счёта (из ai-core:moneyChanged).
Сторона: сервер
Prop
Type
on("QBCore:Server:OnMoneyChange", (source: number, account: string, amount: number, action: "add" | "remove", reason: string) => {
console.log(`${source} ${action} ${amount} ${account} (${reason})`);
});QBCore:Server:OnJobUpdate
Изменилась работа игрока во фреймворке: работа добавлена или удалена, изменился ранг, заступление на дежурство или уход с него, или правка этой работы в панели (из ai-core:jobsChanged, ai-core:dutyChanged, ai-core:definitionsChanged).
Сторона: сервер
Prop
Type
on("QBCore:Server:OnJobUpdate", (source: number, job: { name: string; onduty: boolean; grade: { level: number } }) => {
console.log(`${source}: ${job.name} grade ${job.grade.level}, on duty ${job.onduty}`);
});QBCore:Server:OnGangUpdate
Изменилась банда игрока во фреймворке: активная банда, список банд или правка этой банды в панели (из ai-core:gangsChanged, ai-core:activeGangChanged, ai-core:definitionsChanged).
Сторона: сервер
Prop
Type
on("QBCore:Server:OnGangUpdate", (source: number, gang: { name: string }) => console.log(`${source}: gang ${gang.name}`));QBCore и Qbox: клиент
Отправляются на клиенте самого игрока через TriggerEvent.
| Событие | Когда | Аргументы |
|---|---|---|
QBCore:Client:OnPlayerLoaded | Персонаж находится в мире. | нет |
QBCore:Client:OnPlayerUnload | Игрок вернулся на экран персонажей. | нет |
QBCore:Player:SetPlayerData | После загрузки и после каждого изменения денег, работы, банды или метаданных. | (PlayerData: table) весь PlayerData из QB. |
QBCore:Client:OnJobUpdate | Изменилась работа во фреймворке. | (job: table) таблица работы QB (как на сервере). |
QBCore:Client:SetDuty | Изменилось дежурство по той же работе. | (onDuty: boolean) |
QBCore:Client:OnGangUpdate | Изменилась банда во фреймворке. | (gang: table) таблица банды QB. |
QBCore:Client:OnMoneyChange | Изменился баланс счёта. | (account: string, balance: number) имя счёта в ai-core и новый баланс. |
on("QBCore:Client:OnPlayerLoaded", () => console.log("loaded"));
on("QBCore:Client:OnJobUpdate", (job: { name: string }) => console.log(`job: ${job.name}`));
on("QBCore:Client:SetDuty", (onDuty: boolean) => console.log(`on duty: ${onDuty}`));QBCore:Client:OnMoneyChange несёт (account, balance), то есть новый баланс, а не собственные аргументы qb-core. Скрипт QB, который читает его как сумму, увидит баланс. Предпочитайте QBCore:Player:SetPlayerData или onPlayerData("money", ...) из ai-core.
ESX: сервер
esx:playerLoaded
Персонаж загружен (из ai-core:playerLoaded).
Сторона: сервер
Prop
Type
on("esx:playerLoaded", (source: number, xPlayer: { identifier: string }) => {
console.log(`${xPlayer.identifier} loaded (src ${source})`);
});esx:playerDropped
Игрок покинул сервер (из ai-core:playerUnloaded с причиной dropped).
Сторона: сервер
Prop
Type
on("esx:playerDropped", (source: number) => console.log(`${source} left`));esx:playerLogout
Игрок вернулся на экран персонажей и остаётся подключённым (из ai-core:playerUnloaded с причиной switch).
Сторона: сервер
Prop
Type
on("esx:playerLogout", (source: number) => console.log(`${source} switched character`));esx:setJob
Изменилась работа игрока во фреймворке (в те же моменты, что и QBCore:Server:OnJobUpdate).
Сторона: сервер
Prop
Type
on("esx:setJob", (source: number, job: { name: string; grade: number }) => {
console.log(`${source}: ${job.name} grade ${job.grade}`);
});ESX: клиент
Отправляются на клиенте самого игрока через TriggerEvent.
| Событие | Когда | Аргументы |
|---|---|---|
esx:playerLoaded | Персонаж находится в мире. | (PlayerData: table, isNew: false) клиентский PlayerData из ESX. |
esx:onPlayerLogout | Игрок вернулся на экран персонажей. | нет |
esx:setAccountMoney | Изменился баланс счёта. | (account: { name, money, label }); name равен "money" для cash из ai-core. |
esx:setJob | Изменилась работа во фреймворке. | (job: table, lastJob: table | nil) таблицы работ ESX (как на сервере). |
esx:setPlayerData | Выполнился ESX.SetPlayerData: сменился пед (смена модели, возрождение) или изменились метаданные. | (key: string, value: any) |
on("esx:playerLoaded", () => console.log("loaded"));
on("esx:setAccountMoney", (account: { name: string; money: number }) => console.log(`${account.name}: ${account.money}`));vRP
Мост vRP в ai-core отправляет серверные события vRP. user_id в vRP - это id персонажа в ai-core.
vRP:playerJoin
Персонаж загружен. (vRP отправляет его при подключении; ai-core узнаёт id только после загрузки персонажа.)
Сторона: сервер
Prop
Type
on("vRP:playerJoin", (userId: number, source: number, name: string) => console.log(`${name} joined as user ${userId} (src ${source})`));vRP:playerSpawn
Персонаж помещён в мир. Срабатывает через 2 секунды после того, как ai-core его заспавнил, как в vRP. Только для спавна при загрузке персонажа: возрождения после смерти идут от скрипта смерти и его не вызывают.
Сторона: сервер
Prop
Type
on("vRP:playerSpawn", (userId: number, source: number, firstSpawn: boolean) => {
if (firstSpawn) console.log(`user ${userId} spawned (src ${source})`);
});vRP:playerLeave
Персонаж отпущен: игрок ушёл или сменил персонажа.
Сторона: сервер
Prop
Type
on("vRP:playerLeave", (userId: number, source: number) => console.log(`user ${userId} left (src ${source})`));vRP:playerJoinGroup and vRP:playerLeaveGroup
Персонаж получил или потерял группу vRP. Группы - это работы ai-core, активная банда, имена групп, которые владелец сервера сопоставил в панели (вкладка «vRP scripts»), и дополнительные группы, которые добавляют скрипты vRP. Срабатывает при каждом изменении, в том числе при изменениях, которые ai-core или другой скрипт делает без vRP.
Сторона: сервер
Prop
Type
on("vRP:playerJoinGroup", (userId: number, group: string, gtype?: string) => console.log(`user ${userId} joined ${group} (${gtype ?? "group"})`));
on("vRP:playerLeaveGroup", (userId: number, group: string) => console.log(`user ${userId} left ${group}`));Расширения vRP 2 и 3 получают от моста собственные события расширений (characterLoad, playerJoin, characterUnload, playerLeave, playerSpawn, playerDeath, playerMoneyUpdate, playerJoinGroup / playerLeaveGroup и другие) через систему событий расширений vRP, а не как события FiveM. Не отправляются: vRP:save, vRP:playerRejoin, vRPcli:playerSpawned.
События фреймворков, на которые отвечает ai-core
Скрипты, написанные под фреймворк, отправляют эти события, ожидая ответа от фреймворка. Вместо него отвечает ai-core.
| Событие | Сторона | Что делает ai-core |
|---|---|---|
QBCore:GetObject, esx:getSharedObject | обе | Вызывает callback с объектом ядра (QBCore / ESX). |
QBCore:Server:TriggerCallback, esx:triggerServerCallback | сервер (от клиентов) | Выполняет callback фреймворка, зарегистрированный через CreateCallback / RegisterServerCallback, и отвечает. Не более 30 запросов на игрока за любые 10 секунд. |
QBCore:Notify, esx:showNotification, esx:showAdvancedNotification, ESX:Notify | клиент (от сервера) | Показывает уведомление ai-lib. |
esx:showHelpNotification, ESX:TextUI, ESX:HideUI, qb-core:client:DrawText, qb-core:client:ChangeText, qb-core:client:HideText, qb-core:client:KeyPressed | клиент | Показывает или скрывает подсказку ai-lib. |
qb-menu:client:openMenu, qb-menu:client:closeMenu | клиент | Открывает или закрывает меню ai-lib с пунктами qb-menu. |
progressbar:client:cancel | клиент | Отменяет полосу прогресса моста. |
police:server:policeAlert | сервер | Отправляет полицейское оповещение в активную систему оповещений с позицией игрока. Клиенты отправляют (text) (одно на игрока за 10 секунд); серверные скрипты вызывают его через TriggerEvent с (text, camId, playerSource). |
qb-weathersync:client:DisableSync / EnableSync, cd_easytime:PauseSync, vSync:toggle | клиент | Считаются причинами паузы синхронизации погоды и времени (см. Синхронизация погоды и времени). |
State bag
Общие значения состояния, которые публикуют ai-core и скрипты ai-* - bag игроков, bag транспорта и ключи GlobalState - что хранит каждый, кто его пишет и как его читать и следить за ним.
Lib: клиент
@aicore-fivem/lib/client и клиентская сторона aiLib: что это такое, как загружать их в TypeScript и Lua, и все тематические страницы.