Добавление элемента меню с помощью цикла

-R-I-P-

Участник
Сообщения
3
Реакции
0
Доброго времени суток
При попытке создания элемента меню с помощью следующего цикла ничего не происходит и меню просто закрывается
C-подобный:
int i = 1;
new String:sName[64];
while(i <= MaxClients){
    if(IsClientInGame(i)){
        GetClientName(i, sName, sizeof(sName));
        AddMenuItem(hMenu2, sName, sName);
        i++;
    }
}
И если я создавал без цикла
C-подобный:
int i = 1;
new String:sName[64];
GetClientName(i, sName, sizeof(sName));
AddMenuItem(hMenu2, sName, sName);
то все было отлично
Я в этом новичок и только учусь, возможно ошибка очевидна, но я все равно не понимаю почему так происходит
Помогите 😅
 
Решение
C-подобный:
#include <sourcemod>

public OnPluginStart(){
    RegConsoleCmd("vm", DisplayMyMenu);
}

public Action:DisplayMyMenu(client, args){
    new Handle:hMenu1 = CreateMenu(MenuHandler1);
    SetMenuTitle(hMenu1, "Меню мута игроков\n \n");
    AddMenuItem(hMenu1, "item1", "Замутить одного или нескольких игроков");
    AddMenuItem(hMenu1, "item2", "Замутить всех игроков");
    DisplayMenu(hMenu1, client, 0);
    return Plugin_Handled;
}

public int MenuHandler1(Handle:hMenu1, MenuAction:action, client, item){
    if (action == MenuAction_Select){
        decl String:info[64];
        GetMenuItem(hMenu1, item, info, sizeof(info));
        if(strcmp(info, "item1")==0){
            new Handle:hMenu2 = CreateMenu(MenuHandler1)...

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #2
Покажите полностью код.
И что подразумевается под словами "ничего не происходит и меню просто закрывается"? В какой момент это происходит?

И вынесите увеличение индекса i за пределы проверки на наличие игрока на сервере. Цикл из-за этого может быть бесконечным.
 

-R-I-P-

Участник
Сообщения
3
Реакции
0
C-подобный:
#include <sourcemod>

public OnPluginStart(){
    RegConsoleCmd("vm", DisplayMyMenu);
}

public Action:DisplayMyMenu(client, args){
    new Handle:hMenu1 = CreateMenu(MenuHandler1);
    SetMenuTitle(hMenu1, "Меню мута игроков\n \n");
    AddMenuItem(hMenu1, "item1", "Замутить одного или нескольких игроков"); 
    AddMenuItem(hMenu1, "item2", "Замутить всех игроков");
    DisplayMenu(hMenu1, client, 0);
    return Plugin_Handled;
}

public int MenuHandler1(Handle:hMenu1, MenuAction:action, client, item){
    if (action == MenuAction_Select){
        decl String:info[64];
        GetMenuItem(hMenu1, item, info, sizeof(info));
        if(strcmp(info, "item1")==0){
            new Handle:hMenu2 = CreateMenu(MenuHandler1);
            SetMenuTitle(hMenu2, "Выберите одного или нескольких игроков");
            int i = 1;
            new String:sName[64];
            while(i <= MaxClients){
                GetClientName(i, sName, sizeof(sName));
                if(IsClientInGame(i)){
                    AddMenuItem(hMenu2, sName, sName);
                }
                i++;
            }
            DisplayMenu(hMenu2, client, 0);
          
        }
    } 
}
С циклом при нажатии на "Замутить одного или нескольких игроков" меню просто закрывалось, а без цикла меню отображалось но лишь с одним игроком
Предполагаю что я не правильно создал цикл
 

Allen

love society
Сообщения
352
Реакции
274
  • Команда форума
  • #4
C-подобный:
#include <sourcemod>

public OnPluginStart(){
    RegConsoleCmd("vm", DisplayMyMenu);
}

public Action:DisplayMyMenu(client, args){
    new Handle:hMenu1 = CreateMenu(MenuHandler1);
    SetMenuTitle(hMenu1, "Меню мута игроков\n \n");
    AddMenuItem(hMenu1, "item1", "Замутить одного или нескольких игроков");
    AddMenuItem(hMenu1, "item2", "Замутить всех игроков");
    DisplayMenu(hMenu1, client, 0);
    return Plugin_Handled;
}

public int MenuHandler1(Handle:hMenu1, MenuAction:action, client, item){
    if (action == MenuAction_Select){
        decl String:info[64];
        GetMenuItem(hMenu1, item, info, sizeof(info));
        if(strcmp(info, "item1")==0){
            new Handle:hMenu2 = CreateMenu(MenuHandler1);
            SetMenuTitle(hMenu2, "Выберите одного или нескольких игроков");
            int i = 1;
            new String:sName[64];
            while(i <= MaxClients){
                GetClientName(i, sName, sizeof(sName));
                if(IsClientInGame(i)){
                    AddMenuItem(hMenu2, sName, sName);
                }
                i++;
            }
            DisplayMenu(hMenu2, client, 0);
       
        }
    }
}
С циклом при нажатии на "Замутить одного или нескольких игроков" меню просто закрывалось, а без цикла меню отображалось но лишь с одним игроком
Предполагаю что я не правильно создал цикл
C-подобный:
public Action SomeCommand(int iClient, int iArgs)
{
    Menu hMenu = new Menu(MenuHandler);
  
    int iCount = 0; // Количество пунктов
    hMenu.SetTitle("some title");
    char sName[32], iUser[16];

    // Проходимся по всем игрокам на сервере с помощью цикла for
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && !IsFakeClient(i)) //Проверяем клиента на *инвалидность
        {
            IntToString(GetClientUserId(i), iUser, sizeof(iUser)); //Получаем и пихаем ID клиента в строку
            GetClientName(i, sName, sizeof(sName)); // Получаем никнейм
            hMenu.AddItem(iUser, sName); //Создаем пункт с ником игрока и в этот же пункт пихаем его строку с ID     
            iCount++; // Высчитываем кол-во пунктов
        }
    }
    if(iCount) DisplayMenu(hMenu, iClient, MENU_TIME_FOREVER); // Если игроки существуют, то отображаем меню
    else{
        delete hMenu;
        PrintToChat(iClient, "Пусто!"); // Если игроков нету удаляем меню и кидаем уведомление
    }

    return Plugin_Handled;
}

public int MenuHandler(Menu hMenu, MenuAction action, int iClient, int iItem)
{ 
    switch(action)
    {
        case MenuAction_Select:
        {
            char sID[16];
            hMenu.GetItem(iItem, sID, sizeof(sID)); // получаем ID
            int iUser = GetClientOfUserId(StringToInt(sID)); // Получаем индекс из ID
            // Дальше уже работаем с iUser как нам будет удобно.
        }
        case MenuAction_End: // Меню завершилось - удаляем
        {
            delete hMenu;
        }
    }
}

Дальше сам уже разберешься что да как.
 
Последнее редактирование:
Решение

-R-I-P-

Участник
Сообщения
3
Реакции
0
Премного благодарен за помощь. Пару дней мучился не мог понять что делаю не так
 
Сверху Снизу