Она работает как со старой системой меню так и новой. Думаю что полезна данная функция будет в меню с банами и подобными вещами для избыточной проверки процесса и исключения случайных банов. А может кто то придумает более интересное применение функции player_menu_info
Инфо из newmenus.inc:
/**
* Returns information about a menu (if any) the client is currently viewing.
*
* If newmenu is valid, then the menu will refer to the menuid associated with
* the title. If newmenu is not valid, and the menu is valid, then the player
* is viewing a menu displayed with show_menu().
*
* Both may be invalid if the player is not viewing a menu.
*
* @param id Client index.
* @param menu Variable to store old menu id. If none, then <1 will be
* stored.
* @param newmenu Variable to store new menu id. If none, then -1 will be
* stored.
* @param menupage Variable to store current page of the new menu, if any.
* @return 1 if the player is viewing a menu, 0 otherwise.
* @error Invalid client.
*/
native player_menu_info(id, &menu, &newmenu, &menupage=0);
Синтаксис:
player_menu_info(id, &menu, &newmenu, &menupage=0)
- id - Идентификатор игрока, для кого выполняется функция
- &menu - Переменная для сохранения идентификатора меню(старого типа) ( что бы в дальнейшем работало)
- &newmenu - Переменная для сохранения идентификатора меню(нового типа) ( что бы в дальнейшем работало)
- &menupage=0 - Если указать, то будет проверяться какая именно страница или любая.
Тип функции:
Native
Пример:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "[newmenu.inc] player_menu_info"
#define VERSION "1.0"
#define AUTHOR "Admin"
new mTEST // Menu
new mcbTEST // Menu Callback
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /menu","func_menu")
register_clcmd("say /tmenu","f_player_see_menu")
/* Menu TEST */
mTEST = menu_create("TEST", "mh_TEST")
mcbTEST = menu_makecallback("mcb_TEST")
menu_additem(mTEST, "M test 1", "ma_TEST", ADMIN_ALL, mcbTEST)
menu_additem(mTEST, "M test 2", "ma_TEST", ADMIN_ALL, mcbTEST)
menu_additem(mTEST, "M test 3", "ma_TEST", ADMIN_ALL, mcbTEST)
menu_additem(mTEST, "M test 4", "ma_TEST", ADMIN_ALL, mcbTEST)
menu_additem(mTEST, "M test 5", "ma_TEST", ADMIN_ALL, mcbTEST)
menu_additem(mTEST, "M test 6", "ma_TEST", ADMIN_ALL, mcbTEST)
menu_additem(mTEST, "M test 7", "ma_TEST", ADMIN_ALL, mcbTEST)
menu_additem(mTEST, "M test 8", "ma_TEST", ADMIN_ALL, mcbTEST)
menu_additem(mTEST, "M test 9", "ma_TEST", ADMIN_ALL, mcbTEST)
menu_setprop(mTEST,MPROP_EXIT, 1)
/* Menu End */
}
public f_player_see_menu(id){
new menu,newmenu
new inmenu = player_menu_info(id,menu, newmenu)
client_print(id,print_chat,"You see menu ? - %s",inmenu ? "Yes" : "No")
}
public func_menu(id){
//Функция показывает меню,
//которое было сформировано еще в plugin_init
menu_display(id, mTEST, 0)
}
/* Menu TEST */
public mh_TEST(id, menu, item) {
// Функция вызывается при выборе одного из пунктов меню
item++
client_print(id,print_chat,"You select %d",item)
}
public mcb_TEST(id, menu, item) {
// Тут код для активации/де активации пунктов меню
}
Описание:
Выполните команду
say /tmenu и вы получите вопрос с ответом - видите вы меню или нет.
Затем откройте меню
say /menu и повторите предыдущую команду и вы увидите отличие в ответе.
Пример использования функции вы можете посмотреть в плагине restmenu.
Учитывая что функция не пользуется популярностью, не вижу смысла на долго на ней останавливаться.
Если будут какие то вопросы, обсудим.А пока что на этом все.