Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Сохранение Базы Данных(У всех слетает прокачка)
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, О спасибки
 
  • Страница 1 из 1
  • 1
Поиск: