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:

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

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:

cfg
ensure ox_lib
ensure my_script

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

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

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.

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:

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

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.registerContext novamente pouco antes de lib.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:

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)

Outros tipos de linha incluem select, slider e textarea. Um select leva uma lista de opções:

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

Como 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':

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

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

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

Continue lendo