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é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éfinirmoderneles niveaux admin requis pour chaque commande
📁 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
Variables Requises
life_adminlevel0-5playableUnitsprofileNameFonctions Externes Utilisées
TON_fnc_player_querylife_server/functions.sqflife_fnc_adminGetIDlife_fnc_adminQuerylife_fnc_adminSpectateClasses UI Requises
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
life_adminlevel >= 1Y🔄 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
life_adminlevelplayer_adminadminLevelplayableUnitsprofileNameB. 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.sqffn_adminMenuTabChange.sqffn_adminRefreshList.sqffn_adminFilterPlayers.sqfC. 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
TON_fnc_player_query{0.3, 0.7, 0.3}
life_fnc_adminGetID{0.4, 0.6, 0.8}
life_fnc_adminSpectate{0.38, 0.70, 0.89}
{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:
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 :
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
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
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:
Recompiler"players"-laOnglet JoueursmissionLa"actions"-commandeOngletapparaîtActionsautomatiquement dans le bon onglet !"vehicles"
"server"Changer le niveauNiveau 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
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
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
\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✅fonctionFacilecustomàobligatoiremodifier(utilise:fonctionsToutArmaest3)dans un seul fichier
OptionnellesProchaines étapes (pour fonctionnalités avancées):
TON_fnc_player_querylife_fnc_admin*🛠️ Troubleshooting
Problème: Le menu ne s'ouvre pas
Solutions:
Vérifierlife_adminlevel:hint str life_adminlevel; // Doit être >= 1
Vérifier les includes:
MasterHandler.hpp#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:
life_adminlevel < niveau_requisConfig_Admin.hpp selon vos besoins
Solution: Vérifier dans
fn_adminMenuTabChange.sqf ifcette (_adminLevelconfig
Problème: Mini-map ne s'affiche pas
Solutions:
Life_RscMapControlcommon.hppdropdown
Tester _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:
admin_menu_project.md📄 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)
Fin du Guide d'Intégration