Контакты Поиск

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

  • Страница 1 из 1
  • 1
Форум » SourceMod >> CS:Source >> CSGO » Уроки SourceMod (SourcePawn) Скриптинга » Пример статистики игроков (с сохранением) (Убийства/смерти)
Пример статистики игроков (с сохранением)
_wS_ Дата: Среда, 07.03.2012, 05:14:39 | Сообщение # 1
Пример Keyvalues статистики игроков (кол-во убийств/смертей).

Код
// Глобальная переменная для хранения Handle группы
new Handle:g_Kv;

// k - убийства, d - смерти
new k[MAXPLAYERS+1], d[MAXPLAYERS + 1];

// стимы игроков
new String:g_SteamID[MAXPLAYERS + 1][30];

// true = игрок загружен, есть в базе, авторизован
new bool:g_iReady[MAXPLAYERS + 1];

///////

public OnPluginStart()
{
     // Создаем новую пустую структуру группы
     g_Kv = CreateKeyValues("stats");

     // Если мы уже сохраняли статистику и у нас есть cfg/stats.txt, то загружаем ее
     FileToKeyValues(g_Kv,  "cfg/stats.txt");

     // Ловим событие смерти игрока
     HookEvent("player_death",    player_death);

     // Регистрируем команду для просмотра личной статистики
     RegConsoleCmd("mystats",    mystats_cmd);
}

public OnClientPutInServer(client)
{
     g_iReady[client] = false;

     k[client] = 0;
     d[client] = 0;

     // Если это бот или не удалось получить стим игрока, ничего не делаем
     if (IsFakeClient(client) || !GetClientAuthString(client, g_SteamID[client], 30))
         return;

     // Устанавливаем позицию обратно в верхний узел
     KvRewind(g_Kv);

     // Если игрок есть в базе, получаем его статистику
     if (KvJumpToKey(g_Kv, g_SteamID[client], false))
     {
         k[client] = KvGetNum(g_Kv, "k");
         d[client] = KvGetNum(g_Kv, "d");

         // Отмечаем что игрок авторизован
         g_iReady[client] = true;
     }

     // Добавляем стим в базу
     else if (KvJumpToKey(g_Kv, g_SteamID[client], true))
     {
         KvSetNum(g_Kv, "k", 0);
         KvSetNum(g_Kv, "d", 0);

         // Отмечаем что игрок авторизован
         g_iReady[client] = true;
     }
}

public OnClientDisconnect(client)
{
     // Обновляем статистику игрока в нашей базе, когда он выходит с сервера
     if (g_iReady[client])
     {
         g_iReady[client] = false;
         KvRewind(g_Kv);
         if (KvJumpToKey(g_Kv, g_SteamID[client], false))
         {
             KvSetNum(g_Kv, "k", k[client]);
             KvSetNum(g_Kv, "d", d[client]);
         }
     }
}

public player_death(Handle:event, const String:name[], bool:dontBroadcast)
{
     // Если убийца успел выйти с сервера или это бот, стоп
     new killer = GetClientOfUserId(GetEventInt(event, "attacker"));
     if (killer < 1 || IsFakeClient(killer))
         return;

     // Если убийца и жертва в одной команде, стоп
     new victim = GetClientOfUserId(GetEventInt(event, "userid"));
     if (GetClientTeam(killer) == GetClientTeam(victim))
         return;

     // Добавляем убийце +1 к его статистике убийств
     k[killer]++;

     // Добавляем жертве +1 к его статистике смертей
     d[victim]++;
}

public Action:mystats_cmd(client, args)
{
     if (0 < client <= MaxClients)
     {
         if (g_iReady[client]) PrintToChat(client, "Убийств: %d. Смертей: %d", k[client], d[client]);
         else PrintToChat(client, "Вы не авторизованы");
     }
     return Plugin_Handled;
}

public OnMapEnd()
{
     MyFunc_SaveStats();
}

public OnPluginEnd()
{
     MyFunc_SaveStats();
}

MyFunc_SaveStats()
{
     // Сохраняем статистику в файл cfg/stats.txt на сервере
     KvRewind(g_Kv);
     KeyValuesToFile(g_Kv, "cfg/stats.txt");
}

k и d - глобальные массивы, в которых храним данные игроков, чтобы не обращаться к .txt снова и снова (лаги). Это просто пример работы KeyValues, хранить так много данных плохо, лучше использовать MYSQL/SQLite.

Прикрепления: tats.sp(3.6 Kb)
 
М9сНиК Дата: Воскресенье, 05.08.2012, 10:39:58 | Сообщение # 2
Сообщений: 61
Репутация: 0 [ +/- ]
А где пример с мускулом?
 
TEIN Дата: Пятница, 22.02.2013, 09:15:55 | Сообщение # 3
Сообщений: 568
Репутация: 78 [ +/- ]
Вообщем создается файлик xz.cfg
Код
"wS_Group"
{
}

1. Не добавляется имя и стим игрока в файл
2. Группа с именем, в этой группе должен быть стим, я могу получить имя группы, но как получить значение стима ?

Добавлено (22.02.2013, 09:15:55)
---------------------------------------------
Не тут... перенеси в http://world-source.ru/forum/100-2292-1


Прикрепления: key.sp(1.2 Kb)
 
Scarface_slv Дата: Пятница, 22.02.2013, 14:14:27 | Сообщение # 4
Сообщений: 738
Репутация: 61 [ +/- ]
decl String:steamid[35];
KvGetString(KeyValues, "SteamID", steamid, 35);
PrintToServer("========>%s", steamid);


Сообщение отредактировал Scarface_slv - Пятница, 22.02.2013, 14:15:25
 
TEIN Дата: Пятница, 22.02.2013, 14:58:12 | Сообщение # 5
Сообщений: 568
Репутация: 78 [ +/- ]
Это все конечно же круто, но если игроков 10, то какой стим мне выдаст?
 
Scarface_slv Дата: Пятница, 22.02.2013, 15:16:12 | Сообщение # 6
Сообщений: 738
Репутация: 61 [ +/- ]
если игроков 10, находишь имя которое тебе нужно с KvJumpToKey и внутри нее получаешь стим KvGetString


Сообщение отредактировал Scarface_slv - Пятница, 22.02.2013, 15:25:48
 
DantE6828 Дата: Понедельник, 20.01.2014, 12:22:28 | Сообщение # 7
Сообщений: 16
Репутация: 0 [ +/- ]
Вот у меня есть файл со стим-айдишниками. Как сделать так, чтобы плагин подсчитал сколько их и написал в чате: "В базе найдено 10 (например) игроков"??
 
BarD Дата: Четверг, 30.01.2014, 16:10:55 | Сообщение # 8
Сообщений: 942
Репутация: 132 [ +/- ]
В этом плагине ошибка! Вот содержание моего stats.txt (я ничего не менял):
Код
"stats"
{
  "k"  "18"
  "D"  "12"
}

Исправь ее, wS! Я так понял, что плагин не заносит Стимы в файл. И плагин считывает килы и смерти всего сервера. И еще, объясни, пожалуйста, в какой момент плагин пересохраняет статистику игроков.
 
_wS_ Дата: Четверг, 30.01.2014, 18:52:54 | Сообщение # 9
Подправил. Запись в файл после смены карты или если была команда sm plugins unload stats. Но это просто пример, сохранять статистику в keyvalues плохо, т.к. много ключей = лаги. В OnClientPutInServer KvJumpToKey можно использовать 1 раз, если думать об оптимизации.
 
BarD Дата: Пятница, 31.01.2014, 13:36:17 | Сообщение # 10
Сообщений: 942
Репутация: 132 [ +/- ]
Спасибо большое, wS! А чтобы он сохранял после каждого раунда или килла статистику, надо в блок HookEvent("round_start", round_start) (или player_death) добавить строчку MyFunc_SaveStats()? я ведь правильно понял?

Добавлено (31.01.2014, 13:36:17)
---------------------------------------------
У тебя снова ошибка:

Код
public OnClientPutInServer(client)  
{  
      g_iReady[client] = false;  

      k[client] = 0;  
      d[client] = 0;  

      // Если это бот или не удалось получить стим игрока, ничего не делаем  
      if (IsFakeClient(client) || !GetClientAuthString(client, g_SteamID[client], 30))  
          return;  

      // Устанавливаем позицию обратно в верхний узел  
      KvRewind(g_Kv);  

      // Если игрок есть в базе, получаем его статистику  
      if (KvJumpToKey(g_Kv, g_SteamID[client], false))  
      {  
          k[client] = KvGetNum(g_Kv, "k");  
          d[client] = KvGetNum(g_Kv, "d");  

          // Отмечаем что игрок авторизован  
          g_iReady[client] = true;  
      }  

      // Добавляем стим в базу  
      else if (KvJumpToKey(g_Kv, g_SteamID[client], true))  
      {  
          KvSetNum(g_Kv, "k", 0);  
          KvSetNum(g_Kv, "d", 0);  

          // Отмечаем что игрок авторизован  
          g_iReady[client] = true;  
      }  
}  


Код
     k[client] = 0;  
      d[client] = 0;
Явно лишние, потому что игрок обнуляется, заходя на сервер, даже если он есть в базе) Надо это убрать) wS, А ты плагины на заказ вместе с исходником даешь?


Сообщение отредактировал BarD - Пятница, 31.01.2014, 13:33:02
 
_wS_ Дата: Пятница, 31.01.2014, 14:40:32 | Сообщение # 11
Не ошибка это, хватит придираться.

Цитата BarD ()
плагины на заказ вместе с исходником даешь?

Да.
 
Форум » SourceMod >> CS:Source >> CSGO » Уроки SourceMod (SourcePawn) Скриптинга » Пример статистики игроков (с сохранением) (Убийства/смерти)
  • Страница 1 из 1
  • 1
Поиск: