Menu di contesto ox_lib: registerContext, inputDialog e alertDialog

Crea menu in FiveM con ox_lib: lib.registerContext e lib.showContext con sottomenu e icone, più lib.inputDialog e lib.alertDialog, e risolvere 'lib' che è nil.

Chiami lib.registerContext e la console dice:

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

O il codice del menu si esegue e nulla si apre. Questo articolo copre gli strumenti di menu di ox_lib: il menu di contesto, il dialogo di input e il dialogo di avviso, con la riga di manifesto che rende lib esistente.

Carica ox_lib nel tuo manifesto

lib è un global che ox_lib aggiunge alla tua risorsa attraverso il suo file init. Senza di esso, ogni chiamata lib. fallisce con l'errore sopra. 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' }

Poi avvia ox_lib prima del tuo script in server.cfg:

cfg
ensure ox_lib
ensure my_script

Se il file non può essere trovato affatto, vedi @ox_lib/init.lua not found.

Un menu di contesto

Un menu di contesto è un elenco di opzioni cliccabili. Lo registri una volta sotto un id, poi lo mostri quando ne hai bisogno. Entrambe le chiamate sono lato client:

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')

Le opzioni che userai più:

Campo Cosa fa
title Il testo principale dell'opzione.
description Una seconda riga di testo sotto il titolo.
icon Un nome di icona Font Awesome, come car. Puoi anche passare una classe completa come fa-solid fa-car.
onSelect Funzione che si esegue quando l'opzione viene cliccata.
menu L'id di un altro contesto da aprire (un sottomenu).
arrow Mostra una freccia a destra, un suggerimento che apre qualcosa.
disabled Disabilita l'opzione in modo che non possa essere cliccata.

Esistono altri campi, come event, serverEvent, args, metadata e progress. Controlla la documentazione di ox_lib per la versione che esegui.

Sottomenu

Per aprire un sottomenu, dai all'opzione menu con l'id del contesto successivo. Dai al secondo contesto un menu che punta al primo, e ottiene un pulsante di ritorno:

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')

Consiglio: la tabella delle opzioni viene costruita quando registri il menu. Per un elenco che cambia, come i veicoli di un giocatore, costruisci la tabella e chiama lib.registerContext di nuovo proprio prima di lib.showContext. Registrare lo stesso id di nuovo sostituisce il vecchio menu.

lib.hideContext() chiude il menu dal codice.

Chiedi input con inputDialog

lib.inputDialog apre un modulo e attende finché il giocatore non conferma o annulla. Restituisce una tabella con i valori in ordine di riga, o nil se il giocatore ha annullato:

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)

Altri tipi di riga includono select, slider e textarea. Un select prende un elenco di opzioni:

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

Poiché la chiamata attende, eseguila in un thread o in un gestore che è autorizzato ad aspettare, come una funzione onSelect. Non validare mai solo sul client. Quando il valore va al server, verificalo anche lì.

Conferma con alertDialog

lib.alertDialog è una finestra sì/no. Restituisce 'confirm' o 'cancel':

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

Senza cancel = true c'è solo un pulsante OK.

Usalo da un target o un comando

Un menu viene solitamente aperto da qualcosa d'altro. Con ox_target, chiama lib.showContext in onSelect (vedi ox_target: come aggiungere target). Con un comando, chiamalo nell'handler:

lua
RegisterCommand('garage', function()
    lib.showContext('my_script_main')
end, false)

Registra i contesti per primo, in cima al file client o quando lo script si avvia, così l'id esiste quando il comando si esegue.

Checklist

Sintomo Soluzione
attempt to index a nil value (global 'lib') Aggiungi shared_script '@ox_lib/init.lua' e avvia ox_lib per primo
lib.showContext non apre nulla Registra l'id con lib.registerContext prima di mostrarlo
Il sottomenu non ha un pulsante di ritorno Imposta menu sul sottomenu al id genitore
Il menu mostra dati non aggiornati Registralo di nuovo con le nuove opzioni prima di lib.showContext
inputDialog restituisce nil Il giocatore ha annullato: controlla per nil
L'icona non appare Usa un nome Font Awesome valido, o una classe completa come fa-solid fa-car

Risposte rapide

Perché lib è nil nel mio script?

Il tuo manifesto non carica il file init di ox_lib. Aggiungi shared_script '@ox_lib/init.lua' e assicurati che ox_lib si avvii prima della tua risorsa.

Come faccio a creare un sottomenu?

Registra un secondo contesto con il suo id, poi dai all'opzione nel primo menu menu = 'second_id'. Imposta menu = 'first_id' sul secondo in modo che ottenga un pulsante di ritorno.

Come leggo quello che il giocatore ha digitato?

lib.inputDialog restituisce una tabella con un valore per riga, in ordine, o nil se il giocatore ha annullato. Controlla sempre per nil.

Script senza questo problema

Item Creator V2Crea oggetti utilizzabili con animazioni, props, effetti e altro — senza scrivere codice.Vedi script →Shop CreatorCrea un negozio in meno di un minuto — proprietari, dipendenti, casseforti e rapine inclusi.Vedi script →Quest CreatorUn editor visuale di missioni e dialoghi con gli NPC, costruito nodo per nodo in gioco.Vedi script →

Continua a leggere