View Single Post
impossible_cc
Senior Member
Join Date: Sep 2018
Location: Ukraine
Old 05-03-2019 , 16:25   Re: Help by example how to create a multi-stage menu?
Reply With Quote #4

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 clientint 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 1i<=MaxClients; ++i)
        {
            if(
ValidPlayer(i))
            {
                
char str_i[3];
                
IntToString(istr_isizeof(str_i));
                
                
char name[64];
                
GetClientName(inamesizeof(name));
                
                
menu.AddItem(str_inameITEMDRAW_DEFAULT);
            }
        }
        
        
menu.ExitButton true;
        
menu.Display(client0);
    }
}

public 
int gChooseMainMenu(Menu menuMenuAction actionint clientint param2//Main menu handler
{
    switch(
action)
    {
        case 
MenuAction_Select:
        {
            
char choosenClient[3];
            
menu.GetItem(param2choosenClientsizeof(choosenClient));
            
            
int target StringToInt(choosenClient);
            if(
ValidPlayer(target)) 
            {
//if target is valid -> go for second menu
                
FormParamMenu(clienttarget);
            }
            else
            {
//else back to the first menu
                
FormMainMenu(client);
            }
        }
        case 
MenuAction_End:
        {
            
delete menu;
        }
    }
}

void FormParamMenu(int clientint 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(client0);    
    
}

public 
int gChoosenParamMenu(Menu menuMenuAction actionint clientint param2//second menu handler
{
    switch(
action)
    {
        case 
MenuAction_Select:
        {
            if(
ValidPlayer(client))
            {
                if(
ValidPlayer(g_iChoosenInMenu[client]))
                {
                    
char info[32];
                    
menu.GetItem(param2infosizeof(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 clientbool check_alive false)
{
    return 
client>&& client<=MaxClients && IsClientConnected(client) && IsClientInGame(client) && (!check_alive || IsPlayerAlive(client));

__________________

Last edited by impossible_cc; 05-03-2019 at 16:29.
impossible_cc is offline