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 :
📁 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
{0.3, 0.7, 0.3}{0.4, 0.6, 0.8}{0.38, 0.70, 0.89}{0.8, 0.5, 0.2}{0.8, 0.2, 0.2}{0.3, 0.3, 0.3}🗂️ 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 :
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)
Bouton "EXÉCUTER"
Quand commands[] <= 8 :
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
config/Config_Admin.hppPlayerManagementAdminActionscommands[]{"Ma Commande", "life_fnc_maFonction", 3, "players"}
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
countmaxButtonsBeforeDropdownlevels[]commands[]tabs[]Format Couleur
{R, G, B, Alpha}
// R, G, B: 0.0 à 1.0
// Alpha: 0.0 (transparent) à 1.0 (opaque)
Icônes Arma 3
\A3\ui_f\data\GUI\Rsc\RscDisplayArsenal\face_ca.paa\A3\ui_f\data\IGUI\Cfg\Actions\settimer_ca.paa\A3\ui_f\data\IGUI\Cfg\Actions\getindriver_ca.paa\A3\ui_f\data\IGUI\Cfg\Actions\repair_ca.paa\A3\ui_f\data\IGUI\Cfg\Actions\heal_ca.paa🎉 Conclusion
Avec ce système de configuration :
Prochaines étapes :
Config_Admin.hppfn_adminMenuTabChange.sqfAuteur: ProtoMehka
Version: 2.1
Date: 2025-10-10 Janvier 2025
Framework: Altis Life 5.0+
📋 Table des Matières
✅ Prérequis
Avant de commencer, assurez-vous d'avoir :
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
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
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
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
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
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)
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
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
life_adminlevel >= 1)
Appuyez sur Y → Admin Menu
Vérifiez :
Test 4 : Commandes
Testez une commande simple comme Markers ou God Mode :
admin_logs)
🐛 Troubleshooting
Problème : Le menu ne s'ouvre pas
Solution :
life_adminlevel >= 1 avec hint str life_adminlevel;
Vérifiez que MasterHandler.hpp inclut bien admin_menu.hpp
Vérifiez les logs RPT pour erreurs de compilation
Problème : Liste de joueurs vide
Solution :
[ADMIN REFRESH] doit apparaître
Testez hint str (count playableUnits); pour voir si la fonction fonctionne
Ouvrez/fermez le menu plusieurs fois (délai de chargement)
Problème : Aucune commande affichée
Solution :
Config_Admin.hpp est bien inclus dans Config_Master.hpp
Vérifiez les logs : [ADMIN MENU] X commandes disponibles
Vérifiez votre niveau admin (certaines commandes nécessitent niveau 3+)
Problème : Erreur <NULL-config>
Solution :
Config_Admin.hpp est bien dans admin_menu.Altis/config/
Vérifiez l'include dans Config_Master.hpp (ligne exacte, chemin)
Recompilez la mission
Problème : Dropdown ne s'affiche pas
Solution :
fn_adminMenuTabChange.sqf est bien copié
Vérifiez que la fonction est déclarée dans Functions.hpp
Testez en changeant d'onglet plusieurs fois
Problème : Finances ne s'affichent pas
Solution :
CfgRemoteExec.hpp pour TON_fnc_getPlayerFinances
Vérifiez les logs serveur pour erreurs SQL
📚 Documentation Complémentaire
✅ Checklist Finale
Avant de mettre en production :
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
Nouvelle Fonctionnalité
Version 2.1 - 10 Janvier 2025