Если вы создается меню, опции которого не изменяются (постоянные), то лучше всего создать его, как глобальное. Не нужно его уничтожать и заново создавать по несколько раз.
Если небходимо выровнять текст в меню по правому краю, то используйте \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
}
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 <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
}
// Для хранения меню голсоований
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
}
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
}
Ну вот вроде бы и все.Думаю многим будет полезна даная информация.Сам по ней учился.
Не забываем говрить Спасибо=)Долго писал и оформял.