Keyvalues - База (группа) для хранения информации
| |
Naykon
|
Дата: Пятница, 31.08.2012, 16:15:12 | Сообщение # 16 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Code #include <sourcemod> #include <cstrike> #include <sdktools> #include <sdktools_entoutput> #include <sdktools_functions>
new String:FreeID[25]; new String:FreeName[65]; new UserFree;
public OnPluginStart() { RegConsoleCmd("test", test); }
public Action:test(client, args) { Clients(client); return Plugin_Handled; }
Clients(client) { new Handle:Menu = CreateMenu(FreePlayerSelect); SetMenuTitle(Menu, "Кто?\n \n"); decl String:UserName[MAX_NAME_LENGTH]; decl String:SteamID[150]; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i)) { IntToString(GetClientUserId(i), SteamID, sizeof(SteamID)); GetClientName(i, UserName, sizeof(UserName)); AddMenuItem(Menu, SteamID, UserName); } SetMenuExitButton(Menu, true); DisplayMenu(Menu, client, 0); } }
public FreePlayerSelect(Handle:menu, MenuAction:action, client, option) { if (action == MenuAction_Select) { GetMenuItem(menu, option, FreeID, sizeof(FreeID), _, FreeName, sizeof(FreeName)); UserFree = GetClientOfUserId(StringToInt(FreeID)); new Handle:h = CreateKeyValues("FreeClient"); KvJumpToKey(h, FreeID, true); KvSetString(h, "name", FreeName); KvRewind(h); KeyValuesToFile(h, "cfg/FreeClient.txt"); } }
Получаю вот это: Code "FreeClient" { "2" { "name" "Naykkk" } }
Почему вместо моего STEM_ID двойка в ключе?????(((
|
|
| |
_wS_
|
Дата: Пятница, 31.08.2012, 17:05:04 | Сообщение # 17 |
|
IntToString(GetClientUserId(i), SteamID, sizeof(SteamID)); AddMenuItem(Menu, SteamID, UserName); // ты же не стим записал, а userid GetMenuItem(menu, option, FreeID, sizeof(FreeID), _, FreeName, sizeof(FreeName)); KvJumpToKey(h, FreeID, true);
|
|
| |
Naykon
|
Дата: Суббота, 01.09.2012, 11:17:09 | Сообщение # 18 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Code public FreePlayerSelect(Handle:menu, MenuAction:action, client, option) { if (action == MenuAction_Select) { GetClientAuthString(client, SteaM[client], 20); Kick = StringToInt(KickID); new Handle:h = CreateKeyValues("FreeClient"); KvJumpToKey(h, SteaM[client], true); KvSetString(h, "id", SteaM[client]); KvRewind(h); KeyValuesToFile(h, "cfg/FreeClient.txt"); } } Разобрался)))Добавлено (01.09.2012, 11:17:09) --------------------------------------------- Настоящий STEAN_ID - STEAM_0:0:2131744361 а в файле txt пишет другой: Code "FreeClient" { "STEAM_0:0:214227134" { "id" "STEAM_0:0:214227134" } }
Почему так? Код: Code #include <sourcemod> #include <cstrike> #include <sdktools> #include <sdktools_entoutput> #include <sdktools_functions>
new String:KickID[25]; new String:Name[25]; new Kick; new String:SteaM[MAXPLAYERS+1][25];
public OnPluginStart() { RegConsoleCmd("test", test); }
public Action:test(client, args) { Clients(client); return Plugin_Handled; }
Clients(client) { new Handle:Menu = CreateMenu(FreePlayerSelect); SetMenuTitle(Menu, "Кто?\n \n"); decl String:UserName[MAX_NAME_LENGTH]; //decl String:SteamID[150]; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i)) { GetClientName(i, UserName, sizeof(UserName)); AddMenuItem(Menu, SteaM[i], UserName); } SetMenuExitButton(Menu, true); DisplayMenu(Menu, client, 0); } }
public FreePlayerSelect(Handle:menu, MenuAction:action, i, option) { if (action == MenuAction_Select) { GetClientAuthString(i, SteaM[i], 20); Kick = StringToInt(KickID); new Handle:h = CreateKeyValues("FreeClient"); KvJumpToKey(h, SteaM[i], true); KvSetString(h, "id", SteaM[i]); KvRewind(h); KeyValuesToFile(h, "cfg/FreeClient.txt"); } }
|
|
| |
_wS_
|
Дата: Суббота, 01.09.2012, 20:01:12 | Сообщение # 19 |
|
И об этом уже было не раз сказано.. Кто последним выберет опцию в меню, того стим и будет в базе. Ты же постоянно перезаписываешь всю группу, а ее нужно хранить в глобальной переменной - читай урок про keyvalues и похожие темы.
|
|
| |
scorpion2904
|
Дата: Четверг, 25.10.2012, 17:40:05 | Сообщение # 20 |
|
Сообщений: 68
Репутация: 5 [ +/- ]
|
|
Как сделать, чтобы данные при сохранении перезаписывались, а не добавлялся новый ключ? Например, было так:
Code "stats" { "STEAM_1" { "k" "1" } "STEAM_2" { "k" "2" } "STEAM_3" { "k" "3" } }
А после изменения Steam_2 получается так:
Code "stats" { "STEAM_1" { "k" "1" } "STEAM_2" { "k" "3" } "STEAM_3" { "k" "3" } "STEAM_1" { "k" "1" } "STEAM_3" { "k" "3" } }
|
|
| |
Scarface_slv
|
Дата: Пятница, 26.10.2012, 13:23:37 | Сообщение # 21 |
|
Сообщений: 737
Репутация: 61 [ +/- ]
|
|
вот тут описано подробно все как работать с keyvalues http://world-source.ru/forum/100-2369-1
|
|
| |
BeatMaker_R1KO_
|
Дата: Вторник, 17.09.2013, 17:50:11 | Сообщение # 22 |
|
Сообщений: 60
Репутация: 0 [ +/- ]
|
|
Как можно получить параметры в ключе, не зная их названий и количества (тоесть они string) ??
|
|
| |
_wS_
|
Дата: Среда, 18.09.2013, 01:13:38 | Сообщение # 23 |
|
Цитата (BeatMaker_R1KO_) Как можно получить параметры в ключе, не зная их названий и количества (тоесть они string) ??
Код "x" { "key" { "v1" "3" "v2" "5" "v3" "7" } }
Код new Handle:kv = CreateKeyValues("x"); if (FileToKeyValues(...) && KvJumpToKey(kv, "key", false) && KvGotoFirstSubKey(kv, false)) { decl String:name[5]; do { if (KvGetSectionName(kv, name, 5)) PrintToServer("%s: %d", name, KvGetNum(kv, "")); } while (KvGotoNextKey(kv, false)); } CloseHandle(kv);
|
|
| |
sssw
|
Дата: Суббота, 07.12.2013, 09:03:49 | Сообщение # 24 |
|
Сообщений: 123
Репутация: 14 [ +/- ]
|
|
Код "Movie" { "Frame_1" { } "Frame_2" { "AddEntity" { "1" { "classname" "env_sprite" "velocity" "30 30 30" } }
"DellEntity" { } } }
Как путешествовать тут? Нужно зайти в Frame_2 затем в AddEntity потом зайти поочерёдно всё что есть там и перепрыгнуть на DellEntity.
|
|
| |
_wS_
|
Дата: Воскресенье, 08.12.2013, 18:35:37 | Сообщение # 25 |
|
Попробуй KvGotoFirstSubKey(kv, true) несколько раз.
|
|
| |
Naykon
|
Дата: Воскресенье, 09.03.2014, 16:39:59 | Сообщение # 26 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Код if (FileToKeyValues(kv1, Header)) { KvJumpToKey(kv1, "priglash", true); KvSetString(kv1, SteamID, NamePlayer); KvRewind(kv1); KeyValuesToFile(kv1, Header); }
LINUX сохраняет БАЗУ с маленькой буквы!!! Т.е Header = "Babka" а сохраниться в babka.txt - как бороться?Добавлено (05.03.2014, 16:32:58) ---------------------------------------------
Цитата _wS_ ( ) 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); }
А как удалить только "k" "3"?Добавлено (09.03.2014, 16:39:59) --------------------------------------------- Живые есть?
|
|
| |
_wS_
|
Дата: Воскресенье, 09.03.2014, 19:16:19 | Сообщение # 27 |
|
Так можно:
Код new Handle:kv = CreateKeyValues("stats"); if (FileToKeyValues(kv, "addons/sourcemod/scripting/stats.txt") && KvJumpToKey(kv, "STEAM_3", false) && KvGotoFirstSubKey(kv, false)) { decl String:info[5]; do { if (KvGetSectionName(kv, info, 5) && strcmp(info, "k", false) == 0) { KvDeleteThis(kv); KvRewind(kv); KeyValuesToFile(kv, "addons/sourcemod/scripting/stats.txt"); break; } } while (KvGotoNextKey(kv, false)); } CloseHandle(kv); Но если у ключа "STEAM_3" больше нет параметров, кроме "k", то после удаления "k" удалится и сам ключ "STEAM_3".
|
|
| |
Naykon
|
Дата: Среда, 26.11.2014, 00:46:49 | Сообщение # 28 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Цитата _wS_ ( ) Попробуй KvGotoFirstSubKey(kv, true) несколько раз.
Код "Movie" { "Frame_1" { "AddEntity1" { "classname" "env_sprite" "velocity" "30 30 30" } "AddEntity2" { "classname" "env_sprite" "velocity" "30 30 30" } "AddEntity3" { "classname" "env_sprite" "velocity" "30 30 30" } } }
Как шагать тут? Нужно из каждого "classname" и "velocity" получить данные... Пример дайте пожалуйста. Спасибо.
|
|
| |
AtomoS
|
Дата: Понедельник, 05.01.2015, 00:22:30 | Сообщение # 29 |
|
Сообщений: 1
Репутация: 0 [ +/- ]
|
|
Код "table" { "key1" { "param1" "0" "param2" "1" } "key1" { "param3" "5" "param4" "5" } }
Не подскажите как можно получить список параметров + значения из key1 или key2, не зная какие там есть на самом деле?
// решено
Код KvJumpToKey(kv, "key1"); KvGotoFirstSubKey(kv, false);
do { KvGetSectionName(kv, buffer, sizeof(buffer)); KvGetString(kv, NULL_STRING, command, sizeof(command)); PrintToServer("param: %s - value: %c", buffer, command); } while (KvGotoNextKey(kv, false));
Сообщение отредактировал AtomoS - Суббота, 07.02.2015, 22:06:18 |
|
| |
tolik1231
|
Дата: Вторник, 24.12.2019, 21:13:21 | Сообщение # 30 |
|
Сообщений: 71
Репутация: -1 [ +/- ]
|
|
Иногда у игрока бывает такое странное имя что из-за добавления в KV такого ника вся структура документа рушится.. есть какие-то функции которые корректируют такие ники перед добавлением в KV ?
|
|
| |
|