[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » Создание Меню (CreatePanel, CreateMenu Взято с world-source.ru)
Создание Меню
rootДата: Пятница, 01.02.2013, 15:35 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 561
Статус: Offline
Ниже будут приведены примеры кода для создания разных типов меню. 
Лучше не копируйте код, а скачайте архив в прикреплениях, чтобы вручную отступы не поправлять. 

Panel (панель) 

Код
#include <sourcemod>  

public OnPluginStart()  
{  
       RegConsoleCmd("test", test);  
}  

public Action:test(client, args)  
{  
       if (client > 0 && args < 1) ShowMyPanel(client);  
       return Plugin_Handled;  
}  

ShowMyPanel(client)  
{  
       new Handle:panel = CreatePanel();  
       SetPanelTitle(panel, "Животные:\n \n");  
       DrawPanelItem(panel, "Кот");  
       DrawPanelText(panel, "Носорог");  
       DrawPanelItem(panel, "Собак");  
       DrawPanelItem(panel, "Хамелеон");  
       DrawPanelItem(panel, "Тигр \n \n");  
       DrawPanelItem(panel, "Выход");  
       SendPanelToClient(panel, client, Select_Panel, 0);  
       CloseHandle(panel);  
       ClientCommand(client, "playgamesound items/nvg_off.wav");  
}  

public Select_Panel(Handle:panel, MenuAction:action, client, option)  
{  
       if (action == MenuAction_Select)  
       {  
           PrintToChat(client, "Номер выбранной опции: %d", option);  
           if (option < 5) ShowMyPanel(client);  
       }  
}

Запустите этот плагин, войдите в игру и введите в консоль test. Откроется такое меню: 



Выбрав опцию, вы увидите её номер в чате, и если она меньше 5 (5 это выход), то меню снова откроется. 
Опцию 'Носорог' нельзя выбрать и она без номера, это просто текст. 
Максимум опций (которые можно выбрать): 10 

Если в меню хранятся постоянные одинаковые данные, то нет смысла его постоянно пересоздавать, просто создайте глобальную переменную и сохраните в ней Handle вашего меню. И после отправки менюшки игроку, если оно вам еще надо, не делайте CloseHandle(), ибо это убивает меню. 

Handle:CreatePanel(Handle:hStyle=INVALID_HANDLE); - создаёт панель и возвращает её Handle. 
Если вернёт INVALID_HANDLE, значит произошла ошибка. 

Код
hStyle (стиль меню):  

MenuStyle_Default = 0 // The "default" menu style for the mod  
MenuStyle_Valve = 1 // The Valve provided menu style (Used on HL2DM)  
MenuStyle_Radio = 2 // The simpler menu style commonly used on CS:S

Handle:SetPanelTitle(Handle:panel, const String:text[], bool:onlyIfEmpty=false); 
Устанавливает название меню. Если onlyIfEmpty true, то название установится, только если оно ещё не установлено. 

DrawPanelItem(Handle:panel, const String:text[], style=ITEMDRAW_DEFAULT); - добавляет опцию в меню 

Код
Тип опции (style):  
ITEMDRAW_DEFAULT - используется по умолчанию  
ITEMDRAW_DISABLED - опцию нельзя выбрать + текст становится белым)  
ITEMDRAW_RAWLINE - Item should be a raw line, without a slot  
ITEMDRAW_NOTEXT - No text should be drawn  
ITEMDRAW_SPACER - Item should be drawn as a spacer, if possible  
ITEMDRAW_IGNORE - Item should be completely ignored (rawline + notext)  
ITEMDRAW_CONTROL - Item is control text (back/next/exit)

bool:DrawPanelText(Handle:panel, const String:text[]); 
Это не считается опцией, которую можно выбрать, это добавляет обычный текст 

bool:SendPanelToClient(Handle:panel, client, <функция>, time); 
Отправляет (показывает) игроку меню на time секунд (0 = всегда). Функция выглядит так: 

Код
public xzFuncName(Handle:panel, MenuAction:action, param1, param2)  
{  
       // если надо ловить момент выбора опций:  
       if (action == MenuAction_Select)  
       {  
           // ваш код  
       }  
}

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

MenuAction: 

Код
MenuAction_Select - игрок выбрал опцию (param1 = client, param2 = номер опции)  
MenuAction_Cancel - игрок закрыл меню (param1 = client, param2 = reason)  
MenuAction_End - меню стало неактивным (param1 = reason)  
и др.

MenuAction_Cancel reason (причина закрытия меню) 

Код
MenuCancel_Disconnected - игрок покинул сервер  
MenuCancel_Interrupted - меню закрылось, так как открылось новое  
MenuCancel_Exit - игрок нажал "выход"  
MenuCancel_NoDisplay - меню не может быть отображено клиенту  
MenuCancel_Timeout - время отображения меню истекло  
MenuCancel_ExitBack - клиент выбрал "exit back (выйти обратно)" на одной из страниц

MenuAction_End reason 

Код
MenuEnd_Selected - выбрана опция в меню  
MenuEnd_VotingDone - голосование было завершено  
MenuEnd_VotingCancelled - голосование отменено  
MenuEnd_Cancelled - меню было отменено (param2 = reason)  
MenuEnd_Exit - игрок нажал "exit (выход)"  
MenuEnd_ExitBack - нажал "back"

Handle:GetPanelStyle(Handle:panel); - возвращает Handle стиля панели 

Menu (меню) 

Это меню может содержать множество опций, а не 10, как в панели. Если опций больше 7, то меню само будет разбиваться на страницы и вы сможете листать их дополнительными кнопками внизу "вперед" и "назад". И еще удобно то, что можно узнать не только позицию выбранной опции, но и значение переменной, которое в ней хранится. 

Протестируйте такой код: 

Код
#include <sourcemod>  

public OnPluginStart()  
{  
       RegConsoleCmd("test", test);  
}  

public Action:test(client, args)  
{  
       if (client > 0 && args < 1) ShowMyMenu(client);  
       return Plugin_Handled;  
}  

ShowMyMenu(client)  
{  
       new Handle:menu = CreateMenu(Select_Menu);  
       SetMenuTitle(menu, "Выберите Игрока:\n \n");  
       decl String:userid[15], String:name[32];  
       for (new i = 1; i <= MaxClients; i++)  
       {  
           if (IsClientInGame(i))  
           {  
               IntToString(GetClientUserId(i), userid, 15);  
               GetClientName(i, name, 32);  
               AddMenuItem(menu, userid, name);  
           }  
       }  
       DisplayMenu(menu, client, 0);  
}  

public Select_Menu(Handle:menu, MenuAction:action, client, option)  
{  
       if (action == MenuAction_End)  
       {  
           // Если меню стало неактивным, обязательно уничтожьте его.  
           // Исключение:     
           // Меню глобальное и оно еще вам нужно.  
           CloseHandle(menu);  
           return;  
       }  
       if (action != MenuAction_Select) return;  
       decl String:userid[15];  
       GetMenuItem(menu, option, userid, 15);  
       new target = GetClientOfUserId(StringToInt(userid));  
       if (target > 0)  
       {  
           PrintToChat(client, "Индекс игрока: %d | id: %s", target, userid);  
           new cash = GetEntProp(target, Prop_Send, "m_iAccount") + 1;  
           if (cash < 16001)  
           {  
               SetEntProp(target, Prop_Send, "m_iAccount", cash);  
               PrintToChatAll("Игроку < %N > добавлен $1", target);  
           }  
           else PrintToChat(client, "У него $16000");  
       }  
       else PrintToChat(client, "Игрок не найден (вышел с сервера)");  
       ShowMyMenu(client);  
}



Handle:CreateMenu(<функция>, MenuAction:actions=MENU_ACTIONS_DEFAULT); 
Создаёт меню и возвращает его Handle 

SetMenuTitle(Handle:menu, const String:fmt[], any:...); - устанавливает название 
AddMenuItem(Handle:menu, const String:info[], const String:display[], style=ITEMDRAW_DEFAULT); 

Добавляет опцию в меню: 
info - строка, которую можно будет получить с помощью GetMenuItem 
display - текст, отображающийся в меню 

bool:DisplayMenu(Handle:menu, client, time); - отправить меню игроку на time сек (0 = всегда) 
bool:DisplayMenuAtItem(Handle:menu, client, first_item, time); 
То же самое, но меню можно открыть на определенной странице/опции, надо указать позицию first_item 

GetMenuSelectionPosition() - возвращает позицию первого элемента на текущей странице (MenuAction_Select). 
Используется для того, чтобы можно было отправить меню в исходном положении. 
Можно использовать так: 

Код
DisplayMenuAtItem(menu, client, GetMenuSelectionPosition(), 0);

bool:GetMenuItem(Handle:menu, position, String:infoBuf[], infoBufLen, &style=0, String:dispBuf[]="", dispBufLen=0); 
Это позволять получить значение, которое было записано в info, когда делали AddMenuItem. 
dispBuf - это текст, отображаемый в меню, и dispBufLen его длина. 

GetMenuTitle(Handle:menu, String:buffer[], maxlength); - получить название меню (запишется в buffer) 

bool:GetMenuExitButton(Handle:menu); - вернёт true, если в меню есть кнопка "выход" 
bool:SetMenuExitButton(Handle:menu, bool:button); - запретить(false)/разрешить(true) кнопку "выход" 

bool:GetMenuExitBackButton(Handle:menu); - true, если есть кнопка "назад" 
SetMenuExitBackButton(Handle:menu, bool:button); - запретить(false)/разрешить(true) кнопку "назад" 
Если на 1 страницу добавить эту кнопку, то при её выборе сработает MenuEnd_ExitBack. 

GetMenuItemCount(Handle:menu); - возвращает количество пунктов (опций) в меню 
Handle:GetMenuStyle(Handle:menu); - возвращает Handle стиля меню
 
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » Создание Меню (CreatePanel, CreateMenu Взято с world-source.ru)
  • Страница 1 из 1
  • 1
Поиск: