Converti uno script QBCore a QBox: qbx_core, ox_inventory, ox_target

Come portare uno script QBCore a QBox: il livello di compatibilità qbx_core, GetPlayer, articoli ox_inventory, notifiche e progress di ox_lib, ox_target, e cosa di solito si rompe.

Hai uno script scritto per QBCore e un server che esegue QBox. A volte si avvia e funziona, a volte la console si riempie di errori su un mancante qb-inventory, qb-target o qb-menu. Ecco l'ordine per portarlo, e i posti dove di solito si rompe.

Se stai ancora scegliendo un core, lo stesso lavoro dall'altra direzione è in converti uno script ESX a QBCore.

Cosa QBox cambia e cosa mantiene

QBox è costruito su qbx_core più le risorse Overextended: ox_lib, oxmysql, ox_inventory e ox_target. Mantiene un livello di compatibilità, quindi exports['qb-core']:GetCoreObject() continua a rispondere e PlayerData ha la stessa forma (citizenid, job, charinfo, metadata, money). Ecco perché molti script vengono eseguiti senza modifiche.

Quello che non mantiene sono le vecchie risorse di utilità QB. Dove QBCore usava qb-inventory, qb-target, qb-menu, qb-input e qb-progressbar, QBox si aspetta ox_inventory, ox_target e ox_lib. Quelli sono i pezzi che porti.

Il primo passo è assicurarsi che il core sia avviato correttamente:

cfg
ensure oxmysql
ensure ox_lib
ensure qbx_core
ensure ox_inventory
ensure ox_target
ensure my_script

Rimuovi qualsiasi cartella qb-core rimasta, poiché due core sono in conflitto. Vedi QBCore is nil: GetCoreObject se l'oggetto è mancante.

Passaggio 1: dipendenze nel manifest

lua
fx_version 'cerulean'
game 'gta5'
lua54 'yes'

shared_script '@ox_lib/init.lua'

dependencies { 'qbx_core', 'ox_lib', 'ox_inventory', 'ox_target' }

@ox_lib/init.lua è ciò che ti dà il globale lib. Se non viene trovato, vedi ox_lib init.lua not found.

Passaggio 2: ottenere il giocatore

Entrambi questi funzionano su QBox. Il primo è lo stile di compatibilità, il secondo è il modo QBox:

lua
-- QBCore style (still works through the compatibility layer)
local QBCore = exports['qb-core']:GetCoreObject()
local Player = QBCore.Functions.GetPlayer(source)

-- QBox style
local player = exports.qbx_core:GetPlayer(source)
if player then
    print(player.PlayerData.citizenid, player.PlayerData.job.name)
end

Entrambi restituiscono nil per un giocatore non caricato, quindi mantieni il controllo nil. Per trovare un giocatore caricato per citizen id, QBox ha anche GetPlayerByCitizenId. Quando porti, puoi lasciare le chiamate QBCore in posizione e sostituirle una ad una dopo.

Passaggio 3: inventario

Questo è dove la maggior parte degli script si rompe. qb-inventory e ox_inventory non condividono definizioni di articoli o nomi di funzioni.

Attività QBCore QBox con ox_inventory
Aggiungi un articolo Player.Functions.AddItem('water', 1) exports.ox_inventory:AddItem(source, 'water', 1)
Rimuovi un articolo Player.Functions.RemoveItem('water', 1) exports.ox_inventory:RemoveItem(source, 'water', 1)
Conteggio Player.Functions.GetItemByName('water').amount exports.ox_inventory:GetItemCount(source, 'water')
Metadati tabella info tabella metadata
lua
local src = source
local ok = exports.ox_inventory:AddItem(src, 'water', 2, { quality = 100 })
if not ok then
    lib.notify(src, { description = 'Your inventory is full', type = 'error' })
end

AddItem restituisce un valore falsy quando l'articolo non esiste o non può essere portato, quindi controllalo. Anche le definizioni degli articoli si muovono. QBCore le tiene in qb-core/shared/items.lua, ox_inventory in ox_inventory/data/items.lua. Aggiungi ogni articolo che lo script usa lì, nel formato di ox_inventory. Come fare è in aggiungi articoli a ox_inventory, e il formato QBCore da cui vieni è in aggiungi articoli a qb-inventory.

Gli articoli usabili vengono registrati diversamente anche: QBCore.Functions.CreateUseableItem diventa un export impostato nella definizione dell'articolo in ox_inventory, che punta a una funzione nel tuo script. Le chiamate QBCore potrebbero ancora funzionare attraverso il livello di compatibilità, quindi testa un articolo prima di riscriverlo.

Passaggio 4: notifiche, progress e menu con ox_lib

ox_lib sostituisce le risorse di utilità QB separate. Le chiamate sono vicine a quello che conosci:

lua
-- QBCore
QBCore.Functions.Notify('Done', 'success', 5000)

-- ox_lib (client)
lib.notify({ title = 'Job', description = 'Done', type = 'success', duration = 5000 })
lua
-- QBCore: QBCore.Functions.Progressbar(...) with a callback
-- ox_lib: returns true when completed, false when cancelled
if lib.progressBar({
    duration = 5000,
    label = 'Repairing',
    useWhileDead = false,
    canCancel = true,
    disable = { car = true, move = true },
    anim = { dict = 'mini@repair', clip = 'fixing_a_ped' },
}) then
    print('finished')
else
    print('cancelled')
end

I menu si spostano da qb-menu a lib.registerContext e lib.showContext, e i moduli di input da qb-input a lib.inputDialog. Gli esempi completi sono in notifiche e barre di progress su ESX, QBCore e ox_lib e menu di contesto di ox_lib.

Passaggio 5: ox_target invece di qb-target

qb-target prende un nome, coordinate e una tabella di opzioni nel suo layout. ox_target prende una tabella:

lua
-- qb-target
exports['qb-target']:AddBoxZone('my_zone', vector3(215.0, -810.0, 30.7), 1.5, 1.5, {
    name = 'my_zone', heading = 0, minZ = 29.7, maxZ = 32.7,
}, {
    options = { { event = 'my_script:client:open', icon = 'fas fa-box', label = 'Open', job = 'police' } },
    distance = 2.0,
})

-- ox_target
exports.ox_target:addBoxZone({
    coords = vector3(215.0, -810.0, 30.7),
    size = vector3(1.5, 1.5, 3.0),
    rotation = 0,
    options = {
        { name = 'my_zone_open', icon = 'fas fa-box', label = 'Open', groups = 'police',
          onSelect = function() TriggerEvent('my_script:client:open') end },
    },
})

Nota che event diventa onSelect (o event funziona ancora per un evento client), e job diventa groups. I dettagli sono in qb-target vs ox_target e zone di ox_target.

Cosa di solito si rompe

  • Errori di articoli mancanti. L'articolo esiste nel file condiviso di qb-core ma non in quello di ox_inventory. Aggiungilo.
  • No such export per qb-inventory, qb-target o qb-menu. Lo script li chiama direttamente: porta quelle chiamate, o non funzionerà mai.
  • Callback. lib.callback è lo stile QBox. Se uno script usa ancora QBCore.Functions.CreateCallback, testalo e spostalo a ox_lib se fallisce: vedi server callbacks.
  • Lavori e gang con gradi. QBox ha i suoi dati di lavoro e di gruppo. Testa ogni controllo di lavoro, specialmente on-duty e confronti di gradi.
  • Core misti. Una risorsa qb-core rimasta avviata accanto a qbx_core.
  • Ordine di avvio. Il tuo script sopra ox_lib, ox_inventory o qbx_core in server.cfg.

Checklist

Sintomo Soluzione
GetCoreObject è nil Avvia qbx_core per primo e rimuovi qualsiasi cartella qb-core
No such export per qb-inventory Usa exports.ox_inventory:AddItem(source, item, count)
Articolo non trovato Aggiungilo a ox_inventory/data/items.lua
Le chiamate qb-target falliscono Porta a exports.ox_target:addBoxZone o addLocalEntity
lib è nil Aggiungi shared_script '@ox_lib/init.lua'
Il controllo del lavoro è sempre falso Testa PlayerData.job.name e grado su QBox

Risposte rapide

Gli script QBCore funzionano su QBox senza cambiamenti?

Molti lo fanno, perché qbx_core mantiene un livello di compatibilità per qb-core. Gli script che dipendono da qb-inventory, qb-target o qb-menu di solito hanno bisogno di lavoro, poiché QBox usa ox_inventory, ox_target e ox_lib invece.

Come ottengo il giocatore su QBox?

Sul server, exports.qbx_core:GetPlayer(source) restituisce il giocatore, con la stessa tabella PlayerData che conosci da QBCore.

Devo riscrivere tutto per passare a QBox?

No. Avvia lo script su QBox, leggi gli errori, e sostituisci i pezzi che falliscono: inventario, target, menu e notifiche. Il resto, come PlayerData, lavori e metadati, mantiene la sua forma.

Script senza questo problema

Item Creator V2Crea oggetti utilizzabili con animazioni, props, effetti e altro — senza scrivere codice.Vedi script →Shop CreatorCrea un negozio in meno di un minuto — proprietari, dipendenti, casseforti e rapine inclusi.Vedi script →Quest CreatorUn editor visuale di missioni e dialoghi con gli NPC, costruito nodo per nodo in gioco.Vedi script →

Continua a leggere