ESX betiğini QBCore'a dönüştürün (ve tersine): işlev haritası ve köprü
FiveM betiğini ESX ve QBCore arasında taşıyın: yaygın çağrıların tablosu (oyuncu, para, iş, öğeler, bildirimler, geri aramalar) ve her ikisini destekleyen bir köprü dosyası.
ESX için yazılmış bir betiğiniz var ve sunucunuz QBCore çalıştırır veya tersi. Betiğin çoğu düz Lua ve değişmeyen yerleşikleridir. Yalnızca çerçeve çağrıları değişir ve beklediğinizden daha azı. Bu makale size bunların haritasını verir ve sonra bunları bir köprü dosyasında nasıl yalıtacağını gösterir.
Kalan ve değişen
Yerleşikler, NUI, kendi olaylarınız, döngüleriniz, hedefleriniz ve menüleriniz herhangi bir çerçeve üzerinde çalışır. Değişen kısa bir listedir:
- çerçeve nesnesini nasıl alacağınız
- oyuncuyu nasıl alacağınız
- para, işler ve öğeler
- bildirimler
- kullanılabilir öğeler ve geri aramalar
- oyuncuların veritabanı tabloları
Betikte ESX. ve xPlayer arayın ve her isabet bir şey dönüştürülecektir.
İşlev haritası
| Görev | ESX Legacy | QBCore |
|---|---|---|
| Nesneyi alın | ESX = exports['es_extended']:getSharedObject() |
local QBCore = exports['qb-core']:GetCoreObject() |
| Oyuncuyu alın (sunucu) | ESX.GetPlayerFromId(src) |
QBCore.Functions.GetPlayer(src) |
| Oyuncu tanımlayıcısı | xPlayer.identifier |
Player.PlayerData.citizenid |
| Nakit bakiyesi | xPlayer.getMoney() |
Player.PlayerData.money.cash |
| Nakit ekle | xPlayer.addMoney(n) |
Player.Functions.AddMoney('cash', n) |
| Nakiti kaldır | xPlayer.removeMoney(n) |
Player.Functions.RemoveMoney('cash', n) |
| Banka ekle | xPlayer.addAccountMoney('bank', n) |
Player.Functions.AddMoney('bank', n) |
| Bankayı kaldır | xPlayer.removeAccountMoney('bank', n) |
Player.Functions.RemoveMoney('bank', n) |
| İş adı | xPlayer.job.name |
Player.PlayerData.job.name |
| İş derecesi | xPlayer.job.grade |
Player.PlayerData.job.grade.level |
| Öğe ekle | xPlayer.addInventoryItem(name, n) |
Player.Functions.AddItem(name, n) |
| Öğeyi kaldır | xPlayer.removeInventoryItem(name, n) |
Player.Functions.RemoveItem(name, n) |
| Öğe sayısı | xPlayer.getInventoryItem(name).count |
Player.Functions.GetItemByName(name) (yok ise nil, sonra .amount) |
| Kullanılabilir öğe | ESX.RegisterUsableItem(name, function(src) end) |
QBCore.Functions.CreateUseableItem(name, function(src, item) end) |
| Bildirim (istemci) | ESX.ShowNotification(msg) |
QBCore.Functions.Notify(msg, 'success') |
| Bildirim (sunucu) | xPlayer.showNotification(msg) |
TriggerClientEvent('QBCore:Notify', src, msg, 'success') |
| Oyuncu verileri (istemci) | ESX.GetPlayerData() |
QBCore.Functions.GetPlayerData() |
| Oyuncu yüklenen olayı | esx:playerLoaded |
QBCore:Client:OnPlayerLoaded |
| İş değişen olayı | esx:setJob |
QBCore:Client:OnJobUpdate |
| Sunucu geri araması | ESX.RegisterServerCallback |
QBCore.Functions.CreateCallback |
İki ayrıntı insanları çeledir. Para türleri: ESX nakit ve banka için money var, QBCore ilk argüman olarak 'cash' ve 'bank' kullanır. Ve derece: ESX düz sayı verir, QBCore tablo verir, bu nedenle job.grade.level.
Geri aramalar, her ikinci betik kullanan, ESX'de sunucu geri aramaları, QBCore ve ox_lib içinde ayrıntılı olarak karşılaştırılır.
Veritabanı
Oyuncu tabloları farklıdır, bu nedenle bunlar üzerinde herhangi bir SELECT veya UPDATE değişiklik gerekir:
| ESX | QBCore | |
|---|---|---|
| Oyuncular | users |
players |
| Oyuncu anahtarı | identifier (license: dizesi) |
citizenid |
| Otolar | owned_vehicles |
player_vehicles |
Kendi verilerine kendi tabloları ile depolayan bir betik, genellikle çalışmaya devam eder; satırları her iki çerçeveden de alabileceğiniz bir değerde anahtarlayın. Bunun için lisans tanımlayıcısını kullanmak her iki çerçevede de çalışır.
QBox
QBox, ESX'den QBCore'a daha yakındır. Çekirdeği qbx_core, exports['qb-core']:GetCoreObject() için bir uyumluluk katmanı tutar ve envanteri ox_inventory'dir. QBCore'a dönüştürülmüş bir betik, envanter çağrıları dışında QBox'ta az değişiklikle çalışır.
Köprü dosyası yaklaşımı
Betik her ikisinde de çalışmalıysa, if ESX then ... else ... end ile onu kirletmeyin. Her çerçeve çağrısını bir dosyaya koyun ve betiğin geri kalanı o dosyayı çağırsın.
-- bridge.lua (server)
Bridge = {}
local framework
if GetResourceState('es_extended') == 'started' then
framework = 'esx'
ESX = exports['es_extended']:getSharedObject()
elseif GetResourceState('qb-core') == 'started' then
framework = 'qb'
QBCore = exports['qb-core']:GetCoreObject()
end
function Bridge.GetPlayer(src)
if framework == 'esx' then return ESX.GetPlayerFromId(src) end
return QBCore.Functions.GetPlayer(src)
end
function Bridge.AddCash(src, amount)
local player = Bridge.GetPlayer(src)
if not player then return false end
if framework == 'esx' then
player.addMoney(amount)
else
player.Functions.AddMoney('cash', amount)
end
return true
end
function Bridge.GetJob(src)
local player = Bridge.GetPlayer(src)
if not player then return nil end
if framework == 'esx' then
return player.job.name, player.job.grade
end
return player.PlayerData.job.name, player.PlayerData.job.grade.level
endManifestte, bunu kullanan dosyalardan önce yükleyin:
server_scripts {
'bridge.lua',
'server.lua',
}Betik daha sonra şöyle okur ve hiçbir zaman bir çerçeveden bahsetmez:
RegisterNetEvent('my_script:pay', function()
local src = source
local job = Bridge.GetJob(src)
if job == 'mechanic' then
Bridge.AddCash(src, 100)
end
end)Bildirimler ve oyuncu verileri için aynı şekilde istemci köprüsü ekleyin. QBox gibi qbx_core ile yeni bir çerçeve eklediğinizde, köprüye bir dal eklersiniz ve betik olduğu gibi kalır.
Köprünün yalnızca çerçeve ilk başlatılırsa çalıştığını unutmayın. server.cfg içinde ensure es_extended veya ensure qb-core betiğin üstüne koyun ve nesne nil geri gelirse ESX nil okuyun.
Kontrol Listesi
| Semptom | Çözüm |
|---|---|
QBCore'da attempt to index a nil value (global 'ESX') |
Bir ESX çağrısı kaldı; yukarıdaki haritadan değiştirin |
| Para veya iş daima nil | ESX'de PlayerData veya QBCore'da xPlayer.job okursunuz |
| QBCore'da öğe sayısı hataları | GetItemByName, oyuncunun hiçbiri olmadığında nil döndürür; önce kontrol edin |
| Sorguda yanlış tablo | ESX'de users ve identifier, QBCore'da players ve citizenid |
| Geri arama hiçbir şey döndürmez | Çerçeve için eşleşen kayıt ve tetikleyici çağrıları kullanın |
| Her iki çerçeveyi gerekli | Her çerçeve çağrısını bir köprü dosyasına taşıyın |
Kısa yanıtlar
Herhangi bir ESX betiğini QBCore'a dönüştürebilir miyim?
Çerçeve için yalnızca oyuncuları, parayı, işleri, öğeleri ve bildirimleri kullankan betikler iyi dönüşürler. Esx_society veya qb-management gibi çerçeveye özgü kaynaklar etrafında inşa edilen betikler de bu bölümleri yeniden yazması gerekir.
Çerçeveyi değiştirdiğimde veritabanı değişir mi?
Evet. ESX oyuncuları identifier ile users içinde depolar ve QBCore citizenid ile players içinde. Betiğin sorgularında ve tablo adlarında çalıştırdığınız çerçeveyi takip etmelidir.
Köprü dosyası dönüştürmekten daha iyi mi?
Betiğin her iki çerçevede çalışması gerekiyorsa, evet: tüm betiği değil, bir dosyayı değiştirirsiniz. Yalnızca bir çerçeve çalıştırıyorsanız, bir kez dönüştürün ve diğer dalı bırakın.
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 →
Advanced BoostingTabletten araç boosting: D’den S+ sınıfına kontratlar, ekipler ve canlı sıra.Scripti gör →