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:
ensure oxmysql
ensure ox_lib
ensure qbx_core
ensure ox_inventory
ensure ox_target
ensure my_scriptHerhangi 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
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:
-- 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)
endHer 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 |
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, öğ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:
-- 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')
endMenü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:
-- 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.callbackQBox yoludur. Betik yineQBCore.Functions.CreateCallbackkullanı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_coreyanında başlayan solmuşqb-corekaynağı. - 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 →