Not tested, probably there is better way to do it
Может можно и по-другому, я вижу это так. Могу написать что-то подробнее если нужно.
PHP Code:
#include <sourcemod>
int g_iChoosenInMenu[MAXPLAYERS + 1];
public void OnPluginStart()
{
RegConsoleCmd("sm_menu", Cmd_menu);
}
public Action Cmd_menu(int client, int args)
{
FormMainMenu(client);
return Plugin_Handled;
}
void FormMainMenu(int client) //main menu
{
if(ValidPlayer(client))
{
Menu menu = new Menu(gChooseMainMenu);
menu.SetTitle("Choose player:");
for(int i = 1; i<=MaxClients; ++i)
{
if(ValidPlayer(i))
{
char str_i[3];
IntToString(i, str_i, sizeof(str_i));
char name[64];
GetClientName(i, name, sizeof(name));
menu.AddItem(str_i, name, ITEMDRAW_DEFAULT);
}
}
menu.ExitButton = true;
menu.Display(client, 0);
}
}
public int gChooseMainMenu(Menu menu, MenuAction action, int client, int param2) //Main menu handler
{
switch(action)
{
case MenuAction_Select:
{
char choosenClient[3];
menu.GetItem(param2, choosenClient, sizeof(choosenClient));
int target = StringToInt(choosenClient);
if(ValidPlayer(target))
{
//if target is valid -> go for second menu
FormParamMenu(client, target);
}
else
{
//else back to the first menu
FormMainMenu(client);
}
}
case MenuAction_End:
{
delete menu;
}
}
}
void FormParamMenu(int client, int target)
{
//remember target index
g_iChoosenInMenu[client] = target;
Menu menu = new Menu(gChoosenParamMenu);
menu.SetTitle("Choose option:");
//Your own logic here
//menu.AddItem(...);
menu.ExitButton = true;
menu.Display(client, 0);
}
public int gChoosenParamMenu(Menu menu, MenuAction action, int client, int param2) //second menu handler
{
switch(action)
{
case MenuAction_Select:
{
if(ValidPlayer(client))
{
if(ValidPlayer(g_iChoosenInMenu[client]))
{
char info[32];
menu.GetItem(param2, info, sizeof(info));
if(StrEqual(info, /*your logic*/))
{
//do something
int target = g_iChoosenInMenu[client]; //target - результат выбора первого меню. info - результат выбора второго меню
}
//...
}
else
{
//Choosen target is not valid anymore
FormMainMenu(client);
}
}
}
case MenuAction_End:
{
delete menu;
}
}
}
stock bool ValidPlayer(int client, bool check_alive = false)
{
return client>0 && client<=MaxClients && IsClientConnected(client) && IsClientInGame(client) && (!check_alive || IsPlayerAlive(client));
}
__________________