[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » Keyvalues - База (группа) для хранения информации (Взято с world-source.ru)
Keyvalues - База (группа) для хранения информации
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);  
}
 
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » Keyvalues - База (группа) для хранения информации (Взято с world-source.ru)
  • Страница 1 из 1
  • 1
Поиск: