QBCore betiğini QBox'a dönüştürün: qbx_core, ox_inventory, ox_target

QBCore betiğini QBox'a nasıl taşıyın: qbx_core uyumluluk katmanı, GetPlayer, ox_inventory öğeleri, ox_lib bildir ve ilerleme, ox_target ve genellikle ne kırılır.

QBCore için yazılmış bir betiğiniz ve QBox çalıştıran bir sunucunuz var. Bazen başlar ve çalışır, bazen konsol qb-inventory, qb-target veya qb-menu'nün eksik olması hakkında hatalarla doluyor. İşte bunu taşımanız gereken sıra ve genellikle nerede kırıldığı.

Henüz çekirdek seçiyorsanız, diğer yöndeki aynı iş, ESX betiğini QBCore'a dönüştürün içindedir.

QBox'un değiştirdiği ve tuttuğu

QBox, qbx_core artı Overextended kaynakları: ox_lib, oxmysql, ox_inventory ve ox_target üzerine kurulmuştur. Bir uyumluluk katmanı tutarsa, exports['qb-core']:GetCoreObject() yine yanıt verir ve PlayerData aynı şekle sahiptir (citizenid, job, charinfo, metadata, money). Bu yüzden birçok betik dokunulmadan çalışır.

Tutmadığı eski QB yardımcı kaynakları. QBCore qb-inventory, qb-target, qb-menu, qb-input ve qb-progressbar kullandığında, QBox ox_inventory, ox_target ve ox_lib bekler. Bunlar taşıdığınız parçalardır.

İlk adım çekirdeğin doğru başladığından emin olmaktır:

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

Herhangi bir solmuş qb-core klasörünü kaldırın, çünkü iki çekirdek çatışır. Nesne eksikse QBCore nil'dir: GetCoreObject bölümüne bakın.

Adım 1: manifestte bağımlılıklar

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, lib global'inin ne verdiğidir. Bulunmazsa, ox_lib init.lua bulunmadı bölümüne bakın.

Adım 2: oyuncuyu almak

Her ikisi QBox'ta çalışır. İlki uyumluluk stili, ikincisi QBox yoludur:

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

Her ikisi de yüklenmeyen oyuncu için nil döndürür, bu nedenle nil kontrol tutun. Yürütülen bir oyuncuyu vatandaş kimliğine göre bulmak için QBox'un GetPlayerByCitizenId'si de vardır. Taşıdığında, QBCore çağrılarını yerinde tutabilir ve daha sonra tek tek değiştirebilirsiniz.

Adım 3: envanter

Çoğu betik burada kırılır. qb-inventory ve ox_inventory, öğe tanımlarını veya işlev adlarını paylaşmaz.

Görev QBCore ox_inventory ile QBox
Öğe ekle Player.Functions.AddItem('water', 1) exports.ox_inventory:AddItem(source, 'water', 1)
Öğeyi kaldır Player.Functions.RemoveItem('water', 1) exports.ox_inventory:RemoveItem(source, 'water', 1)
Sayı Player.Functions.GetItemByName('water').amount exports.ox_inventory:GetItemCount(source, 'water')
Meta veriler info tablosu metadata tablosu
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, öğe yoksa veya taşınamıyorsa yanlış bir değer döndürür, böylece kontrol edin. Öğe tanımları da hareket eder. QBCore qb-core/shared/items.lua içinde, ox_inventory ox_inventory/data/items.lua'da tutar. Betiğin ox_inventory'nin formatında kullandığı her öğeyi oraya ekleyin. Bunu yapmak nasıl ox_inventory'ye öğeler ekleyin ve gelmekte olduğunuz QBCore formatı qb-inventory'ye öğeler ekleyin içindedir.

Kullanılabilir öğeler de farklı şekilde kaydedilir: QBCore.Functions.CreateUseableItem, ox_inventory'deki öğenin tanımında ayarlanmış bir export olur ve betiğinizdeki bir işlevi gösterir. QBCore çağrıları hala uyumluluk katmanı aracılığıyla çalışabilir, bu nedenle yeniden yazmadan önce bir öğeyi test edin.

Adım 4: ox_lib ile bildirimler, ilerleme ve menüler

ox_lib, ayrı QB yardımcı kaynaklarının yerini alır. Çağrılar bildiğiniz şeye yakındır:

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

Menüler qb-menu'den lib.registerContext ve lib.showContext'e, giriş formları qb-input'tan lib.inputDialog'a hareket eder. Tam örnekler ESX, QBCore ve ox_lib üzerinde bildirimler ve ilerleme çubukları ve ox_lib bağlam menüleri içindedir.

Adım 5: qb-target yerine ox_target

qb-target, bir ad, koordinatlar ve kendi düzenindeki bir seçenek tablosu alır. ox_target bir tablo alır:

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 },
    },
})

event (veya event bir istemci olayı için yine de çalışır) onSelect ve job groups olur. Ayrıntılar qb-target vs ox_target ve ox_target bölgeleri içindedir.

Genellikle kırılan

  • Eksik öğe hataları. Öğe qb-core'un paylaşılan dosyasında var ama ox_inventory'de yok. Ekleyin.
  • qb-inventory, qb-target veya qb-menu için Böyle dışa aktarım yok. Betik onları doğrudan çağırır: bu çağrıları taşıyın, yoksa hiçbir zaman çalışmaz.
  • Geri aramalar. lib.callback QBox yoludur. Betik yine QBCore.Functions.CreateCallback kullanıyorsa, test edin ve başarısız olursa ox_lib'e taşıyın: bkz. sunucu geri aramaları.
  • Dereceli işler ve çeteler. QBox'un kendi iş ve grup verileri vardır. Her iş kontrolünü test edin, özellikle nöbet ve derece karşılaştırmaları.
  • Karışık çekirdekler. qbx_core yanında başlayan solmuş qb-core kaynağı.
  • Başlama sırası. server.cfg'de ox_lib, ox_inventory veya qbx_core'un üstündeki betiğiniz.

Kontrol Listesi

Semptom Çözüm
GetCoreObject nil'dir qbx_core önce başlatın ve herhangi bir qb-core klasörünü kaldırın
qb-inventory için Böyle dışa aktarım yok exports.ox_inventory:AddItem(source, item, count) kullanın
Öğe bulunamadı ox_inventory/data/items.lua dosyasına ekleyin
qb-target çağrıları başarısız exports.ox_target:addBoxZone veya addLocalEntity'ye taşıyın
lib nil'dir shared_script '@ox_lib/init.lua' ekleyin
İş kontrolü daima yanlış QBox'ta PlayerData.job.name ve derecesi test edin

Kısa yanıtlar

QBCore betikleri değişiklik olmadan QBox'ta çalışır mı?

Çoğu çalışırsa qbx_core qb-core için uyumluluk katmanı tutarsa. qb-inventory, qb-target veya qb-menu'ye bağlı betikler genellikle QBox ox_inventory, ox_target ve ox_lib kullandığı için iş gerektirir.

QBox'ta oyuncuyu nasıl alırım?

Sunucuda, exports.qbx_core:GetPlayer(source) QBCore'dan bildiğiniz aynı PlayerData tablosu ile oyuncuyu döndürür.

QBox'a taşınmak için her şeyi yeniden yazmalı mıyım?

Hayır. Betiği QBox'ta başlatın, hataları okuyun ve başarısız olan parçaları değiştirin: envanter, hedef, menüler ve bildirimler. Geri kalanı; PlayerData, işler ve meta veriler, şeklini tutar.

Bu sorunu yaşatmayan scriptler

Item Creator V2Animasyonlar, proplar, efektler ve daha fazlasıyla kullanılabilir eşyalar oluşturun — kod yazmadan.Scripti gör →Shop CreatorBir dakikadan kısa sürede dükkân kurun — sahipler, çalışanlar, kasalar ve soygunlar dahil.Scripti gör →Quest CreatorGörevler ve NPC diyalogları için oyun içinde düğüm düğüm kurulan görsel editör.Scripti gör →

Okumaya devam edin