root | Дата: Воскресенье, 03.02.2013, 00:25 | Сообщение # 1 |
Генералиссимус
Группа: Администраторы
Сообщений: 561
Статус: Offline
| В Keyvalues можно хранить нужную вам информацию, которую можно использовать не только во время работы сервера, но и после его перезапуска/падения/отключения. В EventScripts это KeyGroup.
Если вы создали группу и занесли в неё какие-то данные, то они будут храниться в памяти сервера аж до его отключения или пока вы сами не уничтожите эту группу. Чтобы данные сохранились и после отключения сервера, их нужно занести в файл, обычный текстовый документ, а потом просто загрузить из него эти данные в нужный вам момент и снова использовать.
Обычно Keyvalues представляет собой такую структуру:
В группе может быть сколько угодно ключей, в качестве которых в основном используют что-то уникальное, например, SteamId или IP игрока, или какой-то пароль. У каждого ключа могут быть параметры с разными значениями, например, убийств : 5, имя : wS
Имя группы должно соответствовать имени файла, в котором она прописана. Т.е. если имя группы xz, то файл должен быть xz.txt (обычный текстовый документ). Вот пример создания и сохранения группы:
Код #include <sourcemod>
public OnPluginStart() { new Handle:kv = CreateKeyValues("wS_Group"); KvJumpToKey(kv, "wS_Key", true); KvSetString(kv, "wS_KeyValue", "Value"); KvRewind(kv);
KvJumpToKey(kv, "STEAM_0:0:17233444", true); KvSetString(kv, "nick", "wS"); KvSetString(kv, "game", "Counter Strike Source"); KvRewind(kv);
KeyValuesToFile(kv, "x.txt"); CloseHandle(kv); } После запуска этого плагина, у вас появится новый файл cstrike/x.txt
Код "wS_Group" { "wS_Key" { "wS_KeyValue" "Value" } "STEAM_0:0:17233444" { "nick" "wS" "game" "Counter Strike Source" } } Вот так можно получить данные, которые мы записали ('nick' и 'game' ключа 'STEAM_0:0:17233444'):
Код #include <sourcemod>
public OnPluginStart() { new Handle:kv = CreateKeyValues("wS_Group"); if (!FileToKeyValues(kv, "x.txt")) { PrintToServer("Не удалось загрузить cstrike/x.txt"); } else if (KvJumpToKey(kv, "STEAM_0:0:17233444")) { decl String:text[35]; KvGetString(kv, "nick", text, 35); PrintToServer("nick = %s", text); KvGetString(kv, "game", text, 35); PrintToServer("game = %s", text); } else PrintToServer("Не удалось найти ключ: STEAM_0:0:17233444"); CloseHandle(kv); } Описание некоторых функций для работы с KeyValues.
Handle:CreateKeyValues(const String:name[], const String:firstkey[]="", const String:firstValue[]="");
Код name - имя группы firstkey - если указано, то будет создан ключ firstValue - если указано, то созданному ключу установится значение
CreateKeyValues("group") выглядит так:
"group" { }
CreateKeyValues("group", "key", "value") выглядит так:
"group" { "key" "value" } Создает новую структуру (группу) и возвращает её Handle, которое необходимо для получения/удаления/добавления данных в эту группу. Чтобы уничтожить/удалить группу и все данные в ней, просто закройте её Handle с помощью функции CloseHandle() - это нужно сделать обязательно, но только тогда, когда эта группа уже вам не нужна. Примечание: Если скрипт был отключен, он сам закроет все Handle, но если во время работы скрипта вы понасоздаете групп и не закроете их Handle, то это утечка, т.е. это плохо.
bool:FileToKeyValues(Handle:kv, const String:file[]); - загружает данные из файла bool:KeyValuesToFile(Handle:kv, const String:file[]); - записывает данные в файл (сохранение группы)
kv - это Handle созданной структуры file - файл в cstrike/ (если ваш файл в папке cfg, то пишите cfg/ваш_файл.txt
Обе функции возвращают true в случае успеха, или false, если произошла ошибка
bool:KvJumpToKey(Handle:kv, const String:key[], bool:create=false);
Код kv - Handle группы key - ключ, который ищем create - если укажете true, то ключ будет создан, если его нет
Устанавливает позицию в структуре группы так, чтобы вы могли работать с параметрами этого ключа, если он был найден или был создан. После того, как вы занесли/извлекли/удалили данные этого ключа, то нужно восстановить позицию - просто сделайте KvRewind(Handle:kv); и не ломайте голову над этим (kv - Handle группы).
Функции для работы с ключом и его параметрами:
// Устанавливаем значения KvSetString(Handle:kv, const String:key[], const String:value[]); KvSetNum(Handle:kv, const String:key[], value); KvSetFloat(Handle:kv, const String:key[], Float:value); KvSetVector(Handle:kv, const String:key[], const Float:vec[3]); KvSetColor(Handle:kv, const String:key[], r, g, b, a=0);
// Получаем KvGetString(Handle:kv, const String:key[], String:value[], maxlength, const String:defvalue[]=""); KvGetNum(Handle:kv, const String:key[], defvalue=0); - возвращает целое число Float:KvGetFloat(Handle:kv, const String:key[], Float:defvalue=0.0); - с точкой KvGetVector(Handle:kv, const String:key[], Float:vec[3], const Float:defvalue[3]); KvGetColor(Handle:kv, const String:key[], &r, &g, &b, &a);
bool:KvGetSectionName(Handle:kv, String:section[], maxlength); Так можно получить имя ключа/группы, что зависит от текущей позиции в структуре.
KvDeleteThis(Handle:kv); - удалить ключ bool:KvGotoFirstSubKey(Handle:kv) - установить позицию на первом попавшемся ключе
bool:KvGotoNextKey(Handle:kv, bool:keyOnly=true); Устанавливает позицию к следующему ключу (сверху вниз). Вернет false, если ключей уже нет. Если keyOnly true, то будут учитываться только ключи, иначе и параметры.
Если вы хотите хранить в такой базе статистику игроков (много данных), то лучше используйте MYSQL. Просто когда в базе будет немало данных, то работать с такой группой будет мучение для сервера.
Запустить цикл по всем ключам в группе можно так:
Код #include <sourcemod>
public OnPluginStart() { new Handle:kv = CreateKeyValues("wS_Group"); if (FileToKeyValues(kv, "x.txt") && KvGotoFirstSubKey(kv)) { decl String:KeyName[35]; do { if (KvGetSectionName(kv, KeyName, 35)) { PrintToServer("Найден ключ: %s", KeyName); } } while (KvGotoNextKey(kv)); } else PrintToServer("cstrike/x.txt отсутствует или пуст"); CloseHandle(kv); } Если вы часто используете группу, то сохраните её в глобальной Handle: переменной. Не стоит злоупотреблять командой FileToKeyValues.
пример удаления
cfg/stats.txt :
Код "stats" { "STEAM_1" { "k" "1" } "STEAM_2" { "k" "2" } "STEAM_3" { "k" "3" } } Удаляем STEAM_2
Код #include <sourcemod>
public OnPluginStart() { new Handle:kv = CreateKeyValues("stats"); if (FileToKeyValues(kv, "cfg/stats.txt") && KvJumpToKey(kv, "STEAM_2")) { KvDeleteThis(kv); KvRewind(kv); KeyValuesToFile(kv, "cfg/stats.txt"); } CloseHandle(kv); }
|
|
| |