menu_makecallback вам просто не обойтись. Функция обработчик вызывается чуть ранее чем добавляется пункт в систему меню, тем самым дает время на проверку и запрет/разрешение использование какого то пункта меню. Обратит внимание что эта функция только создает обработчик и задает идентификатор, и ни чего сама не вызывает.
Инфо из newmenu.inc:
/**
* Creates a menu item callback handler.
*
* The handler function should be prototyped as:
*
* public <function>(id, menu, item)
* id - Client index being displayed to.
* menu - Menu resource identifier.
* item - Item being drawn.
* <return> - ITEM_IGNORE to use the default functionality. ITEM_ENABLED to
* explicitly enable or ITEM_DISABLED to explicitly disable.
*
* @param function Function name.
* @return Menu callback ID.
*/
native menu_makecallback(const function[]);
Синтаксис:
menu_makecallback ( function[] )
- function[] - Исполняемая функция
Тип функции:
Native
Пример:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "[newmenu.inc] menu_additem"
#define VERSION "1.0"
#define AUTHOR "Admin"
new mTEST // Menu
new mcbTEST // Menu Callback
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
mTEST = menu_create("TEST", "mh_TEST")
mcbTEST = menu_makecallback("mcb_TEST")
Описание:
Обратите внимание, что переменные для хранения идентификаторов глобальные, так как создание меню и обработчики находятся в разных форвардах (функциях)
Я понимаю, еще пока что все запутано, но необходимо все изучить по отдельности, прежде чем в омут функций меню окунуться с головой.
Потерпите еще немного, скоро уже будет рабочее меню.
Немного поразмыслив, решил сюда дописать готовый рабочий пример:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "[newmenu.inc] Callback"
#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")
mTEST = menu_create("TEST", "mh_TEST")
mcbTEST = menu_makecallback("mcb_TEST")
new szItem[64]
for (new i=1; i < 25; i++){
format(szItem,63,"Item %i",i)
menu_additem(mTEST,szItem, "ma_TEST", ADMIN_VOTE, mcbTEST)
}
menu_setprop(mTEST,MPROP_EXIT, 1)
}
public func_menu(id){
menu_display(id, mTEST, 0)
}
public mh_TEST(id, menu, item) {
new s_Data[30], s_Name[64], i_Access, i_Callback
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
console_print(id,"item[%d]",item)
console_print(id,"Access[%d]",i_Access)
console_print(id,"Data[%s]",s_Data)
console_print(id,"Name[%s]",s_Name)
console_print(id,"Callback[%d]",i_Callback)
}
public mcb_TEST(id, menu, item){
if(item == 0 || item == 2){
return ITEM_DISABLED
}
return ITEM_ENABLED
}