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 proprename. - Les options sans
menusont au premier niveau. Une option dontmenune 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 (falsesi absent).persist:truepar défaut. L’état est mémorisé côté client (KVPox_target:cb:<name>) et restauré au prochain démarrage.persist = falserepart toujours dedefault.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 deconfig_interactions.lua.- Le
namesert 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
namede l’entrée ;openschange le nom du sous-menu racine (ox_weatherpar défaut). label,icon,descriptionetseparatorAfterde l’entrée remplacent ceux deWeather.labels.root.- Toutes les options générées exigent la permission
weatheret 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
onTogglenionInit: l’état change visuellement mais rien ne l’utilise. - Renommer une case à cocher : les joueurs perdent leur état mémorisé.