Кнопка возвращения назад в меню
| |
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, да
|
|
| |
|