Создание Меню Для CS Сервера

Онлайн игра от 17-06-2013, 08:07

И Так Эта Статья В Основном Пойдет Для Скриптеров На PAWN CS 1.6

В данной статье рассказывается и показываются примеры по созданию нового игрового меню через AMX Mod X.

Если вы создается меню, опции которого не изменяются (постоянные), то лучше всего создать его, как глобальное. Не нужно его уничтожать и заново создавать по несколько раз.

 

скачать кс 1.6

 

Если небходимо выровнять текст в меню по правому краю, то используйте R.

Меню не будет показываться, если у него нет опций.

Для того чтобы убрать отображение меню у игрока на экране, можно использовать код:

show_menu(id, 0, "^n", 1)

Список цветов, которые можно использовать при создании меню:

Белый - w

Желтый - y

Красный -

Серый - 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("

Title 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("

Player 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

// Получаем имя и 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("

Vote 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

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("

My 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("

Sub-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

}