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:
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:
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:
ensure ox_lib
ensure my_scriptSe 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:
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:
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.registerContextdi nuovo proprio prima dilib.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:
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:
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]) endPoiché 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':
local alert = lib.alertDialog({
header = 'Delete the shop?',
content = 'This cannot be undone.',
centered = true,
cancel = true,
})
if alert == 'confirm' then
print('deleting')
endSenza 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:
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 →