FiveM bildirimler ve ilerleme çubukları: ESX, QBCore ve ox_lib

ESX, QBCore ve ox_lib üzerinde ShowNotification, Functions.Notify, lib.notify ve lib.progressBar ile bildirimler gönderme ve ilerleme çubukları gösterme, artı bir köprü işlevi.

Her çerçevenin bir mesaj veya ilerleme çubuğu göstermenin kendi yolu vardır ve bir tanesi için yazılmış bir betik diğerinde başarısız olur:

text
attempt to index a nil value (global 'lib')

Bu makale ESX, QBCore ve ox_lib için bildirimler ve ilerleme çubukları için çağrıları listeler, ardından betiğinizin sunucunun çalıştırdığı hangisinde çalışmasını sağlayacak tek bir köprü işlevini gösterir.

ESX'de Bildirimler

İstemci'de:

lua
ESX.ShowNotification('You picked up a package')

Sunucu'da, oyuncu nesnesinden:

lua
local xPlayer = ESX.GetPlayerFromId(source)
xPlayer.showNotification('Your order is ready')

Buradaki ESX ESX = exports['es_extended']:getSharedObject() nesnesidir. Son ESX sürümleri metin sonrasında bir tür ve süre de kabul eder. Bunlara güveniyorsanız, sürümünüzde test edin.

QBCore'da Bildirimler

İstemci'de:

lua
local QBCore = exports['qb-core']:GetCoreObject()

QBCore.Functions.Notify('You picked up a package', 'success', 5000)

Tür 'primary', 'success' veya 'error''dır ve son değer milisaniye cinsinden süredir. Sunucu'dan, olayı oyuncuya gönderin:

lua
TriggerClientEvent('QBCore:Notify', source, 'Your order is ready', 'success')

QBox'ta aynı QBCore çağrıları uyumluluk katmanı aracılığıyla çalışmaya devam eder ve ox_lib bildirimleri iyi bir alternatiftir.

ox_lib ile Bildirimler

ox_lib'nin kendi bildirimi vardır ve her çerçevede aynı şekilde çalışır. İstemci'de:

lua
lib.notify({
    title = 'Delivery',
    description = 'You picked up a package',
    type = 'success',
    duration = 5000,
})

Tür 'inform', 'success', 'warning' veya 'error''dır. Sunucu'dan, olayı oyuncuda tetikleyin:

lua
TriggerClientEvent('ox_lib:notify', source, {
    title = 'Delivery',
    description = 'Your order is ready',
    type = 'success',
})

lib global'ı, ox_lib bağlam menüsü rehberi'nde açıklandığı gibi, fxmanifest.lua'da shared_script '@ox_lib/init.lua''ye ihtiyaç duyar. Olmadan yukarıda lib nil hatası alırsınız.

İlerleme Çubukları

ox_lib ile, ilerleme çubuğu bekleyen ve bitip bitmediğini döndüren bir çağrıdır:

lua
if lib.progressBar({
    duration = 5000,
    label = 'Repairing the engine',
    useWhileDead = false,
    canCancel = true,
    disable = {
        move = true,
        car = true,
        combat = true,
    },
    anim = {
        dict = 'mini@repair',
        clip = 'fixing_a_ped',
    },
}) then
    print('finished')
else
    print('cancelled')
end

lib.progressCircle aynı seçenekleri alır ve bir çubuk yerine bir daire gösterir. Her ikisi de oyuncuya bir prop ekleyebilir.

QBCore'un versiyonu beklemek yerine bir geri arama kullanır:

lua
QBCore.Functions.Progressbar('repair_engine', 'Repairing the engine', 5000, false, true, {
    disableMovement = true,
    disableCarMovement = true,
    disableMouse = false,
    disableCombat = true,
}, {
    animDict = 'mini@repair',
    anim = 'fixing_a_ped',
    flags = 49,
}, {}, {}, function()
    print('finished')
end, function()
    print('cancelled')
end)

Argümanlar, sırasıyla: bir ad, etiket, süre, useWhileDead, canCancel, devre dışı bırakılan kontroller, animasyon, iki destek, ardından bitir ve iptal geri aramaları. ESX'in her sunucunun paylaştığı kendi ilerleme çubuğu yoktur, bu nedenle ESX'de lib.progressBar kullanın.

Hepsi için bir köprü işlevi

Betiklerinizi çerçeve gerektirmeme durumunu tutmak için, çerçeve ayrıntısını bir kez yazın ve kendi işlevlerinizi her yerde çağırın. Bunu bir istemci dosyasına koyun:

lua
local function started(name)
    return GetResourceState(name) == 'started'
end

function Notify(message, notifyType)
    notifyType = notifyType or 'inform'

    if started('ox_lib') then
        lib.notify({ description = message, type = notifyType })
    elseif started('qb-core') then
        local qbType = notifyType == 'inform' and 'primary' or notifyType
        exports['qb-core']:GetCoreObject().Functions.Notify(message, qbType)
    elseif started('es_extended') then
        exports['es_extended']:getSharedObject().ShowNotification(message)
    else
        print(message)
    end
end

-- returns true when finished, false when cancelled
function Progress(label, duration)
    if started('ox_lib') then
        return lib.progressBar({
            duration = duration,
            label = label,
            canCancel = true,
            disable = { move = true, car = true },
        })
    end

    local p = promise.new()
    exports['qb-core']:GetCoreObject().Functions.Progressbar('bridge_progress', label, duration, false, true, {
        disableMovement = true,
        disableCarMovement = true,
    }, {}, {}, {}, function() p:resolve(true) end, function() p:resolve(false) end)
    return Citizen.Await(p)
end

Şimdi betiğiniz yalnızca Notify('Done', 'success') ve Progress('Working', 5000) çağırır. ox_lib kuruluysa, önce kullanılır. Aksi takdirde QBCore kullanılır ve bildirimler ESX'e geri döner.

Geri dönüş ilerleme çubuğu yalnızca QBCore'u kapsar. ne ox_lib'i ne de QBCore'u olmayan bir sunucuda, kendi dalınızı ekleyin veya ox_lib'i dependency 'ox_lib' ile gerekli bir bağımlılık yapın.

İpucu: Sunucu'da yukarıdaki bölümlerden sunucu çağrılarını kullanarak bir NotifyPlayer(source, message, type) işlevi ile aynı şeyi yapın. Bundan sonra başka hiçbir dosyaya hangi çerçevenin çalıştığını bilmesi gerekmez.

Kontrol Listesi

Belirti Çözüm
attempt to index a nil value (global 'lib') shared_script '@ox_lib/init.lua' ekleyin ve ox_lib'i ilk olarak başlatın
Sunucu bildirimi hiçbir şey yapmaz İstemci olayını oyuncunun source'u ile ikinci argüman olarak tetikleyin
QBCore bildirimi rengi yok Geçerli bir tür kullanın: 'primary', 'success' veya 'error'
İlerleme çubuğu işlevin geri kalanını bloke eder lib.progressBar bekler: bunu bir iş parçacığında veya işleyicide çalıştırın
Oyuncu çubuk sırasında yürüyebilir disable (ox_lib) veya disableMovement (QBCore) ayarlayın
Betik ESX ve QBCore üzerinde çalışmalıdır Köprü işlevlerini kullanın ve yalnızca onları çağırın

Kısa yanıtlar

Sunucudan nasıl bildirim gönderirim?

ESX'de xPlayer.showNotification(msg) kullanın. QBCore'da TriggerClientEvent('QBCore:Notify', source, msg, 'success') kullanın. ox_lib ile TriggerClientEvent('ox_lib:notify', source, { description = msg, type = 'success' }) kullanın.

lib.progressBar betiği bloke mi eder?

Evet. Çubuk bitene kadar bekler ve true döndürür veya oyuncu iptal ettiyse false döndürür. Bunu bir iş parçacığında veya olay işleyicisinde çalıştırın, beklemesi gereken bir yerde değil.

lib.notify çağırdığımda lib neden nil'dir?

Bildiriminiz shared_script '@ox_lib/init.lua''yi eksik bıraktı veya ox_lib kaynağınızdan önce başlatılmadı.

Bu sorunu yaşatmayan scriptler

Quest CreatorGörevler ve NPC diyalogları için oyun içinde düğüm düğüm kurulan görsel editör.Scripti gör →Advanced BoostingTabletten araç boosting: D’den S+ sınıfına kontratlar, ekipler ve canlı sıra.Scripti gör →Mic PhoneTablete dönüşen katlanabilir bir telefon; oyuncunun gerçek telefonuna da taşınır.Scripti gör →

Okumaya devam edin