|
|
(5 intermediate revisions by one other user not shown) |
Line 1: |
Line 1: |
− | [[Category:Russian]] | + | #REDIRECT [[Ru:Using_New_Menu_System]] |
− | [[Category:Ru:Scripting (AMX Mod X)]]
| |
− | | |
− | = Введение =
| |
− | Это статья поможет вам разобраться в новой системе меню.
| |
− | | |
− | == Урок по созданию меню ==
| |
− | Давайте попробуем воспользоваться новой системмой меню. Мы пройдем через этоу простую инструкцию и создадим простое голосование смены карты.
| |
− | | |
− | === Заголовочные файлы ===
| |
− | Как обычно мы начинаем с добавления необходимых заголовочных файлов
| |
− | <pawn>
| |
− | #include <amxmodx>
| |
− | </pawn>
| |
− | | |
− | === Глобальные переменные ===
| |
− | <pawn>
| |
− | new g_Menu; // Переменная обработки главного меню
| |
− | new g_Votes[3]; // Сохраняем голосования Да как 1, No как 2
| |
− | </pawn>
| |
− | | |
− | Тут мы создали 2 глобальные переменные. Одна содержит указатель вашего меню, другая хранит резуьтаты голосования. Голоса 'Да' будут сохранены в g_Votes[1] ,а 'Нет' будет сохранена в g_Votes[2].
| |
− | | |
− | === Регистрируем Плагин и Меню ===
| |
− | <pawn>
| |
− | 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();
| |
− | }
| |
− | </pawn>
| |
− | | |
− | Lets break this down.
| |
− | | |
− | *Регистрирует ваш плагин
| |
− | <pawn>register_plugin("Vote Menu","1.0","Freecode");</pawn>
| |
− | | |
− | *g_Menu - Указатель на ваше меню. Это будет установлено после вызова menu_create.
| |
− | <pawn>g_Menu = menu_create("Change Level?","menu_handle");
| |
− | | |
− | //menu_create ( title[], handler[], ml=0 )
| |
− | //title[] - Заголовок меню
| |
− | //handler[] - Эта функция будет вызвана когда будет нажата клавиша в вашем меню.
| |
− | </pawn>
| |
− | | |
− | * Мы добавили эту команду. Она начинает ваше голосование.
| |
− | <pawn>register_clcmd("amx_startvote","startvote",ADMIN_CFG,"Gaben");
| |
− | </pawn>
| |
− | | |
− | * Это вызов функции. build_menu() функция создает ваше меню.
| |
− | <pawn>build_menu();</pawn>
| |
− | | |
− | === Создение меню ===
| |
− | Конструирование заключается в добавлении пунктов в ваше меню. Прежде чем начали добавлять пункты, мы должны взглянуть на
| |
− | menu_additem .
| |
− | <pawn>menu_additem ( menu, const name[], const command[], paccess=0, callback=-1 )</pawn>
| |
− | * menu - указатель на меню. Это указывает menu_additem меню к которому нужно добавить пункты.
| |
− | * const name[] - имя пункта меню. Это то что будет показано в меню.
| |
− | * const command[] - информация пункта меню.
| |
− | | |
− | Теперь давайте приступим к созданию нашего меню. Как уже говорилось, это простое голосование смены карты. Так что нам надо всего 2 пункта меню. А именно "Да" и "Нет".
| |
− | <pawn>build_menu()
| |
− | {
| |
− | menu_additem(g_Menu, "Yes", "1");
| |
− | menu_additem(g_Menu, "No", "2");
| |
− |
| |
− | menu_setprop(g_Menu, MPROP_PERPAGE, 0);
| |
− | }</pawn>
| |
− | *<tt>Примечание</tt>
| |
− | ** Как вы можете видеть вместо command[] я указал числа. Это необходимо для более простой идентификации пунктов меню.
| |
− | ** Я так-же добавил menu_setprop. Это говорит нашему меню что оно не имеет страниц. Для дополнительной информации смотрите в amxconst.inc
| |
− | | |
− | === Показывает меню голосования ===
| |
− | Для того что-бы показать меню мы должны использовать menu_display.
| |
− | <pawn>menu_display ( id, menu, page )</pawn>
| |
− | * id - id пользователя которому надо показать это меню.
| |
− | * menu - тут указываем хэндл меню которое показываем пользователю.
| |
− | * page - какая страница (номер страницы меню) с которой начинаем. Страницы меню начинаются с 0.
| |
− | | |
− | Ok теперь посмотрим на наш код.
| |
− | <pawn>public startvote(id)
| |
− | {
| |
− | for(new i = 0; i < 33; i++)
| |
− | {
| |
− | if( is_user_alive(i) )
| |
− | {
| |
− | menu_display(i, g_Menu, 0);
| |
− | }
| |
− | }
| |
− |
| |
− | return PLUGIN_HANDLED;
| |
− | }</pawn>
| |
− | *<tt>Примечание:</tt>
| |
− | ** Используем цыкл для прохождения по всем игрокам и показываем меню тем кто живой.
| |
− | | |
− | === Обработка выборов меню ===
| |
− | Последний этап заключается в обработке выбора меню. Это делается через функцию обработки.
| |
− | Она вызывается каждый раз когда пользователь сделал выбор.
| |
− | Вот <b>3</b> переменные которые передаются в функцию.
| |
− | * id - id пользователя
| |
− | * menu - открытое меню у пользователя
| |
− | * item - тут выбор пункта меню пользователем
| |
− | | |
− | Далее мы объявляем несколько специальных переменных таких как меню выхода.
| |
− | <pawn>#define MENU_EXIT -3
| |
− | #define MENU_BACK -2
| |
− | #define MENU_MORE -1</pawn>
| |
− | | |
− | Теперь нам надо проверить если пункт меню выбран и он не является специальной переменной
| |
− | <pawn>if( item < 0 ) return PLUGIN_CONTINUE;</pawn>
| |
− | | |
− | Следующим шагом мы получаем информацию о выбранном пункте меню. Все что мы ищем это номер пункта меню. (Да = 1, Нет = 2).
| |
− | Для этого надо использовать menu_item_getinfo.
| |
− | <pawn>menu_item_getinfo ( menu, item, &access, command[], cmdlen, name[]="", namelen=0, &callback )</pawn>
| |
− | * menu - меню в котором находится пункт меню.
| |
− | * item - the item itself
| |
− | * &access - (edit)
| |
− | * command[] - (edit)(это то где сохраняются идентификационные номера меню)
| |
− | * cmdlen - размер command[]
| |
− | * name[] - имя пункта меню
| |
− | * namelen - размер name[]
| |
− | * &callback - (edit)
| |
− | | |
− | После того как мы получили информацию о пуектах меню, надо взять из command[] номера выбранных меню(это должно быть 1 или 2).
| |
− | Теперь надо добавить в g_Votes теми голосами что были сделаны.
| |
− | Вот как завершонная функция должна выглядеть:
| |
− | <pawn>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;
| |
− | }
| |
− | </pawn>
| |
− | | |
− | === Завершение ===
| |
− | Это конец. Вы завершили Урок по созданию меню. Используя новую систему меню можно создать более удобное управление.
| |
− | В следующем уроке вы увидите более сложную систему меню которая будет использовать callbacks, уничтожение меню и создание.
| |
− | Вот код который должен получится посли всех действий.
| |
− | <pawn>#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;
| |
− | }</pawn>
| |