Ru Using New Menu System

From AlliedModders Wiki
Revision as of 17:22, 2 April 2006 by NetImperia (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Введение

Напишите информацию тут

Beginners Menu Tutorial

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

Includes

Как обычно мы начинаем с добавления необходимых заголовочных файлов

#include <amxmodx>

Глобальные переменные

new g_Menu;	// Переменная обработки главного меню
new g_Votes[3];	// Сохраняем голосования Да как 1, No как 2

Тут мы создали 2 глобальные переменные. Одна содержит указатель вашего меню, другая хранит резуьтаты голосования. Голоса 'Да' будут сохранены в g_Votes[1] ,а 'Нет' будет сохранена в g_Votes[2].

Регистрируем Плагин и Меню

public plugin_init()
{
	// Регистрируем ваш плагин
	register_plugin("Vote Menu","1.0","Freecode");
 
	// Регистрируем меню смены карты
	g_Menu = menu_create("Change Level?","menu_handle");
 
	register_clcmd("amx_startvote","startvote",ADMIN_CFG,"Gaben");
 
	// Теперь нам надо создать наше меню
	build_menu();
}

Lets break this down.

  • Регистрирует ваш плагин
register_plugin("Vote Menu","1.0","Freecode");
  • g_Menu - Указатель на ваше меню. Это будет установлено после вызова menu_create.
g_Menu = menu_create("Change Level?","menu_handle");
 
//menu_create ( title[], handler[], ml=0 )
//title[] - Заголовок меню
//handler[] - Эта функция будет вызвана когда будет нажата клавиша в вашем меню.
  • Мы добавили эту команду. Она начинает ваше голосование.
register_clcmd("amx_startvote","startvote",ADMIN_CFG,"Gaben");
  • Это вызов функции. build_menu() функция создает ваше меню.
build_menu();

Создение меню

Конструирование заключается в добавлении пунктов в ваше меню. Прежде чем начали добавлять пункты, мы должны взглянуть на menu_additem .

menu_additem ( menu, const name[], const command[], paccess=0, callback=-1 )
  • menu - указатель на меню. Это указывает menu_additem меню к которому нужно добавить пункты.
  • const name[] - имя пункта меню. Это то что будет показано в меню.
  • const command[] - информация пункта меню.

Теперь давайте приступим к созданию нашего меню. Как уже говорилось, это простое голосование смены карты. Так что нам надо всего 2 пункта меню. А именно "Да" и "Нет".

build_menu()
{
	menu_additem(g_Menu, "Yes", "1");
	menu_additem(g_Menu, "No", "2");
 
	menu_setprop(g_Menu, MPROP_PERPAGE, 0);
}
  • Примечание
    • Как вы можете видеть вместо command[] я казал числа. Это необходимо для более простой идентификации пунктов меню.
    • Я так-же добавил menu_setprop. Это говорит нашему меню что оно не имеет страниц. Для дополнительной информации смотрите в amxconst.inc

Показывает меню голосования

Для того что-бы показать меню мы должны использовать menu_display.

menu_display ( id, menu, page )
  • id - id пользователя которому надо показать это меню.
  • menu - тут указываем хэндл меню которое показываем пользователю.
  • page - какая страница (номер страницы меню) с которой начинаем. Страницы меню начинаются с 0.

Ok теперь посмотрим на наш код.

public startvote(id)
{
	for(new i = 0; i < 33; i++)
	{
		if( is_user_alive(i) )
		{
			menu_display(i, g_Menu, 0);
		}
	}
 
	return PLUGIN_HANDLED;
}
  • Примечание:
    • Используем цыкл для прохождения по всем игрокам и показываем меню тем кто живой.

Обработка выборов меню

Последний этап заключается в обработке выбора меню. Это делается через функцию обработки. Она вызывается каждый раз когда пользователь сделал выбор. Вот 3 переменные которые передаются в функцию.

  • id - id пользователя
  • menu - открытое меню у пользователя
  • item - тут выбор пункта меню пользователем

Now there are a few of special items like the Exit item.

#define MENU_EXIT	-3
#define	MENU_BACK	-2
#define MENU_MORE	-1

So we must check at first if the item chosen was not one of the special ones.

if( item < 0 ) return PLUGIN_CONTINUE;

Next we must retrieve the item information. What we are looking for is the number we gave the item (Yes = 1, No = 2). And to do this we use menu_item_getinfo.

menu_item_getinfo ( menu, item, &access, command[], cmdlen, name[]="", namelen=0, &callback )
  • menu - the menu where the item exists.
  • item - the item itself
  • &access - (edit)
  • command[] - (edit)(this is where we stored our item identification numbers)
  • cmdlen - length of the command[]
  • name[] - items name
  • namelen - length of the name
  • &callback - (edit)

After we get our items info we will convert the command[] to a number (will either be a 1 or 2) and update the g_Votes array with the appropriate vote chosen. Here is our finished handle function:

public menu_handle(id, menu, item)
{
	if( item < 0 ) return PLUGIN_CONTINUE;
 
	// Get item info
	new cmd[3];
	new access, callback;
 
	menu_item_getinfo(menu, item, access, cmd,2,_,_, callback);
 
	new iChoice = str_to_num(cmd);
 
	g_Votes[iChoice]++;
 
	return PLUGIN_HANDLED;
}

Зевершение

The end. You have completed the Beginner's Menu Tutorial. Using the new menu system we have more control over the menu. In the next tutorial you will see how powerfull the new menu system is. The use of callbacks and destroying and creating menus. Here is the completed code after the menu.

#include <amxmodx>
 
new g_Menu;	// Main Menu handler
new g_Votes[3];	// Store Yes votes at 1, No at 2
 
public plugin_init()
{
	// Register Our Plugin
	register_plugin("Vote Menu","1.0","Freecode");
 
	// Register our Change Level vote menu
	g_Menu = menu_create("Change Level?","menu_handle");
 
	register_clcmd("amx_startvote","startvote",ADMIN_CFG,"Gaben");
 
	// Now we need to build our menu
	build_menu();
}
 
build_menu()
{
	menu_additem(g_Menu, "Yes", "1");
	menu_additem(g_Menu, "No", "2");
 
	menu_setprop(g_Menu, MPROP_PERPAGE, 0);
}
 
public startvote(id)
{
	for(new i = 0; i < 33; i++)
	{
		if( is_user_alive(i) )
		{
			menu_display(i, g_Menu, 0);
		}
	}
 
	return PLUGIN_HANDLED;
}
 
public menu_handle(id, menu, item)
{
	if( item < 0 ) return PLUGIN_CONTINUE;
 
	// Get item info
	new cmd[3];
	new access, callback;
 
	menu_item_getinfo(menu, item, access, cmd,2,_,_, callback);
 
	new iChoice = str_to_num(cmd);
 
	g_Votes[iChoice]++;
 
	return PLUGIN_HANDLED;
}