Notifiche e barre di progresso in FiveM: ESX, QBCore e ox_lib

Invia notifiche e mostra barre di progresso su ESX, QBCore e ox_lib con ShowNotification, Functions.Notify, lib.notify e lib.progressBar, più una funzione bridge.

Ogni framework ha il suo modo di mostrare un messaggio o una barra di progresso, e uno script scritto per uno fallisce su un altro:

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

Questo articolo elenca le chiamate per ESX, QBCore e ox_lib, per le notifiche e per le barre di progresso, poi mostra una singola funzione bridge in modo che il tuo script funzioni su qualsiasi uno il server esegua.

Notifiche su ESX

Sul client:

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

Sul server, dall'oggetto del giocatore:

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

ESX qui è l'oggetto da ESX = exports['es_extended']:getSharedObject(). Le versioni ESX recenti accettano anche un tipo e una durata dopo il testo. Se fai affidamento su di essi, fai un test sulla tua versione.

Notifiche su QBCore

Sul client:

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

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

Il tipo è 'primary', 'success' o 'error', e l'ultimo valore è il tempo in millisecondi. Dal server, invia l'evento al giocatore:

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

Su QBox le stesse chiamate QBCore continuano a funzionare attraverso il suo strato di compatibilità, e le notifiche ox_lib sono una buona alternativa.

Notifiche con ox_lib

ox_lib ha la sua notifica, e funziona allo stesso modo su ogni framework. Sul client:

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

Il tipo è 'inform', 'success', 'warning' o 'error'. Dal server, attiva l'evento sul giocatore:

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

Il global lib ha bisogno di shared_script '@ox_lib/init.lua' nel tuo fxmanifest.lua, come descritto in la guida al menu di contesto ox_lib. Senza di esso ottieni l'errore lib nil sopra.

Barre di progresso

Con ox_lib, una barra di progresso è una chiamata che attende e restituisce se è finita:

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 accetta le stesse opzioni e mostra un cerchio invece di una barra. Entrambi possono anche allegare un prop al giocatore.

La versione di QBCore usa un callback invece di aspettare:

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)

Gli argomenti sono, in ordine: un nome, l'etichetta, la durata, useWhileDead, canCancel, i controlli disabilitati, l'animazione, due prop, quindi i callback di fine e annullamento. ESX non ha una barra di progresso propria che ogni server condivida, quindi su ESX usa lib.progressBar.

Una funzione bridge per tutti

Per mantenere gli script senza framework, scrivi il dettaglio del framework una volta e chiama le tue stesse funzioni ovunque. Metti questo in un file client:

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

Ora il tuo script chiama solo Notify('Done', 'success') e Progress('Working', 5000). Se ox_lib è installato, viene utilizzato per primo. Altrimenti QBCore viene utilizzato, e le notifiche tornano a ESX.

La barra di progresso del fallback copre solo QBCore. Su un server senza ox_lib né QBCore, aggiungi il tuo ramo o rendi ox_lib una dipendenza richiesta con dependency 'ox_lib'.

Consiglio: fai lo stesso sul server con una funzione NotifyPlayer(source, message, type), usando le chiamate server dalle sezioni sopra. Allora nessun altro file ha bisogno di sapere quale framework è in esecuzione.

Checklist

Sintomo Soluzione
attempt to index a nil value (global 'lib') Aggiungi shared_script '@ox_lib/init.lua' e avvia ox_lib per primo
La notifica del server non fa nulla Attiva l'evento client con la source del giocatore come secondo argomento
La notifica di QBCore non ha colore Usa un tipo valido: 'primary', 'success' o 'error'
La barra di progresso blocca il resto della funzione lib.progressBar attende: eseguilo in un thread o handler
Il giocatore può camminare durante la barra Imposta disable (ox_lib) o disableMovement (QBCore)
Lo script deve funzionare su ESX e QBCore Usa le funzioni bridge e chiama solo quelle

Risposte rapide

Come invio una notifica dal server?

Su ESX usa xPlayer.showNotification(msg). Su QBCore usa TriggerClientEvent('QBCore:Notify', source, msg, 'success'). Con ox_lib usa TriggerClientEvent('ox_lib:notify', source, { description = msg, type = 'success' }).

lib.progressBar blocca lo script?

Sì. Attende finché la barra non finisce e restituisce true, o false se il giocatore ha annullato. Eseguilo in un thread o in un gestore di eventi, non in un posto che non deve aspettare.

Perché lib è nil quando chiamo lib.notify?

Il tuo manifesto manca di shared_script '@ox_lib/init.lua', o ox_lib non è avviato prima della tua risorsa.

Script senza questo problema

Quest CreatorUn editor visuale di missioni e dialoghi con gli NPC, costruito nodo per nodo in gioco.Vedi script →Advanced BoostingBoosting di veicoli dal tablet: contratti dalla classe D alla S+, crew e coda in tempo reale.Vedi script →Mic PhoneUn telefono pieghevole che si apre in un tablet e arriva sul telefono vero del giocatore.Vedi script →

Continua a leggere