Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Кнопка возвращения назад в меню
polo79655 Дата: Воскресенье, 24.09.2017, 21:43:24 | Сообщение # 1
Сообщений: 99
Репутация: -1 [ +/- ]
Приветствую. Не могли бы вы мне подсказать, не понимаю, что именно я делаю не так. Хочу сделать кнопку возвращения назад в меню: SetMenuExitBackButton, но когда я на неё жму, то меню просто закрывается. Какие могут быть причины?
Делаю я это таким образом:

public Action:ConsoleCmd(client, args)
{
new Handle:menu = CreateMenu(MenuHandler1);
SetMenuTitle(menu, "Название");
AddMenuItem(menu, "one", "Управление игроками");
SetMenuExitButton(menu, true);
DisplayMenu(menu, client, 0);
}
public MenuHandler1(Handle:menu, MenuAction:action, client, param2)
{
if (action == MenuAction_Select)
{
new Handle:playermngmnt = CreateMenu(MenuHandler1);
SetMenuTitle(playermngmnt, "Управление игроками2");
AddMenuItem(playermngmnt, "Mute", "Выключить микрофон");
AddMenuItem(playermngmnt, "Slay", "Убить");
AddMenuItem(playermngmnt, "Swap to Opposite Team", "Перевести в противоположенную команду");
AddMenuItem(playermngmnt, "Swap to Spectator", "Перевести в наблюдатели");
SetMenuExitBackButton(playermngmnt, true); // кнопка создается но не работает
DisplayMenu(playermngmnt, client, 0);
}
}

Заранее благодарю
 
_R1KO_ Дата: Понедельник, 25.09.2017, 12:38:42 | Сообщение # 2
Сообщений: 200
Репутация: 30 [ +/- ]
polo79655,
Код
public Action:ConsoleCmd(client, args)
{
    if(client)
    {
  DisplayCustomMenu(client);
    }
}

DisplayCustomMenu(client)
{
    new Handle:menu = CreateMenu(MenuHandler1);
    SetMenuExitButton(menu, true);    // Добавляем кнопку "Выход"
    SetMenuExitBackButton(menu, false);    // Убираем кнопку "Назад"
    SetMenuTitle(menu, "Название");
    AddMenuItem(menu, "one", "Управление игроками");
    DisplayMenu(menu, client, 0);
}

public MenuHandler1(Handle:menu, MenuAction:action, client, item)
{
    switch(action)
    {
  case MenuAction_End:    // Меню больше не нужно
  {
   CloseHandle(menu);    // Убиваем его, чтобы не было утечек памяти
  }
  case MenuAction_Select:
  {
   switch(item)
   {
    case 0: // Выбран 1-й пункт (нумерация с 0)
    {
     DisplayCustomMenu2(client);
    }
    // Тут будет для других пунктов
   }
  }
    }
}

DisplayCustomMenu2(client)
{
    new Handle:menu = CreateMenu(MenuHandler2);
    SetMenuExitButton(menu, true);    // Добавляем кнопку "Выход"
    SetMenuExitBackButton(menu, true);    // Добавляем кнопку "Назад"
    SetMenuTitle(menu, "Управление игроками2");
    AddMenuItem(menu, "Mute", "Выключить микрофон");
    AddMenuItem(menu, "Slay", "Убить");
    AddMenuItem(menu, "Swap to Opposite Team", "Перевести в противоположенную команду");
    AddMenuItem(menu, "Swap to Spectator", "Перевести в наблюдатели");
    DisplayMenu(menu, client, 0);
}

public MenuHandler2(Handle:menu, MenuAction:action, client, item)
{
    switch(action)
    {
  case MenuAction_End:    // Меню больше не нужно
  {
   CloseHandle(menu);    // Убиваем его, чтобы не было утечек памяти
  }
  case MenuAction_Cancel:    // Меню было закрыто игроком
  {
   if(Item == MenuCancel_ExitBack)    // Если причина - нажатие кнопки "Назад"
   {
    DisplayCustomMenu(iClient);
   }
  }
  case MenuAction_Select:
  {
   switch(item)
   {
    case 0: // Выбран 1-й пункт
    {
     
    }
    case 1: // Выбран 2-й пункт
    {
     
    }
    // ...
   }
  }
    }
}
 
polo79655 Дата: Понедельник, 25.09.2017, 13:11:40 | Сообщение # 3
Сообщений: 99
Репутация: -1 [ +/- ]
Цитата _R1KO_ ()
 if(Item == MenuCancel_ExitBack)    // Если причина - нажатие кнопки "Назад"
   {
    DisplayCustomMenu(iClient);
   }

Большое тебе спасибо, как всегда. Получается я сам должен указывать, куда возвращаться при нажатии на кнопку назад, я думал самостоятельно должно понимать))
А почему могут быть утечки памяти, если не убивать его?
 
_R1KO_ Дата: Вторник, 26.09.2017, 09:55:09 | Сообщение # 4
Сообщений: 200
Репутация: 30 [ +/- ]
polo79655, потому что ты создаешь Handle:hMenu, это выделяет некую область памяти, а когда меню было отправлено и после закрыто ( по любой причине (нажатие пункта, кнопкой выход/назад, перебито другим меню, по времени)) Вызывается MenuAction_End которое сообщает о том, что меню завершило свою работу. И если его не убить (в результате чего занятая память освобождается) то оно так и останется в памяти до тех пор, пока плагин не завершит работу. А теперь представь себе что это меню вызывают 10 игроков по несколько раз в минуту. Особенно если не одно. В течении нескольких часов вся оперативная память будет забита и сервер упадет
 
polo79655 Дата: Вторник, 26.09.2017, 11:00:23 | Сообщение # 5
Сообщений: 99
Репутация: -1 [ +/- ]
Цитата polo79655 ()
В течении нескольких часов вся оперативная память будет забита и сервер упадет

А если плагин перед сменой карты перезагружать?)
 
_R1KO_ Дата: Вторник, 26.09.2017, 11:22:23 | Сообщение # 6
Сообщений: 200
Репутация: 30 [ +/- ]
polo79655, а зачем такой гемор если можно просто писать нормальный код
 
polo79655 Дата: Вторник, 26.09.2017, 12:32:40 | Сообщение # 7
Сообщений: 99
Репутация: -1 [ +/- ]
Цитата _R1KO_ ()
а зачем такой гемор если можно просто писать нормальный код

ну потому что я говнокодер :D

Добавлено (26.09.2017, 12:32:40)
---------------------------------------------

Цитата _R1KO_ ()
switch(item)
   {
    case 0: // Выбран 1-й пункт (нумерация с 0)
    {
     DisplayCustomMenu2(client);
    }

А я же могу вместо этого делать просто вот так:

new String:info[64];
GetMenuItem(menu, item, info, sizeof(info));
GetClientName(client, names, sizeof(names));
if(strcmp(info, "one") == 0)
{
 DisplayCustomMenu2(client);
}
 
_R1KO_ Дата: Вторник, 26.09.2017, 17:40:28 | Сообщение # 8
Сообщений: 200
Репутация: 30 [ +/- ]
polo79655, да
 
  • Страница 1 из 1
  • 1
Поиск: