Меню выбора игроков
| |
Scarface_slv
|
Дата: Четверг, 19.04.2012, 12:00:15 | Сообщение # 46 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
как то странно среди игроков, кнопка 2 назад, ты так хочешь сделать?) так что ли попробуй: Code else if (action == MenuAction_Cancel) { AdminMenu(admin); }
|
|
| |
Naykon
|
Дата: Воскресенье, 22.04.2012, 09:02:28 | Сообщение # 47 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Code stock ShowMOTDPanel(client, const String:title[], const String:msg[], type=MOTDPANEL_TYPE_INDEX)
Как я понимаю так открывается !motd ... не пойму нафиг нужно это: Code const String:title[], const String:msg[], type=MOTDPANEL_TYPE_INDEX
|
|
| |
nynCuKaH
|
Дата: Воскресенье, 22.04.2012, 13:45:58 | Сообщение # 48 |
|
Сообщений: 110
Репутация: 0 [ +/- ]
|
|
а мне не помогаешь :(
|
|
| |
Naykon
|
Дата: Среда, 25.04.2012, 12:43:01 | Сообщение # 49 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
сорр я просто не знаю такой функции которая ловит действия на карте... тебе нужно просто найти эту функцию http://docs.sourcemod.net/api/ и поставить условие.... Я не настолько опытный скриптер (((Добавлено (25.04.2012, 12:41:26) ---------------------------------------------
Code FREEClient(client) { Menu = CreateMenu(FREEClientSelect); SetMenuTitle(Menu, "Кому?\n \n"); decl String:SteamID[15]; decl String:UserName[MAX_NAME_LENGTH]; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 2) { IntToString(GetClientUserId(i), SteamID, sizeof(SteamID)); GetClientName(i, UserName, sizeof(UserName)); AddMenuItem(Menu, SteamID, UserName); } } SetMenuExitButton(Menu, true); DisplayMenu(Menu, ct_client, 0); }
public FREEClientSelect(Handle:menu, MenuAction:action, client, option) { if (action == MenuAction_Select) { GetMenuItem(menu, option, FreeID, sizeof(FreeID), _, FreeName, sizeof(FreeName)); UserFree = GetClientOfUserId(StringToInt(FreeID)); if (UserFree > 0) { PrintToChatAll("UserFree = %N", UserFree) FREEplayer(UserFree); } else PrintToChatAll("UserFree < 0 - %N", UserFree); } }
FREEplayer(client) { fMenu = CreateMenu(FREEplayerSelect); SetMenuTitle(fMenu, "олололл?\n \n"); AddMenuItem(fMenu, "1", "1!"); AddMenuItem(fMenu, "2", "2!"); SetMenuExitButton(pMenu, false); DisplayMenu(fMenu, client, 0); }
public FREEplayerSelect(Handle:menu, MenuAction:action, client, option) { if (action == MenuAction_Select) { decl String:Info[25]; GetMenuItem(menu, option, Info, sizeof(Info)); if (StrEqual(Info, "1")) { PrintToChatAll("\x04Игрок %s ;)", client); SetEntityRenderColor(client, 100, 50, 50, 50); } if (StrEqual(Info, "2")) { PrintToChatAll("Игрок %s отказалася", client); } } else if (action == MenuAction_End) CloseHandle(menu); }
Не доганяю че не работает гляньте((Добавлено (25.04.2012, 12:43:01) --------------------------------------------- Т.е не показывает меню FREEplayer(UserFree);
|
|
| |
_wS_
|
Дата: Среда, 25.04.2012, 14:22:44 | Сообщение # 50 |
|
Тебе же говорили сколько раз уже, что не x = CreateMenu(), а new Handle:x = CreateMenu(). И ты создал fMenu, а делаешь SetMenuExitButton(pMenu, false); - детские ошибки. И в циклах лучше не делать sizeof(), если знаешь размер массива, то лучше сразу укажи число, или сохрани значение sizeof() в другой переменной и ее вставляй. И ты сделал decl String:SteamID[15] - разве 15 символов достаточно для стима? Там 20 может быть и больше, я 25 ставлю часто. И у тебя функция такая FREEClient(client), а ты делаешь DisplayMenu(Menu, ct_client, 0);
И если меню сохранено в глобальной переменной, то не надо делать if (action == MenuAction_End) CloseHandle(menu); (делать CloseHandle нужно в другой момент), потому что если ты троим отправил меню и кто-то первый что-то в нем сделал и оно закрылось, сработает MenuAction_End и другие два игрока уже ничего не смогут сделать. И ты делаешь PrintToChatAll("Игрок %s отказалася", client); - на те же грабли наступаешь, не надоело?
И еще ты делаешь if (UserFree < 1) PrintToChatAll("UserFree < 0 - %N", UserFree); - это значит что игрок не найден, но ты почему то хочешь как-то его имя получить.. %N
Code if (UserFree > 0) { // ... } else { // Ты тут пишешь, что UserFree < 0.. Но UserFree <= 0 или UserFree < 1 // Так что моё мнение о том, что у тебя чувства логики нет, еще крепче стало. }
Кода мало, а ошибок миллион.. Может я и резко разговариваю, зато правду говорю.
|
|
| |
Naykon
|
Дата: Воскресенье, 29.04.2012, 00:13:05 | Сообщение # 51 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
это все потому что я копирую некоторые части когда чтоб не перепечатывать, на счет глобальной переменное - хорошая инфа =) спсДобавлено (29.04.2012, 00:13:05) --------------------------------------------- Цель: Когда за Т никого нет пишет сообщение "Нет игроков за Т", когда есть высвечивает меню выбора игрока! Проблема: Независимо от того если ли игрок за Т или нету при нажатие меню "Действие" пишет в чат "Нет игроков за Т" PS. специально написал отдельный плагин!
Code new String:FreeID[25]; new String:FreeName[65]; new UserFree; new Handle:Menu; new Handle:cMenu;
public OnPluginStart() { HookEvent("player_say", Say); }
public Say(Handle:event, const String:name[], bool:dontBroadcast) { new i = GetClientOfUserId(GetEventInt(event, "userid")); decl String:text[7]; GetEventString(event, "text", text, sizeof(text)); if (IsClientInGame(i) && IsPlayerAlive(i) && StrEqual(text, "!lol")) Menu1(i); }
Menu1(client) { cMenu = CreateMenu(Menu1Select); SetMenuTitle(cMenu, "Панель\n \n"); AddMenuItem(cMenu, "menu2", "Действие"); SetMenuExitButton(cMenu, true); DisplayMenu(cMenu, client, 0); }
public Menu1Select(Handle:menu, MenuAction:action, client, option) { if (action == MenuAction_Select) { decl String:Info[25]; GetMenuItem(menu, option, Info, sizeof(Info)); if (StrEqual(Info, "menu2")) { for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 2) { ClientMenu(client); } else PrintToChatAll("Нет игроков за Т"); } } } else if (action == MenuAction_End) CloseHandle(menu); }
ClientMenu(client) { Menu = CreateMenu(ClientMenuSelect); SetMenuTitle(Menu, "Кто?\n \n"); decl String:SteamID[150]; decl String:UserName[MAX_NAME_LENGTH]; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 2 && UserFree != i) { IntToString(GetClientUserId(i), SteamID, sizeof(SteamID)); GetClientName(i, UserName, sizeof(UserName)); AddMenuItem(Menu, SteamID, UserName); } } //AddMenuItem(Menu, "2", "Назад"); SetMenuExitButton(Menu, true); DisplayMenu(Menu, client, 0); }
public ClientMenuSelect(Handle:menu, MenuAction:action, client, option) { if (action == MenuAction_Select) { GetMenuItem(menu, option, FreeID, sizeof(FreeID), _, FreeName, sizeof(FreeName)); UserFree = GetClientOfUserId(StringToInt(FreeID)); if (UserFree > 0) { PrintToChatAll("Получилось"); } } }
Почему?????
|
|
| |
_wS_
|
Дата: Воскресенье, 29.04.2012, 00:55:39 | Сообщение # 52 |
|
Потому что у тебя чувства логики нет, я уже говорил, и видимо это не исправить =) Попробую объяснить:
Индекс игрока может быть от 1 до MaxClients. С помощью цикла for, мы от 1 до MaxClients проверяем каждый индекс, 1,2,3,4, 5 и тд, есть ли игрок в игре, жив, и террорист ли он. И как только индекс не проходит твою проверку, ты делаешь 'Нет игроков за Т'.. Так надо делать:
Code for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 2) { // Вот мы нашли живого террориста. Показываем меню и разрываем цикл. ClientMenu(client); return; } } // Если этот код продолжил выполняться, значит return; не сработало = нет живых террористов. PrintToChat(client, "Нет ЖИВЫХ игроков за Т");
И зачем запускать цикл, искать живых т и потом снова запускать этот цикл для создания меню? Сразу создай меню, если есть нужные игроки, добавь, нет, так и напиши в меню, что их нет. С помощью короткого дурацкого тест-скрипта, можно понять как работают циклы..
И зачем все эти глобальные переменные:
Quote new String:FreeID[25]; new String:FreeName[65]; new UserFree; new Handle:Menu; new Handle:cMenu;
В них просто нет никакой необходимости.. Если бы ты владел хоть одним языком нормально (ты хвастался), то на таких моментах не спотыкался бы, потому что оно очень просто. У меня нет терпения на такие глупости. Если бы ты усваивал, исправлял свои ошибки, ладно еще, но тебе по барабану, одни и те же ошибки.
|
|
| |
Naykon
|
Дата: Понедельник, 30.04.2012, 13:57:59 | Сообщение # 53 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
спс понял на счет цикла for.. На счет переменных они мне нужны в более крупном скрипте.. сюда я просто вырезал необходимое. Все приходит с опытом =)Добавлено (30.04.2012, 13:57:59) ---------------------------------------------
Code #include <sourcemod> #include <cstrike> #include <sdktools> #include <sdktools_entoutput> #include <sdktools_functions>
new String:FreeID[25]; new String:FreeName[65]; new UserFree = 0; new Fr; new String:UnFreeID[25] new String:UnFreeName[65]; new UnUserFree; new Handle:Menu; new Handle:UnMenu; new playersFreeDay = 0;
public OnPluginStart() { HookEvent("round_start", Round_Start, EventHookMode_PostNoCopy); HookEvent("player_say", Say); }
public Round_Start(Handle:event, const String:name[], bool:dontBroadcast) { UserFree = 0; playersFreeDay = 0; }
public Say(Handle:event, const String:name[], bool:dontBroadcast) { new i = GetClientOfUserId(GetEventInt(event, "userid")); decl String:text[7]; GetEventString(event, "text", text, sizeof(text)); if (StrEqual(text, "free")) FreePlayer(i); if (StrEqual(text, "unfree")) { UnFreePlayer(i); PrintToChatAll("usususu"); } }
UnFreePlayer(client) { UnMenu = CreateMenu(UnFreePlayerSelect); SetMenuTitle(UnMenu, "Снять свободу:\n \n"); decl String:SteamID[150]; decl String:UserName[MAX_NAME_LENGTH]; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 2 && (i == UserFree)) { IntToString(GetClientUserId(i), SteamID, sizeof(SteamID)); GetClientName(i, UserName, sizeof(UserName)); AddMenuItem(UnMenu, SteamID, UserName); } } //AddMenuItem(Menu, "2", "Назад"); SetMenuExitButton(UnMenu, true); DisplayMenu(UnMenu, client, 0); }
public UnFreePlayerSelect(Handle:menu, MenuAction:action, client, option) { if (action == MenuAction_Select) { GetMenuItem(menu, option, FreeID, sizeof(FreeID), _, FreeName, sizeof(FreeName)); UnUserFree = GetClientOfUserId(StringToInt(FreeID)); if (UnUserFree > 0) { PrintToChatAll("%N свобода снята", UnUserFree); SetEntityRenderColor(UnUserFree, 255, 255, 255, 255); playersFreeDay -= 1; UnUserFree != UserFree; UserFree = 0; } else PrintToChatAll("UnUserFree < 0 - %s", UnUserFree); } }
FreePlayer(client) { Menu = CreateMenu(FreePlayerSelect); SetMenuTitle(Menu, "Дать свободу?\n \n"); decl String:SteamID[150]; decl String:UserName[MAX_NAME_LENGTH]; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 2 && (i != UserFree) && (playersFreeDay < 2)) { IntToString(GetClientUserId(i), SteamID, sizeof(SteamID)); GetClientName(i, UserName, sizeof(UserName)); AddMenuItem(Menu, SteamID, UserName); } } //AddMenuItem(Menu, "2", "Назад"); SetMenuExitButton(Menu, true); DisplayMenu(Menu, client, 0); }
public FreePlayerSelect(Handle:menu, MenuAction:action, client, option) { if (action == MenuAction_Select) { GetMenuItem(menu, option, FreeID, sizeof(FreeID), _, FreeName, sizeof(FreeName)); UserFree = GetClientOfUserId(StringToInt(FreeID)); if (UserFree > 0) { PrintToChatAll("%N свободен", UserFree); SetEntityRenderColor(UserFree, 204, 51, 204, 10); playersFreeDay += 1; } else PrintToChatAll("UserFree < 0 - %s", UserFree); } }
Почему когда выбрал 2 игрока free, в меню unfree остается только 1 ??? Как можно сиправить? ВИжу что UserFree - запомнило только 1 игрока.. так как запомнить в 1 перменной 2 игроков?? => они должны добавиться в unfree
|
|
| |
Scarface_slv
|
Дата: Понедельник, 30.04.2012, 23:58:35 | Сообщение # 54 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
Quote (Naykon) так как запомнить в 1 перменной 2 игроков?? а такое возможно? xd
|
|
| |
Naykon
|
Дата: Понедельник, 30.04.2012, 23:59:39 | Сообщение # 55 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Подскажите решение этой проблемы я лично раньше с этим не сталкивался((Добавлено (30.04.2012, 23:59:39) --------------------------------------------- ну я образно выразился на счет 1 переменная = 2 игрока... просто не пойму как решит... вижу ты тоже(((
|
|
| |
Scarface_slv
|
Дата: Вторник, 01.05.2012, 09:53:10 | Сообщение # 56 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
эээ незнаю как с переменными,но можно через базу данных или через keyvalues. При выборе игрока из меню этот игрок сохраняется в базе его стим ид и ник а потом можно просмотреть удалить и т.д. через любую другую менюшку игроков из базы...
|
|
| |
Naykon
|
Дата: Вторник, 01.05.2012, 15:08:55 | Сообщение # 57 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Блин в гору лесть а обойти можно?? keyvalues - записывает в txt данные .. преодположим я запишу туда 1 выбранного UserFree а потом сразу же 2 выбранного UserFree .. после добавлю их в меню UnFreePlayer: 2 вопроса: 1) Как записать UserFree в keyvalues??? в уроке написано как можно написать скрипт чтоб по нему создался txt но как засунуть UserFree в KvSetString чтоб потом его использовать + какое далжно быть KvJumpToKey ?
|
|
| |
Scarface_slv
|
Дата: Вторник, 01.05.2012, 18:10:26 | Сообщение # 58 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
http://world-source.ru/forum/102-2379-1 Вот тут обсуждалось про меню и keyvalues
|
|
| |
Scarface_slv
|
Дата: Вторник, 01.05.2012, 20:23:15 | Сообщение # 59 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
вот пример просмотра стим ида и ника должен быть файл cstrike/banlist.cfg и в banlist.cfg это: Code "banlist" { "STEAM_0:0:516847243" { "name" "Царь Вахтан" "reason" "Аимбот" "time" "0" "admin" "Scarface" } } не проверял на работоспособность
Гости не могут скачивать файлы
|
|
|
| |
Naykon
|
Дата: Четверг, 03.05.2012, 11:40:04 | Сообщение # 60 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
та мне нужно как омнить id игрока в keyvalve вот код: Code #include <sourcemod> #include <cstrike> #include <sdktools> #include <sdktools_entoutput> #include <sdktools_functions>
new String:FreeID[25]; new String:FreeName[65]; new UserFree = 0; new Fr; new String:UnFreeID[25] new String:UnFreeName[65]; new UnUserFree; new Handle:Menu; new Handle:UnMenu; new playersFreeDay = 0;
public OnPluginStart() { HookEvent("round_start", Round_Start, EventHookMode_PostNoCopy); HookEvent("player_say", Say); }
public Round_Start(Handle:event, const String:name[], bool:dontBroadcast) { UserFree = 0; playersFreeDay = 0; }
public Say(Handle:event, const String:name[], bool:dontBroadcast) { new i = GetClientOfUserId(GetEventInt(event, "userid")); decl String:text[7]; GetEventString(event, "text", text, sizeof(text)); if (StrEqual(text, "free")) FreePlayer(i); if (StrEqual(text, "unfree")) { UnFreePlayer(i); PrintToChatAll("usususu"); } }
UnFreePlayer(client) { UnMenu = CreateMenu(UnFreePlayerSelect); SetMenuTitle(UnMenu, "Снять свободу:\n \n"); decl String:SteamID[150]; decl String:UserName[MAX_NAME_LENGTH]; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 2 && (i == UserFree)) { IntToString(GetClientUserId(i), SteamID, sizeof(SteamID)); GetClientName(i, UserName, sizeof(UserName)); AddMenuItem(UnMenu, SteamID, UserName); } } //AddMenuItem(Menu, "2", "Назад"); SetMenuExitButton(UnMenu, true); DisplayMenu(UnMenu, client, 0); }
public UnFreePlayerSelect(Handle:menu, MenuAction:action, client, option) { if (action == MenuAction_Select) { GetMenuItem(menu, option, FreeID, sizeof(FreeID), _, FreeName, sizeof(FreeName)); UnUserFree = GetClientOfUserId(StringToInt(FreeID)); if (UnUserFree > 0) { PrintToChatAll("%N свобода снята", UnUserFree); SetEntityRenderColor(UnUserFree, 255, 255, 255, 255); playersFreeDay -= 1; UnUserFree != UserFree; UserFree = 0; } else PrintToChatAll("UnUserFree < 0 - %s", UnUserFree); } }
FreePlayer(client) { Menu = CreateMenu(FreePlayerSelect); SetMenuTitle(Menu, "Дать свободу?\n \n"); decl String:SteamID[150]; decl String:UserName[MAX_NAME_LENGTH]; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 2 && (i != UserFree) && (playersFreeDay < 2)) { IntToString(GetClientUserId(i), SteamID, sizeof(SteamID)); GetClientName(i, UserName, sizeof(UserName)); AddMenuItem(Menu, SteamID, UserName); } } //AddMenuItem(Menu, "2", "Назад"); SetMenuExitButton(Menu, true); DisplayMenu(Menu, client, 0); }
public FreePlayerSelect(Handle:menu, MenuAction:action, client, option) { if (action == MenuAction_Select) { GetMenuItem(menu, option, FreeID, sizeof(FreeID), _, FreeName, sizeof(FreeName)); UserFree = GetClientOfUserId(StringToInt(FreeID)); if (UserFree > 0) { PrintToChatAll("%N свободен", UserFree); SetEntityRenderColor(UserFree, 204, 51, 204, 10); playersFreeDay += 1; } else PrintToChatAll("UserFree < 0 - %s", UserFree); } }
|
|
| |
|