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

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)
{
    switch(
action)
    {
        case 
MenuAction_Select:
        {
            
char choosenClient[3];
            
menu.GetItem(param2choosenClientsizeof(choosenClient));
            
            
int target StringToInt(choosenClient);
            if(
ValidPlayer(target))
            {
                
FormParamMenu(clienttarget);
            }
            else
            {
                
FormMainMenu(client);
            }
        }
        case 
MenuAction_End:
        {
            
delete menu;
        }
    }
}

void FormParamMenu(int clientint target)
{
    
g_iChoosenInMenu[client] = target;
    
    
    
Menu menu = new Menu(gChoosenParamMenu);
    
    
menu.SetTitle("Choose option:");
    
    
menu.AddItem("0""Null");
    
menu.AddItem("1""One");
    
    
menu.ExitButton true;
    
menu.Display(client0);    
    
}

public 
int gChoosenParamMenu(Menu menuMenuAction actionint clientint param2)
{
    switch(
action)
    {
        case 
MenuAction_Select:
        {
            if(
ValidPlayer(client))
            {
                
int target g_iChoosenInMenu[client];
                
                if(
ValidPlayer(target))
                {
                    
int userid GetClientUserId(target);
                    
                    
char info[32];
                    
menu.GetItem(param2infosizeof(info));
                    
                    if(
StrEqual(info"0"))
                    {
                        
// You choosed 0.
                        // В первом меню выбран игрок target, во втором меню выбран ноль
                        
                        
PrintToChat(client"You have choosen player (userid): %i, param: 0"userid);        
                        
//Просто для примера вывожу в чат игроку, который вызывал меню, userid выбранного игрока и параметр из второго меню
                    
}
                    
                    if(
StrEqual(info"1"))
                    {
                        
// You choosed 1
                        // В первом меню выбран игрок target, во втором меню выбрана единица
                        
                        
PrintToChat(client"You have choosen player (userid): %i, param: 1"userid);
                        
//Просто для примера вывожу в чат игроку, который вызывал меню, userid выбранного игрока и параметр из второго меню
                    
}
                }
                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));

__________________
impossible_cc is offline