Notifications et barres de progression FiveM : ESX, QBCore et ox_lib

Envoyez des notifications et affichez des barres de progression sur ESX, QBCore et ox_lib avec ShowNotification, Functions.Notify, lib.notify et lib.progressBar, plus une fonction de pont.

Chaque framework a sa propre façon d'afficher un message ou une barre de progression, et un script écrit pour l'un échoue sur un autre :

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

Cet article énumère les appels pour ESX, QBCore et ox_lib, pour les notifications et pour les barres de progression, puis affiche une seule fonction de pont afin que votre script fonctionne sur celui que le serveur exécute.

Notifications sur ESX

Sur le client :

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

Sur le serveur, depuis l'objet du joueur :

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

ESX ici est l'objet de ESX = exports['es_extended']:getSharedObject(). Les versions récentes d'ESX acceptent également un type et une durée après le texte. Si vous en dépendez, testez sur votre version.

Notifications sur QBCore

Sur le client :

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

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

Le type est 'primary', 'success' ou 'error', et la dernière valeur est le temps en millisecondes. Depuis le serveur, envoyez l'événement au joueur :

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

Sur QBox les mêmes appels QBCore continuent à fonctionner via sa couche de compatibilité, et les notifications ox_lib sont une bonne alternative.

Notifications avec ox_lib

ox_lib a sa propre notification, et elle fonctionne de la même façon sur tous les frameworks. Sur le client :

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

Le type est 'inform', 'success', 'warning' ou 'error'. Depuis le serveur, déclenchez l'événement sur le joueur :

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

La globale lib a besoin de shared_script '@ox_lib/init.lua' dans votre fxmanifest.lua, comme décrit dans le guide du menu contextuel ox_lib. Sans elle vous obtenez l'erreur lib nil ci-dessus.

Barres de progression

Avec ox_lib, une barre de progression est un appel qui attend et retourne si elle s'est terminée :

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 prend les mêmes options et affiche un cercle au lieu d'une barre. Les deux peuvent également attacher un prop au joueur.

La version de QBCore utilise un rappel au lieu d'attendre :

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)

Les arguments sont, dans l'ordre : un nom, l'étiquette, la durée, useWhileDead, canCancel, les contrôles désactivés, l'animation, deux props, puis les rappels de fin et d'annulation. ESX n'a pas sa propre barre de progression que chaque serveur partage, utilisez donc lib.progressBar sur ESX.

Une seule fonction de pont pour tous

Pour garder vos scripts framework-free, écrivez le détail du framework une fois et appelez vos propres fonctions partout. Mettez ceci dans un fichier 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

Maintenant votre script n'appelle que Notify('Done', 'success') et Progress('Working', 5000). Si ox_lib est installé, il est utilisé en premier. Sinon QBCore est utilisé, et les notifications reviennent à ESX.

La barre de progression de secours couvre uniquement QBCore. Sur un serveur sans ox_lib ni QBCore, ajoutez votre propre branche ou rendez ox_lib une dépendance obligatoire avec dependency 'ox_lib'.

Astuce : faites la même chose sur le serveur avec une seule fonction NotifyPlayer(source, message, type), en utilisant les appels serveur des sections ci-dessus. Aucun autre fichier n'a besoin de savoir quel framework s'exécute.

Liste de contrôle

Symptôme Correction
attempt to index a nil value (global 'lib') Ajouter shared_script '@ox_lib/init.lua' et démarrer ox_lib en premier
La notification serveur ne fait rien Déclenchez l'événement client avec le source du joueur comme deuxième argument
La notification QBCore n'a pas de couleur Utilisez un type valide : 'primary', 'success' ou 'error'
La barre de progression bloque le reste de la fonction lib.progressBar attend : exécutez-le dans un thread ou un gestionnaire
Le joueur peut marcher pendant la barre Définissez disable (ox_lib) ou disableMovement (QBCore)
Le script doit fonctionner sur ESX et QBCore Utilisez les fonctions de pont et n'appelez que celles-ci

Réponses rapides

Comment envoyer une notification depuis le serveur ?

Sur ESX utilisez xPlayer.showNotification(msg). Sur QBCore utilisez TriggerClientEvent('QBCore:Notify', source, msg, 'success'). Avec ox_lib utilisez TriggerClientEvent('ox_lib:notify', source, { description = msg, type = 'success' }).

Est-ce que lib.progressBar bloque le script ?

Oui. Il attend que la barre se termine et retourne true, ou false si le joueur a annulé. Exécutez-le dans un thread ou un gestionnaire d'événement, pas dans un endroit qui ne doit pas attendre.

Pourquoi lib est-il nil lorsque j'appelle lib.notify ?

Votre manifeste manque shared_script '@ox_lib/init.lua', ou ox_lib n'est pas démarré avant votre ressource.

Des scripts sans ce problème

Quest CreatorUn éditeur visuel de quêtes et de dialogues PNJ, construit nœud par nœud en jeu.Voir le script →Advanced BoostingDu boosting de véhicules piloté par tablette : contrats de classe D à S+, crews et file d’attente en direct.Voir le script →Mic PhoneUn téléphone pliable qui se déplie en tablette et se prolonge jusqu’au vrai téléphone du joueur.Voir le script →

À lire aussi