Файл и меню
| |
Scarface_slv
|
Дата: Вторник, 13.03.2012, 08:35:50 | Сообщение # 1 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
Помоги сделать так чтобы banned_user.cfg отображался в меню получается тока в чате вывести а в меню нет Code DisplayBanMenu(client) { new Handle:menu = CreateMenu(MenuHandler_BanPlayerList); new Handle:F = OpenFile("cfg/banned_user.cfg","r"); decl String:Line[512]; decl String:Text[3][256]; while (ReadFileLine(F, Line, 512)) { Line[strlen(Line)-1] = 0; ExplodeString(Line," ",Text,3,256); PrintToServer("%s", Text[2]); AddTargetsToMenu2(menu, client, COMMAND_FILTER_CONNECTED); DisplayMenu(menu, client, MENU_TIME_FOREVER); } SetMenuExitBackButton(menu, true);
|
|
| |
_wS_
|
Дата: Вторник, 13.03.2012, 09:20:52 | Сообщение # 2 |
|
Code DisplayBanMenu(client) { new Handle:F = OpenFile("cfg/banned_user.cfg", "r"); if (F == INVALID_HANDLE) { PrintToChat(client, "Не удалось открыть cfg/banned_user.cfg"); return; } new Handle:M = CreateMenu(Select_BanMenu), nuM = 0; decl String:StR[85], String:Exp_StR[3][30]; while (ReadFileLine(F, StR, 85)) { if (ExplodeString(StR, " ", Exp_StR, 3, 30) > 2) { nuM++; TrimString(Exp_StR[2]); AddMenuItem(M, Exp_StR[2], Exp_StR[2]); } } CloseHandle(F); if (nuM > 0) { Format(StR, 85, "Забаненых стимов: %d\n \n", nuM); SetMenuTitle(M, StR); DisplayMenu(M, client, 0); } else { CloseHandle(M); PrintToChat(client, "banned_user.cfg пуст"); } }
public Select_BanMenu(Handle:menu, MenuAction:action, i, option) { if (action == MenuAction_End) { CloseHandle(menu); return; } if (action != MenuAction_Select) return; decl String:SteaM[22]; GetMenuItem(menu, option, SteaM, 22); PrintToChat(i, "Вы выбрали стим: %s", SteaM); }
Только я думаю, что лучше хранить такое меню в глобальной переменной, тем более если оно часто используется. Просто частое открытие файла наверно может вызывать лаги, хотя..
|
|
| |
Scarface_slv
|
Дата: Вторник, 13.03.2012, 18:18:21 | Сообщение # 3 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
Спасибо в жизни бы не додумался, а по поводу глобальной переменной я сделаю тока сначала до конца нужно доделать этот плагин, еще раз спасибо)Добавлено (13.03.2012, 18:18:21) --------------------------------------------- Еще вопрос возник, как удалить строку которую выбрал через меню, команду незнаю =( banned_user.cfg тут можно с sm_unban удалить а в других фалах которые сам создал предположим t.txt там как быть?
|
|
| |
_wS_
|
Дата: Вторник, 13.03.2012, 18:24:58 | Сообщение # 4 |
|
Quote (Scarface_slv) banned_user.cfg тут можно с sm_unban удалить а в других фалах которые сам создал предположим t.txt там как быть? Это не составит труда, если используешь Keyvalues. Записывай примерно в таком виде:
Code "bans" { "STEAM_x:x:xxxxxxxx" { "nick" "bad_boy" } "STEAM_x:x:xxxxxxxx" { "nick" "xz player" } }
Для удаления есть две команды:
KvDeleteKey(Handle:kv, const String:key[]); KvDeleteThis(Handle:kv);
|
|
| |
Scarface_slv
|
Дата: Среда, 14.03.2012, 12:22:02 | Сообщение # 5 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
а если я использовал это: Code new String:szFile[256]; BuildPath(Path_SM, szFile, sizeof(szFile), "configs/list.txt");
new Handle:hFile = OpenFile(szFile, "at");
WriteFileLine(hFile, "%s ", steamids); Добавлено (13.03.2012, 18:43:38) --------------------------------------------- или ты имеешь виду что можно использовать Keyvalues чтобы удалить тока строку? Добавлено (13.03.2012, 18:45:28) --------------------------------------------- а нет так не получиться Добавлено (14.03.2012, 12:22:02) --------------------------------------------- и у меня еще вопрос в текстовом файле есть ники которые отображаются в менюшки, вместо стим ида описанной выше, у меня проблема в том что в меню не отображается ник дальше пробела, типо "Explay Scarface" а в менюшки отображается тока "Explay " можно как то это исправить в 34 версии сервака? где то читал просто то что 34 версия не подерживает пробелы.
|
|
| |
_wS_
|
Дата: Среда, 14.03.2012, 12:31:43 | Сообщение # 6 |
|
Я не могу ничего сказать, пока не увижу этот текстовый файл и скрипт (код), который его обрабатывает.
|
|
| |
Scarface_slv
|
Дата: Среда, 14.03.2012, 14:31:51 | Сообщение # 7 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
Вот что файле banlist.ini Code STEAM_0:0:953230310 5 "цуывфы фвф фывф ф" "Scarface" "Аимбот" STEAM_0:0:953230310 10 "Noobik" "Scarface" "Валхак"
вот меню которую ты помог сделать тока переделанный немного Code DisplayBanMenu(client) { new Handle:F = OpenFile("addons/sourcemod/configs/banlist.ini", "r"); if (F == INVALID_HANDLE) { PrintToChat(client, "Не удалось открыть разбан игроков"); return; } new Handle:M = CreateMenu(Select_BanMenu), nuM = 0; decl String:StR[85], String:Exp_StR[4][64]; while (ReadFileLine(F, StR, 85)) { if (ExplodeString(StR, " ", Exp_StR, 3, 64) > 2) { nuM++; TrimString(Exp_StR[2]); AddMenuItem(M, Exp_StR[0], Exp_StR[2]); } } CloseHandle(F); if (nuM > 0) { Format(StR, 85, "Забаненых стимов: %d\n \n", nuM); SetMenuTitle(M, StR); DisplayMenu(M, client, 0); } else { CloseHandle(M); PrintToChat(client, "Забаненых в sourcemod нет"); } }
public Select_BanMenu(Handle:menu, MenuAction:action, i, option) { if (action == MenuAction_End) { CloseHandle(menu); return; } if (action != MenuAction_Select) return; decl String:SteaM[65]; GetMenuItem(menu, option, SteaM, 65); PrintToChat(i, "Вы разбанили: %s", SteaM); ServerCommand("sm_unban %s", SteaM); }
вообщем я когда баню кого нить баны заносятся banlist.ini, а после с помошью меню разбана я могу просмотривать забаненных и разбанивать мне осталось две проблемы решить пробелы ников в меню дальше пробела ники не отображаються, и удаленние строки в banlist.ini
|
|
| |
_wS_
|
Дата: Среда, 14.03.2012, 14:57:30 | Сообщение # 8 |
|
Quote (Scarface_slv) дальше пробела ники не отображаються Конечно, ты же разбиваешь строку и используешь в качестве разделителя пробел. Я говорю, используй лучше keyvalues и не будет таких проблем. Создаешь, например, в папке cfg/, banlist.txt с таким содержимым:
Потом в твоем скрипте делаешь так:
Code new Handle:kv;
public OnPluginStart() { kv = CreateKeyValues("banlist"); if (!FileToKeyValues(kv, "cfg/banlist.txt")) { SetFailState("Ошибка в cfg/banlist.txt"); } }
Когда банишь кого-то, добавляешь его в базу:
Code KvJumpToKey(kv, "STEAM_....", true); KvSetString(kv, "name", "4iter"); KvSetString(kv, "reason", "4it"); KvSetNum(kv, "time", 0); KvRewind(kv);
И тд (есть урок). Только лучше добавлять в подобные файлы только забаненых навсегда. Так как игрок может уже быть разбанен, но он продолжает быть в твоем файле.
|
|
| |
Scarface_slv
|
Дата: Среда, 14.03.2012, 19:37:44 | Сообщение # 9 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
переделывать эх буду снова думать как отобразить ее в менюшке я пошел мучатся)Добавлено (14.03.2012, 19:35:53) --------------------------------------------- помоги два часа тупил так и не понял Code new Handle:h = CreateKeyValues("Banlist"); KvJumpToKey(h, f, true); KvSetString(h, "Name", d); KvSetString(h, "Reason", e); KvRewind(h); KeyValuesToFile(h, "banlist.txt"); CloseHandle(h); единственный код в котором у меня получилось хоть что то добавить про бывал по разному но у всяких разные проблемы, так вот он добавляется вот так: Code "Banlist" { "STEAM_0:0:953230310" { "Name" "Scarface" "Reason" "Аимбот" } } но когда я добавляю нового игрока в бан, то то что записано удаляется и добавляется заново уже другой игрок.Добавлено (14.03.2012, 19:37:44) --------------------------------------------- вообщем как сделать чтобы было так: Code "Banlist" { "STEAM_0:0:953230310" { "Name" "Scarface" "Reason" "Аимбот" } "STEAM_0:0:813418813" { "Name" "Noobik" "Reason" "Валхак" } }
|
|
| |
_wS_
|
Дата: Четверг, 15.03.2012, 05:40:41 | Сообщение # 10 |
|
Я показал тебе пример. Надо 1 раз загрузить группу keyvalues и сохранить ее в глобальной переменной, а ты каждый раз ее создаешь и вписываешь 1 стим, и файл просто перезаписывается.
|
|
| |
Scarface_slv
|
Дата: Четверг, 15.03.2012, 14:12:10 | Сообщение # 11 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
сделал как ты писал создал cfg/banlist.txt с текстом написал скрипт быстренька Code #pragma semicolon 1 #include <sourcemod>
new Handle:kv;
public OnPluginStart() { kv = CreateKeyValues("banlist"); if (!FileToKeyValues(kv, "cfg/banlist.txt")) { SetFailState("Ошибка в cfg/banlist.txt"); } RegConsoleCmd("sm_banlist", Command_Admin, "AlliedModders LLC"); }
public Action:Command_Admin(i, args) { decl String:player_name[68]; decl String:steam_id[32]; decl String:d[68]; decl String:f[32]; GetClientAuthString(i, steam_id, 32); GetClientName(i, player_name, 65); Format(f, sizeof(f), "%s", steam_id); Format(d, sizeof(d), "%s", player_name); KvJumpToKey(kv, f, true); KvSetString(kv, d, "4iter"); KvRewind(kv); return Plugin_Handled; } прописываю команду но ничего не добвляеться в banlist.txt что не так? =(
|
|
| |
_wS_
|
Дата: Четверг, 15.03.2012, 14:55:16 | Сообщение # 12 |
|
Хм, данные то заносятся в базу, но нужно сделать KeyValuesToFile(kv, "cfg/banlist.txt"); чтобы все записалось и сохранилось в файле. И ты делаешь KvSetString(kv, d, "4iter");, где d это имя игрока - это неправильно. Вместо 'd' должно быть имя параметра, важно лишь его значение, т.е.
Code "banlist" { "steam.." { "name" "4iter nick" } }
И получить ник '4iter nick' можно только с помощью параметра "name":
Code if (KvJumpToKey(kv, "steam..")) { decl String:n[32]; KvGetString(kv, "name", n, 32); KvRewind(kv); PrintToServer("nick = %s", n); }
Ещё ты делаешь
Code decl String:steam_id[32]; decl String:f[32]; GetClientAuthString(i, steam_id, 32); Format(f, sizeof(f), "%s", steam_id);
В этом нет необходимости, стим ты получил и сохранил в переменной steam_id, зачем еще одна f?
|
|
| |
Scarface_slv
|
Дата: Четверг, 15.03.2012, 16:31:57 | Сообщение # 13 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
Спасибо получилось все вопрос чтобы в меню это все отображалась нужно меню написать в этом же плагине?
|
|
| |
_wS_
|
Дата: Четверг, 15.03.2012, 16:33:48 | Сообщение # 14 |
|
Хм, это можно сделать и в любом другом, но в этом же думаю удобнее.
|
|
| |
Scarface_slv
|
Дата: Пятница, 16.03.2012, 22:00:06 | Сообщение # 15 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
опять проблемы Code "banlist" { "STEAM_0:0:953230310" { "name" "Noobik" } } не могу сделать вот что Code создал я глобалные переменные стим ида и ник нейма new String:SteaM[MAXPLAYERS+1][30]; new String:NamE[MAXPLAYERS+1][256]; ну и вот Code GetClientAuthString(client, SteaM[client], 20); GetClientName(client, NamE[client], 256); вот при нажатие меню разбана начинаеться блок DisplayBanMenu(client) помоги пожалуйста сделать в этом блоке (если я правильно делаю) чтоб инфа из banlist.txt высвечивался в чате steam_id и name Code DisplayBanMenu(client) { PrintToChat(client, "%s and %s" SteaM[client], NamE[client]); }
ну и keyvalus Code KvJumpToKey(kv, SteaM[client], true); KvSetString(kv, "name", NamE[client]); KvRewind(kv); KeyValuesToFile(kv, "cfg/banlist.txt"); а то у меня при нажатие разбан почему то индекс ника и стим ида выходят а я пошел пока сам подумаю, надеюсь достоточно инфы чтоб понять скриптДобавлено (15.03.2012, 18:42:17) --------------------------------------------- =D я тупанул сорри) %s вместо этого написал %d это и поэтому вмсето стим ида и ника вылазили цифры все понял сорри) Добавлено (15.03.2012, 21:13:17) --------------------------------------------- я написал бред, отображает того кто нажал разбанить, а не с banlist.txt пойду дальше пытаться Добавлено (16.03.2012, 20:58:49) --------------------------------------------- плиз помоги Code if (KvJumpToKey(h, "STEAM_953230310")) { KvGetString(h, "name", f, sizeof(f)); PrintToChatAll("НИК: %s", f); }
Code "banlist" { "STEAM_0:0:953230310" { "name" "Noobik" } "STEAM_0:0:752213211" { "name" "Scarface" } } подскажи как мне объяснить коду чтоб он проверял все стим иды а не только STEAM_953230310, я незнаю что сделать и что вписать вместо (KvJumpToKey(h, "STEAM_953230310")) или вместо STEAM_953230310Добавлено (16.03.2012, 21:30:42) --------------------------------------------- это можно сделать с помощью цикла? Добавлено (16.03.2012, 21:33:17) --------------------------------------------- все понял) Добавлено (16.03.2012, 22:00:06) --------------------------------------------- все отлично!! ура доделал) спасибо большое сайту и _wS_
|
|
| |
|