Пример Keyvalues статистики игроков (кол-во убийств/смертей).
Код
#include <sourcemod>
///////
// Глобальная переменная для хранения 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.
1. Не добавляется имя и стим игрока в файл 2. Группа с именем, в этой группе должен быть стим, я могу получить имя группы, но как получить значение стима ?
Добавлено (22.02.2013, 09:15:55) --------------------------------------------- Не тут... перенеси в http://world-source.ru/forum/100-2292-1
Вот у меня есть файл со стим-айдишниками. Как сделать так, чтобы плагин подсчитал сколько их и написал в чате: "В базе найдено 10 (например) игроков"??
В этом плагине ошибка! Вот содержание моего stats.txt (я ничего не менял):
Код
"stats" { "k" "18" "D" "12" }
Исправь ее, wS! Я так понял, что плагин не заносит Стимы в файл. И плагин считывает килы и смерти всего сервера. И еще, объясни, пожалуйста, в какой момент плагин пересохраняет статистику игроков.
Дата: Четверг, 30.01.2014, 18:52:54 | Сообщение # 9
Подправил. Запись в файл после смены карты или если была команда sm plugins unload stats. Но это просто пример, сохранять статистику в keyvalues плохо, т.к. много ключей = лаги. В OnClientPutInServer KvJumpToKey можно использовать 1 раз, если думать об оптимизации.
Спасибо большое, 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