[Tutorial] Usando y_ini
#1

• Нndice
  • O que й y_ini?
  • Onde posso encontra-la?
  • Como utilizar?
  • Escrita
  • Leitura
  • INI_Load (Leitura)
  • Funзхes
  • INI_ParseFile (Leitura)
    • Contas de usuбrio
  • Outros
    • Salvando e carregando dados de um usuбrio
    • Verificando se um arquivo existe
  • Consideraзхes finais
• O que й y_ini?
  • y_ini й uma include desenvolvida por ****** que tem como o objetivo misturar praticidade, simplicidade e velocidade na hora de trabalhar com leitura e escrita de dados em sa-mp pawn.
• Onde posso encontra-la?
  • A include faz parte da YSI(******'s Script Includes), onde pode ser encontrada neste tуpico.
• Como utilizar?
  • Para utilizar a include, simplesmente inclua a include a seu script:
    pawn Код:
    #include <YSI\y_ini>
  • Caso vocк queira salvar whirlpool hashes com este sistema, vocк precisa aumentar o tamanho mбximo do buffer:
    pawn Код:
    #define MAX_INI_ENTRY_TEXT 160
    #include <YSI\y_ini>
• Escrita
  • Escrever com y_ini й bastante simples e bem similar a outras sistemas ini de leitura e escrita de dados. Resumidamente, vocк abre um arquivo, escreve os dados e fecha o arquivo:
    pawn Код:
    // O nome do arquivo pode ser uma string array ou o texto literal.
    new fileToWrite[] = "mine.INI",

    // "INI_Open" retorna uma variбvel com a tag "INI".
    INI:iniFile = INI_Open(fileToWrite);

    //
    // y_ini suporta tags, isto й:
    //
    //  [tag]
    //  chave = valor
    //
    INI_SetTag(iniFile, "exemplos");

    // Escreve um valor inteiro com a chave "algum_inteiro" dentro da tag atual:
    INI_WriteInt(iniFile, "algum_inteiro", 42);

    // Agora, fecha o arquivo atual.
    INI_Close(iniFile);
  • O resultado do cуdigo acima serб um arquivo criado na pasta "scriptfiles" chamada "mine.INI" contendo:
    Код:
    [exemplos]
    algum_inteiro = 42
  • Por padrгo, y_ini insere um espaзo entre a chave e o sнmbolo de igualdade e entre o sнmbolo de igualdade e o valor. Isto й vбlido em um arquivo INI, no entanto, isto nгo й suportado pela include dini, significando que arquivos criados atravйs da y_ini nгo podem ser lidos pela dini(de acordo com ******, isto poderб ser alterado em futuras versхes).
• Leitura
  • Existem duas maneiras de leitura, uma й quando o nome do arquivo jб й conhecido antecipadamente. A outra й quando nгo, ou quando mais controle sob o arquivo й necessбrio.
  • Um exemplo da primeira maneira seria, por exemplo, as configuraзхes de um gamemode, onde todas as configuraзхes estariam armazenadas em um arquivo, e o nome deste arquivo й provavelmente conhecido na hora de compilar.
  • Um exemplo da segunda maneira й um sistema de usuarios, o nome dos arquivos dependem do nome dos jogadores, sendo impossнvel saber o nome dos mesmo antes deles se conectarem.
  • Ambos os metodos sгo baseados em callbacks, mas um й bem mais simples que o outro.
• INI_Load (Leitura)
  • Quando o nome de um arquivo jб й conhecido, "INI_Load" pode ser usada com funзхes "INI:" especiais. Como por exemplo, o exemplo escrito acima do arquivo chamado "mine.INI". Se o nome de um arquivo serб sempre o mesmo, entгo a estrutura bбsica para a leitura deste arquivo serб:
    pawn Код:
    INI:nome_do_arquivo[exemplos](name[], value[])
    {
    }

    main()
    {
        INI_Load("nome_do_arquivo.INI");
    }
  • Vocк pode ler mais de um arquivo ao mesmo tempo.
    pawn Код:
    INI:arquivo1[exemplos](name[], value[])
    {
    }

    INI:arquivo2[exemplos](name[], value[])
    {
    }

    main()
    {
        INI_Load("arquivo1.INI");
        INI_Load("arquivo2.INI");
    }
  • A funзгo "INI:" tem a seguinte estrutura:
    pawn Код:
    INI:nome_do_arquivo[nome_da_tag](name[], value[])
    {
    }
  • Para ler dados em tags diferentes usando "INI_Load", usamos da seguinte forma:
    pawn Код:
    // Variбveis para armazenar os valores a serem lidos.
    new
        gSomeInteger,
        Float:gAFloat,
        gTheString[32];

    // mine й o nome do arquivo - exemplos й o nome da tag
    INI:mine[exemplos](name[], value[])
    {
        if (!strcmp(name, "some_integer"))
        {
            gSomeInteger = strval(value);
            return;
        }
    }

    // mine й o nome do arquivo - mais_exemplos й o nome da tag
    INI:mine[mais_exemplos](name[], value[])
    {
        if (!strcmp(name, "a_float"))
        {
            gAFloat = floatstr(value);
            return;
        }
        if (!strcmp(name, "the_string"))
        {
            strcpy(gTheString, value, sizeof (gTheString));
            return;
        }
    }

    // Lendo o arquivo ao iniciar o script.
    main()
    {
        INI_Load("mine.INI");
    }
  • y_ini tem suas prуprias funзхes para facilitar a leitura de dados para nгo precisarmos ficar comparando string e formatando valores para passar para variбveis. Usando as funзхes da y_ini o cуdigo acima ficaria assim:
    pawn Код:
    // Variбveis para armazenar os valores a serem lidos.
    new
        gSomeInteger,
        Float:gAFloat,
        gTheString[32];

    // mine й o nome do arquivo - exemplos й o nome da tag
    INI:mine[exemplos](name[], value[])
    {
        // INI_Int procura pela chave "some_integer" e atribui o valor encontrado a variбvel gSomeInteger.
        INI_Int("some_integer", gSomeInteger);
    }

    // mine й o nome do arquivo - mais_exemplos й o nome da tag
    INI:mine[mais_exemplos](name[], value[])
    {
        // INI_Int procura pela chave "a_float" e atribui o valor encontrado a variбvel gAFloat.
        INI_Int("a_float", gAFloat);

        // "INI_String" tem um parвmetro para definir o tamanho maximo da string e ele precisa ser usado!
        INI_String("the_string", gTheString, sizeof(gTheString));
    }

    main()
    {
        // Lendo o arquivo ao iniciar o script.
        INI_Load("mine.INI");
    }
  • O cуdigo final destes exemplos ficaria assim:

    pawn Код:
    // Variбveis para armazenar os valores a serem lidos.
    new
        gSomeInteger,
        Float:gAFloat,
        gTheString[32];

    // Funзгo para carregar os dados da seзгo(tag) "exemplos" do arquivo "mine".
    INI:mine[exemplos](name[], value[])
    {
        INI_Int("some_integer", gSomeInteger);
    }

    // Funзгo para carregar os dados da seзгo(tag) "mais_exemplos" do arquivo "mine".
    INI:mine[mais_exemplos](name[], value[])
    {
        INI_Int("a_float", gAFloat);
        INI_String("the_string", gTheString, sizeof (gTheString));
    }

    main()
    {
        // Lendo o arquivo ao iniciar o script.
        INI_Load("mine.INI");

        // Carregamento do arquivo completo, mostrando resultados.
        printf("exemplos->some_integer = %d", gSomeInteger);
        printf("mais_exemplos->a_float = %.2f", gAFloat);
        printf("mais_exemplos->the_string = %s", gTheString);
    }
• Funзхes
  • INI_Int(name[], variable);
    name[] - Nome da chave a ser procurada em um arquivo.
    variable - Variбvel para armazenar o valor.

    - Lк o valor de um inteiro do arquivo de uma determinada chave e armazena em uma variбvel, exemplo:
    pawn Код:
    INI:nome_do_arquivo[nome_da_tag](name[], value[])
    {
        INI_Int("NIVEL", gNivel);
    }
  • INI_Float(name[], variable);
    name[] - Nome da chave a ser procurada em um arquivo.
    variable - Variбvel para armazenar o valor.

    - Lк o valor de um float do arquivo de uma determinada chave e armazena em uma variбvel, exemplo:
    pawn Код:
    INI:nome_do_arquivo[nome_da_tag](name[], value[])
    {
        INI_Float("POSX", gfPosX);
    }
  • INI_Hex(name[], variable);
    name[] - Nome da chave a ser procurada em um arquivo.
    variable - Variбvel para armazenar o valor.

    - Lк o valor de um hex do arquivo de uma determinada chave e armazena em uma variбvel, exemplo:
    pawn Код:
    INI:nome_do_arquivo[nome_da_tag](name[], value[])
    {
        INI_Hex("COLOR", gColor);
    }
  • INI_Bin(name[], variable);
    name[] - Nome da chave a ser procurada em um arquivo.
    variable - Variбvel para armazenar o valor.

    - Lк o valor de um binбrio do arquivo de uma determinada chave e armazena em uma variбvel, exemplo:
    pawn Код:
    INI:nome_do_arquivo[nome_da_tag](name[], value[])
    {
        INI_Bin("BIN", gBin);
    }
  • INI_Bool(name[], variable);
    name[] - Nome da chave a ser procurada em um arquivo.
    variable - Variбvel para armazenar o valor.

    - Lк o valor de uma bool do arquivo de uma determinada chave e armazena em uma variбvel, exemplo:
    pawn Код:
    INI:nome_do_arquivo[nome_da_tag](name[], value[])
    {
        INI_Bool("ALLOWTELEPORT", gbAllowTeleport);
    }
  • INI_String(name[], variable, length);
    name[] - Nome da chave a ser procurada em um arquivo.
    variable - Variбvel para armazenar o valor.
    length - Tamanho da string destino.

    - Lк o valor de uma string do arquivo de uma determinada chave e armazena em uma variбvel, exemplo:
    pawn Код:
    INI:nome_do_arquivo[nome_da_tag](name[], value[])
    {
        INI_String("SERVERMESSAGE", gaServerMessage, sizeof(gaServerMessage));
    }
  • INI_Load(filename[], bool:bExtra, extra, bLocal);
    filename[] - Nome do arquivo a ser carregado.
    bExtra - Envia dados adicionais.
    extra - Dados adicionais a serem enviados.
    bLocal - Chama funзхes locais ao invйs de globais.

    - Esta funзгo lк todo o arquivo. Tudo, exceto o nome do arquivo й opcional.
    pawn Код:
    // Lк um arquivo
    INI_Load(nome_do_arquivo);
    pawn Код:
    // Lк um arquivo e envia informaзхes adicionais, neste caso o ID de um jogador.
    INI_Load(filename, true, playerid);

    INI:filename[tag](playerid, name[], value[])
    {
    }
    pawn Код:
    // Carrega um arquivo e envia as informaзхes carregadas a todos scripts que estгo rodando.
    INI_Load(filename, .bLocal = false);
  • INI_Open(filename[]);
    filename[] - Nome do arquivo a ser aberto.

    - Esta funзгo abre um arquivo para escrita. Exemplo:
    pawn Код:
    new INI:iniFile = INI_Open("mine.INI");
  • INI_Close(INI:file);
    INI:file - Variбvel INI de um arquivo.

    - Esta funзгo fecha o arquivo que estava sendo escrito. Exemplo:
    pawn Код:
    new INI:iniFile = INI_Open("mine.INI");
    // Escrever algo em um arquivo
    INI_Close(iniFile);
  • INI_SetTag(INI:file, tag[]);
    INI:file - Variбvel INI de um arquivo.
    tag[] - Nome da tag a ser escrita.

    - Esta funзгo cria uma nova TAG para escrever dados dentro dela, caso a TAG jб exista os dados sгo escritos dentro dela, exemplo:
    pawn Код:
    new INI:iniFile = INI_Open("mine.INI");
    INI_SetTag(iniFile, "exemplo");
    // Escreve dados na TAG exemplo.
    INI_Close(iniFile);
  • INI_RemoveEntry(INI:file, tag[]);
    INI:file - Variбvel INI de um arquivo.
    tag[] - Nome da tag a ser verificada.

    - Esta funзгo remove uma chave(e seus valores) de um arquivo da tag atual, exemplo:
    pawn Код:
    new INI:iniFile = INI_Open("mine.INI");
    INI_SetTag(iniFile, "exemplo");
    //Remove a chave dinheiro(e seus valores) do arquivo "mine.INI" da TAG "exemplo".
    INI_RemoveEntry(iniFile, "Dinheiro");
    INI_Close(iniFile);
  • INI_WriteString(INI:file, name[], data[]);
    INI:file - Variбvel INI de um arquivo.
    name[] - Nome da chave para escrever os dados.
    data[] - Dados a serem escritos nesta chave.

    - Esta funзгo escreve uma string em um arquivo, exemplo:
    pawn Код:
    new INI:iniFile = INI_Open("mine.INI");
    INI_SetTag(iniFile, "exemplo");
    INI_WriteString(iniFile, "Senha", "123");
    INI_Close(iniFile);
  • INI_WriteInt(INI:file, name[], data);
    INI:file - Variбvel INI de um arquivo.
    name[] - Nome da chave para escrever os dados.
    data - Dados a serem escritos nesta chave.

    - Esta funзгo escreve um inteiro em um arquivo, exemplo:
    pawn Код:
    new INI:iniFile = INI_Open("mine.INI");
    INI_SetTag(iniFile, "exemplo");
    INI_WriteInt(iniFile, "Dinheiro", 7331);
    INI_Close(iniFile);
  • INI_WriteHex(INI:file, name[], data);
    INI:file - Variбvel INI de um arquivo.
    name[] - Nome da chave para escrever os dados.
    data - Dados a serem escritos nesta chave.

    - Esta funзгo escreve um inteiro no formato hexadecimal(0x1F182) em um arquivo, exemplo:
    pawn Код:
    new INI:iniFile = INI_Open("mine.INI");
    INI_SetTag(iniFile, "exemplo");
    INI_WriteHex(iniFile, "FreeColors", 0x1F1829FF);
    INI_Close(iniFile);
  • INI_WriteBool(INI:file, name[], data);
    INI:file - Variбvel INI de um arquivo.
    name[] - Nome da chave para escrever os dados.
    data - Dados a serem escritos nesta chave.

    - Esta funзгo escreve um bool em um arquivo, exemplo:
    pawn Код:
    new INI:iniFile = INI_Open("mine.INI");
    INI_SetTag(iniFile, "exemplo");
    INI_WriteBool(iniFile, "TeleportAllowed", true);
    INI_Close(iniFile);
  • INI_WriteBin(INI:file, name[], data);
    INI:file - Variбvel INI de um arquivo.
    name[] - Nome da chave para escrever os dados.
    data - Dados a serem escritos nesta chave.

    - Esta funзгo escreve um inteiro no formato de um binбrio (0b1001010) em um arquivo, exemplo:
    pawn Код:
    new INI:iniFile = INI_Open("mine.INI");
    INI_SetTag(iniFile, "exemplo");
    INI_WriteBin(iniFile, "SomeValue", 0b1001010);
    INI_Close(iniFile);
  • INI_WriteFloat(INI:file, name[], data);
    INI:file - Variбvel INI de um arquivo.
    name[] - Nome da chave para escrever os dados.
    data - Dados a serem escritos nesta chave.

    - Esta funзгo escreve um float em um arquivo, exemplo:
    pawn Код:
    new INI:iniFile = INI_Open("mine.INI");
    INI_SetTag(iniFile, "exemplo");
    INI_WriteFloat(iniFile, "PosX", 1745.15);
    INI_Close(iniFile);
• INI_ParseFile (Leitura)
  • Esta funзгo nгo foi explicada no tуpico anterior para dar-mos mais enfвse aqui, ela й uma funзгo chamada pela INI_Load.
    • INI_ParseFile
      filename[] - Arquivo a ser carregado.
      remoteFormat[] - Qual funзгo chamar.
      bool:bFileFirst - Qual ordem para formatar a funзгo.
      bool:bExtra - Enviar dados adicionais.
      extra - Dado adicional a ser enviado.
      bLocal - Chamar funзхes locais ao invez de globais.
      bool:bPassTag - Qual dados extra passar.
    • Usando o exemplo do INI_Load escrito anteriormente, passando de INI_Load para INI_ParseFile, o exemplo anterior ficaria assim:
    pawn Код:
    new
        gSomeInteger,
        Float:gAFloat,
        gTheString[32];

    forward ini_exemplos_mine(name[], value[]);

    public ini_exemplos_mine(name[], value[])
    {
        INI_Int("some_integer", gSomeInteger);
    }

    forward ini_mais_exemplos_mine(name[], value[]);

    public ini_mais_exemplos_mine(name[], value[])
    {
        INI_Int("a_float", gAFloat);
        INI_String("the_string", gTheString, sizeof (gTheString));
    }

    main()
    {
        INI_ParseFile("mine.INI", "ini_%s_%s");
    }
  • O primeiro %s й o nome da TAG o segundo %s й o nome do arquivo(e ambos sгo OPCIONAIS).

    • Agora vamos passar parte por parte.
    pawn Код:
    // Isto:
    INI:mine[exemplos](name[], value[])

    // Se torna isto:
    forward ini_exemplos_mine(name[], value[]);
    public ini_exemplos_mine(name[], value[])
    pawn Код:
    // Isto:
    INI_Load("mine.INI");

    // Se torna isto:
    INI_ParseFile("mine.INI", "ini_%s_%s");
    • Repetindo, o primeiro %s й o nome da TAG o segundo %s й o nome do arquivo(e ambos sгo OPCIONAIS).
    • Contas de usuбrio

      • Um melhor modo de entender isto й usando contas de usuбrios.
      pawn Код:
      public OnPlayerConnect(playerid)
      {
          new playerName[MAX_PLAYER_NAME];
          GetPlayerName(playerid, playerName, MAX_PLAYER_NAME);

          new userFile[32];
          format(userFile, sizeof (userFile), "users/%s.ini", playerName);

          INI_ParseFile(userFile, "load_user_data", .bExtra = true, .extra = playerid);
      }

      forward load_user_data(playerid, name[], value[])
      public load_user_data(playerid, name[], value[])
      {
          INI_Float("health", gPlayerData[playerid][E_PLAYER_HEALTH]);
          INI_Int("money",    gPlayerData[playerid][E_PLAYER_MONEY]);
          return 1;
      }
      • O exemplo acima carrega a conta de um jogador apуs ele se conectar ao servidor, agora vamos estudar parte por parte.

      pawn Код:
      // ...
          INI_ParseFile(userFile, "load_user_data", .bExtra = true, .extra = playerid);
      }
      • Aqui obtemos o nome do jogador(que tambйm serб o nome do arquivo - userFile)
      • Depois dizemos qual funзгo iremos chamar(load_user_data)
      • Entгo dizemos que enviaremos dados adicionais, que й o ID do jogador(.bExtra = true).
      • E por fim, dizemos qual й o valor do dado adicional(.extra = playerid).

      • E aqui й a funзгo que serб chamada pelo ParseFile carregando os dados do jogador.
      pawn Код:
      forward load_user_data(playerid, name[], value[])
      public load_user_data(playerid, name[], value[])
      {
          INI_Float("health", gPlayerData[playerid][E_PLAYER_HEALTH]);
          INI_Int("money",    gPlayerData[playerid][E_PLAYER_MONEY]);
          return 1;
      }
      • Poderiamos fazer isso com TAGS:
      pawn Код:
      public OnPlayerConnect(playerid)
      {
          new playerName[MAX_PLAYER_NAME];
          GetPlayerName(playerid, playerName, MAX_PLAYER_NAME);

          new userFile[32];
          format(userFile, sizeof (userFile), "users/%s.ini", playerName);

          // %s й a TAG.
          INI_ParseFile(userFile, "load_user_data_%s", .bExtra = true, .extra = playerid);
      }

      forward load_user_data_roleplay(playerid, name[], value[])
      public load_user_data_roleplay(playerid, name[], value[])
      {
          INI_Float("health", gPlayerData[playerid][E_PLAYER_HEALTH]);
          INI_Int("money",    gPlayerData[playerid][E_PLAYER_MONEY]);
          return 1;
      }
      • Aqui carregamos os dados do jogador da TAG "roleplay".
• Outros
  • Salvando e carregando dados de um usuбrio
    pawn Код:
    // Variбveis para armazenar as coordenadas:
    enum E_PLAYER_DATA
    {
        Float:E_PLAYER_POSX,
        Float:E_PLAYER_POSY,
        Float:E_PLAYER_POSZ
    }
    new gPlayerData[MAX_PLAYERS][E_PLAYER_DATA];


    // Carregando dados ao se conectar:
    public OnPlayerConnect(playerid)
    {
        // Й aconselhado fazer isto apуs verificar se o jogador estб logado em uma conta.
        INI_ParseFile(userFile, "LoadPlayerAccount", .bExtra = true, .extra = playerid);
        SetPlayerPos(playerid, gPlayerData[playerid][E_PLAYER_POSX], gPlayerData[playerid][E_PLAYER_POSY], gPlayerData[playerid][E_PLAYER_POSZ]);
        return 1;
    }

    forward LoadPlayerAccount(playerid, name[], value[]);
    public LoadPlayerAccount(playerid, name[], value[])
    {
        new playerName[MAX_PLAYER_NAME];
        GetPlayerName(playerid, playerName, MAX_PLAYER_NAME);

        new userFile[32];
        format(userFile, sizeof (userFile), "users/%s.ini", playerName);

        INI_Float("LOAD_POS_X", gPlayerData[playerid][E_PLAYER_POSX]);
        INI_Float("LOAD_POS_Y", gPlayerData[playerid][E_PLAYER_POSY]);
        INI_Float("LOAD_POS_Z", gPlayerData[playerid][E_PLAYER_POSZ]);
    }

    // Salvando dados ao desconectar:
    public OnPlayerDisconnect(playerid, reason)
    {
        // Й aconselhado fazer isto apуs verificar se o jogador estб logado em uma conta.
        SavePlayerAccount(playerid);
        return 1;
    }

    stock SavePlayerAccount(playerid)
    {
        new playerName[MAX_PLAYER_NAME];
        GetPlayerName(playerid, playerName, MAX_PLAYER_NAME);

        new userFile[32];
        format(userFile, sizeof (userFile), "users/%s.ini", playerName);

        new Float:fPos[3];
        GetPlayerPos(playerid, fPos[0], fPos[1], fPos[2]);

        new INI:ini = INI_Open(userFile);

        INI_WriteFloat(ini, "LOAD_POS_X", fPos[0]);
        INI_WriteFloat(ini, "LOAD_POS_Y", fPos[1]);
        INI_WriteFloat(ini, "LOAD_POS_Z", fPos[2]);

        INI_Close(ini);
    }
    - Este cуdigo faz com que salve as coordenadas do jogador quando ele se desconectar e carregue-as apуs ele se conectar.
  • Verificando se um arquivo existe
    - Para verificar se um arquivo existe utilize a funзгo fexist do sa-mp.
• Consideraзхes finais
- Partes deste tutorial foram retirados do tutorial do ******, como cуdigos, exemplos e trechos. Onde os crйditos vгo para o mesmo.
Reply
#2

Уtimo tutorial e haja paciкncia para escrever tudo isso

Reputaзгo adicionada com sucesso
Reply
#3

Que tutorial bonito

Nunca usei y_ini, acho que й muita complicaзгo para pouca coisa. Mas gostei do tutorial, li por cima ... Nгo que seja complicado, mas ****** fez diferente, e eu nem dou-me o trabalho de aprender


Abraзos
Reply
#4

Que lindo tуpico.



Eu jб usei y_ini com sua ajuda.

Abraзos !
Reply
#5

Gostei.
Rep += 15;
Reply
#6

Pensei que vocк nгo gostava do nome Larceny :>
Reply
#7

Cara, уtimo tutorial, esse board, precisa de tutoriais assim !
Reputado !.
Reply
#8

Tutorial Completнssimo ^^

Sу nгo gosto muito de y_ini, й mais complicada que dof rsrs


Parabйns pela paciencia e pelo tуpico
Reputado
Reply
#9

Obrigado!

Quote:
Originally Posted by Stewie`
Посмотреть сообщение
Pensei que vocк nгo gostava do nome Larceny :>
Й, teve um tempo que eu nгo quis mais usa-lo, mas como muita gente ainda me chama de Larceny, decidi voltar as raнzes kk.
Reply
#10

Parabens pelo tutorial =p

Bem explicado
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)