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 стиля меню
|
|
| |