Проблема с меню.
| |
Sunday
|
Дата: Вторник, 29.01.2013, 22:17:15 | Сообщение # 1 |
|
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
Mapige плагин для админов.
Парни, я пишу плагин и возникла такой вопрос с меню, у меня есть список, внутри он выглядит как мапцикл (список карт). Я его прочитываю и передаю в меню, далее я хочу сделать, когда админ нажимает на название карты в списке то переходит в подменю, там появляется кнопка "Продолжить" и в этот момент на экране у админа выводиться картинка с этой картой, все картинки находятся по адресу matireals/mapige, с точно такими же названиями как карты. Если он нажимает кнопку "Продолжить" то картинка отключается и карта меняется, если жмёт "Назад" то он возвращается в предыдущий пункт в котором остановился на выборе карт и картинка отключается.
Не получается сделать:
******************************************************************* 1. Передачу %s в установку картинке, к примеру: статично Вот так работает: SetOverlay(client, "mapige/dm_dust"); А так, нет: SetOverlay(client, "mapige/%s", info[client]); не получается передать название на установку изображения выбранного пункта имени карты...
Решение: Цитата decl String:format[70]; Format(format, sizeof(format), "mapige/%s", info); SetOverlay(client, format);
Спасибо Scarface_slv. *******************************************************************
Сделанно: 1. Осуществил загрузку картинок из дирректории. 2. Осуществил автозаполнение списка из папки с картинками, плагин смотрит и выбирает только vtf файлы и их названия которые точно такие же как и названия карт и заполняет их в список mapige.txt в корневом каталоге.
Остался в принципе это и еще пару мелочей но над этим уже третий день бьюсь и вот решил написать на форум. Я знаю что в приложенном скрипте ниже много косяков и он далек от истенны но он отображает ход мысли, парни уповаю на вашу помощь. Ниже скрипт:
Код #include <sourcemod> #include <sdktools> #include <smlib>
public OnPluginStart() { RegAdminCmd("sm_mapige", ConsoleCmd, ADMFLAG_GENERIC); }
public Action:ConsoleCmd(client, args) { new Handle:file = OpenFile("mapigelist.txt", "rt"); new Handle:menu = CreateMenu(MenuHandler1); new String:mapname[255]; while (!IsEndOfFile(file) && ReadFileLine(file, mapname, sizeof(mapname))) { if (mapname[0] == ';' || !IsCharAlpha(mapname[0])) { continue; } new len = strlen(mapname); for (new i=0; i<len; i++) { if (IsCharSpace(mapname[i])) { mapname[i] = '\0'; break; } } AddMenuItem(menu, mapname, mapname); } CloseHandle(file); SetMenuTitle(menu, "Выберите карту:");
SetMenuExitButton(menu, true); SetMenuExitBackButton(menu, false); DisplayMenu(menu, client, 0); return Plugin_Handled; }
public MenuHandler1(Handle:menu, MenuAction:action, client, param2) { if (action == MenuAction_Select) { new String:info[64]; GetMenuItem(menu, param2, info, sizeof(info));
if(strcmp(info, "%s") == client) { new Handle:imagemenu = CreateMenu(MenuHandler2); SetMenuTitle(imagemenu, "Продолжить?");
SetOverlay(client, "mapige/dm_runoff"); // тут не получается добавить имя карты которую выбрал что бы установить ее картинку.
AddMenuItem(imagemenu, "changemap", "Продолжить");
SetMenuExitBackButton(imagemenu, true); DisplayMenu(imagemenu, client, 0); PrintToChat(client, "Меню продолжить: %s", info) } } }
public MenuHandler2(Handle:menu, MenuAction:action, client, param2) { if (action == MenuAction_Select) { new String:info[32]; new bool:found = GetMenuItem(menu, param2, info, sizeof(info)); PrintToConsole(client, "Вы выбрали: %d (found? %d info: %s)", param2, found, info); ServerCommand("changelevel %s", info); } }
/* Устанавливаем Изображение Карты */ stock SetOverlay(client, String:overlay[]) { Client_SetScreenOverlay(client, overlay); }
/* Выключаем Рисунок Карты, функция будет активироваться клавишей в меню "Назад" и так же если Админ активирует "Продолжить" */ public Action:ResetOverlay(Handle:timer, any:client) { if(Client_IsIngame(client) && Client_IsValid(client)) { Client_SetScreenOverlay(client, ""); } }
Хочется сделать отличный плагин для Админов, что бы им не приходилось думать какую поставить карту если по названию она не знакома, я нахожу это очень удобным, когда в след названия выводиться изображение.
Сообщение отредактировал Sunday - Вторник, 29.01.2013, 23:10:00 |
|
| |
Scarface_slv
|
Дата: Вторник, 29.01.2013, 22:29:05 | Сообщение # 2 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
Цитата (Sunday) А так, нет: SetOverlay(client, "mapige/%s", info[client]); а так ты пробывал SetOverlay(client, "mapige/%s", info);
|
|
| |
Sunday
|
Дата: Вторник, 29.01.2013, 22:32:05 | Сообщение # 3 |
|
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
Цитата (Scarface_slv) ЦитатаSunday писал(а): А так, нет: SetOverlay(client, "mapige/%s", info[client]);
а так ты пробывал SetOverlay(client, "mapige/%s", info);
да! и выводит вот эту ошибку: mapige_menu_0.9.sp(55) : error 092: number of arguments does not match definition Количество параметров (аргументов) не совпадает с объявленными в функции
Сообщение отредактировал Sunday - Вторник, 29.01.2013, 22:32:48 |
|
| |
Scarface_slv
|
Дата: Вторник, 29.01.2013, 22:34:24 | Сообщение # 4 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
Через format попробуй decl String:format[70]; Format(format, sizeof(format), "mapige/%s", info); SetOverlay(client, format);
|
|
| |
Sunday
|
Дата: Вторник, 29.01.2013, 22:39:51 | Сообщение # 5 |
|
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
сейчас Цитата (Scarface_slv) Через format попробуй decl String:format[70]; Format(format, sizeof(format), "mapige/%s", info); SetOverlay(client, format);
Спасибо Scarface_slv, сейчас попробую!
Добавлено (29.01.2013, 22:39:51) --------------------------------------------- Scarface_slv Получилось, что бы я без Вас делал!!! Осталось только передать название карты в ServerCommand("changelevel %s", info); после нажатия кнопки "Продолжить". Как можно это осуществить?
Сообщение отредактировал Sunday - Вторник, 29.01.2013, 22:43:05 |
|
| |
Scarface_slv
|
Дата: Вторник, 29.01.2013, 22:42:56 | Сообщение # 6 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
Так же попробуй через format
|
|
| |
Meow_1337
|
Дата: Вторник, 29.01.2013, 22:43:11 | Сообщение # 7 |
|
Сообщений: 207
Репутация: 11 [ +/- ]
|
|
Sunday, поделись таким замечательным плагином :3
|
|
| |
Scarface_slv
|
Дата: Вторник, 29.01.2013, 22:50:46 | Сообщение # 8 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
Он же кинул код в первом посте
|
|
| |
Sunday
|
Дата: Вторник, 29.01.2013, 22:57:20 | Сообщение # 9 |
|
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
Цитата (Meow_1337) Sunday, поделись таким замечательным плагином :3
Парни, разумеется я им поделюсь со всеми Вами и плагин будет под логотипом http://world-source.ru, тем более форум для меня стал уже вторым домом. Надо только закончить начатое и довести до ума и он сразу отправиться в раздел "Плагины от пользователей" и будет только у нас на форуме :)
Добавлено (29.01.2013, 22:52:33) --------------------------------------------- Цитата (Scarface_slv) Он же кинул код в первом посте
в первом посте один из трех кодов. это код меню.
Добавлено (29.01.2013, 22:57:20) --------------------------------------------- Код public MenuHandler2(Handle:menu, MenuAction:action, client, param2) { if (action == MenuAction_Select) { new String:info[64]; // new bool:found = GetMenuItem(menu, param2, info, sizeof(info)); decl String:format[70]; Format(format, sizeof(format), "%s", info); ServerCommand("changelevel %s", format); } }
Выводит в консоль: changelevel <lvelname> : continue game on a new level.
и дальше тишина, Парни в чем может быть проблема? приложил скрипт.
Гости не могут скачивать файлы
|
Сообщение отредактировал Sunday - Вторник, 29.01.2013, 23:00:16 |
|
| |
Scarface_slv
|
Дата: Вторник, 29.01.2013, 23:11:10 | Сообщение # 10 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
decl String:format[70]; Format(format, sizeof(format), "changelevel %s", info); ServerCommand(format);
|
|
| |
Sunday
|
Дата: Вторник, 29.01.2013, 23:15:32 | Сообщение # 11 |
|
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
Цитата (Scarface_slv) decl String:format[70]; Format(format, sizeof(format), "changelevel %s", info); ServerCommand(format);
Спасибо Scarface_slv, непонятно из за чего но все равно выводит в консоль: changelevel <lvelname> : continue game on a new level.
может что то не правильно в AddMenuItem(imagemenu, "changemap", "Продолжить"); ?
Код public MenuHandler1(Handle:menu, MenuAction:action, client, param2) { if (action == MenuAction_Select) { new String:info[64]; GetMenuItem(menu, param2, info, sizeof(info));
if(strcmp(info, "%s") == client) { new Handle:imagemenu = CreateMenu(MenuHandler2); SetMenuTitle(imagemenu, "Продолжить?");
decl String:format[70]; Format(format, sizeof(format), "mapige/%s", info); SetOverlay(client, format);
AddMenuItem(imagemenu, "changemap", "Продолжить");
SetMenuExitBackButton(imagemenu, true); DisplayMenu(imagemenu, client, 0); } } }
public MenuHandler2(Handle:menu, MenuAction:action, client, param2) { if (action == MenuAction_Select) { new String:info[64]; decl String:format[70]; Format(format, sizeof(format), "changelevel %s", info); ServerCommand(format); } }
Сообщение отредактировал Sunday - Вторник, 29.01.2013, 23:16:02 |
|
| |
Scarface_slv
|
Дата: Вторник, 29.01.2013, 23:26:21 | Сообщение # 12 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
Код public MenuHandler1(Handle:menu, MenuAction:action, client, param2) { if (action == MenuAction_Select) { new String:info[64]; GetMenuItem(menu, param2, info, sizeof(info)); new Handle:imagemenu = CreateMenu(MenuHandler2); SetMenuTitle(imagemenu, "Продолжить?"); decl String:format[70]; Format(format, sizeof(format), "mapige/%s", info); SetOverlay(client, format); AddMenuItem(imagemenu, info, "Продолжить"); SetMenuExitBackButton(imagemenu, true); DisplayMenu(imagemenu, client, 0); } }
public MenuHandler2(Handle:menu, MenuAction:action, client, param2) { if (action == MenuAction_Select) { decl String:info[64]; GetMenuItem(menu, param2, info, sizeof(info)); decl String:format[70]; Format(format, sizeof(format), "changelevel %s", info); ServerCommand(format); } } забыл про формат
Сообщение отредактировал Scarface_slv - Вторник, 29.01.2013, 23:32:53 |
|
| |
Sunday
|
Дата: Вторник, 29.01.2013, 23:45:29 | Сообщение # 13 |
|
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
Цитата (Scarface_slv) public MenuHandler1(Handle:menu, MenuAction:action, client, param2) { if (action == MenuAction_Select) { new String:info[64]; GetMenuItem(menu, param2, info, sizeof(info)); new Handle:imagemenu = CreateMenu(MenuHandler2); SetMenuTitle(imagemenu, "Продолжить?"); decl String:format[70]; Format(format, sizeof(format), "mapige/%s", info); SetOverlay(client, format); AddMenuItem(imagemenu, info, "Продолжить"); SetMenuExitBackButton(imagemenu, true); DisplayMenu(imagemenu, client, 0); } }
public MenuHandler2(Handle:menu, MenuAction:action, client, param2) { if (action == MenuAction_Select) { decl String:info[64]; GetMenuItem(menu, param2, info, sizeof(info)); decl String:format[70]; Format(format, sizeof(format), "%s", info); ServerCommand("changelevel %s", format); } }
Scarface_slv Работает, что бы я без Вас делал, вы меня уже в который раз выручает, в авторах плагина Ваше имя будет сиять ярким пламенем ! Осталось только сделать когда жмешь "Назад" то возвращалось в список раздела выбора карт на котором остановился, и выболняется вот этот скрипт который уже есть в коде, он убивает изображение:
Код public Action:ResetOverlay(Handle:timer, any:client) { if(Client_IsIngame(client) && Client_IsValid(client)) { Client_SetScreenOverlay(client, ""); } } если Вас не затруднит с этим помочь? Остальным, проверками на Валидность файлов и прочих вещей я сейчас буду заниматься! У меня просто жуткая проблема, я еще плохо изучил литературу по меню, боюсь что я опять попаду в ступор с этим.
Сообщение отредактировал Sunday - Вторник, 29.01.2013, 23:50:26 |
|
| |
Scarface_slv
|
Дата: Вторник, 29.01.2013, 23:51:03 | Сообщение # 14 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
добавь в начало блока public MenuHandler1 это Код if (action == MenuAction_Cancel) { if (option == MenuCancel_ExitBack) { CreateTimer(0.1, ResetOverlay, client); ConsoleCmd(client, 0); } } думаю так уберет оверлей если нажать назад
Сообщение отредактировал Scarface_slv - Вторник, 29.01.2013, 23:54:48 |
|
| |
Sunday
|
Дата: Среда, 30.01.2013, 00:01:13 | Сообщение # 15 |
|
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
Цитата (Scarface_slv) добавь в начало блока public MenuHandler1 это if (action == MenuAction_Cancel) { if (option == MenuCancel_ExitBack) ConsoleCmd(client, 0); }
Код public MenuHandler1(Handle:menu, MenuAction:action, client, param2) { if (action == MenuAction_Cancel) { if (option == MenuCancel_ExitBack) ConsoleCmd(client, 0); }
if (action == MenuAction_Select) { new String:info[64]; GetMenuItem(menu, param2, info, sizeof(info)); new Handle:imagemenu = CreateMenu(MenuHandler2); SetMenuTitle(imagemenu, "Продолжить?"); decl String:format[70]; Format(format, sizeof(format), "mapige/%s", info); SetOverlay(client, format); AddMenuItem(imagemenu, info, "Продолжить"); SetMenuExitBackButton(imagemenu, true); DisplayMenu(imagemenu, client, 0); } }
Спасибо Scarface_slv, Выводит: mapige_menu_1.0.sp(48) : error 017: undefined symbol "option". Я так понимаю , его нужно добавить в обработчик как Handle:option?
Сообщение отредактировал Sunday - Среда, 30.01.2013, 00:02:26 |
|
| |
|