qbx_core — Manual

Framework base do servidor: jogadores, personagens, jobs e gangues, dinheiro, metadata, permissões, buckets, fila de entrada, persistência de veículos e a ponte de compatibilidade com o QBCore.


Sumário

  1. Dependências
  2. Instalação
  3. Permissões (ACE)
  4. Convars
  5. Configuração
  6. Dados compartilhados
  7. Comandos
  8. Personagens
  9. Fila de entrada
  10. Persistência de veículos
  11. Ponte QBCore
  12. Integrações
  13. Entrypoints para outros recursos
  14. Localização
  15. Estrutura de arquivos

Dependências

RecursoObrigatórioObservação
oxmysqlSimPersistência de jogadores, bans e grupos
ox_libSimVersão 3.20.0 ou superior. O recurso derruba o servidor na inicialização se a versão for menor
ox_inventorySimVersão 2.42.1 ou superior, com inventory:framework = qbx
OneSync InfinitySimObrigatório; sem ele o qbx_core executa quit immediately
Servidor FiveMSimBuild 10731 ou superior (dependencies do fxmanifest.lua)
illenium-appearanceNãoAparência do ped na tela de personagens (chamada dentro de pcall)
mri_Qspawn / qbx_spawn / qbx_apartmentsNãoEscolha do ponto de spawn após entrar com o personagem
mri_QcarkeysNãoUsado por giveVehicleKeys (server) e hasKeys (client) nesta configuração
qbx_managementNãoContas de sociedade (getSocietyAccount, removeSocietyMoney) para pagamento via sociedade
qbx_idcardNãoNecessário porque os itens iniciais id_card e driver_license pedem metadata dele

Instalação

  1. Copie a pasta qbx_core para resources/.
  2. Importe o SQL:
    -- qbx_core.sql cria as tabelas players, bans e player_groups
    SOURCE qbx_core.sql;
  3. Adicione ao server.cfg, antes de qualquer recurso que dependa do framework:
    setr inventory:framework "qbx"
    set onesync on
    
    ensure oxmysql
    ensure ox_lib
    ensure ox_inventory
    ensure qbx_core
  4. Defina os grupos de ACE (veja abaixo). Sem eles nenhum comando administrativo funciona.
  5. Conflitos — o qbx_core declara provide 'qb-core'. Não rode o qb-core original junto: os dois respondem por exports['qb-core'].

Checagens feitas na inicialização, todas fatais: versão do ox_lib, versão do ox_inventory, inventory:framework igual a qbx e OneSync Infinity ativo.


Permissões (ACE)

Os grupos padrão são god, admin e mod (lista em config.server.permissions). Declare-os no server.cfg:

add_ace group.god command allow
add_principal group.god group.admin
add_principal group.admin group.mod

add_ace group.admin qbadmin.join allow
add_principal identifier.fivem:1 group.admin
ACEEfeito
group.adminTodos os comandos administrativos (/tp, /car, /setjob, /givemoney, /openserver, …)
adminWhitelist de entrada quando config.server.whitelist está ligado (whitelistPermission) e prioridade na fila (Admin Queue)
qbadmin.joinPermite entrar mesmo com o servidor fechado (config.server.closed)

Além da ACE, os comandos administrativos exigem opt-in: enquanto config.server.requireOptIn for true, o admin precisa rodar /optin na sessão antes que os comandos passem.


Convars

Todas opcionais; os valores abaixo são os padrões do código.

ConvarPadrãoEfeito
qbx:enablebridgetrueCarrega a ponte de compatibilidade QBCore. false desliga
qbx:allowmethodoverridestruePermite que recursos sobrescrevam funções da ponte QBCore
qbx:disableoverridewarningfalseSilencia o aviso emitido quando uma função da ponte é sobrescrita
qbx:enablequeuetrueLiga a fila de entrada
qbx:enableVehiclePersistencefalseLiga a persistência de veículos
qbx:vehiclePersistenceTypesemisemi salva posição e propriedades ao sair do veículo; full salva continuamente
qbx:bucketlockdownmodeinactiveModo de lockdown do bucket 0: strict, relaxed ou inactive
qbx:max_jobs_per_player1Máximo de jobs simultâneos por jogador
qbx:max_gangs_per_player1Máximo de gangues simultâneas por jogador
qbx:setjob_replacestrueSetJob substitui o job atual em vez de adicionar
qbx:setgang_replacestrueSetGang substitui a gangue atual em vez de adicionar
qbx:cleanPlayerGroupsfalseRemove da tabela player_groups grupos que não existem mais nos arquivos compartilhados
qbx:motdvazioMensagem do dia exibida ao jogador ao entrar
qbx:acknowledgefalseConfirma a leitura das mensagens de serviço do projeto Qbox
qbx:serviceMessagesUrlURL do repo QboxOrigem das mensagens de serviço
qbx:discordlinkdiscord.gg/qboxLink do Discord usado pela ponte e pelos utilitários

Configuração

config/shared.lua

CampoTipoObrigatórioDescrição
serverNamestringSimNome do servidor exibido na fila e em outros textos
defaultSpawnvec4SimCoordenadas de spawn padrão
notifyPositionstringSimPosição das notificações (center-left, top, top-right, …)
starterItemsarraySimItens dados ao criar o personagem. Cada item: name, amount e um metadata(source) opcional

config/client.lua

CampoTipoObrigatórioDescrição
statusIntervalSecondsnúmeroSimIntervalo de checagem de fome/sede para tirar vida quando chega a zero
loadingModelsTimeoutmsSimTempo máximo de espera do ox_lib ao carregar modelos
pauseMapTextstringSimTexto acima do mapa de pausa (ESC). Vazio mostra “FiveM”
characters.imageURLstringSimImagem exibida na tela de personagens
characters.iconAnimationstringSimAnimação do ícone da tela de personagens
characters.useExternalCharactersboolSimtrue desliga a tela de personagens interna e delega a outro recurso
characters.enableDeleteButtonboolSimPermite o jogador apagar o próprio personagem
characters.startingApartmentboolSimSe true, exige escolha de apartamento no primeiro spawn (depende do qbx_apartments/qbx_spawn)
characters.dateFormatstringSimFormato da data de nascimento
characters.dateMin / dateMaxstringSimFaixa aceita de data de nascimento, no mesmo formato de dateFormat
characters.limitNationalitiesboolSimSe true, a nacionalidade tem de sair da lista nationalities
characters.nationalitiesarraySimLista de nacionalidades aceitas
characters.profanityWordstabelaSimPalavras bloqueadas nos nomes de personagem
characters.locationsarraySimLocais onde o ped de pré-visualização aparece (pedCoords, camCoords opcional). Escolhidos aleatoriamente
discord.enabledboolSimLiga o Rich Presence do Discord
discord.appIdstringSimApplication ID do Discord
discord.largeIcon / smallIcontabelaSimicon e text dos ícones do Rich Presence
discord.firstButton / secondButtontabelaSimtext e link dos botões do Rich Presence
hasKeysfunçãoSimUsada apenas pela ponte QB. Nesta configuração consulta o mri_Qcarkeys

Nota: dateFormat, dateMin, dateMax e limitNationalities aparecem duas vezes dentro de characters. Em Lua a última definição vence, então o formato efetivo é YYYY-MM-DD com faixa 1900-01-01 a 2006-12-31.

config/server.lua

CampoTipoObrigatórioDescrição
updateIntervalminutosSimFrequência com que os dados do jogador são salvos
money.moneyTypestabelaSimTipos de dinheiro e valor inicial (cash, bank, crypto). Um tipo adicionado nunca é removido do banco
money.dontAllowMinusarraySimTipos de dinheiro que não podem ficar negativos
money.paycheckTimeoutminutosSimIntervalo do pagamento automático
money.paycheckSocietyboolSimSe true, o salário sai da conta da sociedade do job (usa getSocietyAccount/removeSocietyMoney)
player.hungerRatenúmeroSimVelocidade com que a fome cai
player.thirstRatenúmeroSimVelocidade com que a sede cai
player.bloodTypesarraySimTipos sanguíneos sorteados na criação do personagem
player.identifierTypestabelaSimGeradores de identificadores únicos: citizenid, AccountNumber, PhoneNumber, FingerId, WalletId, SerialNumber. Cada um tem uma valueFunction
characterDataTablesarray de paresSim{tabela, coluna} apagados quando o personagem é deletado
server.pvpboolSimLiga o PvP (replicado em GlobalState.PVPEnabled)
server.closedboolSimServidor fechado; só entra quem tem a ACE qbadmin.join
server.closedReasonstringSimMensagem exibida a quem é barrado
server.whitelistboolSimLiga a whitelist de entrada
server.whitelistPermissionstringSimACE exigida quando a whitelist está ligada
server.discordstringSimLink de convite do Discord
server.checkDuplicateLicenseboolSimBloqueia entrada com a mesma license da Rockstar já conectada
server.requireOptInboolSimExige /optin antes dos comandos administrativos (marcado como deprecado em favor da ACE)
server.permissionsarraySimGrupos de permissão reconhecidos (god, admin, mod)
characters.playersNumberOfCharacterstabelaSimLimite de personagens por license específica
characters.defaultNumberOfCharactersnúmeroSimLimite padrão de personagens
logging.webhooktabelaSimWebhooks do Discord por canal: default, joinleave, ooc, anticheat, playermoney
logging.roletabelaSimCargos marcados em logs de alta prioridade
persistence.lockStatestringSimlock ou unlock — estado da tranca do veículo persistido ao spawnar
giveVehicleKeysfunçãoSimEntrega de chaves ao spawnar veículo. Nesta configuração chama mri_Qcarkeys:GiveTempKeys
getSocietyAccountfunçãoSimSaldo da sociedade. Nesta configuração usa qbx_management:GetAccount
removeSocietyMoneyfunçãoSimDébito na sociedade. Nesta configuração usa qbx_management:RemoveMoney
sendPaycheckfunçãoSimComo o salário é entregue (padrão: AddMoney('bank', ...) + notificação)

config/queue.lua

CampoTipoObrigatórioDescrição
timeoutSecondssegundosSimTempo para remover da fila quem desconectar enquanto espera
joiningTimeoutSecondssegundosSimTempo para remover da fila quem desconectar durante o carregamento
subQueuesarraySimSub-filas em ordem de prioridade. Cada uma tem name, predicate(source) opcional e cardOptions. A primeira sem predicate é a padrão
waitingEmojisarraySimEmojis cosméticos exibidos junto ao tempo de espera
useAdaptiveCardboolSimUsa o adaptive card gerado por generateCard na tela de conexão
generateCardfunçãoSimMonta o adaptive card com posição, tamanho da fila e tempo decorrido

Dados compartilhados

ArquivoConteúdo
shared/jobs.luaJobs. Chave em minúsculo. Campos: label, type (ex.: leo, ems), defaultDuty, offDutyPay, grades[n] = { name, payment, isboss?, bankAuth? }
shared/gangs.luaGangues. Mesma estrutura, sem payment obrigatório
shared/items.luaItens do QBCore (usados pela ponte). O ox_inventory continua sendo a fonte da verdade dos itens
shared/vehicles.luaCatálogo de veículos: name, brand, model, price, category, type, hash
shared/weapons.luaArmas do QBCore. Marcado como deprecado — só é necessário para a ponte QB
shared/locations.luaCoordenadas nomeadas. Marcado como deprecado
data/nationalities.luaLista de nacionalidades

Jobs e gangues também podem ser criados em runtime pelos exports CreateJob, CreateJobs, CreateGangs, UpsertJobData, UpsertJobGrade e afins — nesse caso ficam no banco, não nos arquivos.


Comandos

Todos os comandos com group.admin também exigem /optin enquanto config.server.requireOptIn estiver ligado.

ComandoPermissãoDescrição
/idQualquer jogadorMostra seu ID de servidor
/me [mensagem]Qualquer jogadorEmote de texto acima do personagem
/ooc [mensagem]Qualquer jogadorChat fora de personagem, alcance de 20 metros (admins em opt-in veem tudo e o log vai para o webhook ooc)
/jobQualquer jogadorMostra o job atual
/gangQualquer jogadorMostra a gangue atual
/optingroup.adminAlterna o opt-in de comandos administrativos
/tp [id] ou /tp [x] [y] [z]group.adminTeleporta até um jogador ou para coordenadas
/tpmgroup.adminTeleporta para o waypoint
/togglepvpgroup.adminLiga/desliga o PvP do servidor
/car [modelo]group.adminSpawna um veículo
/dvgroup.adminApaga o veículo em que você está ou o mais próximo
/givemoney [id] [tipo] [valor]group.adminAdiciona dinheiro a um jogador
/setmoney [id] [tipo] [valor]group.adminDefine o saldo de um jogador
/setjob [id] [job] [grade]group.adminDefine o job primário
/changejob [id] [job] [grade]group.adminTroca o job do jogador
/addjob [id] [job] [grade]group.adminAdiciona um job ao jogador
/removejob [id] [job]group.adminRemove um job do jogador
/setgang [id] [gang] [grade]group.adminDefine a gangue primária
/addpermission [id] [permissão]group.adminAdiciona um grupo de permissão ao jogador
/removepermission [id] [permissão]group.adminRemove um grupo de permissão
/openservergroup.adminReabre o servidor
/closeserver [motivo]group.adminFecha o servidor (só entra quem tem qbadmin.join)
/logoutgroup.adminDesloga o personagem e volta para a tela de seleção
/deletechar [id]group.adminApaga o personagem de um jogador

Personagens

A tela de personagens é interna (client/character.lua) e usa menus do ox_lib.

  • O limite de personagens vem de config.characters.playersNumberOfCharacters (por license) ou de defaultNumberOfCharacters.
  • O ped de pré-visualização aparece em uma das characters.locations, sorteada a cada abertura, e recebe a aparência salva via illenium-appearance quando o recurso existe.
  • Ao criar o personagem, os starterItems são entregues e os identificadores únicos (citizenid, telefone, conta, digital, carteira, número de série) são gerados pelas identifierTypes.
  • Depois de entrar com o personagem, o spawn é resolvido nesta ordem: mri_Qspawn (chooseSpawn), senão qbx_apartments quando startingApartment está ligado, senão qbx_spawn, senão o defaultSpawn.
  • Apagar o personagem remove as linhas listadas em config.characterDataTables.
  • useExternalCharacters = true desliga toda essa tela e deixa o fluxo para outro recurso.

Fila de entrada

Ligada por padrão (qbx:enablequeue). As sub-filas de config/queue.lua são avaliadas de cima para baixo pelo predicate; a primeira sem predicate é a fila padrão. Um jogador que não passe em nenhum predicate e não tenha fila padrão só entra se houver slot livre.

A configuração de fábrica tem duas: Admin Queue (para quem tem a ACE admin) e Regular Queue. A tela de conexão mostra o adaptive card com a posição, o total da fila e o tempo esperando.


Persistência de veículos

Desligada por padrão. Para ligar:

setr qbx:enableVehiclePersistence "true"
setr qbx:vehiclePersistenceType "semi"   -- ou "full"
  • semi — posição e propriedades são gravadas quando o jogador sai do veículo.
  • full — gravação contínua enquanto o veículo existir.
  • config.persistence.lockState define se o veículo volta trancado ou destrancado ao ser respawnado.
  • Recursos podem ligar/desligar a persistência de um veículo específico com os exports EnablePersistence e DisablePersistence.

Ponte QBCore

Com qbx:enablebridge (padrão true), o qbx_core expõe exports['qb-core']:GetCoreObject() e o objeto QBCore clássico (QBCore.Functions.*, QBCore.Shared.*, eventos QBCore:*). É o que permite rodar recursos escritos para QBCore sem alteração.

  • qbx:allowmethodoverrides controla se um recurso pode sobrescrever funções da ponte; qbx:disableoverridewarning silencia o aviso quando isso acontece.
  • shared/weapons.lua e shared/items.lua existem para alimentar QBCore.Shared.Weapons e QBCore.Shared.Items da ponte.
  • Código novo deve usar os exports nativos do qbx_core — a ponte é apenas compatibilidade.

Integrações

ox_inventory

É o inventário oficial e obrigatório. A convar inventory:framework precisa estar em qbx, e inventory:accounts define quais tipos de dinheiro o inventário trata como conta.

mri_Qcarkeys

Nesta configuração, config.server.giveVehicleKeys chama exports.mri_Qcarkeys:GiveTempKeys(src, plate) e config.client.hasKeys consulta HaveTemporaryKey/HavePermanentKey. Trocar de sistema de chaves é só editar essas duas funções (o código do qbx_vehiclekeys está comentado ao lado).

qbx_management

Quando money.paycheckSociety = true, o salário é debitado da conta da sociedade do job usando qbx_management:GetAccount e qbx_management:RemoveMoney.

Atenção: paycheckSociety está false nesta configuração, e o qbx_management deste servidor não expõe GetAccount nem RemoveMoney (ele só faz o menu de chefe). Antes de ligar essa opção, aponte getSocietyAccount e removeSocietyMoney para um recurso de banco que tenha esses exports.

mri_Qspawn / qbx_spawn / qbx_apartments

Definem para onde o jogador vai depois de escolher o personagem. O qbx_core testa o estado dos recursos nessa ordem e chama exports['mri_Qspawn']:chooseSpawn(), apartments:client:setupSpawnUI ou qb-spawn:client:setupSpawns.

illenium-appearance

Aplica a aparência salva no ped de pré-visualização e no personagem carregado. As chamadas são feitas em pcall, então a ausência do recurso não quebra o fluxo.

qbx_idcard

Os itens iniciais id_card e driver_license chamam exports.qbx_idcard:GetMetaLicense. Se o recurso não estiver rodando, a criação do personagem falha com assert — remova esses itens de starterItems se não usar o qbx_idcard.


Entrypoints para outros recursos

Módulos compartilhados

Outros recursos incluem os módulos do core diretamente no fxmanifest.lua:

shared_scripts {
    '@ox_lib/init.lua',
    '@qbx_core/modules/lib.lua',        -- helpers qbx.* (string, math, table, array, spawnVehicle, getVehiclePlate…)
}
client_scripts {
    '@qbx_core/modules/playerdata.lua', -- mantém QBX.PlayerData sincronizado no cliente
}

No servidor, o logger é carregado por require:

local logger = require '@qbx_core.modules.logger'

Exports de servidor — jogador

exports.qbx_core:GetPlayer(source)
exports.qbx_core:GetPlayerByCitizenId(citizenid)
exports.qbx_core:GetPlayerByPhone(number)
exports.qbx_core:GetPlayerByUserId(userId)
exports.qbx_core:GetOfflinePlayer(citizenid)
exports.qbx_core:GetQBPlayers()
exports.qbx_core:GetPlayersData()
exports.qbx_core:GetSource(identifier)
exports.qbx_core:GetUserId(source)
 
exports.qbx_core:CreatePlayer(playerData, isNew)
exports.qbx_core:Login(source, citizenid, newData)
exports.qbx_core:Logout(source)
exports.qbx_core:Save(source)
exports.qbx_core:SaveOffline(playerData)
exports.qbx_core:DeleteCharacter(citizenid)
exports.qbx_core:GenerateUniqueIdentifier('citizenid')

Exports de servidor — dinheiro, dados e metadata

exports.qbx_core:AddMoney(source, 'cash', 100, 'motivo')
exports.qbx_core:RemoveMoney(source, 'bank', 100, 'motivo')
exports.qbx_core:SetMoney(source, 'cash', 100, 'motivo')
exports.qbx_core:GetMoney(source, 'cash')
 
exports.qbx_core:SetPlayerData(source, key, value)
exports.qbx_core:UpdatePlayerData(source)
exports.qbx_core:SetMetadata(source, 'armor', 100)
exports.qbx_core:GetMetadata(source, 'armor')
exports.qbx_core:SetCharInfo(source, 'phone', numero)

Exports de servidor — jobs, gangues e grupos

exports.qbx_core:SetJob(source, 'police', 2)
exports.qbx_core:SetJobDuty(source, true)
exports.qbx_core:SetPlayerPrimaryJob(citizenid, 'police')
exports.qbx_core:AddPlayerToJob(citizenid, 'police', 2)
exports.qbx_core:RemovePlayerFromJob(citizenid, 'police')
exports.qbx_core:SetGang(source, 'ballas', 1)
exports.qbx_core:SetPlayerPrimaryGang(citizenid, 'ballas')
exports.qbx_core:AddPlayerToGang(citizenid, 'ballas', 1)
exports.qbx_core:RemovePlayerFromGang(citizenid, 'ballas')
 
exports.qbx_core:GetJobs()
exports.qbx_core:GetJob('police')
exports.qbx_core:GetGangs()
exports.qbx_core:GetGang('ballas')
exports.qbx_core:CreateJob('police', jobData)
exports.qbx_core:CreateJobs(jobsTable)
exports.qbx_core:RemoveJob('police')
exports.qbx_core:CreateGangs(gangsTable)
exports.qbx_core:RemoveGang('ballas')
exports.qbx_core:UpsertJobData('police', data)
exports.qbx_core:UpsertJobGrade('police', 2, gradeData)
exports.qbx_core:RemoveJobGrade('police', 2)
exports.qbx_core:UpsertGangData('ballas', data)
exports.qbx_core:UpsertGangGrade('ballas', 1, gradeData)
exports.qbx_core:RemoveGangGrade('ballas', 1)
 
exports.qbx_core:GetGroups(source)
exports.qbx_core:GetGroupMembers(name, type)
exports.qbx_core:HasGroup(source, filter)
exports.qbx_core:HasPrimaryGroup(source, filter)
exports.qbx_core:IsGradeBoss('police', 4)
exports.qbx_core:GetDutyCountJob('police')
exports.qbx_core:GetDutyCountType('leo')

Exports de servidor — permissões e moderação

exports.qbx_core:AddPermission(source, 'admin')
exports.qbx_core:RemovePermission(source, 'admin')
exports.qbx_core:GetPermission(source)
exports.qbx_core:HasPermission(source, 'admin')
exports.qbx_core:IsOptin(source)
exports.qbx_core:ToggleOptin(source)
exports.qbx_core:IsPlayerBanned(source)
exports.qbx_core:IsWhitelisted(source)
exports.qbx_core:ExploitBan(source, motivo)
exports.qbx_core:Notify(source, 'mensagem', 'success')

Exports de servidor — buckets, veículos e itens

exports.qbx_core:SetPlayerBucket(source, bucket)
exports.qbx_core:SetEntityBucket(entity, bucket)
exports.qbx_core:GetPlayersInBucket(bucket)
exports.qbx_core:GetEntitiesInBucket(bucket)
exports.qbx_core:GetBucketObjects()
 
exports.qbx_core:GetVehiclesByName()
exports.qbx_core:GetVehiclesByHash()
exports.qbx_core:GetVehiclesByCategory('super')
exports.qbx_core:GetVehicleClass(model)
exports.qbx_core:DeleteVehicle(vehicle)
exports.qbx_core:EnablePersistence(vehicle)
exports.qbx_core:DisablePersistence(vehicle)
exports.qbx_core:CreateSessionId(entity)
 
exports.qbx_core:CreateUseableItem(item, cb)
exports.qbx_core:CanUseItem(item)
exports.qbx_core:GetWeapons()
exports.qbx_core:GetLocations()
exports.qbx_core:GetCoreVersion()

Exports de cliente

exports.qbx_core:GetPlayerData()
exports.qbx_core:GetJobs()
exports.qbx_core:GetJob('police')
exports.qbx_core:GetGangs()
exports.qbx_core:GetGang('ballas')
exports.qbx_core:GetGroups()
exports.qbx_core:HasGroup(filter)
exports.qbx_core:HasPrimaryGroup(filter)
exports.qbx_core:GetVehiclesByName()
exports.qbx_core:GetVehiclesByHash()
exports.qbx_core:GetVehiclesByCategory('super')
exports.qbx_core:GetWeapons()
exports.qbx_core:GetLocations()
exports.qbx_core:Notify('mensagem', 'success')

Hooks

Permitem cancelar operações de dinheiro retornando false. Eventos disponíveis: addMoney, removeMoney, setMoney.

local hookId = exports.qbx_core:registerHook('addMoney', function(payload)
    -- payload traz source, moneyType, amount, reason
    if payload.amount > 1000000 then return false end -- cancela
end)
 
exports.qbx_core:removeHooks() -- remove todos os hooks do recurso que chamou

Eventos (novos)

-- servidor
RegisterNetEvent('qbx_core:server:onJobUpdate', function(jobName, job) end)
RegisterNetEvent('qbx_core:server:onGangUpdate', function(gangName, gang) end)
RegisterNetEvent('qbx_core:server:onGroupUpdate', function(source, groups) end)
RegisterNetEvent('qbx_core:server:onSetMetaData', function(key, oldValue, newValue) end)
RegisterNetEvent('qbx_core:server:playerLoggedOut', function(source) end)
 
-- cliente
RegisterNetEvent('qbx_core:client:onJobUpdate', function(jobName, job) end)
RegisterNetEvent('qbx_core:client:onGangUpdate', function(gangName, gang) end)
RegisterNetEvent('qbx_core:client:onGroupUpdate', function(groups) end)
RegisterNetEvent('qbx_core:client:onSetMetaData', function(key, oldValue, newValue) end)
RegisterNetEvent('qbx_core:client:playerLoggedOut', function() end)

Eventos (compatibilidade QBCore)

-- servidor
AddEventHandler('QBCore:Server:OnPlayerLoaded', function(player) end)
AddEventHandler('QBCore:Server:OnPlayerUnload', function(source) end)
AddEventHandler('QBCore:Server:OnJobUpdate', function(source, job) end)
AddEventHandler('QBCore:Server:OnGangUpdate', function(source, gang) end)
AddEventHandler('QBCore:Server:OnMoneyChange', function(source, type, amount, operation, reason) end)
AddEventHandler('QBCore:Server:OnPermissionUpdate', function(source, permission) end)
 
-- cliente
AddEventHandler('QBCore:Client:OnPlayerLoaded', function() end)
AddEventHandler('QBCore:Client:OnPlayerUnload', function() end)
AddEventHandler('QBCore:Client:OnJobUpdate', function(job) end)
AddEventHandler('QBCore:Client:OnGangUpdate', function(gang) end)
AddEventHandler('QBCore:Client:OnMoneyChange', function(type, amount, isMinus) end)
AddEventHandler('QBCore:Client:SetDuty', function(onDuty) end)
AddEventHandler('QBCore:Player:SetPlayerData', function(playerData) end)

Callbacks (lib.callback)

-- servidor -> cliente
lib.callback.await('qbx_core:client:getVehicleClasses', src)
lib.callback.await('qbx_core:client:getVehiclesInRadius', src, coords, radius)
lib.callback.await('qbx_core:client:setHealth', src, health)
 
-- cliente -> servidor (usados pela tela de personagens)
lib.callback.await('qbx_core:server:getCharacters')
lib.callback.await('qbx_core:server:createCharacter', false, data)
lib.callback.await('qbx_core:server:loadCharacter', false, citizenid)
lib.callback.await('qbx_core:server:deleteCharacter', false, citizenid)
lib.callback.await('qbx_core:server:getGroups')
lib.callback.await('qbx_core:server:getPreviewPedData', false, citizenid)
lib.callback.await('qbx_core:server:setCharBucket')

GlobalState

GlobalState.PlayerCount   -- jogadores conectados
GlobalState.MaxPlayers    -- sv_maxclients
GlobalState.PVPEnabled    -- estado do PvP

Localização

Strings via ox_lib locale. locales/ traz mais de 35 idiomas, entre eles en.json, pt-br.json, pt.json, es.json, fr.json, de.json, it.json, ru.json, pl.json, tr.json, ja.json, zh-tw.json.

setr ox:locale "pt-br"

Estrutura de arquivos

qbx_core/
├── client/
│   ├── main.lua                 — bootstrap do cliente, catálogos de veículos/armas/locais
│   ├── character.lua            — tela de personagens, ped de preview, spawn inicial
│   ├── events.lua               — eventos de player loaded/unload, MOTD, comandos de teleporte
│   ├── functions.lua            — helpers de cliente
│   ├── groups.lua               — cache de jobs/gangues e exports de grupo
│   ├── loops.lua                — loop de fome/sede
│   ├── discord.lua              — Rich Presence
│   └── vehicle-persistence.lua  — envio de posição/propriedades do veículo
├── server/
│   ├── main.lua                 — checagens de inicialização, buckets, catálogos, itens usáveis
│   ├── player.lua               — objeto Player: dinheiro, metadata, jobs, gangues, save/load
│   ├── character.lua            — criação, carregamento e exclusão de personagens
│   ├── groups.lua               — CRUD de jobs e gangues em runtime
│   ├── functions.lua            — permissões, notify, ban, whitelist, utilidades
│   ├── events.lua               — connecting/joining, fila, player dropped
│   ├── commands.lua             — todos os comandos do core
│   ├── loops.lua                — save periódico e paycheck
│   ├── queue.lua                — fila de entrada com adaptive card
│   ├── motd.lua                 — mensagens de serviço e MOTD
│   ├── vehicle-persistence.lua  — gravação de veículos persistentes
│   └── storage/
│       ├── main.lua             — acesso ao banco (bans, grupos)
│       └── players.lua          — leitura e escrita da tabela players
├── shared/
│   ├── main.lua                 — agrega Locations, Vehicles, Weapons e hashes
│   ├── jobs.lua                 — definição dos jobs
│   ├── gangs.lua                — definição das gangues
│   ├── items.lua                — itens para a ponte QBCore
│   ├── vehicles.lua             — catálogo de veículos
│   ├── weapons.lua              — armas para a ponte QBCore (deprecado)
│   ├── locations.lua            — coordenadas nomeadas (deprecado)
│   ├── functions.lua            — helpers compartilhados
│   └── locale.lua               — carregamento do locale
├── config/
│   ├── shared.lua               — nome do servidor, spawn padrão, itens iniciais
│   ├── client.lua               — personagens, Discord, status, hasKeys
│   ├── server.lua               — dinheiro, jogador, servidor, logging, persistência, sociedade
│   └── queue.lua                — sub-filas e adaptive card
├── modules/
│   ├── lib.lua                  — helpers qbx.* usados por todos os recursos da suite
│   ├── playerdata.lua           — QBX.PlayerData no cliente
│   ├── logger.lua               — envio de logs para webhook do Discord
│   ├── hooks.lua                — registerHook / removeHooks
│   └── utils.lua                — utilidades diversas
├── bridge/qb/                   — ponte de compatibilidade QBCore (client, server, shared)
├── data/
│   └── nationalities.lua        — lista de nacionalidades
├── locales/                     — 35+ idiomas
├── qbx_core.sql                 — tabelas players, bans e player_groups
├── types.lua                    — anotações de tipo para o LSP
└── fxmanifest.lua

Os arquivos compare_items*.js, extract_*.js, extra_items.lua, missing_items.lua e compare_*.txt na raiz são scripts avulsos de comparação de itens. Não são carregados pelo fxmanifest.lua e não fazem parte do runtime.