Главная » Статьи » Статьи о cs и про cs |
Новая система меню AMXX
Если вы создается меню,
опции которого не изменяются (постоянные), то лучше всего создать его,
как глобальное. Не нужно его уничтожать и заново создавать по несколько
раз. Если небходимо выровнять текст в меню по правому краю, то используйте \R. Меню не будет показываться, если у него нет опций. Для того чтобы убрать отображение меню у игрока на экране, можно использовать код: show_menu(id, 0, "^n", 1) Список цветов, которые можно использовать при создании меню: Белый - \w Желтый - \y Красный - \r Серый - \d Функции: Создание меню menu_create(title[], handler[], ml=0) title - заголовок меню, который отображается сверху. handler - функция, с которой будет происходить взаимодействие, когда произошло нажатие одной из опций. ml - использовать мультиязычность при формировании меню. Добавление опции меню menu_additem(menu, const name[], const command[], paccess=0, callback=-1) menu - меню, с которым мы будем взаимодействовать. name - название опции меню (нумерация происходит автоматически). command - информация, которую мы посылаем при использовании данной опции. paccess - уровень доступа к данной опции (флаг администратора). callback - если данная опция установлена (это должен быть результат функции menu_makecallback), то будет вызов функции до вывода опции на экран, что даст возможность изменить опцию в реальном времени. Установка свойств меню menu_setprop(menu, prop, ...) menu - меню, с которым мы будем взаимодействовать. prop - свойство меню. Отображение меню menu_display(id, menu, page) id - индекс игрока, которому мы должны показать меню. menu - меню, которое необходимо показать. page - страница меню, с которой начинается отображение. Уничтожение меню menu_destroy(menu) menu - меню, которое нужно уничтожить. После вызова данной функции необходимо использовать return PLUGIN_HANDLED. Получение информации об опции меню menu_item_getinfo(menu, item, &access, command[], cmdlen, name[]="", namelen=0, &callback) menu - меню, из которого необходимо получить информацию. item - опция, о которой необходимо получить информацию. access - уровень доступа для указанной опции. command - данные, передаваемые данной опцией. cmdlen - длина данных. name - название опции меню. namelen - длина названия. callback - значение callback. Добавление пустой опции (пробел) menu_addblank(menu, slot=1) menu - меню, с которым необходимо произвести действие. slot - если значение больше 0, то увеличивает пробелы в данном количестве раз. Можно использовать только после menu_additem. Отменить меню у игрока menu_cancel(player) player - игрок, у которого необходимо отменить действие меню, меню останется на экране игрока, но любое действие будет анулировано. Количество опций в меню menu_items(menu) menu - меню, у которого необходимо получить кол-во опций. Количество страниц в меню menu_pages(menu) menu - меню, у которого необходимо получить кол-во страниц. Установить callback на опцию меню menu_item_setcall(menu, item, callback=-1) menu - меню, с которым происходит взаимодействие. item - опция меню. callback - значение для callback. Установить команду на опцию меню menu_item_setcmd(menu, item, cmd[]) menu - меню, с которым происходит взаимодействие. item - опция меню. cmd - команда опции. Установить название опции меню menu_item_setname(menu, item, name[]) menu - меню, с которым происходит взаимодействие. item - опция меню. name - название опции. Создание callback функции menu_makecallback(function[]) function - название функции для callback. Данная функция передает аргументы id игрока, id меню и id опции: public function(id, menu, item) Функция может возвращать следующие значения: ITEM_IGNORE, ITEM_ENABLED или ITEM_DISABLED. Создание базисного меню (основной пример) #include <amxmodx> public plugin_init() { // Данные вашего плагина // Клиентская команда для вызова меню register_clcmd("my_menu", "My_Menu") } // Создадим функцию, которая будет формировать меню public My_Menu(id) { // Сперва необходимо создать переменную для меню, с которой мы будем взаимодействовать в дальнейшем new i_Menu = menu_create("\rTitle of my menu:", "menu_handler") // Теперь добавим некоторые опции для меню menu_additem(i_Menu, "\wFirst option #1", "1", 0) menu_additem(i_Menu, "\wSecond option #2", "2", 0) menu_additem(i_Menu, "\wAdmin option #3", "3", ADMIN_ADMIN) // Устанавливаем свойства меню menu_setprop(i_Menu, MPROP_EXIT, MEXIT_ALL) // Отображение меню игроку menu_display(id, i_Menu, 0) } // Создадим теперь функцию обработки действий меню public menu_handler(id, menu, item) { // Если игрок нажал выход из меню if (item == MENU_EXIT) { // Уничтожение меню menu_destroy(menu) return PLUGIN_HANDLED } // Теперь создадим переменные, необходимые для получения информации о меню и нажатой опции new s_Data[6], s_Name[64], i_Access, i_Callback // Получаем информацию об опции menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback) // Если посмотреть раньше на использовании menu_additem, то можно увидеть, что мы посылали некоторую информацию // В данном случае вся информация - целочисленная new i_Key = str_to_num(s_Data) // Теперь найдем, какая именно опция была использована switch(i_Key) { case 1: { client_print(id, print_chat, "You selected first option") // Уничтожение меню menu_destroy(menu) return PLUGIN_HANDLED } case 2: { client_print(id, print_chat, "You selected second option") } case 3: { client_print(id, print_chat, "You selected admin option") } } // Уничтожение меню menu_destroy(menu) return PLUGIN_HANDLED } Создание меню, сформированного из игроков на сервере #include <amxmodx> #include <fun> public plugin_init() { // Клиентская команда для вызова меню register_clcmd("my_menu", "My_Menu") } public My_Menu(id) { // Сперва необходимо создать переменную для меню, с которой мы будем взаимодействовать в дальнейшем new i_Menu = menu_create("\rPlayer menu:", "menu_handler") // Необходимые переменные, которые понадобятся нам при выводе меню из игроков new s_Players[32], i_Num, i_Player // Переменные для хранения информации об игроках new s_Name[32], s_Player[10] // Получаем массив игроков get_players(s_Players, i_Num) // Цикл по всем игрокам for (new i; i < i_Num; i++) { // Сохраняем текущего игрока в i_Player i_Player = s_Players[i] // Получаем имя и ID игрока get_user_name(i_Player, s_Name, charsmax(s_Name)) num_to_str(i_Player, s_Player, charsmax(s_Player)) // Добавляем опцию по данному игроку menu_additem(i_Menu, s_Name, s_Player, 0) } // Мы сформировали меню из игроков, присутствующих на сервере, теперь выводим его menu_display(id, i_Menu, 0) } public menu_handler(id, menu, item) { if (item == MENU_EXIT) { menu_destroy(menu) return PLUGIN_HANDLED } new s_Data[6], s_Name[64], i_Access, i_Callback menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback) // Получаем ID игрока, который был выбран в меню new i_Player = str_to_num(s_Data) // Проверяем, если игрок живой if (is_user_alive(i_Player)) // Устанавливаем его здоровье в 100 HP set_user_health(i_Player, 100) menu_destroy(menu) return PLUGIN_HANDLED } Создание меню для голосования #include <amxmodx> // Для хранения меню голсоований new g_VoteMenu // Для хранения голосов за каждую опцию new g_Votes[2] // Для проверки, если голосование уже запущено new g_Voting public plugin_init() { register_clcmd("start_vote", "StartVote") } public StartVote(id) { // Если голосование уже запущено, то выходим if (g_Voting) { client_print(id, print_chat, "There is already a vote going.") // Мы возвращаем PLUGIN_HANDLED, чтобы в консоли игрока не было сообщения unknown command return PLUGIN_HANDLED } g_VoteMenu = menu_create("\rVote Menu:", "menu_handler") menu_additem(g_VoteMenu, "Vote Option 1", "0", 0) menu_additem(g_VoteMenu, "Vote Option 2", "1", 0) new s_Players[32], i_Num, i_Player get_players(s_Players, i_Num) for (new i; i < i_Num; i++) { i_Player = s_Players[i] menu_display(i_Player, g_VoteMenu, 0) // Увеличиваем, чтобы узнать сколько игроков голосуют g_Voting++ } // Останавливаем голосование через 10 секунд set_task(10.0, "EndVote") return PLUGIN_HANDLED } public menu_handler(id, menu, item) { if (item == MENU_EXIT) return PLUGIN_HANDLED new s_Data[6], s_Name[64], i_Access, i_Callback menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback) // Полчаем информацию о том, какая опция была выбрана new i_Vote = str_to_num(s_Data) // Увеличиваем количество голосов по данной опции g_Votes[i_Vote]++ return PLUGIN_HANDLED } public EndVote() { // Если первая опция набрала больше голосов, чем вторая if (g_Votes[0] > g_Votes[1]) client_print(0, print_chat, "First option recieved most votes (%d)", g_Votes[0]) // Иначе если вторая опция набрала больше голосов, чем первая else if (g_Votes[1] > g_Votes[0]) client_print(0, print_chat, "Second option recieved most votes (%d)", g_Votes[1]) // Иначе равное кол-во голосов else client_print(0, print_chat, "The vote tied at %d votes each.", g_Votes[0]) menu_destroy(g_VoteMenu) // Сбрасываем информацию о том, что игроки голосуют g_Voting = 0 } Создание меню с использованием под-меню #include <amxmodx> public plugin_init() { register_clcmd( "my_menu","My_Menu") } public My_Menu(id) { new i_Menu = menu_create("\rMy menu:", "menu_handler") menu_additem(i_Menu, "\wFirst option #1", "1", 0) menu_additem(i_Menu, "\wSub-Menu #2", "2", 0) menu_setprop(i_Menu, MPROP_EXIT, MEXIT_ALL) menu_display(id, i_Menu, 0) } public menu_handler(id, menu, item) { if (item == MENU_EXIT) { menu_destroy(menu) return PLUGIN_HANDLED } new s_Data[6], s_Name[64], i_Access, i_Callback menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback) new i_Key = str_to_num(s_Data) switch(i_Key) { case 1: { client_print(id, print_chat, "You selected first option") } case 2: { // Открыть под-меню Sub_Menu(id) } } menu_destroy(menu) return PLUGIN_HANDLED } public Sub_Menu(id) { // Создаем новое меню, но функция обработки действий будет другая new i_Menu = menu_create("\rSub-Menu:", "submenu_handler") menu_additem(i_Menu, "\wSub-option #1", "1", 0) menu_additem(i_Menu, "\wSub-option #2", "2", 0) menu_setprop(i_Menu, MPROP_EXIT, MEXIT_ALL) menu_display(id, i_Menu, 0) } public submenu_handler(id, menu, item) { if (item == MENU_EXIT) { menu_destroy(menu) // Если игрок на сервере, то показываем главное меню if (is_user_connected(id)) My_Menu(id) return PLUGIN_HANDLED } new s_Data[6], s_Name[64], i_Access, i_Callback menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback) new i_Key = str_to_num(s_Data) switch(i_Key) { case 1: { client_print(id, print_chat, "You selected first sub-option") } case 2: { client_print(id, print_chat, "You selected second sub-option") } } menu_destroy(menu) // Если вы хотите показать главное меню потом My_Menu(id) return PLUGIN_HANDLED } Источник: http://makeserver.ru | |
Просмотров: 11125 | Комментарии: 7
| Теги: |
Всего комментариев: 1 | ||
| ||