Проблема с меню.
| |
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, "" );
}
}
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
Хочется сделать отличный плагин для Админов, что бы им не приходилось думать какую поставить карту если по названию она не знакома, я нахожу это очень удобным, когда в след названия выводиться изображение.
Сообщение отредактировал 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 ];
decl String :format[ 70 ];
Format(format, sizeof(format), "%s" , info);
ServerCommand( "changelevel %s" , format);
}
}
01 02 03 04 05 06 07 08 09 10 11
Выводит в консоль: 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);
}
}
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
Сообщение отредактировал 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);
}
}
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
забыл про формат
Сообщение отредактировал 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, "" );
}
}
1 2 3 4 5 6 7
если Вас не затруднит с этим помочь? Остальным, проверками на Валидность файлов и прочих вещей я сейчас буду заниматься! У меня просто жуткая проблема, я еще плохо изучил литературу по меню, боюсь что я опять попаду в ступор с этим.
Сообщение отредактировал 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 );
}
}
1 2 3 4 5 6 7 8
думаю так уберет оверлей если нажать назад
Сообщение отредактировал 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 );
}
}
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21
Спасибо Scarface_slv, Выводит: mapige_menu_1.0.sp(48) : error 017: undefined symbol "option". Я так понимаю , его нужно добавить в обработчик как Handle:option?
Сообщение отредактировал Sunday - Среда, 30.01.2013, 00:02:26 |
|
| |
|