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:
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:
ESX.ShowNotification('You picked up a package')Sul server, dall'oggetto del giocatore:
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:
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:
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:
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:
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:
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')
endlib.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:
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:
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)
endOra 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 →