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:
ensure oxmysql
ensure ox_lib
ensure qbx_core
ensure ox_inventory
ensure ox_target
ensure my_scriptRimuovi 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
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:
-- 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)
endEntrambi 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 |
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' })
endAddItem 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:
-- QBCore
QBCore.Functions.Notify('Done', 'success', 5000)
-- ox_lib (client)
lib.notify({ title = 'Job', description = 'Done', type = 'success', duration = 5000 })-- 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')
endI 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:
-- 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 exportper 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 ancoraQBCore.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-corerimasta avviata accanto aqbx_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 →