Сохранение значения массива в файл

Статус
В этой теме нельзя размещать новые ответы.

Mandar1n

theRoone
Пользователь
Регистрация
13 Янв 2018
Сообщения
394
Симпатии
70
Пол
Мужской
Нашел такой кусок кода в плагине, который сохраняет деньги в файл при выходе игрока с сервера. Переделал под себя, не знаю в оригинале так же или нет, но заметил что в консоли пылесосит всех кто в файле и находит нужный. Если сыграло 700 человек, то там 2100 строчек.
1 строка нумерация
2 строка steam_id
3 строка значение переменной для игрока

При присоединении игрока на сервер, в консоли появляется 2100 строчек и среди них находит нужный steam_id игрока, либо заносит новые строчки. Как починить это или как лучше реализовать сохранение?

C++:
new g_Coins[33] // Те же монетки :)

new configfile[200];
new g_szIp[33][32];

public plugin_init()
{
new configsdir[200];
get_configsdir(configsdir,199);
format(configfile,199,"%s/cs_bank.ini",configsdir);
}

public read_file2(id)
{
    if(is_user_connected(id) && file_exists(configfile))
    {
        get_user_authid(id,g_szIp[id],31);
        //get_user_ip(id,g_szIp[id],charsmax(g_szIp[]));
        
        new read[32];
        new filepointer = fopen(configfile,"r");
        while(fgets(filepointer,read,31))
        {
            replace(read,31,"^n","");
            if(equali(read,g_szIp[id]))
            {
                fgets(filepointer,read,31);
                g_Coins[id] = str_to_num(read);
                
                set_dhudmessage(0, 100, 255, -1.0, 0.3, 0, 5.0, 5.0);
                show_dhudmessage(id, "Загружены монетки. ^nУ вас %d", g_Coins[id]);
                emit_sound( id, CHAN_ITEM, gRespawned, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
                break;
                
            }
        }
        fclose(filepointer);
    }
}

public save_coins(id)
{
    new string[32];
    format(string,31,"%d",g_Coins[id]);
    new i, line;
    new filepointer = fopen(configfile,"r");
    if(filepointer)
    {
        new read[32];
        while(fgets(filepointer,read,31))
        {
            replace(read,31,"^n","");
            server_print("%d. %s",i,read);
            if(equali(read,g_szIp[id]))
            {
                line=1;
                break;
            }
            i++;
        }
    }
    fclose(filepointer);
    if(!line)
    write_file(configfile,g_szIp[id],i);
    write_file(configfile,string,i+1);
}
 

Mandar1n

theRoone
Пользователь
Регистрация
13 Янв 2018
Сообщения
394
Симпатии
70
Пол
Мужской
BeasT, та я чет сморел, чет не понял как делать. Хотя наверное самый лучший вариант
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
393
Симпатии
55
Пол
Мужской

Анатолий

Заблокированные
Пользователь
Регистрация
8 Июн 2017
Сообщения
686
Симпатии
196
Пол
Мужской
ВКонтакте
e1337ace
Нашел такой кусок кода в плагине, который сохраняет деньги в файл при выходе игрока с сервера. Переделал под себя, не знаю в оригинале так же или нет, но заметил что в консоли пылесосит всех кто в файле и находит нужный. Если сыграло 700 человек, то там 2100 строчек.
1 строка нумерация
2 строка steam_id
3 строка значение переменной для игрока

При присоединении игрока на сервер, в консоли появляется 2100 строчек и среди них находит нужный steam_id игрока, либо заносит новые строчки. Как починить это или как лучше реализовать сохранение?

C++:
new g_Coins[33] // Те же монетки :)

new configfile[200];
new g_szIp[33][32];

public plugin_init()
{
new configsdir[200];
get_configsdir(configsdir,199);
format(configfile,199,"%s/cs_bank.ini",configsdir);
}

public read_file2(id)
{
    if(is_user_connected(id) && file_exists(configfile))
    {
        get_user_authid(id,g_szIp[id],31);
        //get_user_ip(id,g_szIp[id],charsmax(g_szIp[]));
       
        new read[32];
        new filepointer = fopen(configfile,"r");
        while(fgets(filepointer,read,31))
        {
            replace(read,31,"^n","");
            if(equali(read,g_szIp[id]))
            {
                fgets(filepointer,read,31);
                g_Coins[id] = str_to_num(read);
               
                set_dhudmessage(0, 100, 255, -1.0, 0.3, 0, 5.0, 5.0);
                show_dhudmessage(id, "Загружены монетки. ^nУ вас %d", g_Coins[id]);
                emit_sound( id, CHAN_ITEM, gRespawned, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
                break;
               
            }
        }
        fclose(filepointer);
    }
}

public save_coins(id)
{
    new string[32];
    format(string,31,"%d",g_Coins[id]);
    new i, line;
    new filepointer = fopen(configfile,"r");
    if(filepointer)
    {
        new read[32];
        while(fgets(filepointer,read,31))
        {
            replace(read,31,"^n","");
            server_print("%d. %s",i,read);
            if(equali(read,g_szIp[id]))
            {
                line=1;
                break;
            }
            i++;
        }
    }
    fclose(filepointer);
    if(!line)
    write_file(configfile,g_szIp[id],i);
    write_file(configfile,string,i+1);
}
лучшим решением тут будет база либо nvault + удалять устаревшие записи чтоб фаил не рос сильно)
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
393
Симпатии
55
Пол
Мужской
nvault из личного опыта бы не советовал ИМХО! и еще раз ИМХО! :Whatever01:
 

Mandar1n

theRoone
Пользователь
Регистрация
13 Янв 2018
Сообщения
394
Симпатии
70
Пол
Мужской
BeasT, какие плагины есть, где можно посмотреть реализацию sql. Чтобы этот плагин не был огромным с миллионами полями в бд
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
393
Симпатии
55
Пол
Мужской
BeasT, какие плагины есть, где можно посмотреть реализацию sql. Чтобы этот плагин не был огромным с миллионами полями в бд
даже не знаю...)
думаю, немного погуглив ты найдешь ответы ;)
 

Mandar1n

theRoone
Пользователь
Регистрация
13 Янв 2018
Сообщения
394
Симпатии
70
Пол
Мужской
BeasT, в том то и дело, что я не нашел. По этому и забил на SQL :D
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
393
Симпатии
55
Пол
Мужской
BeasT, в том то и дело, что я не нашел. По этому и забил на SQL :D
тогда что-нибудь в духе скиллов покопай, уж не поленись да перелопать под себя.
Я бы и рад подкинуть тебе код, но со временем у меня беда...
 

Vaqtincha

aggressive
Разработчик
Скриптер
Регистрация
28 Янв 2018
Сообщения
959
Симпатии
682
Пол
Мужской
nvault больше подходить
 

Mandar1n

theRoone
Пользователь
Регистрация
13 Янв 2018
Сообщения
394
Симпатии
70
Пол
Мужской
Vaqtincha, нашел такой вариант. Нормальный?
C++:
#include <amxmodx>

#include <amxmisc>

#include <nvault>

 

#define PLUGIN  "LoadSave"

#define VERSION         "1.0"

#define AUTHOR  "CrAsH"

 

new g_Vault //Идентификатор фаулта

new g_Coins[33] //Донат игрока

 

public plugin_init()

{

        register_plugin(PLUGIN, VERSION, AUTHOR)

 

        register_clcmd("say /set", "set")

        register_clcmd("say /get", "get")

}

 

public get(id)

{

        client_print(id, print_chat, "you donate - %i", g_Coins[id])

}

 

public set(id)

{

        g_Coins[id] = g_Coins[id] + 100

        client_print(id, print_chat, "you new donate - %i", g_Coins[id])

}

 

public client_connect(id)

{

        set_task(2.0, "Loading", id)

}

 

public client_infochanged(id)

{

        if(!is_user_connected(id))

                return PLUGIN_CONTINUE

 

        new szNewName[32], szOldName[32]

              

        get_user_name(id, szOldName, charsmax( szOldName ))

        get_user_info(id, "name", szNewName, charsmax( szNewName ))

      

        if(!equal(szNewName, szOldName))

        {

                g_Coins[id] = 0

                Load(id)

        }

        return PLUGIN_CONTINUE

}

 

public Loading(id)

{

        Load(id)

}

 

public client_disconnected(id)

{

        Save(id)

}

 

stock Load(id)

{

        g_Vault = nvault_open("DonateSave")

      

        if(g_Vault == INVALID_HANDLE)

        {

                set_fail_state("Error nvault")

        }

      

        new szKey[64], szData[256]

 

        new szName[32]

        get_user_name(id, szName, charsmax( szName ))

      

        formatex(szKey, charsmax( szKey ),"%s", szName)

        formatex(szData, charsmax( szData ), "%i", g_Coins[id])

 

        nvault_get(g_Vault, szKey, szData, charsmax( szData ))

        g_Coins[id] = str_to_num( szData )

 

        nvault_close(g_Vault)

}

 

stock Save(id)

{

        g_Vault = nvault_open("DonateSave")

      

        if(g_Vault == INVALID_HANDLE)

        {

                set_fail_state("Error nvault")

        }

      

        new szKey[32], szData[256]

 

        new szName[32]

        get_user_name(id, szName, charsmax( szName ))

 

        formatex(szKey, charsmax( szKey ),"%s", szName)

        formatex(szData, charsmax( szData ),"%i", g_Coins[id])

 

        nvault_set(g_Vault, szKey, szData)

        nvault_close(g_Vault)

}
 

Vaqtincha

aggressive
Разработчик
Скриптер
Регистрация
28 Янв 2018
Сообщения
959
Симпатии
682
Пол
Мужской
Mandar1n, нет. ваулд открывай один раз в инит и закрывай в энд
 

Vesuvius

НЕ СКРИПТЕР!!!
Команда форума
Администратор
Регистрация
8 Июн 2017
Сообщения
1.598
Симпатии
570
Пол
Мужской
Вот мне интересно кто прожорливей?
Nvault или Sqlite?
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу