CMenu - Класс для создания меню в Metamod

Сообщения
48
Реакции
151
Это готовый и удобный класс для создания и управления меню в Metamod, похожий на "новую систему меню" в AMXX.



Использование


  • для начала необходимо выделить память для объекта нашего меню и передать конструктору его обработчик, который будет вызываться при выборе пунктов меню
    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;
    }
Официальный репозиторий на GitHub, с полным примером.

P.S.: если нужны еще примеры или любая другая помощь - обращайтесь, гыы
 

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

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