[Include] Southclaw INI file
#1

Tуpico original:
https://sampforum.blast.hk/showthread.php?tid=262795
Tenho permissхes do autor p/postar aqui!

Resumo do tуpico:
Quote:
Originally Posted by Sothclaw
Dou crйdito para [FEK] DraKins, por ter usado o FINI para aprender a ultilizar Cache.
Uma das caracterнsticas й a correзгo de bug em Windows e Linux de linha ( \r \n)
pawn Код:
//Caso vocк esteje usando Windows, defina no OnGameModeInit:
file_OS(WINDOWS);
//Caso vocк esteje usando LINUX, defina no OnGameModeInit
file_OS(LINUX);
Atualizaзхes:
- Adicionado file_SetFloat e file_GetFloat
- Adicionado file_IncVal (veja abaixo a descriзгo)
- Adicionado separadores para as funзхes do Pawn


Funзхes:

pawn Код:
// - Ediзгo

file_Create(filename[])
// Cria um arquivo com o nome <filename> sem esquecer da extensгo ( .txt .ini.cfg )
file_Delete(filename[])
// Deleta o arquivo com o nome <filename>

// - Abrindo e fechando

file_Open(filename[])
//Abre o arquivo <filename> e salva os arquivos na memуria [Ele nгo vai ler arquivos sem o sinal ' = ' ]

// <NOTA>  Nгo abra vбrios arquivos em um sу cуdigo, use file_Close e depois abra o outro arquivo!

file_Save(filename[])
// Salva o arquivo <filename>
// Vocк nгo precisa salvar o arquivo ao ler o mesmo.

file_Close()
//Sempre use file_Close para fechar o arquivo, nгo abra vбrios arquivos sem fechбr os mesmos.

//- Escrevendo

file_SetStr(key[], value[])
//Escreve uma STRING na KEY

file_SetVal(key[], value)
//Escreve um VALOR na KEY

file_SetFloat(key[], value)
//Escreve uma FLOAT na KEY

file_IncVal(key[], amount)
//Just a simple macro to save space when writing, Increments the value of <key> by <amount>

file_Remove(key[])
//Remove a KEY do arquivo.

//- LENDO

file_GetStr(key[])
//Retorna a string do arquivo

file_GetVal(key[])
// Retorna o valor da Key

Float:file_GetFloat(key[])
// Retorna a Float da Key

file_IsKey(key[])
//Checa se a chave й valida

// < - Outros >

file_PrintAll()
//Jб se diz por sн sу.

file_OS(type = LINUX or WINDOWS)
//USE ISSO PARA DEFINIR O SISTEMA OPERACIONAL EM 'OnGameModeInit' ( ex: file_OS(WINDOWS); )
Download:

Pastebin


Exemplos:

PHP код:
#include <a_samp>
#include <inifile>
stock SalvarDados(playerid)
{
    new 
arquivo[0x30], nome[0x20]; GetPlayerName(playeridnomesizeof(nome));
    
format(arquivosizeof(arquivo), "%s.ini"nome);
    if(!
fexist(arquivo)) file_Create(arquivo); //Caso nгo exista
    
file_Open(arquivo); // Abre o arquivo.
    
file_SetVal("Dinheiro"GetPlayerMoney(playerid)); // SETA um VALOR no arquivo
    
file_SetVal("Skin"GetPlayerSkin(playerid)); // SETA UM VALOR NO ARQUIVO
    
file_SetVal("Score"GetPlayerScore(playerid)); //SETA UM VALOR NO ARQUIVO
    
file_SetStr("Ricop522""Lindo"); //SETA UMA STRING NO ARQUIVO
    
file_Save(arquivo);  //SALVA !
    
file_Close();//Fecha
    
return 0x01;
}
stock CarregarDados(playerid)
{
    new 
arquivo[0x30], nome[0x20]; GetPlayerName(playeridnomesizeof(nome));
    
format(arquivo,sizeof(arquivo),"%s.txt",nome);
    if(!
fexist(arquivo)) file_Create(arquivo); //Caso nгo exista, ele cria o arquivo
    
file_Open(arquivo);
    
GivePlayerMoney(playeridfile_GetVal("Dinheiro"));
    
SetPlayerSkin(playeridfile_GetVal("Skin"));
    
SetPlayerScore(playeridfile_GetVal("Score"));
    
//Carregar arquivos: file_GetStr("Ricop522");
    
file_Close();
    return 
0x01;

Crйditos: Southclaw
Tutorial: Ricop522

___________________________
Reply
#2

Isto me lembra demais Fini, grande parte das funзхes sгo idкnticas, acredito que ele apenas modificou algumas coisas e colocou o suporte aos sistema operacionais, assim ficando bem trabalhado.

De qualquer forma ficou bem feito, att
Reply
#3

Sim, no tуpico ele disse que usou FINI para aprender a ultilizar Cache .
Reply
#4

Vocк tem os testes?

Eu estava usando dini a algum tempo, entгo comecei migrar para Fini, ainda estou em dъvida com Y_ini, mas se este for mais rбpido fico com ele, apesar de ser a base de Fini.
Reply
#5

Coloquei algumas vбriaveis para simular alguns players conectados em IsPlayerConnect.

Deixei 4 Mil e os resultados dos testes nгo foram nada diferentes, ambos sгo уtimos sistemas mas pelo que vi Fini parece ser ainda um pouco mais veloz

pawn Код:
///
#include    a_samp
#include    fini
#include    shot

//gambiarras
#define     IsPlayerConnected(%0) ppa[%0]
#define     MaxClients 4000
#define     LoopClients(%0) for(new %0; %0 < MaxClients; %0++) if(IsPlayerConnected(%0))

main(){OnInit();}
static stock bool:ppa[MaxClients] = {true,...};

OnInit();public OnInit()
{
///===
    new tickfile = GetTickCount();
    file_Create("File.ini");
    file_OS(WINDOWS); file_Open("File.ini");
    {
        LoopClients(i) {
            file_SetVal("ValueTeste", random(91891));
            file_SetStr("StringTeste", RandomString(12,true));
            file_Save("File.ini");
        }
    }
    file_Close();
    tickfile = GetTickCount() - tickfile;

///===
    new tickfini = GetTickCount();
    Fini_Create("Fini.ini");
    Fini_OpenFile("Fini.ini");
    {
        LoopClients(i) {
            Fini_SetVal("ValueTeste", random(91891));
            Fini_SetStr("StringTeste",RandomString(12,true));
            Fini_SaveFile("Fini.ini");
        }
    }
    Fini_CloseFile();
    tickfini = GetTickCount() - tickfini;

//===
    printf("FINI %d ms",tickfini);
    printf("FILE %d ms",tickfile);
    return true;
}


RandomString(len,bool:lowercase)
{
    new
        string[26]                                // maxchars ...
        ;

    for(new i = 0; i < len; i++) {
        string[i] = lowercase? tolower(random(25)+65) : (random(25)+65);
    }
    return string;
}
Ambos abriram o arquivo e fizeram a funзгo conforme o prometido, acredito que o lag deste sistema atual й devido a funзгo de operar no sistema operacional

(o desenvolvedor fez algo com variбveis para checar isto, quando nгo era necessбrio)

pawn Код:
#define WINDOWS
Logo exclua a definiзгo se estiver usando linux, caso contrбrio deixe em seu game mode.

pawn Код:
stock Fini_SaveFile(sFile[])
{
    iFile = fopen(sFile,io_write),
        sTemp[0] = EOS;

    iLoop = 0x0;
    while((sCacheKeys[iLoop][0x0]) && (iLoop < MaxLines)) {

        #if defined WINDOWS
        format(sTemp,MaxKeys,"%s=%s\r\n",sCacheKeys[iLoop],sCacheValue[iLoop]);
        #else
        format(sTemp,MaxKeys,"%s=%s\n",sCacheKeys[iLoop],sCacheValue[iLoop]);
        #endif
        fwrite(iFile,sTemp);
        ++iLoop;
    }
    return fclose(iFile);
}
Parabйns, neste momento o Fini estarб aptado para funcionar em linux ou windows sem perder a mнnima velocidade.

pawn Код:
/*////////////////////////////////////////////////////////////////////////////////

                     _ ____        _____          __  __
                    (_)  _ \ ___  |_   _|__  __ _|  \/  |
                    | | |_) / __|   | |/ _ \/ _` | |\/| |
                    | |  __/\__ \   | |  __/ (_| | |  | |
                    |_|_|   |___/   |_|\___|\__,_|_|  |_|

                        Intelligent Programming Style ®

                         ____________________________
http://www.ips-team.blogspot.com
http://www.ips-team.forumeiros.com
____________________________

Created By DraKiNs & SlashPT
Thanks to [iPs]TeaM and Jhony

*/

////////////////////////////////////////////////////////////////////////////////

//========= [ Configs of Read/Write Files ] ====================================

#define MaxLines    (999)
#define MaxKeys     (064)

#define Fini_GetBool(%0)    (bool:strval(Fini_GetStr(%0)))
#define Fini_GetValue(%0)   (strval(Fini_GetStr(%0)))
#define Fini_Exists(%0)     (fexist(%0))
#define Fini_GetFloat(%0)   floatstr(Fini_GetStr(%0))
#define Fini_Remove(%0)     (fremove(%0))

#define WINDOWS //delete if use linux
//========= [ Variables of Set/Get Ini ] ========================================

new
sCacheKeys[MaxLines][MaxKeys],
sCacheValue[MaxLines][MaxKeys],
iLoop           = 0x0,
iFind           = 0x0,
iKeySet         = 0x0,
File:iFile      = File:0,
sTemp[MaxKeys]  = " ";

//============ [ Functions ] ================================================

//Get ~ Read Functions
stock Fini_GetStr(sKey[])
{
    iLoop = 0x0;
    while((sCacheKeys[iLoop][0x0]) && (iLoop < MaxLines)) {
        if(!strcmp(sCacheKeys[iLoop],sKey,false))
            return sCacheValue[iLoop];
        ++iLoop;
    }
    return sCacheKeys[0];
}


//Others Funcions
stock   Fini_Create(sFile[])
{
    if(Fini_Exists(sFile)) return false;
    iFile = fopen(sFile,io_write);
    return fclose(iFile);
}


stock Fini_OpenFile(sFile[])
{
    iFile = fopen(sFile,io_read),
        iFind   = 0x0;
    iLoop = 0x0;

    while(fread(iFile,sTemp)) {
        sTemp[strlen(sTemp) - 2] = EOS;
        iFind   = strfind(sTemp,"=");
        format(sCacheValue[iLoop],MaxKeys,sTemp[iFind + 1]);
        sTemp[iFind] = EOS;
        format(sCacheKeys[iLoop],MaxKeys,sTemp);
        ++iLoop;
    }
    return fclose(iFile);
}


stock Fini_SaveFile(sFile[])
{
    iFile = fopen(sFile,io_write),
        sTemp[0] = EOS;

    iLoop = 0x0;
    while((sCacheKeys[iLoop][0x0]) && (iLoop < MaxLines)) {

        #if defined WINDOWS
        format(sTemp,MaxKeys,"%s=%s\r\n",sCacheKeys[iLoop],sCacheValue[iLoop]);
        #else
        format(sTemp,MaxKeys,"%s=%s\n",sCacheKeys[iLoop],sCacheValue[iLoop]);
        #endif
        fwrite(iFile,sTemp);
        ++iLoop;
    }
    return fclose(iFile);
}

stock Fini_CloseFile()
{
    sCacheKeys[0][0]    =   EOS;
    sCacheValue[0][0]   =   EOS;
    iLoop               =   0x0;
    iFind               =   0x0;
    iKeySet             =   0x0;
    sTemp[0]            =   EOS;
    return true;
}


stock Fini_IsSet(sTag[])
{
    iLoop = 0x0;
    while((sCacheKeys[iLoop][0x0]) && (iLoop < MaxLines)) {
        if(!strcmp(sCacheKeys[iLoop],sTag,false)) {
            return true;
        }
        iLoop++;
    }
    return false;
}


//Set ~ Write Functions

stock Fini_SetStr(sKey[],sValue[])
{
    iLoop = 0x0;
    while((sCacheKeys[iLoop][0x0]) && (iLoop < MaxLines)) {
        if(!strcmp(sCacheKeys[iLoop],sKey,false)) {
            sCacheValue[iLoop][0] = EOS;
            strcat(sCacheValue[iLoop],sValue);
            iKeySet = 1;
        }
        ++iLoop;
    }
    if(!iKeySet) {
        while(sCacheKeys[iLoop][0]) iLoop++;
        strcat(sCacheValue[iLoop],sValue);
        strcat(sCacheKeys[iLoop],sKey);
    }
    return EOS;
}


stock Fini_SetFloat(sTag[],Float:iVal)
{
    format(sTemp,MaxKeys,"%f",iVal);
    return Fini_SetStr(sTag,sTemp);
}


stock Fini_SetVal(sTag[],iVal)
{
    format(sTemp,MaxKeys,"%d",iVal);
    return Fini_SetStr(sTag,sTemp);
}


stock Fini_SetBool(sTag[],bool:iVal)
{
    format(sTemp,MaxKeys,"%d",iVal);
    return Fini_SetStr(sTag,sTemp);
}
Abraзos
Reply
#6

Qual a diferenзa de usar ++ antes da int ?

Vou dar uma exemplo:
PHP код:
for(new i10; ++i
e
PHP код:
for(new i10i++) 
Qual a diferenзa ?

:B
Reply
#7

Mais rбpido.

@scriptertroll

Poste no tуpico dele.
O problema й que FINI estб com alguns bugs, por isso ele criou o file.
E realmente, estб com bugs.
DraKins foi banido entгo, nгo tem como ele atualizar o FINI.

#ps 4000 MAX_PLAYERS

Pra que 4000 de max players, nгo precisa colocar um nъmero surreal de jogadores assim..
Reply
#8

Уtimo
atй o momento utilizando esta include, nгo estou tendo mais o problema que havia tendo com Fini, de salvar valores de um arquivo em outro, e bom que ainda continua rбpido como Fini.
Reply
#9

Muito bom, e parece ter menos Bugs do que a Fini.
Boa INC
Reply


Forum Jump:


Users browsing this thread: 4 Guest(s)