Come aggiungere un job su QBCore: shared/jobs.lua, gradi e /setjob
Aggiungi un job personalizzato a QBCore o QBox: la struttura shared/jobs.lua con defaultDuty, offDutyPay e gradi, il comando /setjob, e leggere Player.PlayerData.job.
Su QBCore un job è un blocco in un file Lua, non una riga nel database. Aggiungi il blocco, riavvia il core, e imposta il job su un giocatore. Questa guida mostra la struttura, il comando, e come leggere il job nel codice, per QBCore e QBox.
La struttura
Apri qb-core/shared/jobs.lua. I job sono entry nella tabella QBShared.Jobs, con chiave del nome del job. Aggiungi il tuo:
['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 },
},
},Cosa significa ogni parte:
| Campo | Significato |
|---|---|
Chiave (mechanic) |
Il nome del job usato nel codice e /setjob: minuscolo, senza spazi |
label |
Il nome che i giocatori vedono |
defaultDuty |
true se i giocatori iniziano in servizio quando ottengono il job |
offDutyPay |
true se il job paga anche quando il giocatore è fuori servizio |
grades |
I ranghi, con chiave del loro livello |
name |
Il nome di visualizzazione del rango |
payment |
Lo stipendio di quel rango ad ogni pagamento |
isboss |
true marca il rango come un rango di boss |
Due regole:
- Le chiavi di grado sono stringhe su QBCore:
['0'],['1']. Inizia a'0'senza lacune. - Guarda i job già nel file, come
police, e copia la loro forma. Alcuni job portano un campotypeextra che altri script usano per raggrupparli, e il file mostra cosa la tua versione supporta.
Attenzione: una virgola o una parentesi mancante in
jobs.luaferma qb-core dal caricamento, e ogni script che dipende da esso con esso.
Riavvia e imposta il job
Il core legge il file all'avvio:
restart qb-corePoi, come admin, nel gioco o la console:
/setjob <player id> mechanic 1I valori sono l'id del giocatore, la chiave del job e il numero di grado. Se il comando è rifiutato, non hai permessi di admin: vedi permessi ACE per admin.
Leggi il job negli script
Sul server:
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 contiene name, label, onduty, isboss, payment e una tabella grade con il name e level del rango. Per il numero di rango usa job.grade.level.
Per cambiare il job dal codice:
Player.Functions.SetJob('mechanic', 1)Se QBCore è nil qui, vedi tentativo di indicizzare un valore nil (globale 'QBCore').
Sul client
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)Leggere GetPlayerData().job prima che il giocatore abbia caricato dà nil, quindi aspetta OnPlayerLoaded, e mantieni il job fresco con OnJobUpdate.
Su QBox
Il core di QBox è qbx_core, e il file jobs è qbx_core/shared/jobs.lua. La struttura è la stessa: un label, defaultDuty, offDutyPay e grades. Apri il file e segui le entry già in esso, poiché il file di QBox può differire nei dettagli come le chiavi di grado sono scritte, e le nuove versioni possono aggiungere campi.
Riavvia qbx_core dopo la modifica. Per il codice, il livello di compatibilità ancora risponde a exports['qb-core']:GetCoreObject(), e l'export proprio di QBox è:
local player = exports.qbx_core:GetPlayer(source)
if player then
print(player.PlayerData.job.name)
endMenu di boss e fondi
Un grado con isboss = true è solo il flag. Il menu che lascia il boss assumere persone e usare l'account dell'azienda viene dalla tua risorsa di gestione, che di solito ha la sua lista di job da configurare. Se il menu di boss non si apre per il tuo nuovo job, controlla quella risorsa's config per il nome del job.
Problemi comuni
- Job non trovato da
/setjob. Il core non è stato riavviato, o la chiave è scritta male. - Il core fallisce dopo la modifica. Un errore di sintassi in
jobs.lua. Leggi la prima riga rossa nella console, e come leggere un errore di script aiuta con il file e la riga. - Lo stipendio non viene ricevuto.
offDutyPay = falsesignifica che il giocatore deve essere in servizio, e l'intervallo di pagamento viene dalla config del core.
Checklist
| Sintomo | Soluzione |
|---|---|
| Job non trovato | Aggiungilo a shared/jobs.lua e riavvia qb-core o qbx_core |
| Il core non si avvia | Errore di sintassi in jobs.lua; controlla le virgole e le parentesi |
| Rango sbagliato | Le chiavi di grado sono stringhe che iniziano a '0' su QBCore |
| Nessun pagamento fuori servizio | Imposta offDutyPay = true o vai in servizio |
| Il job è nil sul client | Aspetta QBCore:Client:OnPlayerLoaded |
| Nessun menu di boss | Imposta isboss = true e aggiungi il job alla risorsa di gestione |
Risposte rapide
Dove sono definiti i job di QBCore?
In qb-core/shared/jobs.lua, come entry di QBShared.Jobs. Su QBox il file è qbx_core/shared/jobs.lua.
Perché /setjob dice che il job non esiste?
Il core legge il file quando si avvia. Riavvia qb-core (o qbx_core) dopo la modifica, e controlla che il nome del job e il numero di grado esistano nel file.
Cosa fa isboss?
Marca un grado come grado di boss. I menu di boss e gli script di gestione controllano quel flag per decidere chi può assumere, licenziare e usare i fondi dell'azienda.
Script senza questo problema
Advanced BoostingBoosting di veicoli dal tablet: contratti dalla classe D alla S+, crew e coda in tempo reale.Vedi script →
Shop CreatorCrea un negozio in meno di un minuto — proprietari, dipendenti, casseforti e rapine inclusi.Vedi script →
Pawn Shop AppUn banco dei pegni tra giocatori dentro lb-phone.Vedi script →