| 
 
 
	
		
		
			| Пример статистики игроков (с сохранением) |  |  |  | 
| _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.
 
 | Гости не могут скачивать файлы | 
 |  |  |  |  |  | 
| М9сНиК | Дата: Воскресенье, 05.08.2012, 10:39:58 | Сообщение # 2 |  |   
|  |  | Сообщений: 61 Репутация: 0 [ +/- ]
 |  | А где пример с мускулом? |  |  |  |  |  | 
| TEIN | Дата: Пятница, 22.02.2013, 09:15:55 | Сообщение # 3 |  |   
|  |  | Сообщений: 563 Репутация: 78 [ +/- ]
 |  | Вообщем создается файлик xz.cfg 
 1. Не добавляется имя и стим игрока в файл
 2. Группа с именем, в этой группе должен быть стим, я могу получить имя группы, но как получить значение стима ?
 Добавлено (22.02.2013, 09:15:55)---------------------------------------------
 Не тут... перенеси в http://world-source.ru/forum/100-2292-1
 
 | Гости не могут скачивать файлы | 
 |  |  |  |  |  | 
| Scarface_slv | Дата: Пятница, 22.02.2013, 14:14:27 | Сообщение # 4 |  |   
|  |  | Сообщений: 737 Репутация: 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 |  |   
|  |  | Сообщений: 563 Репутация: 78 [ +/- ]
 |  | Это все конечно же круто, но если игроков 10, то какой стим мне выдаст? |  |  |  |  |  | 
| Scarface_slv | Дата: Пятница, 22.02.2013, 15:16:12 | Сообщение # 6 |  |   
|  |  | Сообщений: 737 Репутация: 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 |  |   
|  |  | Сообщений: 943 Репутация: 137 [ +/- ]
 |  | В этом плагине ошибка! Вот содержание моего 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 |  |   
|  |  | Сообщений: 943 Репутация: 137 [ +/- ]
 |  | Спасибо большое, 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;
 }
 }
 
 
 Явно лишние, потому что игрок обнуляется, заходя на сервер, даже если он есть в базе) Надо это убрать) wS, А ты плагины на заказ вместе с исходником даешь?Код      k[client] = 0;  d[client] = 0;
 
 
 Сообщение отредактировал BarD - Пятница, 31.01.2014, 13:33:02 |  |  |  |  |  | 
| _wS_ | Дата: Пятница, 31.01.2014, 14:40:32 | Сообщение # 11 |  |   | Не ошибка это, хватит придираться. 
 
 Цитата BarD (  ) плагины на заказ вместе с исходником даешь?Да.
 |  |  |  |  |  
 |