MrPoulpi Labs
ox_target

Scripts disponibles

EN
Centre de documentation

Catégories, sous-menus et cases à cocher

Créer des catégories et des sous-menus imbriqués, utiliser les séparateurs, les cases à cocher mémorisées, les raccourcis d’emotes et le menu météo généré.

But : organiser le menu en catégories et ajouter des options à état. Fichier à modifier : config_interactions.lua.

Catégories et sous-menus

Une catégorie est une option type = 'category' qui ouvre un sous-menu nommé par opens. Les options rattachées déclarent ce nom dans menu :

{ name = 'police', label = 'Police', icon = 'fa-solid fa-shield', type = 'category', opens = 'police_menu', jobs = { 'police' } },
{ name = 'cuff', menu = 'police_menu', label = 'Menotter', icon = 'fa-solid fa-handcuffs', type = 'client_event', event = 'mon_pd:menotter' },
{ name = 'escort', menu = 'police_menu', label = 'Escorter', icon = 'fa-solid fa-person-walking', type = 'client_event', event = 'mon_pd:escorter' },

mon_pd:menotter et mon_pd:escorter sont des noms d’exemple.

Résultat attendu : le menu principal affiche « Police » avec une flèche ; un clic ouvre un second panneau à droite contenant « Menotter » et « Escorter ». Le menu principal reste affiché et cliquable.

Règles observées :

  • Sans opens, une catégorie ouvre le menu portant son propre name.
  • Les options sans menu sont au premier niveau. Une option dont menu ne correspond à aucune catégorie n’est jamais affichée.
  • Un sous-menu peut contenir des catégories : le second panneau est alors remplacé par le sous-menu suivant. Il n’y a pas de bouton retour : recliquez la catégorie du premier niveau, ou utilisez opens = 'home' pour revenir à la racine.
  • Les noms de sous-menus sont partagés par toutes les options affichées sur la cible. Gardez-les uniques par liste pour éviter les mélanges.
  • Évitez les cycles (A ouvre B qui ouvre A) : le configurateur les bloque.

Séparateurs

separatorAfter = true ajoute un trait après l’option. Le trait n’apparaît que si l’option est elle-même affichée.

Cases à cocher

{
    name = 'hud_compact', label = 'HUD compact', icon = 'fa-solid fa-toggle-on', type = 'checkbox', default = false,
    onToggle = function(state)
        TriggerEvent('mon_hud:compact', state)
    end,
    onInit = function(state)
        TriggerEvent('mon_hud:compact', state)
    end
},
  • default : état initial (false si absent).
  • persist : true par défaut. L’état est mémorisé côté client (KVP ox_target:cb:<name>) et restauré au prochain démarrage. persist = false repart toujours de default.
  • onToggle(state) : appelée à chaque clic, avec le nouvel état.
  • onInit(state) : appelée une fois au démarrage avec l’état restauré. Ce champ est lu par le moteur même s’il n’apparaît pas dans l’en-tête de config_interactions.lua.
  • Le name sert de clé de mémorisation : le changer réinitialise l’état des joueurs.

Le builtin anti_punch est une case à cocher de ce type : son défaut vient de Config.AntiPunch.defaultEnabled, et un champ default sur l’entrée le remplace.

Raccourcis d’emotes

Le modèle livré regroupe les emotes dans des catégories :

{ name = 'self_emotes', label = 'Emotes', icon = 'fa-solid fa-face-smile', description = 'Raccourcis emotes', type = 'category', opens = 'self_emotes', separatorAfter = true },
{ name = 'emote_wave', menu = 'self_emotes', label = 'Salut', icon = 'fa-solid fa-hand', type = 'emote', emote = 'wave' },

Pour les joueurs, utilisez type = 'shared_emote' dans Config.PlayerInteractions : avec les presets fournis, la commande Config.Commands.sharedEmote (nearby <emote>) est exécutée. Le nom doit exister dans votre script d’emotes.

Le menu météo

L’entrée { name = 'weather_menu', menu = 'self_admin', builtin = 'weather_menu' } génère tout un arbre depuis Config.Weather :

weather_menu (catégorie → ox_weather)
├─ weather_menu_types     → un élément par Weather.types
├─ weather_menu_time      → un élément par Weather.times, Freeze ON, Freeze OFF
├─ weather_menu_zones     → un élément par Weather.zones (si useZones)
├─ weather_menu_blackout  → Blackout ON, OFF, Toggle
├─ weather_menu_tools     → Météo aléatoire, heure serveur, état blackout, info zone (si useZones)
└─ weather_menu_local     → pluie et freeze locaux (si localTools)
  • Le préfixe des noms générés est le name de l’entrée ; opens change le nom du sous-menu racine (ox_weather par défaut).
  • label, icon, description et separatorAfter de l’entrée remplacent ceux de Weather.labels.root.
  • Toutes les options générées exigent la permission weather et ne s’affichent que si l’intégration météo est disponible côté client.
  • Évitez de nommer vos propres options weather_menu_… dans la même liste : les noms se chevaucheraient.

Erreurs fréquentes

  • Catégorie vide : la flèche s’affiche mais le panneau est vide. Vérifiez l’orthographe de menu.
  • Case à cocher sans onToggle ni onInit : l’état change visuellement mais rien ne l’utilise.
  • Renommer une case à cocher : les joueurs perdent leur état mémorisé.

Rechercher

Tapez un terme : paramètre, export, erreur…