@Nekro, в уроке же всё есть
В том то и дело, что в уроке нет такого@Nekro, в уроке же всё есть
"GlobalKey"
{
"key1" //Мы не знаем его названия
{
"param1" "value1"
"param2" "value2"
}
"key2" //Мы не знаем его названия
{
"param1" "value1"
"param2" "value2"
}
}
GetSectionNameВ том то и дело, что в уроке нет такого
Там есть только переходы на уже известные позиции.
А необходимо пробежать по ним не имея названий, так как в конфиге их могут сменить на любыеC-подобный:"GlobalKey" { "key1" //Мы не знаем его названия { "param1" "value1" "param2" "value2" } "key2" //Мы не знаем его названия { "param1" "value1" "param2" "value2" } }
if(hKV.GotoFirstSubKey())
do {
hKV.GetSectionName(szSection, sizeof szSection);
/*
* Тут воркаем с ключем
* Например,
*
* hKV.JumpToKey(szSection); // Ваще проверку if(...)
* int ikeyname = hKV.GetNum("keyname", 0);
* int ikeyname2 = hKV.GetNum("keyname2", 0);
*/
} while (hKV.GotoNextKey());
покажи пример реального конфига хотя быА необходимо пробежать по ним не имея названий, так как в конфиге их могут сменить на любые
@NekroGetSectionName
so ->
Это если неизвестен сабкей(т.е его название), но известны сами ключиснюсоеды!!!:if(hKV.GotoFirstSubKey()) do { hKV.GetSectionName(szSection, sizeof szSection); /* * Тут воркаем с ключем * Например, * * hKV.JumpToKey(szSection); // Ваще проверку if(...) * int ikeyname = hKV.GetNum("keyname", 0); * int ikeyname2 = hKV.GetNum("keyname2", 0); */ } while (hKV.GotoNextKey());
Насколько я понял, вопрос заключается именно в этом.
"Title"
{
"List"
{
"Key1"
{
"min" "0"
"max" "1"
}
"Key2"
{
"min" "0"
"max" "1"
}
"Key3"
{
"min" "0"
"max" "1"
}
}
}
void List()
{
hKeyValues.Rewind();
hKeyValues.JumpToKey("Title", false);
char sKey[32], sValue[16];
char sKeyMin[32];
if(hKeyValues.GotoFirstSubKey(false)) //Устанавливает текущую позицию в дереве KeyValues для первого подключа
{
do
{
if(hKeyValues.GetSectionName(sKey, sizeof(sKey))) //Получает имя текущего раздела.
{
if(hKeyValues.GotoFirstSubKey(false)) //Устанавливает текущую позицию в дереве KeyValues для первого подключа
{
int iCmdChat;
do hKeyValues.GoBack
{
if(hKeyValues.GetSectionName(sKeyMin, sizeof(sKeyMin))) //Получает имя текущего раздела.
{
hKeyValues.GetString(NULL_STRING, sValue, sizeof(sValue)); // Извлекает строковое значение из ключа KeyValues
if(!iCmdChat) PrintToChatAll("Ключ: %s, значение min: %s", sKey, sValue);
else
{
PrintToChatAll("Ключ: %s, значение max: %s", sKey, sValue);
hKeyValues.GoBack(); //Прыгаем выше (это не работает)
}
iCmdChat++;
}
} while( hKeyValues.GotoNextKey(false) );
}
}
} while( hKeyValues.GotoNextKey(false) );
CheckClientAll(sKey);
}
}
stock void List()
{
if(!hKeyValues) return; // hKeyValues не существует
hKeyValues.Rewind(); // переносимся в самое начало KeyValues
if(!hKeyValues.GotoFirstSubKey(false)) // Устанавливает текущую позицию в дереве KeyValues для первого подключа
return;
char section[32], value[16];
do
{
if(!hKeyValues.GetSectionName(section, sizeof(section))) // Получает имя текущего раздела.
continue;
PrintToChatAll("Ключ: %s", section);
hKeyValues.GetString("min", value, sizeof(value));
if(value[0]) PrintToChatAll("значение 'min': %s", value);
hKeyValues.GetString("max", value, sizeof(value))
if(value[0]) PrintToChatAll("значение 'max': %s", value);
CheckClientAll(section);
hKeyValues.GoBack();
} while(hKeyValues.GotoNextKey(false));
}
Так он будет считывает только "List"@Nekro, тебе достаточно вот такого кода, кмк:C-подобный:stock void List() { if(!hKeyValues) return; // hKeyValues не существует hKeyValues.Rewind(); // переносимся в самое начало KeyValues if(!hKeyValues.GotoFirstSubKey(false)) // Устанавливает текущую позицию в дереве KeyValues для первого подключа return; char section[32], value[16]; do { if(!hKeyValues.GetSectionName(section, sizeof(section))) // Получает имя текущего раздела. continue; PrintToChatAll("Ключ: %s", section); hKeyValues.GetString("min", value, sizeof(value)); if(value[0]) PrintToChatAll("значение 'min': %s", value); hKeyValues.GetString("max", value, sizeof(value)) if(value[0]) PrintToChatAll("значение 'max': %s", value); CheckClientAll(section); hKeyValues.GoBack(); } while(hKeyValues.GotoNextKey(false)); }
"Title"
{
"List" //Читает только это
{
"Key1"
{
"min" "0"
"max" "1"
}
"Key2"
{
"min" "0"
"max" "1"
}
}
}
Дай пжлст полный пример структуры, чтобы понимать с чем по итогу будет идти работаЗадумка, что будет не только одна секция "List", а будут ещё "List2" и "List3"
Вот, будет вот таких 3 блокаДай пжлст полный пример структуры, чтобы понимать с чем по итогу будет идти работа
"Title"
{
"List" //Читает только это
{
"Key1"
{
"min" "0"
"max" "1"
}
"Key2"
{
"min" "0"
"max" "1"
}
}
"List2" //Читает только это
{
"Key1"
{
"min" "0"
"max" "1"
}
"Key2"
{
"min" "0"
"max" "1"
}
}
"List3" //Читает только это
{
"Key1"
{
"min" "0"
"max" "1"
}
"Key2"
{
"min" "0"
"max" "1"
}
}
}
Вот, будет вот таких 3 блока
if(hKV.GotoFirstSubKey()) // переходим к первому ключу
do {
hKV.GetSectionName(szSection, sizeof szSection); //Получаем имя (list1, list2)
hKV.JumpToKey(szSection); //Переходим к ключу
if(hKV.GotoFirstSubKey()) //Переходим к первому саб-ключу
do {
hKV.GetSectionName(szSection, sizeof szSection); //Получаем имя (key1, key2)
hKV.JumpToKey(szSection); //Переходим в него (Вообще это поидее не надо, туплю чет)
int iMax = hKV.GetNum("max", 0);
int iMax = hKV.GetNum("min", 0);
//Далее работаем со значениями
} while (hKV.GotoNextKey()); //Делаем цикл по всем саб-кеям (key1, key2)
} while (hKV.GotoNextKey()); //Делаем цикл по всем ключам (list1, list2)
Дефолтные значения можно не указывать (я про нули в последнем параметре).int iMax = hKV.GetNum("max", 0);
int iMax = hKV.GetNum("min", 0);
Попробуй вот так:Задумка, что будет не только одна секция "List", а будут ещё "List2" и "List3"
Сейчас выводит в чат Ключ: List и больше ничего
stock void List()
{
if(!hKeyValues) return; // hKeyValues не существует
hKeyValues.Rewind(); // переносимся в самое начало KeyValues
if(!hKeyValues.GotoFirstSubKey(false)) // Устанавливает текущую позицию в дереве KeyValues для первого подключа
return;
char section[32], key[32], value[16];
do
{
if(hKeyValues.GetSectionName(section, sizeof(section))) do
{
if(!hKeyValues.GetSectionName(section, sizeof(section))) // Получает имя текущего раздела.
continue;
PrintToChatAll("Ключ: %s", section);
hKeyValues.GetString("min", value, sizeof(value));
if(value[0]) PrintToChatAll("значение 'min': %s", value);
hKeyValues.GetString("max", value, sizeof(value))
if(value[0]) PrintToChatAll("значение 'max': %s", value);
CheckClientAll(section);
hKeyValues.GoBack();
} while(hKeyValues.GotoNextKey(false));
hKeyValues.GoBack();
} while(hKeyValues.GotoNextKey(false));
}
Дефолтные значения можно не указывать (я про нули в последнем параметре).
@Rolzzandik, и да: ты неправильно назвал вторую переменную, из-за чего код не скомпилится. =)
Сообщения автоматически склеены:
Вообще переменные следовало создавать перед циклами, а внутри только присваивать им значения.
Сообщения автоматически склеены:
@Nekro, для чего делать несколько блоков, включающих в себя ещё блоки, если всё равно внутри у них одно и то же содержимое, кроме того всё проходится циклом?
Сообщения автоматически склеены:
Попробуй вот так:C-подобный:stock void List() { if(!hKeyValues) return; // hKeyValues не существует hKeyValues.Rewind(); // переносимся в самое начало KeyValues if(!hKeyValues.GotoFirstSubKey(false)) // Устанавливает текущую позицию в дереве KeyValues для первого подключа return; char section[32], key[32], value[16]; do { if(hKeyValues.GetSectionName(section, sizeof(section))) do { if(!hKeyValues.GetSectionName(section, sizeof(section))) // Получает имя текущего раздела. continue; PrintToChatAll("Ключ: %s", section); hKeyValues.GetString("min", value, sizeof(value)); if(value[0]) PrintToChatAll("значение 'min': %s", value); hKeyValues.GetString("max", value, sizeof(value)) if(value[0]) PrintToChatAll("значение 'max': %s", value); CheckClientAll(section); hKeyValues.GoBack(); } while(hKeyValues.GotoNextKey(false)); hKeyValues.GoBack(); } while(hKeyValues.GotoNextKey(false)); }
if(hKeyValues.GotoFirstSubKey(false)) //Переходит к первому ключу внутри текущей секции
{
do
{
hKeyValues.GetString("name", sBuffer, sizeof(sBuffer));
hArrMapName.PushString(sBuffer);
hKeyValues.GetString("customname", sBuffer, sizeof(sBuffer));
hArrMapCustomName.PushString(sBuffer);
}
while(hKeyValues.GotoNextKey(false)); //Переходит к следующему ключу в секции
}
"NewMapVoting"
{
"0" //Уникальное индекс карты
{
"name" "2000" //Название карты
"customname" "Две тысячи" //Пользовательское название карты
}
"1"
{
"name" "de_dust2"
"customname" "ДАСТ 2"
}
"2"
{
"name" "cs_assault"
"customname" "АСАУТ"
}
"3"
{
"name" "cs_italy"
"customname" "ИТАЛИЯ"
}
"4"
{
"name" "cs_office"
"customname" "ОФИС"
}
"5"
{
"name" "de_aztec"
"customname" "АСТЕК"
}
"6"
{
"name" "de_nuke"
"customname" "НЮК"
}
}
Size: 14 | Name: 2000 | CustomName: Две тысячи
Size: 14 | Name: de_dust2 | CustomName: ДАСТ 2
Size: 14 | Name: cs_assault | CustomName: АСАУТ
Size: 14 | Name: cs_italy | CustomName: ИТАЛИЯ
Size: 14 | Name: cs_office | CustomName: ОФИС
Size: 14 | Name: de_aztec | CustomName: АСТЕК
Size: 14 | Name: de_nuke | CustomName: НЮК
Size: 14 | Name: 2000 | CustomName: Две тысячи
Size: 14 | Name: de_dust2 | CustomName: ДАСТ 2
Size: 14 | Name: cs_assault | CustomName: АСАУТ
Size: 14 | Name: cs_italy | CustomName: ИТАЛИЯ
Size: 14 | Name: cs_office | CustomName: ОФИС
Size: 14 | Name: de_aztec | CustomName: АСТЕК
Size: 14 | Name: de_nuke | CustomName: НЮК
public Action Cmd_MapList(int iClient, int iArgs)
{
char sMapName[64];
char sMapCustomName[64];
for(int i = 0; i < hArrMapName.Length; ++i)
{
hArrMapName.GetString(i, sMapName, sizeof(sMapName));
hArrMapCustomName.GetString(i, sMapCustomName, sizeof(sMapCustomName));
PrintToConsole(iClient, "Size: %i | Name: %s | CustomName: %s", hArrMapName.Length, sMapName, sMapCustomName);
}
return Plugin_Handled;
}