Eventos del puente de frameworks
Los eventos de ESX, QB / Qbox y vRP que dispara ai-core para que los scripts escritos para esos frameworks sigan funcionando, con sus argumentos exactos, y los eventos de framework a los que responde ai-core.
ai-core se presenta como es_extended, qb-core, qbx_core y vrp, así que los scripts escritos para esos frameworks funcionan sin cambios. Parte de eso es disparar los propios eventos del framework cuando algo cambia en ai-core: carga un personaje, se mueve dinero, cambia un trabajo. Esta página lista cada evento de framework que dispara el puente, con los argumentos tal como los envía el puente, y los eventos de framework a los que responde.
El código nuevo no debería usarlos. Escribe contra los eventos propios de ai-core (servidor, cliente) y la lib: llevan más información (varios trabajos, bandas, servicio) y no dependen de la forma de un framework. Esta página sirve para ejecutar y arreglar scripts existentes de ESX / QB / vRP.
Las vistas de framework mantienen un trabajo por jugador: el trabajo en el que el jugador está de servicio; si no, su primer trabajo. ai-core en sí permite varios trabajos. ESX no tiene bandas; la cuenta money de ESX es el cash de ai-core.
QBCore y Qbox: servidor
El puente los dispara en el servidor con TriggerEvent. Los scripts de Qbox escuchan los mismos nombres de QBCore; el puente no dispara ningún evento exclusivo de Qbox.
QBCore:Server:PlayerLoaded
Se cargó un personaje (desde ai-core:playerLoaded).
Lado: Servidor
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
Se soltó a un personaje: el jugador salió o volvió a la pantalla de personajes (desde ai-core:playerUnloaded).
Lado: Servidor
Prop
Type
on("QBCore:Server:OnPlayerUnload", (source: number) => console.log(`${source} unloaded`));QBCore:Server:OnMoneyChange
Cambió el saldo de una cuenta (desde ai-core:moneyChanged).
Lado: Servidor
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
Cambió el trabajo de framework del jugador: se añadió o quitó un trabajo, un cambio de rango, entrar o salir de servicio, o una edición de ese trabajo en el panel (desde ai-core:jobsChanged, ai-core:dutyChanged, ai-core:definitionsChanged).
Lado: Servidor
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
Cambió la banda de framework del jugador: la banda activa, la lista de bandas o una edición de esa banda en el panel (desde ai-core:gangsChanged, ai-core:activeGangChanged, ai-core:definitionsChanged).
Lado: Servidor
Prop
Type
on("QBCore:Server:OnGangUpdate", (source: number, gang: { name: string }) => console.log(`${source}: gang ${gang.name}`));QBCore y Qbox: cliente
Se disparan en el propio cliente del jugador con TriggerEvent.
| Evento | Cuándo | Argumentos |
|---|---|---|
QBCore:Client:OnPlayerLoaded | El personaje está en el mundo. | ninguno |
QBCore:Client:OnPlayerUnload | El jugador volvió a la pantalla de personajes. | ninguno |
QBCore:Player:SetPlayerData | Tras la carga y tras cada cambio de dinero, trabajo, banda o metadatos. | (PlayerData: table) el PlayerData de QB completo. |
QBCore:Client:OnJobUpdate | Cambió el trabajo de framework. | (job: table) la tabla de trabajo de QB (como en el servidor). |
QBCore:Client:SetDuty | Cambió el servicio en el mismo trabajo. | (onDuty: boolean) |
QBCore:Client:OnGangUpdate | Cambió la banda de framework. | (gang: table) la tabla de banda de QB. |
QBCore:Client:OnMoneyChange | Cambió el saldo de una cuenta. | (account: string, balance: number) el nombre de cuenta de ai-core y el nuevo saldo. |
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 lleva (account, balance), el nuevo saldo, no los argumentos propios de qb-core. Un script de QB que lo lea como una cantidad ve el saldo. Prefiere QBCore:Player:SetPlayerData o el onPlayerData("money", ...) de ai-core.
ESX: servidor
esx:playerLoaded
Se cargó un personaje (desde ai-core:playerLoaded).
Lado: Servidor
Prop
Type
on("esx:playerLoaded", (source: number, xPlayer: { identifier: string }) => {
console.log(`${xPlayer.identifier} loaded (src ${source})`);
});esx:playerDropped
El jugador salió del servidor (desde ai-core:playerUnloaded con el motivo dropped).
Lado: Servidor
Prop
Type
on("esx:playerDropped", (source: number) => console.log(`${source} left`));esx:playerLogout
El jugador volvió a la pantalla de personajes y sigue conectado (desde ai-core:playerUnloaded con el motivo switch).
Lado: Servidor
Prop
Type
on("esx:playerLogout", (source: number) => console.log(`${source} switched character`));esx:setJob
Cambió el trabajo de framework del jugador (en los mismos momentos que QBCore:Server:OnJobUpdate).
Lado: Servidor
Prop
Type
on("esx:setJob", (source: number, job: { name: string; grade: number }) => {
console.log(`${source}: ${job.name} grade ${job.grade}`);
});ESX: cliente
Se disparan en el propio cliente del jugador con TriggerEvent.
| Evento | Cuándo | Argumentos |
|---|---|---|
esx:playerLoaded | El personaje está en el mundo. | (PlayerData: table, isNew: false) el PlayerData de cliente de ESX. |
esx:onPlayerLogout | El jugador volvió a la pantalla de personajes. | ninguno |
esx:setAccountMoney | Cambió el saldo de una cuenta. | (account: { name, money, label }); name es "money" para el cash de ai-core. |
esx:setJob | Cambió el trabajo de framework. | (job: table, lastJob: table | nil) tablas de trabajo de ESX (como en el servidor). |
esx:setPlayerData | Se ejecutó ESX.SetPlayerData: cambió el ped (cambio de modelo, reaparición) o cambiaron los metadatos. | (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
El puente de vRP de ai-core dispara los eventos de servidor de vRP. El user_id de vRP es el id de personaje de ai-core.
vRP:playerJoin
Se cargó un personaje. (vRP lo dispara al conectar; ai-core solo conoce el id cuando hay un personaje cargado.)
Lado: Servidor
Prop
Type
on("vRP:playerJoin", (userId: number, source: number, name: string) => console.log(`${name} joined as user ${userId} (src ${source})`));vRP:playerSpawn
Se puso al personaje en el mundo. Se dispara 2 segundos después de que ai-core lo hiciera aparecer, como en vRP. Solo para la aparición de una carga de personaje: las reapariciones tras morir vienen del script de muerte y no lo disparan.
Lado: Servidor
Prop
Type
on("vRP:playerSpawn", (userId: number, source: number, firstSpawn: boolean) => {
if (firstSpawn) console.log(`user ${userId} spawned (src ${source})`);
});vRP:playerLeave
Se soltó a un personaje: el jugador salió o cambió de personaje.
Lado: Servidor
Prop
Type
on("vRP:playerLeave", (userId: number, source: number) => console.log(`user ${userId} left (src ${source})`));vRP:playerJoinGroup and vRP:playerLeaveGroup
El personaje obtuvo o perdió un grupo de vRP. Los grupos son los trabajos de ai-core, la banda activa, los nombres de grupo que el dueño del servidor mapeó en el panel (pestaña "vRP scripts") y los grupos extra que añaden los scripts de vRP. Se dispara con cada cambio, también con los cambios que hacen ai-core u otro script sin pasar por vRP.
Lado: Servidor
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}`));Las extensiones de vRP 2 y 3 reciben del puente sus propios eventos de extensión (characterLoad, playerJoin, characterUnload, playerLeave, playerSpawn, playerDeath, playerMoneyUpdate, playerJoinGroup / playerLeaveGroup y otros) a través del sistema de eventos de extensión de vRP, no como eventos de FiveM. No se disparan: vRP:save, vRP:playerRejoin, vRPcli:playerSpawned.
Eventos de framework a los que responde ai-core
Los scripts escritos para un framework envían estos eventos esperando que el framework responda. ai-core responde en su lugar.
| Evento | Lado | Qué hace ai-core |
|---|---|---|
QBCore:GetObject, esx:getSharedObject | ambos | Llama al callback con el objeto core (QBCore / ESX). |
QBCore:Server:TriggerCallback, esx:triggerServerCallback | servidor (desde los clientes) | Ejecuta el callback de framework registrado con CreateCallback / RegisterServerCallback y responde. Como mucho 30 peticiones por jugador en cualquier intervalo de 10 segundos. |
QBCore:Notify, esx:showNotification, esx:showAdvancedNotification, ESX:Notify | cliente (desde el servidor) | Muestra la notificación de ai-lib. |
esx:showHelpNotification, ESX:TextUI, ESX:HideUI, qb-core:client:DrawText, qb-core:client:ChangeText, qb-core:client:HideText, qb-core:client:KeyPressed | cliente | Muestra u oculta el aviso de ai-lib. |
qb-menu:client:openMenu, qb-menu:client:closeMenu | cliente | Abre o cierra el menú de ai-lib con los elementos de qb-menu. |
progressbar:client:cancel | cliente | Cancela la barra de progreso del puente. |
police:server:policeAlert | servidor | Envía una alerta de policía al sistema de alertas activo en la posición del jugador. Los clientes envían (text) (una por jugador cada 10 segundos); los scripts de servidor lo disparan con TriggerEvent y (text, camId, playerSource). |
qb-weathersync:client:DisableSync / EnableSync, cd_easytime:PauseSync, vSync:toggle | cliente | Cuentan como motivos de pausa de la sincronización de clima y hora (consulta Sincronización de clima y hora). |
State bags
Los valores de estado compartido que publican ai-core y los scripts ai-* - bags de jugador, bags de vehículo y claves de GlobalState - qué contiene cada uno, quién lo escribe y cómo leerlo y seguirlo.
Lib: cliente
@aicore-fivem/lib/client y el lado de cliente de aiLib: qué son, cómo cargarlos en TypeScript y Lua, y cada página temática.