Como adicionar um job em QBCore: shared/jobs.lua, grades e /setjob

Adicione um job customizado ao QBCore ou QBox: a estrutura shared/jobs.lua com defaultDuty, offDutyPay e grades, o comando /setjob, e lendo Player.PlayerData.job.

Em QBCore um job é um bloco em um arquivo Lua, não uma linha de banco de dados. Você adiciona o bloco, reinicia o core, e define o job em um jogador. Este guia mostra a estrutura, o comando, e como ler o job em código, para QBCore e QBox.

A estrutura

Abra qb-core/shared/jobs.lua. Jobs são entradas na tabela QBShared.Jobs, com chave pelo nome do job. Adicione o seu:

lua
['mechanic'] = {
    label = 'Mechanic',
    defaultDuty = true,
    offDutyPay = false,
    grades = {
        ['0'] = { name = 'Recruit', payment = 50 },
        ['1'] = { name = 'Mechanic', payment = 75 },
        ['2'] = { name = 'Boss', payment = 120, isboss = true },
    },
},

O que cada parte significa:

Campo Significado
Chave (mechanic) O nome do job usado em código e /setjob: lowercase, sem espaços
label O nome que jogadores veem
defaultDuty true se jogadores começam on duty quando recebem o job
offDutyPay true se o job paga mesmo quando o jogador está off duty
grades Os ranks, com chave pelo seu nível
name O nome de exibição do rank
payment O pagamento daquele rank a cada paycheck
isboss true marca o rank como boss rank

Duas regras:

  • Chaves de grade são strings em QBCore: ['0'], ['1']. Comece em '0' sem gaps.
  • Olhe os jobs já no arquivo, como police, e copie sua forma. Alguns jobs carregam um campo extra type que outros scripts usam para agrupá-los, e o arquivo mostra o que sua versão suporta.

Atenção: uma vírgula faltando ou brace em jobs.lua impede qb-core de carregar, e cada script que depende com ele.

Reinicie e defina o job

O core lê o arquivo ao iniciar:

text
restart qb-core

Depois, como um admin, no jogo ou no console:

text
/setjob <player id> mechanic 1

Os valores são o id do jogador, a chave do job e o número de grade. Se o comando é recusado, você não tem permissões de admin: veja ACE permissions for admins.

Leia o job em scripts

No server:

lua
local QBCore = exports['qb-core']:GetCoreObject()

RegisterNetEvent('my_script:doWork', function()
    local src = source
    local Player = QBCore.Functions.GetPlayer(src)
    if not Player then return end

    local job = Player.PlayerData.job
    if job.name ~= 'mechanic' then
        return TriggerClientEvent('QBCore:Notify', src, 'You are not a mechanic', 'error')
    end

    if not job.onduty then
        return TriggerClientEvent('QBCore:Notify', src, 'Go on duty first', 'error')
    end

    -- allowed
end)

Player.PlayerData.job contém name, label, onduty, isboss, payment e uma tabela grade com o name do rank e level. Para o número de rank use job.grade.level.

Para mudar o job de código:

lua
Player.Functions.SetJob('mechanic', 1)

Se QBCore é nil aqui, veja attempt to index a nil value (global 'QBCore').

No cliente

lua
local QBCore = exports['qb-core']:GetCoreObject()
local PlayerData = {}

RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()
    PlayerData = QBCore.Functions.GetPlayerData()
end)

RegisterNetEvent('QBCore:Client:OnJobUpdate', function(job)
    PlayerData.job = job
end)

Ler GetPlayerData().job antes do jogador ter carregado dá nil, então espere por OnPlayerLoaded, e mantenha o job fresco com OnJobUpdate.

Em QBox

O core de QBox é qbx_core, e o arquivo de jobs é qbx_core/shared/jobs.lua. A estrutura é a mesma: um label, defaultDuty, offDutyPay e grades. Abra o arquivo e siga as entradas já nele, já que o arquivo de QBox pode diferir em detalhes como como as chaves de grade são escritas, e novas versões podem adicionar campos.

Reinicie qbx_core após o edit. Para código, a compatibility layer ainda responde exports['qb-core']:GetCoreObject(), e o export próprio de QBox é:

lua
local player = exports.qbx_core:GetPlayer(source)
if player then
    print(player.PlayerData.job.name)
end

Uma grade com isboss = true é apenas a flag. O menu que deixa o boss contratar pessoas e usar a conta da empresa vem do seu resource de management, que usualmente tem sua própria lista de jobs para configurar. Se o menu de boss não abre para seu novo job, verifique aquele resource's config para o nome do job.

Problemas comuns

  • Job não encontrado por /setjob. O core não foi reiniciado, ou a chave está errada.
  • Core falha após o edit. Um erro de sintaxe em jobs.lua. Leia a primeira linha vermelha no console, e how to read a script error ajuda com o arquivo e linha.
  • Pay não é recebido. offDutyPay = false significa que o jogador deve estar on duty, e o intervalo de paycheck vem da config do core.

Checklist

Sintoma Solução
Job não encontrado Adicione a shared/jobs.lua e reinicie qb-core ou qbx_core
Core não vai começar Erro de sintaxe em jobs.lua; verifique vírgulas e braces
Rank errado Chaves de grade são strings começando em '0' em QBCore
Sem pay off duty Defina offDutyPay = true ou vá on duty
Job é nil no cliente Espere por QBCore:Client:OnPlayerLoaded
Sem menu de boss Defina isboss = true e adicione o job ao resource de management

Respostas rápidas

Onde jobs de QBCore são definidos?

Em qb-core/shared/jobs.lua, como entradas de QBShared.Jobs. Em QBox o arquivo é qbx_core/shared/jobs.lua.

Por que /setjob diz que o job não existe?

O core lê o arquivo quando inicia. Reinicie qb-core (ou qbx_core) após o edit, e verifique que o nome do job e o número de grade existem no arquivo.

O que isboss faz?

Marca uma grade como boss grade. Menus de boss e scripts de management checam aquele flag para decidir quem pode contratar, desligar e usar o fundo do job.

Scripts sem esse problema

Advanced BoostingBoosting de veículos pelo tablet: contratos da classe D à S+, crews e fila ao vivo.Ver script →Shop CreatorMonte uma loja em menos de um minuto — donos, funcionários, cofres e assaltos inclusos.Ver script →Pawn Shop AppUma casa de penhores entre jogadores dentro do lb-phone.Ver script →

Continue lendo