Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 2
  • 1
  • 2
  • »
Форум » SourceMod >> CS:Source >> CSGO » Обсуждение » Файл и меню (я нуб=))
Файл и меню
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
Thanks
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
Thanks
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
Thanks
Я не могу ничего сказать, пока не увижу этот текстовый файл и скрипт (код), который его обрабатывает.
 
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
Thanks
Quote (Scarface_slv)
дальше пробела ники не отображаються

Конечно, ты же разбиваешь строку и используешь в качестве разделителя пробел. Я говорю, используй лучше keyvalues и не будет таких проблем. Создаешь, например, в папке cfg/, banlist.txt с таким содержимым:

Code
"banlist"
{
}


Потом в твоем скрипте делаешь так:

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
Thanks
Я показал тебе пример. Надо 1 раз загрузить группу keyvalues и сохранить ее в глобальной переменной, а ты каждый раз ее создаешь и вписываешь 1 стим, и файл просто перезаписывается.
 
Scarface_slv Дата: Четверг, 15.03.2012, 14:12:10 | Сообщение # 11
Сообщений: 737
Репутация: 61 [ +/- ]
сделал как ты писал создал cfg/banlist.txt с текстом
Code

"banlist"
{
}

написал скрипт быстренька
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
Thanks
Хм, данные то заносятся в базу, но нужно сделать 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
Thanks
Хм, это можно сделать и в любом другом, но в этом же думаю удобнее.
 
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_

 
Форум » SourceMod >> CS:Source >> CSGO » Обсуждение » Файл и меню (я нуб=))
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: