*seufz* ich habs befürchtet...
okay, das prinzip ist folgendermaßen: jedesmal, wenn ein spieler ein menü aufruft, werden alle anderen plugins davon in kenntnis gesetzt. wie das geht? ganz einfach, mit plugin_exec().
als erstes habe ich ein base plugin, plugin_rindy_menubase. dieses fängt schonmal alle mod-menüs ab, so dass diese nicht in jedem plugin einzeln registert werden müssen, sowie connect und disconnect.
Code:
#include <adminlib>
#include <plugin>
new g_Version[100] = "0.1";
forward rmb_kill_menu(HLCommand,HLData,HLUserName,UserIndex);
forward rmb_reset(HLCommand,HLData,HLUserName,UserIndex);
forward rmb_receive_info(HLCommand,HLData,HLUserName,UserIndex);
forward kill_menu(UserIndex = 0);
public plugin_init(){
plugin_registerinfo("Rinde's Menu Base Plugin","Base functions for Rinde's menuplugins.",g_Version);
plugin_registercmd("radio1","rmb_kill_menu",ACCESS_ALL);
plugin_registercmd("radio2","rmb_kill_menu",ACCESS_ALL);
plugin_registercmd("radio3","rmb_kill_menu",ACCESS_ALL);
plugin_registercmd("buyequip","rmb_kill_menu",ACCESS_ALL);
plugin_registercmd("buy","rmb_kill_menu",ACCESS_ALL);
plugin_registercmd("chooseteam","rmb_kill_menu",ACCESS_ALL);
plugin_registercmd("showbriefing","rmb_kill_menu",ACCESS_ALL);
plugin_registercmd("rmb_reset","rmb_reset",ACCESS_ALL);
return PLUGIN_CONTINUE;
}
public plugin_connect(HLUserName,HLIP,UserIndex) {
kill_menu(UserIndex);
return PLUGIN_CONTINUE;
}
public plugin_disconnect(HLUserName,UserIndex) {
kill_menu(UserIndex);
return PLUGIN_CONTINUE;
}
public rmb_kill_menu(HLCommand,HLData,HLUserName,UserIndex) {
kill_menu(UserIndex);
return PLUGIN_CONTINUE;
}
public rmb_reset(HLCommand,HLData,HLUserName,UserIndex) {
return PLUGIN_HANDLED;
}
kill_menu(UserIndex = 0) {
new str[3];
numtostr(UserIndex,str);
plugin_exec("rmb_reset",str);
}
wie man sieht, ist es für cs ausgelegt, lässt sich aber für andere mods durchaus abändern. kernstück ist die funktion kill_menu(UserIndex).
es sendet das plugin_exec, mit dem userindex als string. dies wird von anderen plugins als command registriert
beispiel: plugin_rm_rindy_player (rm steht für rindy menu, kennzeichnet, dass plugin_rindy_menubase vorraussetzung ist, damit dieses plugin funktioniert)
hier gekürzt, um das wesentliche zu verdeutlichen
Code:
new g_Menu[MAX_PLAYERS];
public plugin_init() {
plugin_registerinfo("Rinde's Advanced Ban Plugin","Recognizes players that left recently, and logs bans to a textfile",g_Version);
plugin_registercmd("admin_playermenu","BanMenu",ACCESS_BAN,"admin_playermenu: Display player menu.");
plugin_registercmd("menuselect","HandleMS",ACCESS_ALL);
plugin_registercmd("rmb_reset","rmb_reset",ACCESS_ALL); //function to reset the menu if another menu is called
return PLUGIN_CONTINUE;
}
public rmb_reset(HLCommand,HLData,HLUserName,UserIndex) {
new Data[3];
new i;
convert_string(HLData,Data,3);
if(Data[0] == '0') {
for(i=1;i<=g_Maxplayers;i++) {
g_Menu[i] = 0;
}
} else {
g_Menu[strtonum(Data)] = 0;
}
return PLUGIN_CONTINUE;
}
public BanMenu(HLCommand,HLData,HLUserName,UserIndex) {
if(UserIndex == 0) {
selfmessage("This command cannot be used from console.");
} else {
kill_menu(UserIndex);
g_Menu[UserIndex] = 1;
show_menu(UserIndex);
}
return PLUGIN_HANDLED;
}
public HandleMS(HLCommand,HLData,HLUserName,UserIndex) {
new Data[MAX_NAME_LENGTH];
new i;
if(g_Menu[UserIndex] == 1) {
convert_string(HLData,Data,MAX_NAME_LENGTH);
i = strtonum(Data);
switch(i) {
...
}
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
kill_menu(UserIndex=0) {
new str[3];
numtostr(UserIndex,str);
plugin_exec("rmb_reset",str);
}
die globale variable g_Menu speichert für jeden spieler, ob er im menü ist oder nicht. wird ein anderes menü aufgerufen, wird rmb_reset ausgeführt, und für den/die entsprechenden user dieser wert auf 0 gesetzt. 0 im rmb_reset steht für alle spieler, beispielsweise für vote(...) ganz praktisch. umgekehrt führt das aufrufen der playermenus dazu, dass rmb_reset erneut aufgerufen wird, wodurch alle anderen plugins wissen: "ok, ich bin nicht mehr dran" (das kill_menu in public BanMenu). erst danach darf logischerweise g_Menu[UserIndex] = 1 gesetzt werden, da das kill_menu es erneut auf 0 setzt.
und auf diese art und weise weiss die HandleMS funktion immer, ob der spieler gerade das menü dieses plugins sieht.
alles klar?