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:

text
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:

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:

cfg
ensure ox_lib
ensure my_script

Wenn 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:

lua
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:

lua
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.registerContext erneut auf, gerade bevor lib.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:

lua
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:

lua
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]) end

Weil 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:

lua
local alert = lib.alertDialog({
    header = 'Delete the shop?',
    content = 'This cannot be undone.',
    centered = true,
    cancel = true,
})

if alert == 'confirm' then
    print('deleting')
end

Ohne 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:

lua
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 →

Weiterlesen