Сохранение Базы Данных(У всех слетает прокачка)
| |
RunCrafting
|
Дата: Воскресенье, 07.02.2016, 11:57:01 | Сообщение # 1 |
|
Сообщений: 52
Репутация: 0 [ +/- ]
|
|
Вобщем у некоторых игроков при заходе, слетает прокачка Вот вчера набили поинтов, а седня все слетело, поможете?
OnClientDisconnect
Код public OnClientDisconnect(client) { g_iReady[client] = false; KvRewind(g_Kv); if (KvJumpToKey(g_Kv, g_SteamID[client], false)) { KvSetNum(g_Kv, "LongJump", lglevel[client]+1); KvSetNum(g_Kv, "MaxHealth", hpmaxlevel[client]+1); KvSetNum(g_Kv, "Damage", dmglevel[client]+1); KvSetNum(g_Kv, "Vampire", vmlevel[client]+1); KvSetNum(g_Kv, "RegenHP", rhlevel[client]+1); KvSetNum(g_Kv, "RegenAP", ralevel[client]+1); KvSetNum(g_Kv, "FreezeKnife", fklevel[client]+1); KvSetNum(g_Kv, "Shaker", shlevel[client]+1); KvSetNum(g_Kv, "Medic", mdclevel[client]+1); KvSetNum(g_Kv, "Crit", kdlevel[client]+1); KvSetNum(g_Kv, "Armor", arlevel[client]+1); KvSetNum(g_Kv, "Cash", cashlevel[client]+1); KvSetNum(g_Kv, "Stealth", sslevel[client]+1); KvSetNum(g_Kv, "InfinityGrenades", ramlevel[client]+1); KvSetNum(g_Kv, "InfinityAmmo", ialevel[client]+1); KvSetNum(g_Kv, "Explode", elevel[client]+1); KvSetNum(g_Kv, "HeadShot", hslevel[client]+1); KvSetNum(g_Kv, "DropWeapon", dwlevel[client]+1); KvSetNum(g_Kv, "Model", vipmodel[client]); KvSetNum(g_Kv, "Chameleon", chlevel[client]+1); KvSetNum(g_Kv, "Gold", gold[client]); KvSetNum(g_Kv, "Jump", jlevel[client]+1); KvSetNum(g_Kv, "InvisGun", iglevel[client]+1); KvSetNum(g_Kv, "HJump", hjlevel[client]+1); KvSetNum(g_Kv, "Invis", iplevel[client]+1); KvSetNum(g_Kv, "Poison", shlevel[client]+1); KvSetNum(g_Kv, "Mirror", malevel[client]+1); KvSetNum(g_Kv, "SwapPos", splevel[client]+1); KvSetNum(g_Kv, "Points", pointammo[client]); // KvSetNum(g_Kv, "ADM2", ADM2[client]); KvSetNum(g_Kv, "Deaths", death[client]); KvSetNum(g_Kv, "Kills", kills[client]); KvSetNum(g_Kv, "VIP", VIP[client]); KvSetNum(g_Kv, "ADMIN", ADMIN[client]); KvSetNum(g_Kv, "OSN", OSN[client]); /* int lglevel[MAXPLAYERS+1]; int hpmaxlevel[MAXPLAYERS+1]; int dmglevel[MAXPLAYERS+1]; int vmlevel[MAXPLAYERS+1]; int rhlevel[MAXPLAYERS+1]; int ralevel[MAXPLAYERS+1]; int fklevel[MAXPLAYERS+1];*/ } }
LoadStats(запускается по OnClientPutInServer)
Код public LoadStats(client) { g_iReady[client] = false; if(IsFakeClient(client)) bots+=1 if(bots<=6) ServerCommand("bot_kick") RegenHP[client] = 0 RegenAP[client] = 0 kills[client] = 0; death[client] = 0; lglevel[client] = -1 dmglevel[client] = -1 kdlevel[client] = -1 hpmaxlevel[client] = -1 vmlevel[client] = -1 elevel[client] = -1 splevel[client] = -1 ADM2[client]=0 ialevel[client] = -1 arlevel[client] = -1 rhlevel[client] = -1 mdclevel[client] = -1 ramlevel[client] = -1 hslevel[client] = -1 chlevel[client] = -1 dwlevel[client] = -1 vipmodel[client]=0 ralevel[client] = -1 fklevel[client] = -1 cashlevel[client] = -1 hslevel[client] = -1 iplevel[client] = -1 iglevel[client] = -1 malevel[client] = -1 jlevel[client] = -1 hjlevel[client] = -1 pointammo[client] = 200 VIP[client] = 0 ADMIN[client] = 0 OSN[client] = 0 gold[client] = 100 WeapAl[client] = true effects[client] = 1 if (IsFakeClient(client)||!GetClientAuthId(client, AuthId_Steam2, g_SteamID[client], 30)) return; /* if() { CreateTimer(2.0, LoadStats2, client) return; }*/
// Устанавливаем позицию обратно в верхний узел KvRewind(g_Kv); // KvRewind(g_Kv3); decl String:name[256]; GetClientName(client, name, sizeof(name)) // Если игрок есть в базе, получаем его статистику if (KvJumpToKey(g_Kv, g_SteamID[client], false)) { lglevel[client] = KvGetNum(g_Kv, "LongJump")-1; hpmaxlevel[client] = KvGetNum(g_Kv, "MaxHealth")-1; dmglevel[client] = KvGetNum(g_Kv, "Damage")-1; sslevel[client] = KvGetNum(g_Kv, "Stealth")-1; vmlevel[client] = KvGetNum(g_Kv, "Vampire")-1; rhlevel[client] = KvGetNum(g_Kv, "RegenHP")-1; ralevel[client] = KvGetNum(g_Kv, "RegenAP")-1; fklevel[client] = KvGetNum(g_Kv, "FreezeKnife")-1; shlevel[client] = KvGetNum(g_Kv, "Shake")-1; mdclevel[client] = KvGetNum(g_Kv, "Medic")-1; kdlevel[client] = KvGetNum(g_Kv, "Crit")-1; arlevel[client] = KvGetNum(g_Kv, "Armor")-1; // ADM2[client] = KvGetNum(g_Kv, "ADM2"); ialevel[client] = KvGetNum(g_Kv, "InfinityAmmo")-1; hslevel[client] = KvGetNum(g_Kv, "HeadShot")-1; ramlevel[client] = KvGetNum(g_Kv, "InfinityGrenades")-1; elevel[client] = KvGetNum(g_Kv, "Explode")-1; iglevel[client] = KvGetNum(g_Kv, "InvisGun")-1; cashlevel[client] = KvGetNum(g_Kv, "Cash")-1; splevel[client] = KvGetNum(g_Kv, "SwapPos")-1; dwlevel[client] = KvGetNum(g_Kv, "DropWeapon")-1; chlevel[client] = KvGetNum(g_Kv, "Chameleon")-1; gold[client] = KvGetNum(g_Kv, "Gold"); jlevel[client] = KvGetNum(g_Kv, "Jump")-1; hjlevel[client] = KvGetNum(g_Kv, "HJump")-1; //KvSetNum(g_Kv, "Poison", shlevel[param1]+1); //KvSetNum(g_Kv, "Mirror", malevel[param1]+1); shlevel[client] = KvGetNum(g_Kv, "Poison")-1; malevel[client] = KvGetNum(g_Kv, "Mirror")-1; iplevel[client] = KvGetNum(g_Kv, "Invis")-1; pointammo[client]= KvGetNum(g_Kv, "Points"); vipmodel[client]=KvGetNum(g_Kv, "Model"); death[client] = KvGetNum(g_Kv, "Deaths"); OSN[client] = KvGetNum(g_Kv, "OSN"); kills[client] = KvGetNum(g_Kv, "Kills"); VIP[client] = KvGetNum(g_Kv, "VIP"); ADMIN[client] = KvGetNum(g_Kv, "ADMIN"); KvSetString(g_Kv, "Name", name)
// Отмечаем что игрок авторизован g_iReady[client] = true; } // Добавляем стим в базу else if (KvJumpToKey(g_Kv, g_SteamID[client], true)) { // Отмечаем что игрок авторизован g_iReady[client] = true; KvSetString(g_Kv, "Name", name) } if(jlevel[client] > 0) jlevel[client]=0 }
OnPluginStart
Код g_Kv = CreateKeyValues("stats"); FileToKeyValues(g_Kv, "InkCore/RPGIC/rpg_players.txt");
|
|
| |
pro-health
|
Дата: Понедельник, 08.02.2016, 10:41:40 | Сообщение # 2 |
|
Сообщений: 188
Репутация: 5 [ +/- ]
|
|
Лучше используй sql/MySql базу.
|
|
| |
Darkeneez
|
Дата: Понедельник, 08.02.2016, 12:46:32 | Сообщение # 3 |
|
Сообщений: 221
Репутация: 18 [ +/- ]
|
|
Или создавай для каждого игрока отдельный файл с ключами. Т.к я давно сталкивался с проблемой, что при огромном размере файла с ключами, они или смещаются или слетают.
|
|
| |
RunCrafting
|
Дата: Понедельник, 08.02.2016, 23:39:45 | Сообщение # 4 |
|
Сообщений: 52
Репутация: 0 [ +/- ]
|
|
Цитата pro-health ( ) Лучше используй sql/MySql базу. Дело в том, что я хз как ее настроить, при виде хоть куска MySQL, у меня вопрос: "че?"
Цитата Darkeneez ( ) создавай для каждого игрока отдельный файл с ключами. Хорошая идея, и как я сам не догадался, спасибо! Стоп, а не слишком ли много будет Handle? Можете кинуть готовый код, сохраняющий под каждого игрока свой файл?
А хотя если создавать Handle прямо в функции, ничего такого не будет, или new Handle:KV[MaxClients+1], если прокатит. new Handle:KV[MaxClients+1] не прокатит, только что попробывал, придется создавать ключ на ходу
Добавлено (08.02.2016, 23:39:45) ---------------------------------------------
Цитата RunCrafting ( ) Или создавай для каждого игрока отдельный файл с ключами. Т.к я давно сталкивался с проблемой, что при огромном размере файла с ключами, они или смещаются или слетают.
Не могу создать файл, просто потому что не знаю как;D
Сообщение отредактировал RunCrafting - Понедельник, 08.02.2016, 23:52:17 |
|
| |
Darkeneez
|
Дата: Вторник, 09.02.2016, 04:00:27 | Сообщение # 5 |
|
Сообщений: 221
Репутация: 18 [ +/- ]
|
|
Код char file_one[256];
GetClientAuthString(client, file_one, sizeof(file_one));
BuildPath(Path_SM, file_one, sizeof (file_one), "configs/sic/KeyValues/%s.txt", file_one);
KeyValues kv = new KeyValues("stats"); kv.ImportFromFile(file_one); if (kv.GotoFirstSubKey()) { do { /*Заполняем файл*/ } while (kv.GotoNextKey()); kv.Rewind(); delete kv; }
С телефона набросал.
Сообщение отредактировал Darkeneez - Вторник, 09.02.2016, 04:00:54 |
|
| |
Jon4ik
|
Дата: Вторник, 09.02.2016, 16:30:46 | Сообщение # 6 |
|
Сообщений: 278
Репутация: 7 [ +/- ]
|
|
Раз уж речь пошла о KV .
Есть файл x.ini и в нем "group" "1;3".Получаю вот так int category = KvGetNum(kv, "group"); и дальше надо разделить их,но я не могу понять как это сделать. Надо чтобы после разделения было примерно так:
LogMessage("Группа: 1"); и LogMessage("Группа: 3");
Сообщение отредактировал Jon4ik - Вторник, 09.02.2016, 16:31:00 |
|
| |
Darkeneez
|
Дата: Вторник, 09.02.2016, 16:50:52 | Сообщение # 7 |
|
Сообщений: 221
Репутация: 18 [ +/- ]
|
|
Цитата Jon4ik ( ) Раз уж речь пошла о KV .
Есть файл x.ini и в нем "group" "1;3".Получаю вот так int category = KvGetNum(kv, "group"); и дальше надо разделить их,но я не могу понять как это сделать. Надо чтобы после разделения было примерно так:
LogMessage("Группа: 1"); и LogMessage("Группа: 3");
У тебя уже не int получается, а String. Получай строку и разбивай ее.
|
|
| |
Jon4ik
|
Дата: Вторник, 09.02.2016, 16:54:20 | Сообщение # 8 |
|
Сообщений: 278
Репутация: 7 [ +/- ]
|
|
Darkeneez, Можешь пример дать как это сделать?
|
|
| |
Darkeneez
|
Дата: Вторник, 09.02.2016, 20:49:00 | Сообщение # 9 |
|
Сообщений: 221
Репутация: 18 [ +/- ]
|
|
Цитата Jon4ik ( ) Darkeneez, Можешь пример дать как это сделать?
Код char buffer[256]; char g_names[10][256]; KvGetString(..., ..., buffer,sizeof(buffer)); ExplodeString(buffer, ";", g_names, 9, 256);
Как-то так
|
|
| |
Jon4ik
|
Дата: Вторник, 09.02.2016, 22:14:27 | Сообщение # 10 |
|
Сообщений: 278
Репутация: 7 [ +/- ]
|
|
Darkeneez, О спасибки
|
|
| |
|