Skip to main content

Intégration Client

📦📋 Guide d'Intégrationde Configuration Admin - Admin Menu v2.0Config_Admin.hpp

Auteur: ProtoMehka Version: 2.0 Framework: Compatible Altis Life (5.0 et supérieur)1 Dernière mise à jour: 2025-10-0410


📋 Table des Matières

    Présentation Fichiers du Package Prérequis Installation Complète Intégration dans un Autre Framework Configuration Dépendances et Adaptations Troubleshooting

    🎯 PrésentationObjectif

    CeCentraliser toute la configuration du menu admin v2.0dans estun uneseul interface moderne et modulairefichier pour gérerpermettre votre serveur Altis Life. Il peut être intégré dans n'importe quel framework Altis Life avec quelques adaptations.

    Fonctionnalités principales:

    • InterfaceDéfinir moderneles niveaux admin requis pour chaque commande
    Personnaliser les couleurs des boutons par niveau Organiser les commandes dans des onglets personnalisés Gérer les menus déroulants pour les onglets avec ongletsbeaucoup (Joueurs/Actions/Véhicules/Serveur)d'actions RechercheModifier etfacilement filtressans detoucher joueursau Mini-map interactive avec tracking temps réel Système de permissions configurables Design responsive et épurécode

    📁 FichiersStructure du PackageFichier

    Structure ComplèteLocalisation

    admin_menu.Altis/
    ├── config/
    │   └── Config_Admin.hpp
    #

    Architecture

    class Life_AdminConfig {
        // Niveaux d'administration
        class AdminLevels { ... };
    
        // Couleurs des boutons par niveau
        class ButtonColors { ... };
    
        // Configuration des permissions
    ├── dialog/
    │   ├── admin_menu_new.hpp                  # Interface principale
    │   └── MasterHandler.hpp                   # (modification requise)
    └── core/
        ├── admin/
        │   ├── fn_adminMenuNew.sqf             # Contrôleur principal
        │   ├── fn_adminMenuTabChange.sqf       # Gestion onglets
        │   ├── fn_adminRefreshList.sqf         # Liste joueurs
        │   ├── fn_adminSearchPlayer.sqf        # Recherche
        │   ├── fn_adminFilterPlayers.sqf       # Filtres
        │   └── fn_adminPlayerSelected.sqf      # Infos joueur + map
        └── pmenu/
            └── fn_p_openMenu.sqf               # (modification requise)
    

    Fichiers à Créer (Nouveaux)

    ✅ config/Config_Admin.hpp
    ✅ dialog/admin_menu_new.hpp
    ✅ core/admin/fn_adminMenuNew.sqf
    ✅ core/admin/fn_adminMenuTabChange.sqf
    ✅ core/admin/fn_adminRefreshList.sqf
    ✅ core/admin/fn_adminSearchPlayer.sqf
    ✅ core/admin/fn_adminFilterPlayers.sqf
    ✅ core/admin/fn_adminPlayerSelected.sqf
    

    Fichiers à Modifier (Existants)

    🔧 Functions.hpp                            # Déclaration des fonctions
    🔧 dialog/MasterHandler.hpp                 # Include du nouveau dialog
    🔧 dialog/player_inv.hpp                    # Bouton ouverture menu
    🔧 core/pmenu/fn_p_openMenu.sqf             # (optionnel)
    

    ✅ Prérequis

    Framework

      Altis Life 5.0+ (AsYetUntitled ou compatible) SQF compatible Système de dialogs Arma 3

      Variables Requises

      Le menu utilise ces variables du framework:

      Variable Type Description Exemple life_adminlevel NUMBER Niveau admin du joueur 0-5 playableUnits ARRAY Liste des joueurs connectés Auto Arma 3 profileName STRING Nom du joueur Auto Arma 3

      Fonctions Externes Utilisées

      Fonction Fichier d'origine Utilisation TON_fnc_player_query life_server/functions.sqf Récupérer infos joueur life_fnc_adminGetID Existante Get Steam ID life_fnc_adminQuery Existante Query player life_fnc_adminSpectate Existante Spectate mode Etc. core/admin/ Toutes les commandes admin

      Classes UI Requises

      Le menu utilise les classes de dialog/common.hpp:

      Life_RscText
      Life_RscButtonMenu
      Life_RscListBox
      Life_RscEdit
      Life_RscStructuredText
      Life_RscMapControl
      

      🚀 Installation Complète

      Étape 1: Copier les Fichiers

        Créer le dossier de configuration (si inexistant):

        admin_menu.Altis/config/
        

        Copier tous les nouveaux fichiers:

        config/Config_Admin.hpp
        dialog/admin_menu_new.hpp
        core/admin/fn_adminMenuNew.sqf
        core/admin/fn_adminMenuTabChange.sqf
        core/admin/fn_adminRefreshList.sqf
        core/admin/fn_adminSearchPlayer.sqf
        core/admin/fn_adminFilterPlayers.sqf
        core/admin/fn_adminPlayerSelected.sqf
        

        Étape 2: Modifier Functions.hpp

        Ouvrir Functions.hpp et trouver la section class Admin.

        AJOUTER ces lignes:

        class AdminTabs { file... = "core\admin"};
        
            // ...Commandes fonctionspar existantescatégorie
            class PlayerManagement { ... // ===== ADMIN MENU v2.0 - ProtoMehka =====
            class adminMenuNew {};
            class adminMenuTabChangeAdminActions { ... };
            class adminRefreshListObjectManagement { ... };
            class adminSearchPlayerServerManagement {}; class... adminFilterPlayers {};
            class adminPlayerSelected {};
        };
        

        🎨 Configuration des Couleurs

        ÉtapeCouleurs 3:par ModifierNiveau MasterHandler.hppAdmin

        Ouvrir dialog/MasterHandler.hpp.

        AJOUTER cette ligne après #include "admin_menu.hpp":

        #includeclass "admin_menu.hpp"ButtonColors #include "admin_menu_new.hpp"{
            // <--Format: AJOUTER{R, CETTEG, LIGNEB, 

        Étape 4: Modifier player_inv.hpp

        Ouvrir dialog/player_inv.hpp et trouver le bouton admin (IDC 2021).

        REMPLACER:

        onButtonClick = "closeDialog 0; createDialog ""life_admin_menu"";";
        

        PAR:

        onButtonClick = "closeDialog 0; createDialog ""life_admin_menu_new"";";
        

        Étape 5: Tester

          Compiler votre mission Se connecter au serveur Avoir life_adminlevel >= 1 Appuyer sur Y → Cliquer "Admin Menu"

          🔄 Intégration dans un Autre Framework

          Cas 1: Framework Altis Life Compatible

          Si votre framework utilise la même structure qu'Altis Life 5.0:

            Vérifier les variables:

            life_adminlevelAlpha}
                // DoitValeurs existerde (0-5)0.0 
            à 1.0 class

            SuivreLevel1 l'installation complète ci-dessus

            Adapter les chemins si nécessaire dans les #include

            Cas 2: Framework Custom

            A. Identifier les Variables Équivalentes

            Variable AL 5.0 Votre Framework Action life_adminlevel player_admin, adminLevel, etc. Remplacer dans tous les fichiers playableUnits Généralement identique - profileName Généralement identique -

            B. Adapter les Macros

            Ouvrir core/admin/fn_adminMenuNew.sqf et tous les autres.

            Rechercher:

            FETCH_CONST(life_adminlevel)
            

            Remplacer par votre variable:

            // Exemple 1: Variable simple
            player_adminLevel{  // ExempleSupport
                    2: Variable dans namespace
            (player getVariable ["adminLevel", 0])
            
            // Exemple 3: Fonction custom
            [normal[] call my_fnc_getAdminLevel
            

            Fichiers à modifier:

              fn_adminMenuNew.sqf fn_adminMenuTabChange.sqf fn_adminRefreshList.sqf fn_adminFilterPlayers.sqf

              C. Adapter les Factions

              Si vos factions sont différentes (west/civilian/independent):

              Ouvrir fn_adminRefreshList.sqf:

              // AVANT (Altis Life 5.0)
              case west:= {"Cop"};0.3, case0.7, civilian:0.3, {"Civ"};
              case independent: {"Medic"}0.7};      // APRÈSVert (votrenormal
                      framework)hover[] case west:= {"Police"}0.4, 0.8, 0.4, 0.9};       // VotreVert nomhover
                      casepressed[] civilian:= {"Civil"};0.2, case0.6, independent:0.2, {"Pompiers"}0.8};     // ExempleVert casepressé
                      east:disabled[] = {"Rebelles"}0.3, 0.3, 0.3, 0.5};    // SiGris vousdésactivé
                  avez};
              
                  uneclass 4eLevel2 faction{  

              Faire de même pour les couleurs:

              // DansModérateur
                      fn_adminRefreshList.sqfnormal[] case west:= {[0.2, 0.4, 0.8]}6, 0.8, 0.7};      // Bleu policeclair
                      casehover[] civilian:= {[0.5, 0.7, 0.9, 0.9};
                      pressed[] = {0.3, 0.8,5, 0.3]7, 0.8};
                      disabled[] = {0.3, 0.3, 0.3, 0.5};
                  };
              
                  class Level3 {  // Admin
                      normal[] = {0.38, 0.70, 0.89, 0.7};   // VertBleu civilAltis
                      casehover[] independent:= {[0.9,48, 0.80, 0.99, 0.9};
                      pressed[] = {0.28, 0.60, 0.79, 0.8};
                      disabled[] = {0.3, 0.3, 0.3, 0.5};
                  };
              
                  class Level4 {  // Super Admin
                      normal[] = {0.8, 0.5, 0]}0.2, 0.7};      // Orange
                      pompiershover[] case east:= {[0.8,9, 0.2,6, 0.2]3, 0.9};
                      pressed[] = {0.7, 0.4, 0.1, 0.8};
                      disabled[] = {0.3, 0.3, 0.3, 0.5};
                  };
              
                  class Level5 {  // RougeOwner
                      rebelles (exemple)
              

              D. Adapter les Boutons de Filtre

              Ouvrir dialog/admin_menu_new.hpp:

              Si vous avez une 4e faction, AJOUTER:

              class FilterRebel: Life_RscButtonMenu {
                  idc = 29027;  // Nouveau IDC
                  text = "REBEL";
                  onButtonClick = "[""rebel""] call life_fnc_adminFilterPlayers;";
                  x = 0.450 * safezoneW + safezoneX;
                  y = 0.27 * safezoneH + safezoneY;
                  w = 0.03 * safezoneW;
                  h = 0.02 * safezoneH;
                  colorBackground[normal[] = {0.8, 0.2, 0.2, 0.6}7};      // Rouge
                      sizeExhover[] = {0.02;9, 0.3, 0.3, 0.9};
                      pressed[] = {0.7, 0.1, 0.1, 0.8};
                      disabled[] = {0.3, 0.3, 0.3, 0.5};
                  };
              };
              

              Puis modifier fn_adminFilterPlayers.sqf:

              case "rebel": {_playerSide == east};  // Ajouter ce cas
              

              E. Adapter les Fonctions Externes

              Si vos noms

              Palette de fonctionsCouleurs diffèrent

              :Recommandées
              Fonction AL 5.0Couleur ActionRGB
              Usage Recommandé 🟢 Vert TON_fnc_player_query{0.3, 0.7, 0.3} RemplacerNiveau par1 votre fonction de query joueur(Support) 🔵 Bleu Clair life_fnc_adminGetID{0.4, 0.6, 0.8} GarderNiveau ou2 adapter(Modérateur) 🔵 Bleu life_fnc_adminSpectate{0.38, 0.70, 0.89} GarderNiveau ou3 adapter(Admin) 🟠 Orange {0.8, 0.5, 0.2} Niveau 4 (Super Admin) 🔴 Rouge {0.8, 0.2, 0.2} Niveau 5 (Owner) ⚪ Gris {0.3, 0.3, 0.3} Désactivé

              Exemple dans

              🗂️ fn_adminPlayerSelected.sqf:Configuration des Onglets

              Structure de Base

              //class AVANT
              [player] remoteExecCall ["TON_fnc_player_query", _unit];
              
              // APRÈS (si vous avez une autre fonction)
              [player] remoteExecCall ["YOUR_fnc_playerQuery", _unit];
              

              F. Adapter l'Ouverture du Menu

              Si vous n'utilisez pas le même menu inventaire:

                Trouver où vous ouvrez votre menu admin Remplacer par:
                createDialog "life_admin_menu_new";
                

                Exemple: Si vous avez une touche dédiée:

                // Dans votre fn_keyHandler.sqf
                case 0x3B:Tabs {
                    // F1Nombre iftotal (life_adminleveld'onglets
                    >count = 1)4;
                
                    then// Configuration de chaque onglet
                    // Format: {Nom, ID, Icône, Couleur}
                
                    tabs[] = {
                        createDialog{
                            "life_admin_menu_new"JOUEURS",                                              // Nom affiché
                            "players",                                               // ID interne
                            "\A3\ui_f\data\GUI\Rsc\RscDisplayArsenal\face_ca.paa",  // Icône
                            {0.38, 0.70, 0.89, 0.7}                                 // Couleur
                        },
                        {
                            "ACTIONS",
                            "actions",
                            "\A3\ui_f\data\IGUI\Cfg\Actions\settimer_ca.paa",
                            {0.8, 0.5, 0.2, 0.7}
                        },
                        {
                            "OBJETS",
                            "objects",
                            "\A3\ui_f\data\IGUI\Cfg\Actions\getindriver_ca.paa",
                            {0.3, 0.7, 0.3, 0.7}
                        },
                        {
                            "SERVEUR",
                            "server",
                            "\A3\ui_f\data\IGUI\Cfg\Actions\settimer_ca.paa",
                            {0.8, 0.2, 0.2, 0.7}
                        }
                    };
                };
                

                Ajouter un Nouvel Onglet

                Exemple: Ajouter un onglet "UTILITAIRES"

                class Tabs {
                    count = 5;  // Incrémenter le nombre
                
                    tabs[] = {
                        // ... onglets existants ...
                        {
                            "UTILITAIRES",
                            "utilities",
                            "\A3\ui_f\data\IGUI\Cfg\Actions\repair_ca.paa",
                            {0.5, 0.5, 0.9, 0.7}
                        }
                    };
                };
                

                ⚙️🎮 Configuration des Commandes

                Format de Base

                // Format d'une commande:
                {
                    "Nom Affiché",           // Texte du bouton
                    "fonction_sqf",          // Fonction à appeler
                    niveau_minimum,          // Niveau admin requis (1-5)
                    "onglet_id",            // Dans quel onglet placer
                    "icone"                 // (Optionnel) Chemin vers icône
                }
                

                Exemple Complet

                class PlayerManagement {
                    // Toutes les commandes liées aux joueurs
                    commands[] = {
                        // Niveau 1 - Support
                        {"Get ID", "life_fnc_adminGetID", 1, "players", ""},
                        {"Query Player", "life_fnc_adminQuery", 1, "players", ""},
                
                        // Niveau 2 - Modérateur
                        {"Compensate", "life_fnc_adminCompensate", 2, "players", ""},
                
                        // Niveau 3 - Admin
                        {"Spectate", "life_fnc_adminSpectate", 3, "players", ""},
                        {"TP to Player", "life_fnc_adminTeleport", 3, "players", ""},
                        {"Heal Player", "life_fnc_adminHeal", 3, "players", ""},
                        {"Revive Player", "life_fnc_adminRevive", 3, "players", ""},
                
                        // Niveau 4 - Super Admin
                        {"TP Here", "life_fnc_adminTpHere", 4, "players", ""},
                        {"Freeze Player", "life_fnc_adminFreeze", 4, "players", ""},
                        {"Kick Player", "life_fnc_adminKick", 4, "players", ""},
                        {"Give Money", "life_fnc_adminGiveMoney", 4, "players", ""},
                
                        // Niveau 5 - Owner
                        {"Ban Player", "life_fnc_adminBan", 5, "players", ""},
                        {"Set Admin Level", "life_fnc_adminSetLevel", 5, "players", ""}
                    };
                };
                
                class AdminActions {
                    // Actions personnelles de l'admin
                    commands[] = {
                        {"God Mode", "life_fnc_adminGodMode", 4, "actions", ""},
                        {"Markers", "life_fnc_adminMarkers", 4, "actions", ""},
                        {"Debug Console", "life_fnc_adminDebugCon", 5, "actions", ""},
                        {"Invisibility", "life_fnc_adminInvisibility", 4, "actions", ""},
                        {"No Recoil", "life_fnc_adminNoRecoil", 4, "actions", ""}
                    };
                };
                
                class ObjectManagement {
                    // Gestion objets et véhicules
                    commands[] = {
                        {"Repair Object", "life_fnc_adminRepairObject", 3, "objects", ""},
                        {"Delete Object", "life_fnc_adminDeleteObject", 4, "objects", ""},
                        {"Refuel Vehicle", "life_fnc_adminRefuelVehicle", 3, "objects", ""},
                        {"Flip Vehicle", "life_fnc_adminFlipVehicle", 3, "objects", ""},
                        {"Spawn Vehicle", "life_fnc_adminSpawnVehicle", 4, "objects", ""}
                    };
                };
                
                class ServerManagement {
                    // Gestion du serveur
                    commands[] = {
                        {"Server Message", "life_fnc_adminServerMsg", 4, "server", ""},
                        {"Restart Warning", "life_fnc_adminRestartWarning", 5, "server", ""},
                        {"Server Statistics", "life_fnc_adminServerStats", 3, "server", ""},
                        {"Weather Control", "life_fnc_adminWeather", 4, "server", ""},
                        {"Time Control", "life_fnc_adminTime", 4, "server", ""},
                        {"Cleanup Dead", "life_fnc_adminCleanup", 4, "server", ""},
                        {"Admin Chat", "life_fnc_adminChat", 1, "server", ""}
                    };
                };
                

                📜 Menu Déroulant (Dropdown)

                Pourquoi un Menu Déroulant ?

                Quand un onglet contient plus de 8 commandes, un menu déroulant est recommandé pour :

                  Éviter l'encombrement visuel Maintenir une interface propre Faciliter la recherche de commandes

                  Configuration du Seuil

                  class DropdownSettings {
                      // Nombre max de boutons avant de passer en dropdown
                      maxButtonsBeforeDropdown = 8;
                  
                      // Hauteur du dropdown
                      dropdownHeight = 0.35;  // En SafeZone
                  
                      // Position du bouton "EXÉCUTER"
                      executeButtonColor[] = {0.38, 0.70, 0.89, 0.9};
                  };
                  

                  Architecture Dropdown

                  Quand commands[] > 8 :

                    Combobox (Liste déroulante)

                      Affiche toutes les commandes disponibles Filtrées par niveau admin Triées alphabétiquement

                      Bouton "EXÉCUTER"

                        Apparaît sous la combobox Exécute la commande sélectionnée Couleur selon le niveau de la commande

                        Quand commands[] <= 8 :

                          Affichage classique en boutons Un bouton par commande Pas de dropdown

                          Exemple d'Implémentation

                          // Dans fn_adminMenuTabChange.sqf
                          
                          private _commands = [];
                          switch (_tabIndex) do {
                              case 0: { // JOUEURS
                                  _commands = getArray(missionConfigFile >> "Life_AdminConfig" >> "PlayerManagement" >> "commands");
                              };
                              // ... autres onglets
                          };
                          
                          // Filtrer par niveau admin
                          private _availableCommands = [];
                          {
                              private _cmdName = _x select 0;
                              private _cmdFunction = _x select 1;
                              private _cmdLevel = _x select 2;
                          
                              if (life_adminlevel >= _cmdLevel) then {
                                  _availableCommands pushBack _x;
                              };
                          } forEach _commands;
                          
                          // Vérifier si dropdown nécessaire
                          private _maxButtons = getNumber(missionConfigFile >> "Life_AdminConfig" >> "DropdownSettings" >> "maxButtonsBeforeDropdown");
                          
                          if (count _availableCommands > _maxButtons) then {
                              // CRÉER DROPDOWN
                              private _dropdown = _display ctrlCreate ["RscCombo", 29100];
                              _dropdown ctrlSetPosition [0.35 * safezoneW + safezoneX, 0.35 * safezoneH + safezoneY, 0.25 * safezoneW, 0.03 * safezoneH];
                              _dropdown ctrlCommit 0;
                          
                              // Remplir dropdown
                              {
                                  private _cmdName = _x select 0;
                                  private _index = _dropdown lbAdd _cmdName;
                                  _dropdown lbSetData [_index, _x select 1]; // Stocker fonction
                                  _dropdown lbSetValue [_index, _x select 2]; // Stocker niveau
                              } forEach _availableCommands;
                          
                              // Bouton EXÉCUTER
                              private _executeBtn = _display ctrlCreate ["RscButton", 29101];
                              _executeBtn ctrlSetText "EXÉCUTER";
                              _executeBtn ctrlSetPosition [0.35 * safezoneW + safezoneX, 0.39 * safezoneH + safezoneY, 0.25 * safezoneW, 0.03 * safezoneH];
                              _executeBtn ctrlCommit 0;
                          
                              _executeBtn ctrlAddEventHandler ["ButtonClick", {
                                  private _display = findDisplay 29000;
                                  private _dropdown = _display displayCtrl 29100;
                                  private _selectedIndex = lbCurSel _dropdown;
                          
                                  if (_selectedIndex >= 0) then {
                                      private _function = _dropdown lbData _selectedIndex;
                                      call compile format["call %1;", _function];
                                  };
                              }];
                          
                          } else {
                              // CRÉER BOUTONS CLASSIQUES
                              private _yOffset = 0;
                              {
                                  private _btn = _display ctrlCreate ["RscButton", 29100 + _forEachIndex];
                                  // ... création bouton classique
                                  _yOffset = _yOffset + 0.035;
                              } forEach _availableCommands;
                          };
                          

                          🎨 Personnalisation Avancée

                          Icônes Personnalisées

                          commands[] = {
                              {
                                  "Heal Player",
                                  "life_fnc_adminHeal",
                                  3,
                                  "players",
                                  "\A3\ui_f\data\IGUI\Cfg\Actions\heal_ca.paa"  // Icône custom
                              }
                          };
                          

                          Tooltips (Infobulles)

                          class Tooltips {
                              enabled = 1;  // Activer les tooltips
                          
                              // Format: {"fonction", "Description"}
                              descriptions[] = {
                                  {"life_fnc_adminHeal", "Soigner complètement le joueur sélectionné"},
                                  {"life_fnc_adminFreeze", "Geler/Dégeler le joueur ciblé"},
                                  {"life_fnc_adminBan", "Bannir définitivement le joueur du serveur"}
                              };
                          };
                          

                          Sons Personnalisés

                          class Sounds {
                              // Sons lors d'actions
                              onButtonClick = "click";
                              onCommandExecute = "FD_Finish_F";
                              onError = "FD_CP_Not_Clear_F";
                              onSuccess = "FD_Finish_F";
                          };
                          

                          📋 Exemples de Configuration

                          Config_Admin.hppConfiguration Minimaliste (4 onglets, peu de commandes)

                          Ajouter une commande:

                          class Life_AdminConfig {
                              class AdminLevels {
                                  levels[] = {"Joueur", "Support", "Modérateur", "Admin", "Super Admin", "Owner"};
                              };
                          
                              class DropdownSettings {
                                  maxButtonsBeforeDropdown = 10;  // Seuil élevé
                              };
                          
                              class PlayerManagement {
                                  commands[] = {
                                      {"Spectate", "life_fnc_adminSpectate", 3, "players"},
                                      {"TP to Player", "life_fnc_adminTeleport", 3, "players"},
                                      {"Freeze", "life_fnc_adminFreeze", 4, "players"}
                                  };
                              };
                          
                              // ... autres classes minimalistes
                          };
                          

                          Configuration Avancée (5+ onglets, beaucoup de commandes)

                          class Life_AdminConfig {
                              class AdminLevels {
                                  levels[] = {
                                      "Joueur",           // 0
                                      "Trial Support",    // 1
                                      "Support",          // 2
                                      "Modérateur",       // 3
                                      "Admin",            // 4
                                      "Super Admin",      // 5
                                      "Head Admin",       // 6
                                      "Owner"             // 7
                                  };
                              };
                          
                              class DropdownSettings {
                                  maxButtonsBeforeDropdown = 6;  // Seuil bas = dropdown plus fréquent
                                  dropdownHeight = 0.4;
                              };
                          
                              class Tabs {
                                  count = 6;
                                  tabs[] = {
                                      {"JOUEURS", "players", "\A3\...", {0.38, 0.70, 0.89, 0.7}},
                                      {"ACTIONS", "actions", "\A3\...", {0.8, 0.5, 0.2, 0.7}},
                                      {"VÉHICULES", "vehicles", "\A3\...", {0.3, 0.7, 0.3, 0.7}},
                                      {"SERVEUR", "server", "\A3\...", {0.8, 0.2, 0.2, 0.7}},
                                      {"UTILITAIRES", "utilities", "\A3\...", {0.5, 0.5, 0.9, 0.7}},
                                      {"LOGS", "logs", "\A3\...", {0.4, 0.4, 0.4, 0.7}}
                                  };
                              };
                          
                              class PlayerManagement {
                                  commands[] = {
                                      // ...15+ commandes existantesjoueurs
                                      {"Get ID", "life_fnc_adminGetID", 1, "players"},
                                      {"Query", "life_fnc_adminQuery", 1, "players"},
                                      {"Spectate", "life_fnc_adminSpectate", 3, "players"},
                                      {"TP to", "life_fnc_adminTeleport", 3, "players"},
                                      {"Heal", "life_fnc_adminHeal", 3, "players"},
                                      {"Revive", "life_fnc_adminRevive", 3, "players"},
                                      {"TP Here", "life_fnc_adminTpHere", 4, "players"},
                                      {"Freeze", "life_fnc_adminFreeze", 4, "players"},
                                      {"Kick", "life_fnc_adminKick", 4, "players"},
                                      {"Give Money", "life_fnc_adminGiveMoney", 4, "players"},
                                      {"Strip Weapons", "life_fnc_adminStripWeapons", 4, "players"},
                                      {"Ban Temp", "life_fnc_adminBanTemp", 5, "players"},
                                      {"Ban Perm", "life_fnc_adminBan", 6, "players"},
                                      {"Unban", "life_fnc_adminUnban", 6, "players"},
                                      {"Set Admin", "life_fnc_adminSetLevel", 7, "players"}
                                  };
                              };
                          
                              // ... autres classes avec beaucoup de commandes
                          };
                          

                          🛠️ Modification Dynamique

                          Ajouter une Commande

                            Ouvrir config/Config_Admin.hpp Trouver la classe correspondante (PlayerManagement, AdminActions, etc.) Ajouter une ligne dans commands[]:
                            {"Ma Nouvelle Commande", "life_fnc_maFonction", 3, "players"}
                            // Nom affiché | Fonction | Niveau min | Onglet
                                };
                            };
                            

                            Onglets disponibles:

                              1. "players"Recompiler -la Onglet Joueursmission
                              2. "actions"La -commande Ongletapparaît Actionsautomatiquement dans le bon onglet !
                              3. "vehicles"
                            - Onglet Véhicules "server" - Onglet Serveur

                            Changer le niveauNiveau requis

                            :Requis
                            // AVANT
                            {"Freeze Player", "life_fnc_adminFreeze", 4, "players"}
                            
                            // APRÈS (accessible dès niveau 3)
                            {"Freeze Player", "life_fnc_adminFreeze", 3, "players"}
                            

                            Déplacer une Commande d'Onglet

                            // ^AVANT (dans l'onglet ACTIONS)
                            {"God Mode", "life_fnc_adminGodMode", 4, "actions"}
                            
                            // NiveauAPRÈS 3(dans requisl'onglet UTILITAIRES)
                            {"God Mode", "life_fnc_adminGodMode", 4, "utilities"}
                            

                            🧪 Tests et Validation

                            Checklist de Validation

                            ☐ Tous les niveaux admin ont des couleurs distinctes
                            ☐ Les onglets sont bien nommés et dans l'ordre souhaité
                            ☐ Chaque commande est dans le bon onglet
                            ☐ Les niveaux admin sont corrects (pas de niveau 1 avec debug)
                            ☐ Le seuil dropdown est adapté au nombre de commandes
                            ☐ Les icônes s'affichent correctement
                            ☐ Les tooltips sont clairs et utiles
                            ☐ Pas de doublons de commandes
                            ☐ Toutes les fonctions existent et sont déclarées
                            

                            CouleursTests par NiveauIn-Game

                            Dans fn_adminMenuTabChange.sqf, modifier les couleurs:

                            private// _colorTester avec différents niveaux
                            life_adminlevel = switch (_cmdLevel) do {
                                case 1: {[0.3, 0.7, 0.3, 0.7]};1;  // Vert - Support
                            casecreateDialog 2:"life_admin_menu_new";
                            
                            {[0.4,life_adminlevel 0.6,= 0.8, 0.7]};3;  // BleuAdmin
                            claircreateDialog case"life_admin_menu_new";
                            
                            3:life_adminlevel {[0.38,= 0.70, 0.89, 0.7]};5;  // BleuOwner
                            casecreateDialog 4: {[0.8, 0.5, 0.2, 0.7]};      // Orange
                                case 5: {[0.8, 0.2, 0.2, 0.7]};      // Rouge
                                default {[0.5, 0.5, 0.5, 0.7]};      // Gris
                            }"life_admin_menu_new";
                            

                            🔗📚 DépendancesRéférence et AdaptationsRapide

                            VariablesCommandes Globales CrééesConfig

                            Le

                            menucréecesPropriété variablesType globales:Valeurs Description count NUMBER 1-10 Nombre d'onglets maxButtonsBeforeDropdown NUMBER 5-15 Seuil dropdown levels[] ARRAY Strings Noms des niveaux admin commands[] ARRAY Arrays Liste des commandes tabs[] ARRAY Arrays Configuration onglets

                            Format Couleur

                            life_admin_currentTab{R, G, B, Alpha}
                            // OngletR, actifG, (0-3)B: life_admin_selectedPlayer0.0 à 1.0
                            // JoueurAlpha: sélectionné0.0 (OBJECT)
                            life_admin_currentFilter     // Filtre actif ("all", "cop", "civ", "medic")
                            life_admin_marker            // Marqueur map (STRING)
                            life_admin_posUpdate         // Handle misetransparent) à jour position1.0 (SCRIPT)
                            

                            Nettoyage: Ces variables sont automatiquement nettoyées à la fermeture du menu.

                            Macros Utilisées

                            FETCH_CONST(life_adminlevel)  // Depuis script_macros.hpp
                            

                            Si vous n'avez pas ce macro:

                            REMPLACER par:

                            life_adminlevel  // Variable directeopaque)
                            

                            FonctionsIcônes duArma Framework Utilisées3

                            Chemin Description \A3\ui_f\data\GUI\Rsc\RscDisplayArsenal\face_ca.paa Visage (joueurs) \A3\ui_f\data\IGUI\Cfg\Actions\settimer_ca.paa Horloge \A3\ui_f\data\IGUI\Cfg\Actions\getindriver_ca.paa Véhicule \A3\ui_f\data\IGUI\Cfg\Actions\repair_ca.paa Réparer \A3\ui_f\data\IGUI\Cfg\Actions\heal_ca.paa Soigner

                            🎉 Conclusion

                            ObligatoiresAvec ce système de configuration :

                            • Aucune✅ fonctionFacile customà obligatoiremodifier (utilise: fonctionsTout Armaest 3)dans un seul fichier
                            ✅ Flexible : Supporte 1 à 10+ onglets ✅ Scalable : Dropdown automatique si trop de commandes ✅ Personnalisable : Couleurs, icônes, tooltips ✅ Maintenable : Pas besoin de toucher au code SQF

                            OptionnellesProchaines étapes (pour fonctionnalités avancées):

                              TON_fnc_player_query - Infos financières joueur Toutes les fonctions life_fnc_admin* - Commandes admin

                              🛠️ Troubleshooting

                              Problème: Le menu ne s'ouvre pas

                              Solutions:

                              1. Vérifier life_adminlevel:

                                hint str life_adminlevel;  // Doit être >= 1
                                

                              Vérifier les includes:

                                MasterHandler.hpp contient #include "admin_menu_new.hpp"

                                Vérifier les erreurs RPT:

                                C:\Users\VOTRE_NOM\AppData\Local\Arma 3\arma3_x64_xxx.rpt
                                

                                Problème: Liste de joueurs vide

                                Solutions:

                                  Tester playableUnits:

                                  hint str (count playableUnits);
                                  

                                  Vérifier les factions dans fn_adminRefreshList.sqf

                                  Problème: Boutons d'action invisibles

                                  Causes possibles:

                                    Niveau admin insuffisant: Les boutons sont masqués si life_adminlevel < niveau_requis Mauvaise configuration dansPersonnaliser Config_Admin.hpp selon vos besoins

                                    Solution: Vérifier dans

                                    Adapter fn_adminMenuTabChange.sqf lignepour ~75:lire
                                    ifcette (_adminLevelconfig
                                    >= _cmdLevel) then { // CréerImplémenter le boutonsystème }de

                                    Problème: Mini-map ne s'affiche pas

                                    Solutions:

                                      Vérifier la classe Life_RscMapControl dans common.hppdropdown Tester manuellement:avec
                                      _mapdifférents =niveaux findDisplay 29000 displayCtrl 29040;
                                      ctrlType _map;  // Doit retourner 101
                                      

                                      Problème: Erreurs "Undefined variable"

                                      Cause: Variables du framework différentes

                                      Solution: Rechercher et remplacer dans tous les fichiers:

                                      # Windows PowerShell
                                      Get-ChildItem -Recurse -Filter "*.sqf" | Select-String "VARIABLE_A_REMPLACER"
                                      
                                      # Linux/Mac
                                      grep -r "VARIABLE_A_REMPLACER" *.sqf
                                      

                                      📞 Support

                                      Pour toute question ou problème:

                                        Vérifier ce guide en entier Consulter admin_menu_project.md pour la documentation complète Vérifier les fichiers RPT pour les erreursadmin

                                        📄 Licence

                                        Auteur: ProtoMehka Version: 2.1 Date: 2025-10-04 Framework: Altis Life 5.0+10

                                        Libre d'utilisation et de modification. Crédit apprécié mais non obligatoire.


                                        🔄 Changelog

                                        Version 2.0 (2025-10-04)

                                          ✨ Interface moderne avec onglets ✨ Mini-map interactive ✨ Système de recherche et filtres ✨ Configuration centralisée des permissions ✨ Design responsive SafeZone ✨ Mise à jour temps réel positions joueurs

                                          Fin du Guide d'Intégration