Узнать количество параметров и их значения

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #1
Каким образом можно узнать количество параметров и их значения (string) в ключе в Keyvalues ?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #4
The End Is Near...,
PHP:
public OnMapStart() 
{
	ClearArray(g_Name);
	ClearArray(g_SteamID);
	ClearArray(g_IP);
	ResetSettings();
	
	new Handle:hKVReasons;
	
	hKVReasons = CreateKeyValues("SourceBans");
	decl String:strBuffer[256];
	BuildPath(Path_SM, strBuffer, sizeof(strBuffer), "configs/sourcebans/sourcebans.cfg");
	
	if(FileToKeyValues(hKVReasons, strBuffer))
	{
		KvJumpToKey(hKVReasons, "BanReasons", false);

		do
		{
			// тут нужно получать параметры.
		}
		while (KvGotoNextKey(hKVReasons));
	}
    CloseHandle(hKVReasons);
}

sourcebans.cfg
"SourceBans"
{
"Config"
{
// Website address to tell where the player to go for unban, etc
"Website" "http://****"

// Allow or disallow admins access to addban command
"Addban" "1"

// Allow or disallow admins access to unban command
"Unban" "1"

// The Tableprefix you set while installing the webpanel. (default: "sb")
"DatabasePrefix" "sb"

// How many seconds to wait before retrying when a players ban fails to be checked. Min = 15.0 Max = 60.0
"RetryTime" "45.0"

// How often should we process the failed ban queue in minutes
"ProcessQueueTime" "5"

// Should the plugin automaticaly add the server to sourcebans
// (servers without -ip being set on startup need this set to 0)
"AutoAddServer" "1"

// Enable backing up config files after getting admins from database (1 = enabled, 0 = disabled)
"BackupConfigs" "1"

// Enable admin part of the plugin (1 = enabled, 0 = disabled)
"EnableAdmins" "1"

// Require the admin to login once into website
"RequireSiteLogin" "0"

// This is the ID of this server (Check in the admin panel -> servers to find the ID of this server)
"ServerID" "1"
}

"BanReasons"
{
"Hacking" "Hacking"
"Exploit" "General Exploit of Game/Map/Server"
"TK" "Team Killing"
"TF" "Team Flashing"
"CommSpam" "Spamming Mic/Chat"
"BadSpray" "Inappropriate Spray"
"BadLang" "Inappropriate Language"
"BadName" "Inappropriate Name"
"IgnoreAdmin" "Ignoring Admins"
"Stacking" "Team Stacking"
"Own Reason" "Own Reason"
}
}
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
KvGotoFirstSubKey -> KvGotoNextKey -> KvGetSectionName(kv, section, sizeof(section)) -> KvJumpToKey(kv, section, false) -> KvGetString
Пробуй так
 
  • Мне нравится
Реакции: R1KO

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #6
The End Is Near..., ты меня не понял, мне нужно получить параметры внутри ключа, а не ключи.
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
Как ни странно, но ответ на этот вопрос есть на оффициальной вики, в разделе работы с KeyValues. Сам не до конца понимаю, как оно работает, но кидаю пример кода, который шарит по всем ключам и секциям в KV.
C-подобный:
BrowseKeyValues(Handle:kv)
{
	do
	{
		// You can read the section/key name by using KvGetSectionName here.
 
		if (KvGotoFirstSubKey(kv, false))
		{
			// Current key is a section. Browse it recursively.
			BrowseKeyValues(kv);
			KvGoBack(kv);
		}
		else
		{
			// Current key is a regular key, or an empty section.
			if (KvGetDataType(kv, NULL_STRING) != KvData_None)
			{
				// Read value of key here (use NULL_STRING as key name). You can
				// also get the key name by using KvGetSectionName here.
			}
			else
			{
				// Found an empty sub section. It can be handled here if necessary.
			}
		}
	} while (KvGotoNextKey(kv, false));
}
Полагаю, что основная суть такова:
1. Прыгаем в нужную нам секцию.
2. Идем к её FirstKey.
3. Дальше с помощью do ... while (KvGoNextKey) просматриваем как SectionName название всех ключей (можно и их число посчитать).
Если нужно дальше изъять их значения, то в шаге три я обычно записываю в массив названия всех ключей, а потом делаю шаг один, и уже в массиве названия всех ключей, значит тупо for (new i = 0; i < ArraySize; i++) KvGet... ();

P.S. Подобным образом можно считывать Kv с вложением более трех уровней.
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Т.е. пытаться рассматривать ключи как секции? oO
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
KorDen, что-то типа того...
Сначала сбор название всех ключей, рассматривая их как секции, а дальше, зная названия ключей секции, получать их значения.
Таким образом, можно считывать значения из кв файла, не зная заранее ни названий ключей, ни названия секций. А можно читать кв вида
C-подобный:
"somekv"
{
	"level1"
	{
		"level2"
		{
			"key1"	"value1"
		}
	}
}
и не только, уровень вложенности по сути уже может быть любым.
 
Сверху Снизу