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:
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:
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:
ensure ox_lib
ensure my_scriptJeśli plik nie może być znaleziony wcale, patrz @ox_lib/init.lua not found.
Menu kontekstowe
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:
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.
Submenu
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:
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.registerContextponownie tuż przedlib.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ł:
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:
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]) endPonieważ 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':
local alert = lib.alertDialog({
header = 'Delete the shop?',
content = 'This cannot be undone.',
centered = true,
cancel = true,
})
if alert == 'confirm' then
print('deleting')
endBez 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:
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 →