FiveM Benachrichtigungen und Fortschrittsbalken: ESX, QBCore und ox_lib

Sende Benachrichtigungen und zeige Fortschrittsbalken auf ESX, QBCore und ox_lib mit ShowNotification, Functions.Notify, lib.notify und lib.progressBar, plus eine Bridge-Funktion.

Jedes Framework hat seine eigene Art, eine Nachricht oder einen Fortschrittsbalken anzuzeigen, und ein Skript, das für eine geschrieben wurde, schlägt auf einer anderen fehl:

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

Dieser Artikel listet die Aufrufe für ESX, QBCore und ox_lib für Benachrichtigungen und Fortschrittsbalken auf, und zeigt dann eine einzelne Bridge-Funktion, damit dein Skript auf jedem funktioniert, das der Server ausführt.

Benachrichtigungen auf ESX

Auf dem Client:

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

Auf dem Server, vom Spieler-Objekt:

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

ESX hier ist das Objekt von ESX = exports['es_extended']:getSharedObject(). Neuere ESX-Versionen akzeptieren auch einen Typ und eine Dauer nach dem Text. Wenn du dich darauf verlässt, teste auf deiner Version.

Benachrichtigungen auf QBCore

Auf dem Client:

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

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

Der Typ ist 'primary', 'success' oder 'error', und der letzte Wert ist die Zeit in Millisekunden. Vom Server aus sende das Event zum Spieler:

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

Bei QBox funktionieren die gleichen QBCore-Aufrufe durch seine Kompatibilätslage weiter, und ox_lib-Benachrichtigungen sind eine gute Alternative.

Benachrichtigungen mit ox_lib

ox_lib hat seine eigene Benachrichtigung, und sie funktioniert auf jedem Framework gleich. Auf dem Client:

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

Der Typ ist 'inform', 'success', 'warning' oder 'error'. Vom Server aus löse das Event auf dem Spieler aus:

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

Das globale lib benötigt shared_script '@ox_lib/init.lua' in deiner fxmanifest.lua, wie in the ox_lib context menu guide beschrieben. Ohne es bekommst du den lib nil-Fehler oben.

Fortschrittsbalken

Mit ox_lib ist ein Fortschrittsbalken ein Aufruf, der wartet und zurückgibt, ob er beendet wurde:

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 nimmt die gleichen Optionen und zeigt einen Kreis anstatt einen Balken. Beide können auch ein prop an den Spieler anhängen.

QBCore-Version verwendet stattdessen einen Callback:

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)

Die Argumente sind der Reihe nach: ein Name, das Label, die Dauer, useWhileDead, canCancel, die deaktivierten Steuerelemente, die Animation, zwei Props, dann die Fertig- und Abbruch-Callbacks. ESX hat keinen eigenen Fortschrittsbalken, den jeder Server teilt, also verwende auf ESX lib.progressBar.

Eine Bridge-Funktion für alle

Um deine Skripte Framework-frei zu halten, schreibe die Framework-Details einmal und rufe überall deine eigenen Funktionen auf. Lege dies in eine Client-Datei:

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

Jetzt ruft dein Skript nur Notify('Done', 'success') und Progress('Working', 5000) auf. Wenn ox_lib installiert ist, wird es zuerst verwendet. Andernfalls wird QBCore verwendet, und Benachrichtigungen fallen auf ESX zurück.

Der Fallback-Fortschrittsbalken deckt nur QBCore ab. Auf einem Server ohne ox_lib oder QBCore, füge deinen eigenen Zweig hinzu oder mache ox_lib zu einer erforderlichen Abhängigkeit mit dependency 'ox_lib'.

Tipp: Mache das Gleiche auf dem Server mit einer NotifyPlayer(source, message, type)-Funktion, indem du die Server-Aufrufe von den Abschnitten oben verwendest. Dann muss keine andere Datei wissen, welches Framework läuft.

Checkliste

Symptom Behebung
attempt to index a nil value (global 'lib') Füge shared_script '@ox_lib/init.lua' hinzu und starte ox_lib zuerst
Server-Benachrichtigung tut nichts Löse das Client-Event mit source als zweites Argument des Spielers aus
QBCore-Benachrichtigung hat keine Farbe Verwende einen gültigen Typ: 'primary', 'success' oder 'error'
Fortschrittsbalken blockiert den Rest der Funktion lib.progressBar wartet: Führe es in einem Thread oder Handler aus
Spieler kann während des Balkens gehen Setze disable (ox_lib) oder disableMovement (QBCore)
Skript muss auf ESX und QBCore funktionieren Verwende die Bridge-Funktionen und rufe nur diese auf

Kurze Antworten

Wie sende ich eine Benachrichtigung vom Server?

Verwende bei ESX xPlayer.showNotification(msg). Bei QBCore verwende TriggerClientEvent('QBCore:Notify', source, msg, 'success'). Mit ox_lib verwende TriggerClientEvent('ox_lib:notify', source, { description = msg, type = 'success' }).

Blockiert lib.progressBar das Skript?

Ja. Es wartet, bis der Balken endet und gibt true zurück, oder false, wenn der Spieler abgebrochen hat. Führe es in einem Thread oder einem Event-Handler aus, nicht an einem Ort, der nicht warten darf.

Warum ist lib nil, wenn ich lib.notify aufrufe?

Dein Manifest fehlt shared_script '@ox_lib/init.lua', oder ox_lib wird nicht vor deiner Ressource gestartet.

Scripts ohne dieses Problem

Quest CreatorEin visueller Editor für Quests und NPC-Dialoge, Node für Node im Spiel gebaut.Script ansehen →Advanced BoostingFahrzeug-Boosting per Tablet: Aufträge von Klasse D bis S+, Crews und eine Live-Warteschlange.Script ansehen →Mic PhoneEin faltbares Handy, das sich zum Tablet aufklappt und bis aufs echte Handy des Spielers reicht.Script ansehen →

Weiterlesen