ox_lib Kontextmenü: registerContext, inputDialog und alertDialog
Baue Menüs in FiveM mit ox_lib: lib.registerContext und lib.showContext mit Untermenüs und Symbolen, plus lib.inputDialog und lib.alertDialog, und behebt 'lib' ist nil.
Du rufst lib.registerContext auf und die Konsole sagt:
attempt to index a nil value (global 'lib')Oder der Menü-Code läuft und nichts öffnet sich. Dieser Artikel behandelt die Menü-Tools von ox_lib: das Kontextmenü, das Eingabedialog und das Warnedialog, mit der Manifest-Zeile, die lib existieren lässt.
Laden ox_lib in deinem Manifest
lib ist ein Global, das ox_lib zu deiner Ressource durch seine Init-Datei hinzufügt. Ohne sie schlägt jeder lib.-Aufruf mit dem Fehler oben fehl. In fxmanifest.lua:
fx_version 'cerulean'
game 'gta5'
lua54 'yes'
shared_script '@ox_lib/init.lua'
client_scripts { 'client/*.lua' }
server_scripts { 'server/*.lua' }Dann starte ox_lib vor deinem Skript in server.cfg:
ensure ox_lib
ensure my_scriptWenn die Datei überhaupt nicht gefunden werden kann, siehe @ox_lib/init.lua not found.
Ein Kontextmenü
Ein Kontextmenü ist eine Liste von anklickbaren Optionen. Du registrierst es einmal unter einer ID, dann zeigst es, wenn du es brauchst. Beide Aufrufe sind Client-Seite:
lib.registerContext({
id = 'my_script_main',
title = 'Garage',
options = {
{
title = 'Take out a vehicle',
description = 'Choose from your parked vehicles',
icon = 'car',
onSelect = function()
print('take out')
end,
},
{
title = 'Store vehicle',
description = 'Park the vehicle you are in',
icon = 'warehouse',
onSelect = function()
print('store')
end,
},
{
title = 'Impound',
description = 'Not available',
icon = 'lock',
disabled = true,
},
},
})
lib.showContext('my_script_main')Die Optionen, die du am meisten verwendest:
| Feld | Was es tut |
|---|---|
title |
Der Haupttext der Option. |
description |
Eine zweite Textzeile unter dem Titel. |
icon |
Ein Font Awesome Symbol-Name, wie car. Du kannst auch eine vollständige Klasse wie fa-solid fa-car übergeben. |
onSelect |
Funktion, die läuft, wenn die Option angeklickt wird. |
menu |
Die ID eines anderen Kontextmenüs zum Öffnen (ein Untermenü). |
arrow |
Zeigt einen Pfeil auf der rechten Seite, ein Hinweis, dass es etwas öffnet. |
disabled |
Ergraut die Option, sodass sie nicht geklickt werden kann. |
Andere Felder existieren, wie event, serverEvent, args, metadata und progress. Prüfe die ox_lib-Dokumentation für die Version, die du ausführst.
Untermenüs
Um ein Untermenü zu öffnen, geben der Option menu mit der ID des nächsten Kontextmenüs. Geben dem zweiten Kontextmenü ein menu, das auf das erste zurückzeigt, und es bekommt einen Zurück-Button:
lib.registerContext({
id = 'my_script_main',
title = 'Garage',
options = {
{
title = 'My vehicles',
icon = 'car',
arrow = true,
menu = 'my_script_vehicles',
},
},
})
lib.registerContext({
id = 'my_script_vehicles',
title = 'My vehicles',
menu = 'my_script_main',
options = {
{
title = 'Sultan',
description = 'Plate ABC 123',
onSelect = function()
print('selected Sultan')
end,
},
},
})
lib.showContext('my_script_main')Tipp: Die Optionen-Tabelle wird beim Registrieren des Menüs erstellt. Für eine Liste, die sich ändert, wie die Fahrzeuge eines Spielers, baue die Tabelle und rufe
lib.registerContexterneut auf, gerade bevorlib.showContext. Das Registrieren der gleichen ID erneut ersetzt das alte Menü.
lib.hideContext() schließt das Menü von Code.
Frage nach Eingabe mit inputDialog
lib.inputDialog öffnet ein Formular und wartet bis der Spieler bestätigt oder abbricht. Es gibt eine Tabelle mit den Werten in Zeilen-Reihenfolge zurück, oder nil, wenn der Spieler abgebrochen hat:
local input = lib.inputDialog('New shop', {
{ type = 'input', label = 'Shop name', required = true },
{ type = 'number', label = 'Price', default = 100, min = 0 },
{ type = 'checkbox', label = 'Open to everyone' },
})
if not input then return end
local name, price, open = input[1], input[2], input[3]
print(name, price, open)Andere Zeilen-Typen beinhalten select, slider und textarea. Ein select nimmt eine Liste von Optionen:
local input = lib.inputDialog('Pick a colour', {
{
type = 'select',
label = 'Colour',
options = {
{ value = 'red', label = 'Red' },
{ value = 'blue', label = 'Blue' },
},
},
})
if input then print(input[1]) endWeil der Aufruf wartet, führe ihn in einem Thread oder in einem Handler aus, der warten darf, wie eine onSelect-Funktion. Validiere niemals nur auf dem Client. Wenn der Wert zum Server geht, prüfe ihn auch dort.
Bestätige mit alertDialog
lib.alertDialog ist ein Ja/Nein-Fenster. Es gibt 'confirm' oder 'cancel' zurück:
local alert = lib.alertDialog({
header = 'Delete the shop?',
content = 'This cannot be undone.',
centered = true,
cancel = true,
})
if alert == 'confirm' then
print('deleting')
endOhne cancel = true gibt es nur einen OK-Button.
Verwende es von einem Ziel oder einem Befehl
Ein Menü wird normalerweise von etwas anderem geöffnet. Mit ox_target rufst du lib.showContext in onSelect auf (siehe ox_target: how to add targets). Mit einem Befehl rufe es im Handler auf:
RegisterCommand('garage', function()
lib.showContext('my_script_main')
end, false)Registriere die Kontextmenüs zuerst, oben in der Client-Datei oder wenn das Skript startet, damit die ID existiert, wenn der Befehl 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 |
lib.showContext öffnet nichts |
Registriere die ID mit lib.registerContext bevor du sie zeigst |
| Untermenü hat keinen Zurück-Button | Setze menu auf dem Untermenü auf die Eltern-ID |
| Menü zeigt veraltete Daten | Registriere es erneut mit den neuen Optionen bevor lib.showContext |
inputDialog gibt nil zurück |
Der Spieler abgebrochen: Prüfe auf nil |
| Symbol wird nicht angezeigt | Verwende einen gültigen Font Awesome Namen oder eine vollständige Klasse wie fa-solid fa-car |
Kurze Antworten
Warum ist lib nil in meinem Skript?
Dein Manifest lädt die Init-Datei von ox_lib nicht. Füge shared_script '@ox_lib/init.lua' hinzu und stelle sicher, dass ox_lib vor deiner Ressource startet.
Wie mache ich ein Untermenü?
Registriere ein zweites Kontextmenü mit seiner eigenen id, dann geben der Option im ersten Menü menu = 'second_id'. Setze menu = 'first_id' auf dem zweiten, damit es einen Zurück-Button bekommt.
Wie lese ich, was der Spieler eingegeben hat?
lib.inputDialog gibt eine Tabelle mit einem Wert pro Zeile, in der Reihenfolge, oder nil, wenn der Spieler abgebrochen hat, zurück. Prüfe immer auf nil.
Scripts ohne dieses Problem
Item Creator V2Erstelle nutzbare Items mit Animationen, Props, Effekten und mehr — ganz ohne Code.Script ansehen →
Shop CreatorBau einen Shop in unter einer Minute — Besitzer, Angestellte, Tresore und Überfälle inklusive.Script ansehen →
Quest CreatorEin visueller Editor für Quests und NPC-Dialoge, Node für Node im Spiel gebaut.Script ansehen →