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

  1. Présentation
  2. Fichiers du Package
  3. Prérequis
  4. Installation Complète
  5. Intégration dans un Autre Framework
  6. Configuration
  7. Dépendances et Adaptations
  8. 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 joueurs
  • au
  • 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:

VariableTypeDescriptionExemple
life_adminlevelNUMBERNiveau admin du joueur0-5
playableUnitsARRAYListe des joueurs connectésAuto Arma 3
profileNameSTRINGNom du joueurAuto Arma 3

Fonctions Externes Utilisées

FonctionFichier d'origineUtilisation
TON_fnc_player_querylife_server/functions.sqfRécupérer infos joueur
life_fnc_adminGetIDExistanteGet Steam ID
life_fnc_adminQueryExistanteQuery player
life_fnc_adminSpectateExistanteSpectate 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

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

    admin_menu.Altis/config/
    
  2. 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

  1. Compiler votre mission
  2. Se connecter au serveur
  3. Avoir life_adminlevel >= 1
  4. 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:

  1. Vérifier les variables:

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

    SuivreLevel1 l'installation complète ci-dessus

  4. Adapter les chemins si nécessaire dans les #include

Cas 2: Framework Custom

A. Identifier les Variables Équivalentes

Variable AL 5.0Votre FrameworkAction
life_adminlevelplayer_admin, adminLevel, etc.Remplacer dans tous les fichiers
playableUnitsGénéralement identique-
profileNameGé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 ActionRGBUsage Recommandé
🟢 VertTON_fnc_player_query{0.3, 0.7, 0.3} RemplacerNiveau par1 votre fonction de query joueur(Support)
🔵 Bleu Clairlife_fnc_adminGetID{0.4, 0.6, 0.8} GarderNiveau ou2 adapter(Modérateur)
🔵 Bleulife_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:

  1. Trouver où vous ouvrez votre menu admin
  2. 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 :

  1. Combobox (Liste déroulante)

    • Affiche toutes les commandes disponibles
    • Filtrées par niveau admin
    • Triées alphabétiquement
  2. 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

  1. Ouvrir config/Config_Admin.hpp
  2. Trouver la classe correspondante (PlayerManagement, AdminActions, etc.)
  3. 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éecesvariablesglobales:

Propriété Type ValeursDescription
countNUMBER1-10Nombre d'onglets
maxButtonsBeforeDropdownNUMBER5-15Seuil dropdown
levels[]ARRAYStringsNoms des niveaux admin
commands[]ARRAYArraysListe des commandes
tabs[]ARRAYArraysConfiguration 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

CheminDescription
\A3\ui_f\data\GUI\Rsc\RscDisplayArsenal\face_ca.paaVisage (joueurs)
\A3\ui_f\data\IGUI\Cfg\Actions\settimer_ca.paaHorloge
\A3\ui_f\data\IGUI\Cfg\Actions\getindriver_ca.paaVéhicule
\A3\ui_f\data\IGUI\Cfg\Actions\repair_ca.paaRéparer
\A3\ui_f\data\IGUI\Cfg\Actions\heal_ca.paaSoigner

🎉 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
    
  2. Vérifier les includes:

    • MasterHandler.hpp contient #include "admin_menu_new.hpp"
  3. Vérifier les erreurs RPT:

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

Problème: Liste de joueurs vide

Solutions:

  1. Tester playableUnits:

    hint str (count playableUnits);
    
  2. Vérifier les factions dans fn_adminRefreshList.sqf

Problème: Boutons d'action invisibles

Causes possibles:

  1. Niveau admin insuffisant: Les boutons sont masqués si life_adminlevel < niveau_requis
  2. 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éer
  • Implémenter le boutonsystème }de

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

    Solutions:

    1. Vérifier la classe Life_RscMapControl dans common.hppdropdown
    2. 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:

    1. Vérifier ce guide en entier
    2. Consulter admin_menu_project.md pour la documentation complète
    3. 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