Ru Using New Menu System
Contents
Введение
Это статья поможет вам разобраться в новой системе меню.
Урок по созданию меню
Давайте попробуем воспользоваться новой системмой меню. Мы пройдем через этоу простую инструкцию и создадим простое голосование смены карты.
Заголовочные файлы
Как обычно мы начинаем с добавления необходимых заголовочных файлов
#include <amxmodx>
Глобальные переменные
new g_Menu; // Переменная обработки главного меню new g_Votes[3]; // Сохраняем голосования Да как 1, No как 2
Тут мы создали 2 глобальные переменные. Одна содержит указатель вашего меню, другая хранит резуьтаты голосования. Голоса 'Да' будут сохранены в g_Votes[1] ,а 'Нет' будет сохранена в g_Votes[2].
Регистрируем Плагин и Меню
public plugin_init() { // Регистрируем ваш плагин register_plugin("Vote Menu","1.0","Freecode"); // Регистрируем меню смены карты g_Menu = menu_create("Change Level?","menu_handle"); register_clcmd("amx_startvote","startvote",ADMIN_CFG,"Gaben"); // Теперь нам надо создать наше меню build_menu(); }
Lets break this down.
- Регистрирует ваш плагин
register_plugin("Vote Menu","1.0","Freecode");
- g_Menu - Указатель на ваше меню. Это будет установлено после вызова menu_create.
g_Menu = menu_create("Change Level?","menu_handle"); //menu_create ( title[], handler[], ml=0 ) //title[] - Заголовок меню //handler[] - Эта функция будет вызвана когда будет нажата клавиша в вашем меню.
- Мы добавили эту команду. Она начинает ваше голосование.
register_clcmd("amx_startvote","startvote",ADMIN_CFG,"Gaben");
- Это вызов функции. build_menu() функция создает ваше меню.
build_menu();
Создение меню
Конструирование заключается в добавлении пунктов в ваше меню. Прежде чем начали добавлять пункты, мы должны взглянуть на menu_additem .
menu_additem ( menu, const name[], const command[], paccess=0, callback=-1 )
- menu - указатель на меню. Это указывает menu_additem меню к которому нужно добавить пункты.
- const name[] - имя пункта меню. Это то что будет показано в меню.
- const command[] - информация пункта меню.
Теперь давайте приступим к созданию нашего меню. Как уже говорилось, это простое голосование смены карты. Так что нам надо всего 2 пункта меню. А именно "Да" и "Нет".
build_menu() { menu_additem(g_Menu, "Yes", "1"); menu_additem(g_Menu, "No", "2"); menu_setprop(g_Menu, MPROP_PERPAGE, 0); }
- Примечание
- Как вы можете видеть вместо command[] я указал числа. Это необходимо для более простой идентификации пунктов меню.
- Я так-же добавил menu_setprop. Это говорит нашему меню что оно не имеет страниц. Для дополнительной информации смотрите в amxconst.inc
Показывает меню голосования
Для того что-бы показать меню мы должны использовать menu_display.
menu_display ( id, menu, page )
- id - id пользователя которому надо показать это меню.
- menu - тут указываем хэндл меню которое показываем пользователю.
- page - какая страница (номер страницы меню) с которой начинаем. Страницы меню начинаются с 0.
Ok теперь посмотрим на наш код.
public startvote(id) { for(new i = 0; i < 33; i++) { if( is_user_alive(i) ) { menu_display(i, g_Menu, 0); } } return PLUGIN_HANDLED; }
- Примечание:
- Используем цыкл для прохождения по всем игрокам и показываем меню тем кто живой.
Обработка выборов меню
Последний этап заключается в обработке выбора меню. Это делается через функцию обработки. Она вызывается каждый раз когда пользователь сделал выбор. Вот 3 переменные которые передаются в функцию.
- id - id пользователя
- menu - открытое меню у пользователя
- item - тут выбор пункта меню пользователем
Далее мы объявляем несколько специальных переменных таких как меню выхода.
#define MENU_EXIT -3 #define MENU_BACK -2 #define MENU_MORE -1
Теперь нам надо проверить если пункт меню выбран и он не является специальной переменной
if( item < 0 ) return PLUGIN_CONTINUE;
Следующим шагом мы получаем информацию о выбранном пункте меню. Все что мы ищем это номер пункта меню. (Да = 1, Нет = 2). Для этого надо использовать menu_item_getinfo.
menu_item_getinfo ( menu, item, &access, command[], cmdlen, name[]="", namelen=0, &callback )
- menu - меню в котором находится пункт меню.
- item - the item itself
- &access - (edit)
- command[] - (edit)(это то где сохраняются идентификационные номера меню)
- cmdlen - размер command[]
- name[] - имя пункта меню
- namelen - размер name[]
- &callback - (edit)
После того как мы получили информацию о пуектах меню, надо взять из command[] номера выбранных меню(это должно быть 1 или 2). Теперь надо добавить в g_Votes теми голосами что были сделаны. Вот как завершонная функция должна выглядеть:
public menu_handle(id, menu, item) { if( item < 0 ) return PLUGIN_CONTINUE; // Get item info new cmd[3]; new access, callback; menu_item_getinfo(menu, item, access, cmd,2,_,_, callback); new iChoice = str_to_num(cmd); g_Votes[iChoice]++; return PLUGIN_HANDLED; }
Зевершение
Это конец. Вы завершили Урок по созданию меню. Используя новую систему меню можно создать более удобное управление. В следующем уроке вы увидите более сложную систему меню которая будет использовать callbacks, уничтожение меню и создание. Вот код который должен получится посли всех действий.
#include <amxmodx> new g_Menu; // Переменная обработки главного меню new g_Votes[3]; // Сохраняем голосования Да как 1, No как 2 public plugin_init() { // Регистрируем ваш плагин register_plugin("Vote Menu","1.0","Freecode"); // Регистрируем меню смены карты g_Menu = menu_create("Change Level?","menu_handle"); register_clcmd("amx_startvote","startvote",ADMIN_CFG,"Gaben"); // Теперь нам надо создать наше меню build_menu(); } build_menu() { menu_additem(g_Menu, "Yes", "1"); menu_additem(g_Menu, "No", "2"); menu_setprop(g_Menu, MPROP_PERPAGE, 0); } public startvote(id) { for(new i = 0; i < 33; i++) { if( is_user_alive(i) ) { menu_display(i, g_Menu, 0); } } return PLUGIN_HANDLED; } public menu_handle(id, menu, item) { if( item < 0 ) return PLUGIN_CONTINUE; // Получаем информацию о пункте new cmd[3]; new access, callback; menu_item_getinfo(menu, item, access, cmd,2,_,_, callback); new iChoice = str_to_num(cmd); g_Votes[iChoice]++; return PLUGIN_HANDLED; }