Tutoriel : Dessines moi un menu

Quand on administre un serveur, il est parfois plus aisé de créer son propre menu d’admin que d’utiliser celui intégré à SourceMod. C’est du moins la conclusion à laquelle nous sommes arrivés, Gao et moi.

I – Ce qu’il vous faut

Le nécessaire :
MetaMod:source : http://sourcemm.net/
SourceMod : http://www.sourcemod.net/snapshots.php
Notepad++ : http://notepad-plus.sourceforge.net/fr/site.htm

Pourquoi Notepad++ ? parce qu’à l’instar des éditeurs de texte avancés, il permet de voir si les balises { et } (appelées « accolades ») correspondent bien. L’oubli d’une balise en ouverture ou fermeture empêchera votre menu de fonctionner et c’est dans 95% des cas la cause du dysfonctionnement d’un menu personnalisé.

Auparavant, pour modifier le menu d’admin de SourceMod il fallait passer par un plug-in externe, supermenu (créé par pRED*) qui est devenu par la suite dynamic menu et a finalement été intégré à sourcemod directement à partir de la version Snapshot 1.1.0-r2025 (les versions snapshots sont des bêtas mises à jour de manière automatisée), vous pouvez trouver la dernière en date à cette adresse: http://www.sourcemod.net/snapshots.php

Vous avez le choix entre la famille 1.0 ou 1.1,plus évoluée, que je conseille pour TF2.

Avant de vous lancer dans la création d’un menu, il faut s’assurer que votre module d’administration (ici sourcemod) fonctionne correctement. Une fois dans votre serveur (que vous aurez rebooté après l’installation de sourcemod et de metamod:source) tapez dans la console sm_admin ce qui fera apparaitre le menu d’admin dans le jeu (le plus simple étant d’y associer une touche en tapant bind « k » « sm_admin » dans la console, par exemple. Dès lors, quand vous serez en jeu, il suffira d’appuyer sur K pour faire apparaître le menu).

II – Playskool présente Mon premier menu

Le menu dynamique se trouve dans « ../tf/addons/sourcemod/configs/adminmenu_custom.txt »
L’architecture des menus est très simple, voici un exemple qui peut sembler compliqué mais qui est en fait très logique:

« Commands »
{
« A Joueurs »
{
//comande player list
« 1 Kicker un joueur »
{
« admin » « sm_kick »
« cmd » « sm_kick #1 #2 »
« execute » « player »
« 1 »
{
« type » « player »
« method » « name »
« title » « Selectionnez le joueur »
}
« 2 »
{
« type » « list »
« title » « Raison: »
« 1 » « Tricheur »
« 2 » « AFK/Ping »
« 3 » « Apprends la politesse »
}
}
//commande plug-in tier
« 2 Identifier un Tag »
{
« admin » « sm_slay »
« cmd » « sm_tracespray »
}
}

« B Variables »
{
« 1 Changer la carte »
{
« admin » « sm_mapchange »
« cmd » « sm_map #1 »
« 1 »
{
« type » « mapcycle »
« path » « allmap.txt »
« title » « Choisissez la carte: »
}
}
}
}

On ne s’affole pas !! Décortiquons ce menu section par section.

Votre fichier doit donc commencer par « Commands » qui annonce le début du menu. Puis vient la première partie du menu après la première accolade ( { ).

1ère partie : Joueurs, ce menu est composé de deux fonctions « 1 Kicker un joueur » et « 2 identifier un tag ».
2ème partie : Variables, celui-ci est composé d’une seule fonction « 1 Changer la carte ».

Il y a dans l’exemple trois systèmes de commande mais il en existe bien d’autres.

L’architecture d’un menu est toujours la même:

Chaque commande est tout d’abord définie par le niveau d’autorisation des admins:

« admin » « sm_kick »

Ceci signifie que seuls les admins disposant du droit de kick peuvent utiliser cette fonction du menu. La raison pour laquelle ce sont les fonctions qui définissent l’autorisation et non pas un flag général est simple, ceci permet une plus grande flexibilité dans la gestion des droits des administrateurs (nous aborderons la gestion avancée des administrateurs dans un prochain article).

Vient ensuite la commande en elle-même. Par exemple :

« cmd » « sm_kick #1 #2 »

Les commandes comme sm_kick ou sm_votemap peuvent avoir besoin d’arguments (ici #1 & #2 qui sont respectivement le joueur à kicker et la raison du kick). Ces arguments sont obtenus par une liste que vous créez ou que vous appelez (pour les player et les maps par exemple).

  • Reprenons notre exemple:

« 1 Kicker un joueur »
{
« admin » « sm_kick »
« cmd » « sm_kick #1 #2 »
« execute » « player »
« 1 »
{
« type » « player »
« method » « name »
« title » « Selectionnez le joueur »
}
« 2 »
{
« type » « list »
« title » « Raison: »
« 1 » « Tricheur »
« 2 » « AFK/Ping »
« 3 » « Apprends la politesse »
}
}

J’ai donc défini le niveau d’autorisation à sm_kick, entré ma commande sm_kick suivie de ses deux arguments #1 et #2, il faut maintenant définir ces deux arguments.
Le premier argument sera défini par « type » « player » qui affiche la liste des joueurs par nom (« method » « name »). Au passage, remarquez la ligne « title » « Selectionnez le joueur » qui permet d’afficher un titre au menu: ceci fonctionne pour tous les menus.

Le second argument est une liste que vous créez vous-même « type » « list » : il suffit donc de créer une liste de raison de kick selon la syntaxe « numéro » « arguments ».

Une fois tous les arguments choisis la commande est exécutée, ici :
sm_kick « [CCCPC]Flubber » « Tricheur » par exemple. Ce qui a pour effet de kicker le joueur avec comme explication Tricheur.

  • Voyons la seconde commande du menu.

« 2 Identifier un Tag »
{
« admin » « sm_slay »
« cmd » « sm_tracespray »
}

Ici la commande sm_tracespray (qui permet d’afficher l’auteur d’un tag (plug-in tiers)) ne nécessite aucun argument, il suffit de viser un tag et de lancer la commande pour afficher son auteur. Dès lors, cette section est très simple: elle contient uniquement le niveau d’autorisation et la commande à activer.

  • Enfin voyons la troisième et dernière commande du menu.

« 1 Changer la carte »
{
« admin » « sm_setnextmap »
« cmd » « sm_setnextmap #1 »
« 1 »
{
« type » « mapcycle »
« path » « allmap.txt »
« title » « Choisissez la carte: »
}
}

Ici nous retrouvons le même principe de commande à argument que pour le « sm_kick », il faut définir la carte qui va suivre. Cet exemple est particulier car il appelle une fonction interne à sourcemod « type » « mapcycle ». Cette fonction permet d’appeler la liste des cartes du serveur et de définir votre choix comme l’argument #1. Par défaut la liste est celle du mapcycle.txt à la racine de votre installation de TF2. Mais il est tout à fait possible de définir via la ligne « path » « nomdufichieralaracine » un fichier précis comme je le fait ci-dessus ou de changer la liste par défaut dans le fichier maplist.cfg qui se trouve dans :

../srv/rab3/orangebox/tf/addons/sourcemod/configs/maplist.cfg

Nous avons vu trois systèmes de commandes. Dans le paragraphe suivant, je vais énumérer les différentes syntaxes des commandes disponibles (les plus courantes du moins). A savoir que vous pouvez utiliser toutes les commandes de sourcemod dans un menu, la liste des commandes disponibles (celles d’origine et celles rajoutées par les plug-in) est accessible en tapant sm_help dans la console. (sm_help 2 pour la page 2, sm_help 3 pour la page trois, etc…). Lorsque vous appelez sm_help, les fonctions, leur syntaxe (arguments et position des arguments), les infos sur l’auteur et une brève description sont affichées.

Enfin, avant de continuer, il semble important de vous préciser que les menus sont ordonnés alphabétiquement (ne me demandez pas pourquoi, c’est la seule chose que je reproche au menu de sourcemod), donc pensez-y lorsque vous remplissez les lignes « title ». Vous aurez d’ailleurs remarqué que j’ajoutais à chaque fois des lettres ou des chiffres afin de garder l’ordre désiré.

III – What what in the plug

Il est tout à fait possible d’appeler des fonctions de plug-in tiers (mais fait pour sourcemod bien entendu) directement depuis votre menu perso, tout comme il est possible de modifier des variables serveurs (cvars). Voila deux exemples non commentés mais qui s’expliquent d’eux mêmes si vous avez compris la partie précédente, ces exemples sont de plus proposés seuls (c’est-à-dire sans le reste du menu) afin que ce soit plus clair. Je ne reprends pas ici les trois exemples ci-dessus.

Modification de Cvars

« Commands »
{
« Changer le pass du serveur »
{ « admin » « sm_root »
« test »
{
« cmd » « sv_password test »
« execute » « server »
}
}

Appel de fonction d’un plug-in tiers

  • A. Ajout d’un plug-in en mode « say »
    C’est-à-dire un plug-in qui s’exécute quand un admin lance une commande dans la chat-box. Le fait d’ajouter say devant la commande permet de simuler le fait que l’admin ait tapé dans la chat-box la commande !adminsounds (remarquez le « execute » « player » qui lance la fonction depuis le poste du joueur).

    « Commands »
    {
    « Jouer un son »
    {
    « admin » « sm_vote »
    « cmd » « say !adminsounds »
    « execute » « player »
    }
    }

  • B. Ajout d’un menu tiers (ici Map-Decals)
    Ici je lance via le menu perso le menu du plug-in Map-Decals qui permet d’ajouter des tags permanents à la manière de Mani-Admin-Plugin.

    « Commands »
    {
    « Tags permanents »
    {
    « admin » « sm_rcon »
    « cmd » « sm_decalmenu »
    « execute » « server »
    }
    }

IV – Cacher les menus d’origine

Un menu personnalisé, c’est sympa, mais le risque est de se retrouver avec les 3 lignes du menu de base en plus : Player commands, Server commands, Voting Commands.

S’en débarrasser n’est pas si compliqué, il va juste falloir mettre un peu les mains dans le cambouis.

Dans votre répertoire « votrerepertoiresteam\teamfortress2 ou orangebox (selon l’install)\tf\addons\sourcemod\scripting », trouvez le fichier « adminmenu.sp ». Je vous conseille grandement d’en faire une copie, au cas où… Et ensuite, ouvrez ce fichier à l’aide de votre éditeur de texte préféré : bloc note, Notepad++, Wordpad pour ne citer qu’eux.

Bien entendu, une fois ouvert, évitez d’écrire n’importe quoi, n’importe où, sous peine de gros bugs poilus.

Comme un homme averti en vaut deux, vous et votre homme poilu allez devoir trouver ce passage :

public OnAllPluginsLoaded()
{
hAdminMenu
= CreateTopMenu(DefaultCategoryHandler);

obj_playercmds
= AddToTopMenu(hAdminMenu,

« PlayerCommands »,
TopMenuObject_Category,
DefaultCategoryHandler,
INVALID_TOPMENUOBJECT);

obj_servercmds
= AddToTopMenu(hAdminMenu,

« ServerCommands »,
TopMenuObject_Category,
DefaultCategoryHandler,
INVALID_TOPMENUOBJECT);

obj_votingcmds
= AddToTopMenu(hAdminMenu,

« VotingCommands »,
TopMenuObject_Category,
DefaultCategoryHandler,
INVALID_TOPMENUOBJECT);

BuildDynamicMenu();

Call_StartForward(hOnAdminMenuCreated);
Call_PushCell(hAdminMenu);
Call_Finish();

Call_StartForward(hOnAdminMenuReady);
Call_PushCell(hAdminMenu);
Call_Finish();

Vous trouverez ce passage vers la ligne 105, dans la version 2026 d’adminmenu.sp. Evidemment, toutes modifications ultérieures peuvent modifier cette position.

Vous avez le passage ? Vous avez fait le plus dur. Il va maintenant suffire d’enlever le passage qui ajoute les menus. Deux méthodes : la « pas terrible » aka la « méthode à la Frite », et la bien…

La méthode déconseillée est de supprimer purement et simplement les lignes, moi, je vous conseille de simplement les mettre en commentaires, vous permettant ainsi tout retour en arrière.

Alors, attention …

public OnAllPluginsLoaded()
{
hAdminMenu
= CreateTopMenu(DefaultCategoryHandler);

/*obj_playercmds =
AddToTopMenu(hAdminMenu,

« PlayerCommands »,
TopMenuObject_Category,
DefaultCategoryHandler,
INVALID_TOPMENUOBJECT);

obj_servercmds
= AddToTopMenu(hAdminMenu,

« ServerCommands »,
TopMenuObject_Category,
DefaultCategoryHandler,
INVALID_TOPMENUOBJECT);

obj_votingcmds
= AddToTopMenu(hAdminMenu,

« VotingCommands »,
TopMenuObject_Category,
DefaultCategoryHandler,
INVALID_TOPMENUOBJECT);*/


…voila. Pour ceux qui n’ont pas suivi (et pourtant vous êtes 2…), vous allez devoir rajouter « /* » (sans les guillemets) devant la ligne « obj_playercmds = AddToTopMenu(hAdminMenu », et « */ » a la fin du 3eme « INVALID_TOPMENUOBJECT); », le premier ouvrant la partie commentaire, le 2eme la fermant. Sauvegardez.

Vous venez donc de dire au compilateur : « Ce passage n’est pas du code, ignores le ».

Et bien, parlons-en du compilateur, justement. Dans ce même répertoire Scripting, vous devrez trouver un compile.exe, soyons fous, double-cliquez.

Une fenêtre DOS devrait s’ouvrir, et plusieurs lignes défiler, pour finalement, finir sur un « press enter to exit ». Avant de fermer la fenêtre, remontez les logs, jusqu’à trouver les lignes correspondantes à notre adminmenu.sp.

Vous devez avoir quelque chose ressemblant à ça :

S’il y avait d’autres choses de mentionnées, comme des Warnings ou autres erreurs, vérifiez que vous avez bien entouré les bonnes lignes. Si tout s’est bien passé, vous pouvez maintenant appuyer sur entrée.

Votre fichier doit maintenant être compilé en .smx, et il doit se trouver dans « scripting/compiled/ ».

Avant de le mettre en place, rendez vous dans le répertoire « votrerepertoiresteam\teamfortress2 ou orangebox (selon l’install)\tf \addons\sourcemod\plugins », et déplacez adminmenu.smx dans le répertoire « plugins/disabled », ceci afin de garder une copie de votre original.

Copiez maintenant votre adminmenu.smx à partir de « scripting/compiled » vers « plugins », et le tour est joué.

VI – Exemple de menu

Voila, vous savez normalement comment faire un menu personnalisé.
Certes, celà peut sembler un peu long et compliqué, mais l’utilité d’avoir un menu dédié à vos besoins et à ceux de vos administrateurs n’est à notre avis, plus à démontrer.

Toutefois comme vous êtes des grosses feignasses, voici quelques exemples de menus tous faits. Attention ceci est une base, certaines fonctions peuvent faire appel à des plug-ins externes (comme la lecture des sons ou la gestions des tags permanents pour mes menus), d’autre sont des menus avec beaucoup de fonctions pour Counter-Strike:Source.

Souvenez-vous que ces menus ne sont que des exemples, l’idéal est de s’en inspirer pour créer le vôtre.

Menu de Flubber (TF2)

Menu de Tekniqal (CSS)

Voilà, vous disposez maintenant du nécessaire pour créer votre menu d’admin perso. Il peut sembler dérisoire de vouloir créer un menu alors que celui d’origine de sourcemod fonctionne parfaitement, mais c’est surtout un confort de tous les jours si votre serveur est très visité. De plus, pouvoir ajouter des fonctions qui habituellement passent par la console est tout de même un plus qui fait gagner un temps précieux. Bref, il ne tient qu’à vous maintenant de faciliter la vie de vos modos et admins qui à présent pourront slapper à volonté sans perdre de temps.

Tags:

5 commentaires pour “Tutoriel : Dessines moi un menu”

  1. FuRy dit :

    Un grand bravo !

    Merci Flubber de mettre tes connaissances en matières d’administration serveur au profit de nous pauvres débutants français.

    Tes explications sont claires et si on suit à la lettre ce topic on obtient des résultats étonnants bonne continuation et longue vie à ce site

  2. vintage dit :

    Merci beaucoup du tutoriel. Tres clair.
    J’ai enfin compris quelque chose dans les menus sourcemod !!

  3. vince1234 dit :

    comment on fait pour ajouter des commandes de pluins du genre camo on/off ?

  4. Flubber dit :

    « C Activer le alltalk »
    {
    « admin » « sm_slay »
    « cmd » « sm_svalltalk #1 »
    « execute » « server »
    « 1 »
    {
    « type » « list »
    « 1 » « 1 »
    « 1. » « On »
    « 2 » « 0 »
    « 2. » « Off »
    }
    }

  5. MrToto738 dit :

    Salut,
    j’ai besoin d’un petit peu d’aide car je ne comprends pas (et ne trouve pas (par la même occasion)) comment installer sourcemod et metamodsource…..
    Peux-tu m’aider ?

    Merci d’avance.

    PS : Comme d’habitude super tuto 😉

Laisser un commentaire