Menu de contexto ox_lib: registerContext, inputDialog e alertDialog
Construa menus em FiveM com ox_lib: lib.registerContext e lib.showContext com submenus e ícones, além de lib.inputDialog e lib.alertDialog, e corrigir 'lib' sendo nil.
Você chama lib.registerContext e o console diz:
attempt to index a nil value (global 'lib')Ou o código do menu roda e nada abre. Este artigo cobre as ferramentas de menu de ox_lib: o menu de contexto, o diálogo de entrada e o diálogo de alerta, com a linha do manifesto que faz lib existir.
Carregue ox_lib em seu manifesto
lib é um global que ox_lib adiciona ao seu recurso através de seu arquivo init. Sem ele, toda chamada lib. falha com o erro acima. Em fxmanifest.lua:
fx_version 'cerulean'
game 'gta5'
lua54 'yes'
shared_script '@ox_lib/init.lua'
client_scripts { 'client/*.lua' }
server_scripts { 'server/*.lua' }Depois inicie ox_lib antes de seu script em server.cfg:
ensure ox_lib
ensure my_scriptSe o arquivo não pode ser encontrado de jeito nenhum, veja @ox_lib/init.lua not found.
Um menu de contexto
Um menu de contexto é uma lista de opções clicáveis. Você o registra uma vez sob um id, depois o mostra quando precisa. Ambas as chamadas são do lado do cliente:
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')As opções que você usará mais:
| Campo | O que faz |
|---|---|
title |
O texto principal da opção. |
description |
Uma segunda linha de texto sob o título. |
icon |
Um nome de ícone Font Awesome, como car. Você também pode passar uma classe completa como fa-solid fa-car. |
onSelect |
Função que roda quando a opção é clicada. |
menu |
O id de outro contexto para abrir (um submenu). |
arrow |
Mostra uma seta à direita, uma dica de que abre algo. |
disabled |
Acinzenta a opção para que não possa ser clicada. |
Outros campos existem, como event, serverEvent, args, metadata e progress. Verifique a documentação ox_lib para a versão que você executa.
Submenus
Para abrir um submenu, dê a opção menu com o id do próximo contexto. Dê ao segundo contexto um menu apontando de volta ao primeiro, e ele recebe um botão voltar:
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')Dica: a tabela de opções é construída quando você registra o menu. Para uma lista que muda, como os veículos de um jogador, construa a tabela e chame
lib.registerContextnovamente pouco antes delib.showContext. Registrar o mesmo id novamente substitui o menu antigo.
lib.hideContext() fecha o menu a partir do código.
Peça entrada com inputDialog
lib.inputDialog abre um formulário e aguarda até que o jogador confirme ou cancele. Retorna uma tabela com os valores em ordem de linha, ou nil se o jogador cancelou:
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)Outros tipos de linha incluem select, slider e textarea. Um select leva uma lista de opções:
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]) endComo a chamada aguarda, execute-a em uma thread ou em um manipulador que é permitido aguardar, como uma função onSelect. Nunca valide apenas no cliente. Quando o valor vai para o servidor, verifique-o lá também.
Confirme com alertDialog
lib.alertDialog é uma janela sim/não. Retorna 'confirm' ou 'cancel':
local alert = lib.alertDialog({
header = 'Delete the shop?',
content = 'This cannot be undone.',
centered = true,
cancel = true,
})
if alert == 'confirm' then
print('deleting')
endSem cancel = true há apenas um botão OK.
Use-o a partir de um alvo ou comando
Um menu geralmente é aberto por algo mais. Com ox_target, chame lib.showContext em onSelect (veja ox_target: como adicionar alvos). Com um comando, chame-o no manipulador:
RegisterCommand('garage', function()
lib.showContext('my_script_main')
end, false)Registre os contextos primeiro, no topo do arquivo do cliente ou quando o script começar, para que o id exista quando o comando roda.
Lista de verificação
| Sintoma | Solução |
|---|---|
attempt to index a nil value (global 'lib') |
Adicione shared_script '@ox_lib/init.lua' e inicie ox_lib primeiro |
lib.showContext não abre nada |
Registre o id com lib.registerContext antes de mostrá-lo |
| Submenu não tem botão voltar | Defina menu no submenu para o id pai |
| Menu mostra dados obsoletos | Registre-o novamente com as novas opções antes de lib.showContext |
inputDialog retorna nil |
O jogador cancelou: verifique por nil |
| Ícone não aparece | Use um nome Font Awesome válido, ou uma classe completa como fa-solid fa-car |
Respostas rápidas
Por que lib é nil em meu script?
Seu manifesto não carrega o arquivo init de ox_lib. Adicione shared_script '@ox_lib/init.lua' e certifique-se de que ox_lib começa antes de seu recurso.
Como faço um submenu?
Registre um segundo contexto com seu próprio id, depois dê a opção no primeiro menu menu = 'second_id'. Defina menu = 'first_id' no segundo para que obtenha um botão voltar.
Como leio o que o jogador digitou?
lib.inputDialog retorna uma tabela com um valor por linha, em ordem, ou nil se o jogador cancelou. Sempre verifique por nil.
Scripts sem esse problema
Item Creator V2Crie itens usáveis com animações, props, efeitos e muito mais — sem escrever código.Ver script →
Shop CreatorMonte uma loja em menos de um minuto — donos, funcionários, cofres e assaltos inclusos.Ver script →
Quest CreatorUm editor visual de missões e diálogos com NPCs, montado nó por nó dentro do jogo.Ver script →