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:
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:
ESX.ShowNotification('You picked up a package')Auf dem Server, vom Spieler-Objekt:
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:
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:
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:
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:
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:
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 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:
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:
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)
endJetzt 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 →