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.

lua
-- 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
end

Manifestte, bunu kullanan dosyalardan önce yükleyin:

lua
server_scripts {
    'bridge.lua',
    'server.lua',
}

Betik daha sonra şöyle okur ve hiçbir zaman bir çerçeveden bahsetmez:

lua
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 →

Okumaya devam edin