Использование функции get_user_menu

d3m37r4

111111
Сообщения
1,428
Реакции
1,169
Помог
10 раз(а)
Имеется, к примеру, простое меню:
Код:
#include <amxmodx>

new const KEYS_MENU = (1<<0)|(1<<1)|(1<<2)|(1<<9)
new g_MenuId;

public plugin_init()
{
register_clcmd("say /menu", "Menu_Function")
register_clcmd("say_team /menu", "Menu_Function")

register_menucmd(register_menuid("Menu"), KEYS_MENU, "Menu_Handler")

register_event("StatusIcon", "Event_HideStatusIcon", "b", "1=0", "2=buyzone");

}

public Menu_Function(id)
{
static menu[512]
new len
new menuid, keysmenu

get_user_menu (id,menuid,keysmenu)
g_MenuId = menuid
client_print(id, print_chat, "MENU_ID: %d", g_MenuId)

len = formatex(menu[len], charsmax(menu) - len, "\yMenu^n^n")

len += formatex(menu[len], charsmax(menu) - len, "1. Первый пункт^n")
len += formatex(menu[len], charsmax(menu) - len, "2. Второй пункт^n")
len += formatex(menu[len], charsmax(menu) - len, "3. Третий пункт^n")
len += formatex(menu[len], charsmax(menu) - len, "0. Выход")

return show_menu(id, KEYS_MENU, menu, -1, "Menu")
}

public Menu_Handler(id, key)
{
switch(key)
{
case 0:client_print(id, print_chat, "Вы выбрали первый пункт.")
case 1:client_print(id, print_chat, "Вы выбрали второй пункт.")
case 2:client_print(id, print_chat, "Вы выбрали третий пункт.")
case 9:client_print(id, print_chat, "Вы вышли из меню.")
}
}

public Event_HideStatusIcon(id)
{
new ViewMenuId, ViewKeysMenu
get_user_menu (id, ViewMenuId, ViewKeysMenu)

client_print(id, print_chat, "VIEW_MENUID: %d", ViewMenuId)
if (ViewMenuId == g_MenuId)
{
menu_cancel(id)
show_menu(id, 0, "^n", 1)
}
}
Хотелось бы реализовать закрытие меню при выходе из зоны закупки.

Чтобы отловить id меню воспользовался функцией get_user_menu, которая проверяет открыто ли меню. Появилась проблема в том, что при открытии меню, пишет id открытого меню 0, а при выходе из зоны закупки уже другое, скрины тут:
1.jpg
2.jpg
Но, если поверх этого открытого меню, вызвать команду /menu еще раз, то id меню перезапишется, например, как на скрине ниже:
3.jpg
И при выходе из зоны закупки, показывает этот же ид, соответственно, меню закрывается.
4.jpg

Хотелось бы узнать, почему при открытии меню в первый раз id меню различается, с id меню при выходе из бай зоны. Возможно ли как-то это исправить и в итоге сделать так, чтобы именно данное меню при выходе из зоны закупки закрывалось.
 
Сообщения
432
Реакции
409
Помог
14 раз(а)
Ну потому что ты получаешь menuid до того как меню создано.
Код:
    get_user_menu (id,menuid,keysmenu)
g_MenuId = menuid // равно 0, поскольку никакого меню нет. Когда ты вызываешь новое меню тебе возвращается айди предыдущего
client_print(id, print_chat, "MENU_ID: %d", g_MenuId)

И еще
Код:
return show_menu(id, KEYS_MENU, menu, -1, "Menu")

Никогда так не делай
 

d3m37r4

111111
Сообщения
1,428
Реакции
1,169
Помог
10 раз(а)
Спасибо, переместил получение ида меню после snow_menu, заработало вроде как. и убрал return.

И еще
return show_menu(id, KEYS_MENU, menu, -1, "Menu")
Никогда так не делай
Можно объяснить, почему так делать не стоит?)
 
Сообщения
432
Реакции
409
Помог
14 раз(а)
d3m37r4, потому что это логически неверно. Если меню не создалось по каким-то причинам, то клиенту в консоль напишет invalid command из-за того что вернется 0 (PLUGIN_CONTINUE)
Для команд хэндлеров может быть только 3 return значения - PLUGIN_HANDLED, PLUGIN_HANDLED_MAIN и PLUGIN_CONTINUE
Код:
show_menu(...
return PLUGIN_HANDLED

Если тебе плевать на возвращаемое значение, то делаешь просто
Код:
show_menu(...
return

Но не так как у тебя в коде
 
Сообщения
2,491
Реакции
2,791
Помог
61 раз(а)
пример. не тестировал
C++:
#include <amxmodx>

new const KEYS_MENU = (1<<0)|(1<<1)|(1<<2)|(1<<9)
new g_MenuId;

public plugin_init()
{
register_clcmd("say /menu", "Menu_Function")
register_clcmd("say_team /menu", "Menu_Function")
register_event("StatusIcon", "Event_HideStatusIcon", "b", "1=0", "2=buyzone");

g_MenuId = register_menuid("Menu")
register_menucmd(g_MenuId, KEYS_MENU, "Menu_Handler")
}

public Menu_Function(id)
{
static menu[512]
new len
new menuid, keysmenu
show_menu(id, KEYS_MENU, menu, -1, "Menu")
}


public Event_HideStatusIcon(id)
{
new ViewMenuId, ViewKeysMenu
if (get_user_menu (id, ViewMenuId, ViewKeysMenu) == 1 && ViewMenuId == g_MenuId) {
show_menu(id, 0, "^n", 1)
}
}
 

d3m37r4

111111
Сообщения
1,428
Реакции
1,169
Помог
10 раз(а)
fantom, да этот пример работает, спасибо)
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу