Пример статистики игроков (с сохранением)
| |
_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; } }
Код k[client] = 0; d[client] = 0; Явно лишние, потому что игрок обнуляется, заходя на сервер, даже если он есть в базе) Надо это убрать) wS, А ты плагины на заказ вместе с исходником даешь?
Сообщение отредактировал BarD - Пятница, 31.01.2014, 13:33:02 |
|
| |
_wS_
|
Дата: Пятница, 31.01.2014, 14:40:32 | Сообщение # 11 |
|
Не ошибка это, хватит придираться.
Цитата BarD ( ) плагины на заказ вместе с исходником даешь? Да.
|
|
| |
|