Menu contextuel ox_lib : registerContext, inputDialog et alertDialog
Construire des menus dans FiveM avec ox_lib : lib.registerContext et lib.showContext avec des sous-menus et des icônes, plus lib.inputDialog et lib.alertDialog, et corriger 'lib' étant nil.
Vous appelez lib.registerContext et la console dit :
attempt to index a nil value (global 'lib')Ou le code du menu s'exécute et rien ne s'ouvre. Cet article couvre les outils de menu d'ox_lib : le menu contextuel, le dialogue d'entrée et le dialogue d'alerte, avec la ligne de manifeste qui rend lib existant.
Charger ox_lib dans votre manifeste
lib est une globale qu'ox_lib ajoute à votre ressource via son fichier init. Sans elle, chaque appel lib. échoue avec l'erreur ci-dessus. Dans fxmanifest.lua :
fx_version 'cerulean'
game 'gta5'
lua54 'yes'
shared_script '@ox_lib/init.lua'
client_scripts { 'client/*.lua' }
server_scripts { 'server/*.lua' }Ensuite, démarrez ox_lib avant votre script dans server.cfg :
ensure ox_lib
ensure my_scriptSi le fichier ne peut pas être trouvé du tout, voir @ox_lib/init.lua not found.
Un menu contextuel
Un menu contextuel est une liste d'options cliquables. Vous l'enregistrez une fois sous un id, puis vous le montrez quand vous en avez besoin. Les deux appels sont côté 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')Les options que vous utiliserez le plus :
| Champ | Ce qu'il fait |
|---|---|
title |
Le texte principal de l'option. |
description |
Une deuxième ligne de texte sous le titre. |
icon |
Un nom d'icône Font Awesome, comme car. Vous pouvez aussi passer une classe complète comme fa-solid fa-car. |
onSelect |
Fonction qui s'exécute lorsque l'option est cliquée. |
menu |
L'id d'un autre contexte à ouvrir (un sous-menu). |
arrow |
Affiche une flèche à droite, un indice qu'il ouvre quelque chose. |
disabled |
Grise l'option pour qu'elle ne puisse pas être cliquée. |
D'autres champs existent, tels que event, serverEvent, args, metadata et progress. Consultez la documentation d'ox_lib pour la version que vous exécutez.
Sous-menus
Pour ouvrir un sous-menu, donnez l'option menu avec l'id du contexte suivant. Donnez au deuxième contexte un menu pointant vers le premier, et il obtient un bouton retour :
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')Astuce : la table d'options est construite lorsque vous enregistrez le menu. Pour une liste qui change, comme les véhicules d'un joueur, construisez la table et appelez
lib.registerContextà nouveau juste avantlib.showContext. L'enregistrement du même id à nouveau remplace l'ancien menu.
lib.hideContext() ferme le menu à partir du code.
Demander une entrée avec inputDialog
lib.inputDialog ouvre un formulaire et attend jusqu'à ce que le joueur confirme ou annule. Il retourne une table avec les valeurs dans l'ordre des lignes, ou nil si le joueur a annulé :
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)D'autres types de lignes incluent select, slider et textarea. Un select prend une liste d'options :
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]) endParce que l'appel attend, exécutez-le dans un thread ou dans un gestionnaire qui est autorisé à attendre, comme une fonction onSelect. Ne validez jamais du côté client seul. Quand la valeur va au serveur, vérifiez-la aussi là.
Confirmer avec alertDialog
lib.alertDialog est une fenêtre oui/non. Elle retourne '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')
endSans cancel = true il y a seulement un bouton OK.
L'utiliser à partir d'une cible ou d'une commande
Un menu est généralement ouvert par quelque chose d'autre. Avec ox_target, appelez lib.showContext dans onSelect (voir ox_target: how to add targets). Avec une commande, appelez-la dans le gestionnaire :
RegisterCommand('garage', function()
lib.showContext('my_script_main')
end, false)Enregistrez les contextes d'abord, en haut du fichier client ou au démarrage du script, afin que l'id existe quand la commande s'exécute.
Liste de contrôle
| Symptôme | Correction |
|---|---|
attempt to index a nil value (global 'lib') |
Ajouter shared_script '@ox_lib/init.lua' et démarrer ox_lib en premier |
lib.showContext n'ouvre rien |
Enregistrer l'id avec lib.registerContext avant de le montrer |
| Le sous-menu n'a pas de bouton retour | Définir menu sur le sous-menu à l'id parent |
| Le menu montre des données obsolètes | L'enregistrer à nouveau avec les nouvelles options avant lib.showContext |
inputDialog retourne nil |
Le joueur a annulé : vérifier pour nil |
| L'icône n'apparaît pas | Utiliser un nom Font Awesome valide, ou une classe complète comme fa-solid fa-car |
Réponses rapides
Pourquoi lib est-il nil dans mon script ?
Votre manifeste ne charge pas le fichier init d'ox_lib. Ajoutez shared_script '@ox_lib/init.lua' et assurez-vous qu'ox_lib démarre avant votre ressource.
Comment créer un sous-menu ?
Enregistrez un second contexte avec son propre id, puis donnez l'option dans le premier menu menu = 'second_id'. Définissez menu = 'first_id' sur le second pour qu'il reçoive un bouton retour.
Comment lire ce que le joueur a tapé ?
lib.inputDialog retourne une table avec une valeur par ligne, dans l'ordre, ou nil si le joueur a annulé. Toujours vérifier nil.
Des scripts sans ce problème
Item Creator V2Créez des items utilisables avec animations, props, effets et plus — sans écrire une ligne de code.Voir le script →
Shop CreatorCréez un magasin en moins d’une minute — propriétaires, employés, coffres et braquages inclus.Voir le script →
Quest CreatorUn éditeur visuel de quêtes et de dialogues PNJ, construit nœud par nœud en jeu.Voir le script →