Автор: Emp` Перевод и редактирование: DJ_WEST
В данной статье рассказывается и показываются примеры по созданию нового игрового меню через AMX Mod X.
- Если
вы создается меню, опции которого не изменяются (постоянные), то лучше
всего создать его, как глобальное. Не нужно его уничтожать и заново
создавать по несколько раз.
- Если небходимо выровнять текст в меню по правому краю, то используйте \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.
Создание базисного меню (основной пример)
- Код: Выделить всё
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)
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 }
Создание меню, сформированного из игроков на сервере
- Код: Выделить всё
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 = s_Players[i]
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)
new i_Player = str_to_num(s_Data)
if (is_user_alive(i_Player)) set_user_health(i_Player, 100)
menu_destroy(menu) return PLUGIN_HANDLED }
Создание меню для голосования
- Код: Выделить всё
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.") 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++ }
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 }
Создание меню с использованием под-меню
- Код: Выделить всё
public plugin_init() { register_clcmd( "my_menu","My_Menu") }
public My_Menu(id) { new i_Menu = menu_create("\rMy menu:", "menu_handler")
|