MenuAPI - новая, функциональная система меню

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
48
Реакции
151
MenuAPI - это заголовочный файл предоставляющий очень удобную и функциональную систему меню. Никаких модулей и дополнительных плагинов ставить не нужно, все реализовано в самом инклуде, просто подключаете и пользуетесь доступными функциями.

  1. MenuCreate(handler[], title[], any:...) - Создание нового меню
    handler - обработчик меню
    title - заголовок
    Возвращает идентификатор меню
  2. MenuAddItem(const menuid, const alias, const name[], const access = INVALID_HANDLE, const callback[32] = "") - Добавление нового пункта
    menuid - индекс меню
    alias - уникальная метка
    name - название пункта
    access - флаги доступа (-1 — без флагов доступа)
    callback - функция обработчик
  3. MenuAddItemF(const menuid, const alias, const nameid, const access = INVALID_HANDLE, const callback[32] = "") - Добавление нового пункта (функция с форматированием строки)
    menuid - индекс меню
    alias - уникальная метка
    nameid - название пункта через функцию ItemFormat (смотрите пример)
    access - флаги доступа (-1 — без флагов доступа)
    callback - функция обработчик
  4. ItemFormat(const buffer[], any:...) - Форматирование имени пункта
  5. MenuDisplay(const player, const menu) - Отображает созданное меню опр. игроку
  6. MenuDestroy(const menu) - Уничтожение меню
  7. MenuClose(const player) - Закрытие всех меню для опр. игрока
  8. MenuItemGetInfo(const menuid, const item, name[], const len, bool: removecolor = false, &alias = 0, &access = 0, &callback = 0) - Получение информации о пункте
    menuid - индекс меню
    item - индекс пункта меню
    name - массив для записи названия меню
    len - максимальная длина массива
    removecolor - удалить ли все символы цвета из названия
    alias - переменная для записи уникальной метки
    access - переменная для записи флагов доступа
    callback - переменная для записи идентификатора обработчика
  9. MenuSetItemName(const menu, const item, buffer[], any:...) - Установка временного названия для пункта. При следующем открытии будет снова название, которое было получено при добавлении пункта.
  10. GetPlayerMenu(const player) - Вернет индекс меню, которое открыто у игрока, либо -1, если нет открытых меню
  11. GetPlayerMenuPage(const player) - Вернет текущую страницу меню, открытую у игрока, либо -1, если нет открытых меню
  12. MenuSetProp(const menu, const MenuProps: prop, any:...) - Изменение свойств меню
    menu - индекс меню
    prop - нужное свойство
    arg1 - значение №1
    arg2 - значение №2 (необязательно)
    arg3 - значение №3 (необязательно)

    P.S.: Некоторые свойства могут принять сразу несколько значений, установив его к следующему похожему свойству. Так, например, свойство MENU_PROP_NUMFMT может принять вторым аргументом сразу значение и для MENU_PROP_NUMFMT_DISABLE. А свойство MENU_PROP_BACKNAME аналогично может принять сразу еще два дополнительных значения, для свойств MENU_PROP_NEXTNAME и MENU_PROP_EXITNAME.

    Свойство​
    Описание​
    По умолчанию​
    MENU_PROP_NUMFMTФормат нумерации доступных для нажатия пунктов
    \r%i.​
    MENU_PROP_NUMFMT_DISABLEФормат нумерации недоступных для нажатия пунктов
    \d%i.​
    MENU_PROP_NOACCESS_FMTФормат пункта при отсутствии доступа к нему
    \d%s \r*​
    MENU_PROP_EXITПрисутствие пункта "Выход"
    1​
    MENU_PROP_DISPLAY_PAGESВключение показа номера текущей страницы меню/всего страниц меню, когда страниц больше одной
    1​
    MENU_PROP_BACKNAMEНазвание пункта "Назад"
    Back​
    MENU_PROP_NEXTNAMEНазвание пункта "Далее"
    Next​
    MENU_PROP_EXITNAMEНазвание пункта "Выход"
    Exit​
    MENU_PROP_COPYRIGHTКопирайт. Идет следующим после пункта "Выход"
C++:
#include <amxmodx>
#include <menuapi>

new const szAdminItemName[] = "Третий пункт"// с заранее сохраним название пункта для админов
public plugin_init() {
    //зарегистрируем команду, по которой будет открываться меню
    register_clcmd("say /menu", "MenuOpen");
}

public MenuOpen(const player) {
    //получим имя игрока, который открыл меню
    new szName[32]; get_user_name(player, szName, charsmax(szName));

    // создадим меню и сохраним его индекс в переменную, чтобы взаимодействовать с ним в дальнейшем
    // в заголовке поприветствуем игрока, который открыл меню
    new iMenu = MenuCreate("MenuHandler", "Привет, \r%s\w! Мы ждали тебя!", szName);

    // добавим парочку пунктов для всех
    MenuAddItem(iMenu, 1, "Первый пункт");
    MenuAddItem(iMenu, 2, "Второй пункт");

    // и один пункт только для админовс флагом ADMIN_BAN, название которого мы придумали с заранее
    MenuAddItemF(iMenu, 3, ItemFormat("%s", szAdminItemName), ADMIN_BAN)

    // переведем названия пунктов управления на русский
    MenuSetProp(iMenu, MENU_PROP_BACKNAME, "Назад", "Далее", "Выход");
    // установим копирайт с нашим сайтом
    MenuSetProp(iMenu, MENU_PROP_COPYRIGHT, "\dby MYSITE.RU");

    // покажем созданное нами меню игроку
    MenuDisplay(player, iMenu);

    return PLUGIN_HANDLED;
}

// обработчик нашего меню
public MenuHandler(const player, const menu, const item) {
    // создадим переменные для записи в них информации о нажатом пункте
    new szName[64], iAlias, iAccess, iCallback;

    // записываем информацию о нажатом пункте в ранее созданные переменные
    MenuItemGetInfo(menu, item, szName, charsmax(szName), false, iAlias, iAccess, iCallback);

    // опеределим какой именно пункт был выбран, сделаем мы это по уникальной метке, которую мы присвоили каждому из пунктов
    switch (iAlias) {
        case 1: {
            client_print(player, print_chat, "Вы выбрали первый пункт (его название: %s)", szName);
        }

        case 2: {
            client_print(player, print_chat, "Вы выбрали второй пункт (его название: %s)", szName);
        }

        case 3: {
            client_print(player, print_chat, "Вы выбрали третий пункт (его название: %s)", szName);
        }
    }

    // уничтожим меню
    MenuDestroy(menu);
}
20171218023501_1.jpg
Версия 1.0.1:
  • Добавлены новые свойства меню: MENU_PROP_NOACCESS_FMT и MENU_PROP_DISPLAY_PAGES. Описание по прежнему в таблице под спойлером "Доступные функции".
  • MenuClose теперь можно использовать для всех (0 индекс).
  • Добавлены две функции: GetPlayerMenu и GetPlayerMenuPage.
Версия 1.0.0:
  • Первый релиз
 

Download all Attachments

Последнее редактирование:
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Kaido Ren,
Код:
stock MenuClose(const player) {
    if (is_user_connected(player)) {
        show_menu(player, 0, "^n", 1);
    }
}
эм.. а чтобы закрыть всем я цикл должен гнать? бред же :\
 
Сообщения
48
Реакции
151
neygomon, ну мог добавить, спешл фор ю с:
 
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
81x08, шта?
show_menu(0,...) не в моде?
 
Сообщения
48
Реакции
151
81x08, не, там в нативе show_menu оказывается все это уже реализовано, а я туда не смотрел, поэтому добавил проверку на ingame c:
Через пару минут залью обновление.
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Вроде бы хорошо, но не очень. Просто обьясните мне зачем использовать даной inc, если он почти полностью повторяет API новой системы меню, кроме форматирования номеров пунктов меню. А еще неn возможности зарегистрировать меню и с помощью player_menu_info узнать открыто ли наше меню сейчас или нет.
P.S. а так выглядит интересно
 
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
fantom, new menu = MenuCreate();

new n, o;
player_menu_info(n, o);

if(o == menu) { // }
 
Сообщения
2,751
Реакции
3,014
Помог
61 раз(а)
Kaido Ren оформи всё-таки это в ресурс. там лучше будет.
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
neygomon, нужно проверить, но судя по коду не прокатит. MenuCreate возвращает позицию меню в массиве кото}ый в инклуде. А player_menu_info возвращает свойство menuid которое в самом амхх реализовано
 
Сообщения
48
Реакции
151
Версия 1.0.1:
  • Добавлены новые свойства меню: MENU_PROP_NOACCESS_FMT и MENU_PROP_DISPLAY_PAGES. Описание по прежнему в таблице под спойлером "Доступные функции".
  • MenuClose теперь можно использовать для всех (0 индекс).
  • Добавлены две функции: GetPlayerMenu и GetPlayerMenuPage.
Первый пост обновлен.
18 Дек 2017
fantom, через player_menu_info - да, не получится. Но добавил аналогичную функцию - GetPlayerMenu, которое вернет тебе индекс открытого меню.
В player_menu_info тоже могу сделать, там всего лишь присвоить оффсету iMenu индекс меню моего инклуда, но есть вероятность, что мой индекс может совпасть с созданным меню от AMXX. Да и не вижу в этом смысла, ибо уже сделал аналог.
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
https://github.com/alliedmodders/amxmodx/blob/master/amxmodx/meta_api.cpp#L1103
https://github.com/alliedmodders/amxmodx/blob/master/amxmodx/newmenus.cpp#L1148
Как видно задествованы свойства класа CPlayer->menu и CPlayer->newmenu
18 Дек 2017
что мой индекс может совпасть с созданным меню от AMXX.
а не было идеи перенести все это в отдельный модуль или плагин с api?
 
Сообщения
48
Реакции
151
fantom, могу без проблем сделать модуль, но кому он будет нужен? В этом и смысл был сделать это инклудом, чтобы не подключать всякую доп. херню в виде плагинов и модулей. Да, если замерять какими то профайлерами то конечно этот инклуд будет чуть медленнее, но на глаз это никак не ощутимо. Так что не вижу особого смысла если честно
 
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Kaido Ren,
Код:
stock GetPlayerMenu(const player) {
    return __playerData[player][playerCurrentMenu];
}
супер-неадекватно...
банальный пример:
проверяем есть ли открытые менюшки у чела - юзаем player_menu_info, вернуло 0, открываем свое меню...
а проверку на меню, сделанное через API, не сделали, - закрыли меню :|

поэтому варианта 2:
1. выкинуть инклюд
2. проверять сразу на оба

ps В АМХХ 1.8.3 функционал newmenus.inc + string.inc повторяют на 100% функции инклюда
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Kaido Ren, здесь не в плане оптимизаций. Здесь скорее я говорю об более менее универсальном подходе. Например регистрируем меню в одном плагине. И доп пункты доюавляем в другом. Своего рода АПИ одно плагина ко второму.
 
Сообщения
48
Реакции
151
neygomon, а в чем проблема проверять и то и то? Суть функции - для сравнения индекса, а не "открыто ли меню".
На 100% говоришь? Может поспорим? с:
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Kaido Ren, ну даное меню подойдет только для простых случаев. И да оно делает свою роботу, а именно упрощает создание меню но уже со своим форматированием номеров пунктов. ИМХО (не в обиду) я забью на то как будут выглядеть пункты 1. или [1], но я тогда буду использовать новое меню. А от старого мне нужно немного больше функционала. Например 9 - вперед, 0 -выход/назад. А вот что будет сложно сделать:
- Вип система которая отображает меню при спавне только тогда когда не открыто никакое другое (часто жалуються админы что открыв меню админа и не успев например забанить игрока при спавне випка перекривает своим меню)
- Сделать открытие/закрытие меню - например нажали раз на N и меню открылось, нажали второй раз и оно закрылось. Здесь также нужно проверять открыто наше меню или какое нибудь другое.
- Сделать кнопкы вперед/назад/выход через LANG файлы
 
Сообщения
48
Реакции
151
fantom, эм, что касается вип системы, с чего вдруг нельзя? Я не понимаю, вам действительно сложно проверить открыто ли старое или новое меню в AMXX и открыто ли меню из инклуда (при том, что ЕСЛИ вы его вообще используете) - если нет, то открыть меню. Это все реально, я добавил функцию, но вам ее недостаточно. Я уже сказал, что в player_menu_info ее реально добавить только костылем.
Открытие/закрытие - невозможно? Серьезно? С чего вдруг? Тебе пример показать или как?
Кнопки вперед назад в ланге? Да без проблем как бы. С чего вдруг нельзя?

Почему ты рассуждаешь о том, чего нельзя сделать, при этом даже не попробовав?
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Kaido Ren,
ИМХО (не в обиду)
а оно делает свою роботу, а именно упрощает создание меню но уже со своим форматированием номеров пунктов
Не стоит реагировать как штики. Я же не написал что меню плохое. И да я возможно раз его таки та использую когда нибудь.
 
Статус
В этой теме нельзя размещать новые ответы.

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

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