Menu kontekstowe ox_lib: registerContext, inputDialog i alertDialog

Zbuduj menu w FiveM z ox_lib: lib.registerContext i lib.showContext z submenu i ikonami, plus lib.inputDialog i lib.alertDialog, i napraw 'lib' być nil.

Wołujesz lib.registerContext i konsola mówi:

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

Lub kod menu uruchamia się i nic się nie otwiera. Ten artykuł obejmuje narzędzia menu ox_lib: menu kontekstowe, dialog wejściowy i dialog alertu, z linią manifestu która sprawia że lib istnieje.

Załaduj ox_lib w twoim manifeście

lib to globalna którą ox_lib dodaje do twojego zasobu poprzez plik init. Bez niego, każde wołanie lib. nie powiedzie się z błędem powyżej. W fxmanifest.lua:

lua
fx_version 'cerulean'
game 'gta5'
lua54 'yes'

shared_script '@ox_lib/init.lua'

client_scripts { 'client/*.lua' }
server_scripts { 'server/*.lua' }

Potem uruchom ox_lib przed twoim skryptem w server.cfg:

cfg
ensure ox_lib
ensure my_script

Jeśli plik nie może być znaleziony wcale, patrz @ox_lib/init.lua not found.

Menu kontekstowe to lista klikalna opcji. Ty rejestrujesz to raz pod id, potem pokazujesz to gdy go potrzebujesz. Oba wołania są po stronie klienta:

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

Opcje które będziesz używać najczęściej:

Pole Co robi
title Główny tekst opcji.
description Druga linia tekstu pod tytułem.
icon Nazwa ikony Font Awesome, takie jak car. Możesz także przesłać pełną klasę takie jak fa-solid fa-car.
onSelect Funkcja która uruchamia się gdy opcja jest klikana.
menu Id innego kontekstu aby otworzyć (submenu).
arrow Pokazuje strzałkę na prawo, wskazówka że otwiera coś.
disabled Szarzy opcję aby nie mogła być klikana.

Inne pola istnieją, takie jak event, serverEvent, args, metadata i progress. Sprawdź dokumentację ox_lib dla wersji którą uruchamiasz.

Aby otworzyć submenu, daj opcji menu z id następnego kontekstu. Daj drugiemu kontekstowi menu wskazujący z powrotem do pierwszego, i otrzyma przycisk powrotu:

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

Porada: tabela opcji jest zbudowana gdy rejestrujesz menu. Dla listy która się zmienia, takie jak pojazdy gracza, zbuduj tabelę i wołaj lib.registerContext ponownie tuż przed lib.showContext. Rejestrowanie tego samego id ponownie zastępuje stare menu.

lib.hideContext() zamyka menu z kodu.

Poproś o wejście z inputDialog

lib.inputDialog otwiera formularz i czeka aż gracz potwierdzi lub anuluje. Zwraca tabelę z wartościami w kolejności wierszy, lub nil jeśli gracz anulował:

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)

Inne typy wierszy włączają select, slider i textarea. select bierze listę opcji:

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

Ponieważ wołanie czeka, uruchom to w wątku lub w obsłudze która może czekać, takie jak funkcja onSelect. Nigdy nie waliduj tylko na kliencie. Gdy wartość idzie na serwer, sprawdzaj tam też.

Potwierdź z alertDialog

lib.alertDialog to okno tak/nie. Zwraca 'confirm' lub '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

Bez cancel = true jest tylko przycisk OK.

Używaj to z celu lub komendy

Menu jest zwykle otwierane przez coś innego. Z ox_target, wołaj lib.showContext w onSelect (patrz ox_target: jak dodać cele). Z komendy, wołaj to w obsłudze:

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

Zarejestruj konteksty najpierw, na górze pliku klienta lub gdy skrypt się uruchamia, aby id istniało gdy komenda uruchamia się.

Checklist

Objaw Naprawić
attempt to index a nil value (global 'lib') Dodaj shared_script '@ox_lib/init.lua' i uruchom ox_lib pierwszy
lib.showContext nic nie otwiera Zarejestruj id z lib.registerContext zanim go pokazujesz
Submenu nie ma przycisku powrotu Ustaw menu na submenu na parent id
Menu pokazuje stare dane Zarejestruj to ponownie z nowymi opcjami przed lib.showContext
inputDialog zwraca nil Gracz anulował: sprawdzaj nil
Ikona się nie pojawia Użyj ważnej nazwy Font Awesome, lub pełnej klasy takie jak fa-solid fa-car

Szybkie odpowiedzi

Dlaczego lib jest nil w moim skrypcie?

Twój manifest nie ładuje pliku init ox_lib. Dodaj shared_script '@ox_lib/init.lua' i upewnij się że ox_lib uruchamia się przed twoim zasobem.

Jak uczynić submenu?

Zarejestruj drugi kontekst ze swoim własnym id, potem daj opcję w pierwszym menu menu = 'second_id'. Ustaw menu = 'first_id' na drugim aby otrzymał przycisk powrotu.

Jak przeczytać co gracz wpisał?

lib.inputDialog zwraca tabelę z jedną wartością na wiersz, w kolejności, lub nil jeśli gracz anulował. Zawsze sprawdzaj nil.

Skrypty bez tego problemu

Item Creator V2Twórz używalne przedmioty z animacjami, propami, efektami i nie tylko — bez pisania kodu.Zobacz skrypt →Shop CreatorZbuduj sklep w niecałą minutę — właściciele, pracownicy, sejfy i napady w zestawie.Zobacz skrypt →Quest CreatorWizualny edytor questów i dialogów z NPC, budowanych węzeł po węźle w grze.Zobacz skrypt →

Czytaj dalej