Разработчик
Скриптер
Участник
Пользователь
- Сообщения
- 48
- Реакции
- 151
Это готовый и удобный класс для создания и управления меню в Metamod, похожий на "новую систему меню" в AMXX.
Использование
P.S.: если нужны еще примеры или любая другая помощь - обращайтесь, гыы
Использование
- для начала необходимо выделить память для объекта нашего меню и передать конструктору его обработчик, который будет вызываться при выборе пунктов меню
C++:void MenuHandle(CMenu *menu, edict_t *player, int item);
int main() {
auto pMenu = new CMenu(MenuHandle);
//another code...
return 0;
}
- после создания объекта для нашего меню, мы можем установить заголовок для него, а также добавить необходимые пункты с помощью метода
menu_additem
и открыть меню для игрока с помощью методаmenu_open
C++:void MenuHandle(CMenu *menu, edict_t *player, int item);
int main(edict_t *player) {
auto pMenu = new CMenu(MenuHandle);
pMenu->menu_settitle("My menu title");
pMenu->menu_additem(1/*alias*/, "Item 1"/*itemname*/);
pMenu->menu_additem(2/*alias*/, "Item 2"/*itemname*/);
pMenu->menu_additem(3/*alias*/, "Item 2"/*itemname*/);
pMenu->menu_open(player);
return 0;
}
- ЗАМЕТКА: не забывайте уничтожать меню для освобождения памяти, чтобы не было утечек. Локальные меню, которые создаются каждый раз по новому, необходимо удалять в обработчике
C++:void MenuHandle(CMenu *menu, edict_t *player, int item) {
auto pItem = menu->menu_itemgetinfo(item);
printf("select itemid = %i | itemalias = %i | itemname = %i", pItem->itemid, pItem->itemalias_i, pItem->itemname);
delete menu;//освобождаем память (уничтожаем меню)
}
глобальные меню можно удалять где вам пожелается, например вMeta_Detach
.
bool menu_open(edict_t *edict)
- открытие меню для опр. игрока
void menu_settitle(const char *title, ...)
- установка заголовка меню
- Метод
menu_additem
имеет несколько вариантов:
C++:int menu_additem(char *alias, const char * name, ...)//с установкой строкового алиаса и названия пункта
int menu_additem(int alias, const char * name, ...)//с установкой целочисленного алиаса и названия пункта
int menu_additem(char * alias, MCALLBACK callback, const char * name, ...)//с установкой строкового алиаса, обработчика пункта и его названия
int menu_additem(int alias, MCALLBACK callback, const char * name, ...)//с установкой целочисленного алиаса, обработчика пункта и его названия
метод возвращает идентификатор созданного пункта.
int menu_getitems()
- метод возвращает количество пунктов в менюvoid menu_numformat(char *fmt)
- метод устанавливает формат нумерации, значение по умолчанию -\\r%d.
void menu_setcontrolname(ControlNames control, const char * name)
- метод позволяет изменять название пунктов управления (назад, далее и выход), значения по умолчанию установлены на английском. Пример:pMenu->menu_setcontrolname(C_Exit, "Выход");
void menu_setcallback(const int item, MCALLBACK callback)
- устанавливает обработчик для указанного пунктаMenuItemsStruct * menu_getiteminfo(const int id)
- метод получает структуру с данными указанного пункта по его идентификатору
void menu_setitemtempname(const char *name, ...)
- метод устанавливает временное название текущему пункту меню (нужен для обработчика пунктов). Пример использования:
C++:int Menu_Callback(CMenu *pMenu, edict_t *pEdict, int iItem) {
auto pItem = pMenu->menu_getiteminfo(iItem);//получаем все данные пункта (его имя, айди, алиасы и обработчик)
int player = ENTINDEX(pEdict);
switch (pItem->itemalias_i) {
case 1://если это нужный нам пункт
if (!g_amxxapi.IsPlayerAlive(player)) {//если игрок мертв
pMenu->menu_setitemtempname("\\d%s", pItem->itemname);//устанавливаем временное название у пункта (изменяем цвет на серый)
return ITEM_DISABLED;//отключаем текущий пункт (на него нельзя будет нажать)
}
}
return ITEM_ENABLED;
}
P.S.: если нужны еще примеры или любая другая помощь - обращайтесь, гыы