Skip to main content

Intégration Client

📋🖥️ Guide ded'Intégration Configuration Admin - Config_Admin.hpp

Auteur: ProtoMehka Version: 2.1 Dernière mise à jour: 2025-10-10


🎯 Objectif

Centraliser toute la configuration du menu admin dans un seul fichier pour permettre :

  • Définir les 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 beaucoup d'actions
  • Modifier facilement sans toucher au code

📁 Structure du Fichier

Localisation

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 onglets
    class Tabs { ... };

    // Commandes par catégorie
    class PlayerManagement { ... };
    class AdminActions { ... };
    class ObjectManagement { ... };
    class ServerManagement { ... };
};

🎨 Configuration des Couleurs

Couleurs par Niveau Admin

class ButtonColors {
    // Format: {R, G, B, Alpha}
    // Valeurs de 0.0 à 1.0

    class Level1 {  // Support
        normal[] = {0.3, 0.7, 0.3, 0.7};      // Vert normal
        hover[] = {0.4, 0.8, 0.4, 0.9};       // Vert hover
        pressed[] = {0.2, 0.6, 0.2, 0.8};     // Vert pressé
        disabled[] = {0.3, 0.3, 0.3, 0.5};    // Gris désactivé
    };

    class Level2 {  // Modérateur
        normal[] = {0.4, 0.6, 0.8, 0.7};      // Bleu clair
        hover[] = {0.5, 0.7, 0.9, 0.9};
        pressed[] = {0.3, 0.5, 0.7, 0.8};
        disabled[] = {0.3, 0.3, 0.3, 0.5};
    };

    class Level3 {  // Admin
        normal[] = {0.38, 0.70, 0.89, 0.7};   // Bleu Altis
        hover[] = {0.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.2, 0.7};      // Orange
        hover[] = {0.9, 0.6, 0.3, 0.9};
        pressed[] = {0.7, 0.4, 0.1, 0.8};
        disabled[] = {0.3, 0.3, 0.3, 0.5};
    };

    class Level5 {  // Owner
        normal[] = {0.8, 0.2, 0.2, 0.7};      // Rouge
        hover[] = {0.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};
    };
};

Palette de Couleurs Recommandées

CouleurRGBUsage Recommandé
🟢 Vert{0.3, 0.7, 0.3}Niveau 1 (Support)
🔵 Bleu Clair{0.4, 0.6, 0.8}Niveau 2 (Modérateur)
🔵 Bleu{0.38, 0.70, 0.89}Niveau 3 (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é

🗂️ Configuration des Onglets

Structure de Base

class Tabs {
    // Nombre total d'onglets
    count = 4;

    // Configuration de chaque onglet
    // Format: {Nom, ID, Icône, Couleur}

    tabs[] = {
        {
            "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 3Client - 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

Configuration Minimaliste (4 onglets, peu de commandes)

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",    // v2.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 joueurs
            {"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 Commande", "life_fnc_maFonction", 3, "players"}
  1. Recompiler la mission
  2. La commande apparaît automatiquement dans le bon onglet !

Changer le Niveau 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"}

// APRÈS (dans l'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

Tests In-Game

// Tester avec différents niveaux
life_adminlevel = 1;  // Support
createDialog "life_admin_menu_new";

life_adminlevel = 3;  // Admin
createDialog "life_admin_menu_new";

life_adminlevel = 5;  // Owner
createDialog "life_admin_menu_new";

📚 Référence Rapide

Commandes Config

PropriétéTypeValeursDescription
countNUMBER1-10Nombre d'onglets
maxButtonsBeforeDropdownNUMBER5-15Seuil dropdown
levels[]ARRAYStringsNoms des niveaux admin
commands[]ARRAYArraysListe des commandes
tabs[]ARRAYArraysConfiguration onglets

Format Couleur

{R, G, B, Alpha}
// R, G, B: 0.0 à 1.0
// Alpha: 0.0 (transparent) à 1.0 (opaque)

Icônes Arma 3

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

Avec ce système de configuration :

  • Facile à modifier : Tout est 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

Prochaines étapes :

  1. Personnaliser Config_Admin.hpp selon vos besoins
  2. Adapter fn_adminMenuTabChange.sqf pour lire cette config
  3. Implémenter le système de dropdown
  4. Tester avec différents niveaux admin

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


📋 Table des Matières

  1. Prérequis
  2. Fichiers à Copier
  3. Modifications des Fichiers de Configuration
  4. Vérification de l'Installation
  5. Troubleshooting

✅ Prérequis

Avant de commencer, assurez-vous d'avoir :

  •  Framework Altis Life 5.0 ou supérieur
  •  Accès aux fichiers de la mission (admin_menu.Altis/)
  •  Éditeur de texte (Notepad++, VSCode, etc.)
  •  Backup complet de votre mission

📦 Fichiers à Copier

Étape 1 : Nouveaux Fichiers

Copiez les fichiers suivants dans votre mission admin_menu.Altis/ :

Configuration (1 fichier)

admin_menu.Altis/config/
└── Config_Admin.hpp          ✨ NOUVEAU

Interface (3 fichiers)

admin_menu.Altis/dialog/
├── admin_menu.hpp             ⚠️ REMPLACER
├── server_message.hpp         ⚠️ REMPLACER
└── object_manager.hpp         ✨ NOUVEAU (v2.1)

Fonctions Admin Core (12 fichiers)

admin_menu.Altis/core/admin/
├── fn_adminMenu.sqf               ⚠️ REMPLACER
├── fn_adminMenuTabChange.sqf      ⚠️ REMPLACER
├── fn_adminRefreshList.sqf        ⚠️ REMPLACER
├── fn_adminSearchPlayer.sqf       ⚠️ REMPLACER
├── fn_adminPlayerSelected.sqf     ⚠️ REMPLACER
├── fn_adminQueryFinances.sqf      ⚠️ REMPLACER
├── fn_adminReceiveFinances.sqf    ⚠️ REMPLACER
├── fn_adminRepairObject.sqf       ⚠️ REMPLACER
├── fn_adminDeleteObject.sqf       ⚠️ REMPLACER
├── fn_adminServerMsg.sqf          ⚠️ REMPLACER
├── fn_adminSendServerMsg.sqf      ⚠️ REMPLACER
└── fn_adminBroadcastMsg.sqf       ⚠️ REMPLACER

Fonctions Admin - Corrections v2.1 (5 fichiers)

admin_menu.Altis/core/admin/
├── fn_adminSpectate.sqf           ⚠️ REMPLACER (TFAR compatible)
├── fn_adminTpHere.sqf             ⚠️ REMPLACER (IDC corrigé)
├── fn_adminFreeze.sqf             ⚠️ REMPLACER (IDC corrigé)
└── fn_adminGodMode.sqf            ⚠️ REMPLACER (closeDialog supprimé)

Object Manager - NOUVEAU v2.1 (4 fichiers)

admin_menu.Altis/core/admin/
├── fn_adminObjectManager.sqf      ✨ NOUVEAU
├── fn_adminObjectRefresh.sqf      ✨ NOUVEAU
├── fn_adminObjectSelect.sqf       ✨ NOUVEAU
└── fn_adminObjectDelete.sqf       ✨ NOUVEAU

Autres Fonctions Admin (3 fichiers)

admin_menu.Altis/core/admin/
├── fn_adminCompensate.sqf         ⚠️ REMPLACER (logging ajouté)
├── fn_adminDebugCon.sqf           ⚠️ REMPLACER (logging ajouté)
└── fn_adminMarkers.sqf            ⚠️ REMPLACER (logging ajouté)

Fonction Teleport (1 fichier)

admin_menu.Altis/core/functions/
└── fn_teleport.sqf                ⚠️ REMPLACER (logging ajouté)

🔧 Modifications des Fichiers de Configuration

Étape 2 : Config_Master.hpp

Fichier: admin_menu.Altis/config/Config_Master.hpp

Localiser la section des includes (généralement au début du fichier, après class Life_Settings).

Ajouter cette ligne :

#include "Config_Admin.hpp"

Exemple de placement :

class Life_Settings {
    /* ... autres paramètres ... */
};

#include "Config_Admin.hpp"      // ← AJOUTER ICI
#include "Config_Master.hpp"
#include "Config_Clothing.hpp"
// ... autres includes ...

Étape 3 : Functions.hpp

Fichier: admin_menu.Altis/Functions.hpp

Localiser la classe Admin (environ ligne 70-90).

Remplacer ou compléter avec les nouvelles fonctions :

class Admin {
    file = "core\admin";

    // Fonctions existantes (conserver si elles existent)
    class adminCompensate {};
    class adminDebugCon {};
    class adminFreeze {};
    class admingetID {};
    class adminGodMode {};
    class adminid {};
    class admininfo {};
    class adminMarkers {};
    class adminQuery {};
    class adminSpectate {};
    class adminTeleport {};
    class adminTpHere {};

    // ✨ NOUVELLES FONCTIONS - Admin Menu v2.1
    class adminMenu {};
    class adminMenuTabChange {};
    class adminRefreshList {};
    class adminSearchPlayer {};
    class adminPlayerSelected {};
    class adminQueryFinances {};
    class adminReceiveFinances {};
    class adminRepairObject {};
    class adminDeleteObject {};
    class adminServerMsg {};
    class adminSendServerMsg {};
    class adminBroadcastMsg {};

    // ✨ Object Manager v2.1
    class adminObjectManager {};
    class adminObjectRefresh {};
    class adminObjectSelect {};
    class adminObjectDelete {};
};

Étape 4 : MasterHandler.hpp

Fichier: admin_menu.Altis/dialog/MasterHandler.hpp

Localiser les includes de dialogs admin.

Modifier pour inclure les nouveaux dialogs :

// Admin Menu v2.1
#include "admin_menu.hpp"
#include "server_message.hpp"
#include "object_manager.hpp"

⚠️ Important : Supprimez l'ancien include si présent :

// #include "admin_menu_new.hpp"   ← SUPPRIMER si présent

Étape 5 : CfgRemoteExec.hpp

Fichier: admin_menu.Altis/CfgRemoteExec.hpp

Ajouter les permissions pour les nouvelles fonctions client :

// Admin Menu v2.1 - Client Functions
F(life_fnc_adminQueryFinances,CLIENT)
F(life_fnc_adminReceiveFinances,CLIENT)
F(life_fnc_adminBroadcastMsg,CLIENT)

Ajouter les permissions pour les fonctions serveur :

// Admin Menu v2.1 - Server Functions
F(TON_fnc_getPlayerFinances,SERVER)
F(TON_fnc_logAdminAction,SERVER)

Exemple complet d'une section :

class CfgRemoteExec {
    class Functions {
        mode = 1;
        jip = 0;

        // ... autres fonctions ...

        // Admin Menu v2.0 - Client
        F(life_fnc_adminQueryFinances,CLIENT)
        F(life_fnc_adminReceiveFinances,CLIENT)
        F(life_fnc_adminBroadcastMsg,CLIENT)

        // Admin Menu v2.0 - Server
        F(TON_fnc_getPlayerFinances,SERVER)
        F(TON_fnc_logAdminAction,SERVER)
    };
};

Étape 6 : player_inv.hpp

Fichier: admin_menu.Altis/dialog/player_inv.hpp

Localiser le bouton "Admin Menu" (généralement IDC 2021).

Modifier l'action onButtonClick :

class ButtonAdminMenu: Life_RscButtonMenu {
    idc = 2021;
    text = "$STR_PM_AdminMenu";
    colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 0.5};
    onButtonClick = "closeDialog 0; createDialog ""life_admin_menu"";";  // ← MODIFIER ICI
    x = 0.0204 * safezoneW + safezoneX;
    y = 0.82 * safezoneH + safezoneY;
    w = 0.0392 * safezoneW;
    h = 0.033 * safezoneH;
};

⚠️ Important : L'ancien nom était potentiellement life_admin_menu_new, vérifiez et changez en life_admin_menu.


Étape 7 : common.hpp (Optionnel)

Fichier: admin_menu.Altis/dialog/common.hpp

Ce fichier a reçu des modifications mineures (+1 ligne). Si vous avez des customisations importantes dans votre common.hpp, vérifiez les différences.

Conseil : Si vous n'avez pas modifié ce fichier, remplacez-le par la nouvelle version.


✅ Vérification de l'Installation

Test 1 : Compilation

  1. Packez votre mission (PBO)
  2. Vérifiez qu'il n'y a aucune erreur de compilation
  3. Recherchez dans les logs :
    • Config_Admin.hpp doit être chargé
    • Aucune erreur <NULL-config>

Test 2 : Logs de Démarrage

Lancez la mission et vérifiez le fichier RPT :

[ADMIN MENU] Config_Admin.hpp chargé
[ADMIN MENU] 12 commandes disponibles
[ADMIN REFRESH] Liste des joueurs chargée

Test 3 : Menu Fonctionnel

  1. Connectez-vous avec un compte admin (life_adminlevel >= 1)
  2. Appuyez sur Y → Admin Menu
  3. Vérifiez :
    •  Le menu s'ouvre correctement
    •  Les 4 onglets sont visibles (Joueurs/Actions/Objets/Serveur)
    •  La liste des joueurs s'affiche
    •  La recherche fonctionne
    •  Le dropdown affiche les commandes
    •  La mini-map s'affiche quand un joueur est sélectionné

Test 4 : Commandes

Testez une commande simple comme Markers ou God Mode :

  1. Sélectionnez la commande dans le dropdown
  2. Cliquez sur EXÉCUTER
  3. Vérifiez que la commande s'exécute
  4. Vérifiez dans la BDD que l'action est loguée (table admin_logs)

🐛 Troubleshooting

Problème : Le menu ne s'ouvre pas

Solution :

  1. Vérifiez life_adminlevel >= 1 avec hint str life_adminlevel;
  2. Vérifiez que MasterHandler.hpp inclut bien admin_menu.hpp
  3. Vérifiez les logs RPT pour erreurs de compilation

Problème : Liste de joueurs vide

Solution :

  1. Vérifiez les logs : [ADMIN REFRESH] doit apparaître
  2. Testez hint str (count playableUnits); pour voir si la fonction fonctionne
  3. Ouvrez/fermez le menu plusieurs fois (délai de chargement)

Problème : Aucune commande affichée

Solution :

  1. Vérifiez que Config_Admin.hpp est bien inclus dans Config_Master.hpp
  2. Vérifiez les logs : [ADMIN MENU] X commandes disponibles
  3. Vérifiez votre niveau admin (certaines commandes nécessitent niveau 3+)

Problème : Erreur <NULL-config>

Solution :

  1. Assurez-vous que Config_Admin.hpp est bien dans admin_menu.Altis/config/
  2. Vérifiez l'include dans Config_Master.hpp (ligne exacte, chemin)
  3. Recompilez la mission

Problème : Dropdown ne s'affiche pas

Solution :

  1. Vérifiez que fn_adminMenuTabChange.sqf est bien copié
  2. Vérifiez que la fonction est déclarée dans Functions.hpp
  3. Testez en changeant d'onglet plusieurs fois

Problème : Finances ne s'affichent pas

Solution :

  1. Vérifiez que la partie serveur est installée (voir INTEGRATION_SERVER.md)
  2. Vérifiez CfgRemoteExec.hpp pour TON_fnc_getPlayerFinances
  3. Vérifiez les logs serveur pour erreurs SQL

📚 Documentation Complémentaire

DocumentDescription
README.mdDocumentation générale du projet
CONFIG_ADMIN_GUIDE.mdGuide de configuration détaillé
INTEGRATION_SERVER.mdInstallation côté serveur
INTEGRATION_DB.mdConfiguration base de données
CHANGELOG.mdJournal des modifications

✅ Checklist Finale

Avant de mettre en production :

  •  Tous les fichiers sont copiés
  •  Config_Master.hpp modifié
  •  Functions.hpp modifié
  •  MasterHandler.hpp modifié
  •  CfgRemoteExec.hpp modifié
  •  player_inv.hpp modifié
  •  Mission recompilée sans erreur
  •  Logs RPT vérifiés
  •  Menu testé en jeu
  •  Commandes testées
  •  Logging vérifié en BDD
  •  Backup effectué

Installation côté serveur : Voir INTEGRATION_SERVER.md Configuration BDD : Voir INTEGRATION_DB.md


🆕 Nouveautés v2.1

Corrections de Bugs

  • TP Here : IDC corrigé (2902 → 29020)
  • Freeze Player : IDC corrigé (2902 → 29020)
  • God Mode : Ne ferme plus le menu
  • Server Message : Fonction et remoteExec corrigés
  • Spectate : Touche F fonctionnelle, caméra repositionnée, compatible TFAR

Nouvelle Fonctionnalité

  • Object Manager : Gestionnaire d'items au sol
    • Détection items dans rayon personnalisable (1-50m)
    • Affichage contenu WeaponHolder détaillé
    • Flèche 3D rouge sur item sélectionné
    • Suppression individuelle d'items
    • Les autres items restent au sol

Version 2.1 - 10 Janvier 2025