Нова система меню amxx - російська спільнота по скриптингу amxx

В даній статті розповідається і показуються приклади зі створення нового ігрового меню через AMX Mod X.
  • Якщо ви створюється меню, опції якого не змінюються (постійні), то краще за все створити його, як глобальне. Не потрібно його знищувати і заново створювати по кілька разів.
  • Якщо небхідно вирівняти текст в меню по правому краю, то використовуйте \ R.
  • Меню стане нормальним, якщо у нього немає опцій.
  • Для того щоб прибрати відображення меню у гравця на екрані, можна використовувати код:
    Код: Виділити все show_menu (id. 0. "^ n". 1)
  • Список кольорів, які можна використовувати при створенні меню:
    • Білий - \ w
    • Жовтий - \ y
    • Червоний - \ r
    • Сірий - \ d

функції:
  • створення меню
    Код: Виділити все menu_create (title # 91; # 93 ;, handler # 91; # 93 ;, ml = 0)
    title - заголовок меню, який відображений в верхній частині.
    handler - функція, з якою буде відбуватися взаємодія, коли відбулося натискання однієї з опцій.
    ml - використовувати багатомовність при формуванні меню.
  • Додавання опції меню
    Код: Виділити все menu_additem (menu. Const name # 91; # 93 ;, const command # 91; # 93 ;, 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 # 91; # 93 ;, cmdlen. name # 91; # 93; = "". 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 # 91; # 93;)
    menu - меню, з яким відбувається взаємодія.
    item - опція меню.
    cmd - команда опції.
  • Встановити назву опції меню
    Код: Виділити все menu_item_setname (menu. Item. Name # 91; # 93;)
    menu - меню, з яким відбувається взаємодія.
    item - опція меню.
    name - назва опції.
  • Створення callback функції
    Код: Виділити все menu_makecallback (function # 91; # 93;)
    function - назва функції для callback.
    Ця функція передає аргументи id гравця, id меню і id опції:
    Код: Виділити все public function (id. Menu. Item)
    Функція може повертати наступні значення: ITEM_IGNORE, ITEM_ENABLED або ITEM_DISABLED.

Створення базисного меню (основний приклад)
Код: Виділити все #include

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)

// Тепер створимо змінні, необхідні для отримання інформації про меню і, утримуючи опції
new s_Data # 91; 6 # 93 ;, s_Name # 91; 64 # 93 ;, 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
#include

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 # 91; 32 # 93 ;, i_Num. i_Player

// Змінні для зберігання інформації про гравців
new s_Name # 91; 32 # 93 ;, s_Player # 91; 10 # 93;

// Отримуємо масив гравців
get_players (s_Players. i_Num)

// Цикл по всім гравцям
for (new i; i <
// Зберігаємо поточного гравця в i_Player
i_Player = s_Players # 91; i # 93;

// Отримуємо ім'я і 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 # 91; 6 # 93 ;, s_Name # 91; 64 # 93 ;, 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

// Для зберігання меню голсоованій
new g_VoteMenu
// Для зберігання голосів за кожну опцію
new g_Votes # 91; 2 # 93;
// Для перевірки, якщо голосування вже запущено
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 # 91; 32 # 93 ;, i_Num. i_Player
get_players (s_Players. i_Num)

for (new i; i i_Player = s_Players # 91; i # 93;

menu_display (i_Player. g_VoteMenu. 0)

// Збільшуємо, щоб дізнатися скільки гравців голосують
g_Voting ++
>

// Зупиняємо голосування через 10 секунд
set_task (10.0. "EndVote")

public menu_handler (id. menu. item)
if (item == MENU_EXIT)
return PLUGIN_HANDLED

new s_Data # 91; 6 # 93 ;, s_Name # 91; 64 # 93 ;, 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 # 91; i_Vote # 93; ++

public EndVote ()
// Якщо перша опція набрала більше голосів, ніж друга
if (g_Votes # 91; 0 # 93;> g_Votes # 91; 1 # 93;)
client_print (0. print_chat. "First option recieved most votes (.)". g_Votes # 91; 0 # 93;)
// Інакше якщо друга опція набрала більше голосів, ніж перша
else if (g_Votes # 91; 1 # 93;> g_Votes # 91; 0 # 93;)
client_print (0. print_chat. "Second option recieved most votes (.)". g_Votes # 91; 1 # 93;)
// Інакше рівну кількість голосів
else
client_print (0. print_chat. "The vote tied at. votes each.". g_Votes # 91; 0 # 93;)

// Скидаємо інформацію про те, що гравці голосують
g_Voting = 0
>

Створення меню з використанням під-меню
Код: Виділити все #include

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 # 91; 6 # 93 ;, s_Name # 91; 64 # 93 ;, 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)

new s_Data # 91; 6 # 93 ;, s_Name # 91; 64 # 93 ;, 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")
>
>

// Якщо ви хочете показати головне меню потім
My_Menu (id)

Не пишіть мені в ЛС. якщо вам потрібна допомога на безоплатній основі. Будь-які питання на форум.