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 :

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

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 :

cfg
ensure ox_lib
ensure my_script

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

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

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 :

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

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 avant lib.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é :

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)

D'autres types de lignes incluent select, slider et textarea. Un select prend une liste d'options :

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

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

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

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

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

À lire aussi