SSGamers - 12 Anos online por você.

#SSGamers - A Comunidade que mais crescer no brasil!

Participe do fórum, é rápido e fácil

SSGamers - 12 Anos online por você.

#SSGamers - A Comunidade que mais crescer no brasil!

SSGamers - 12 Anos online por você.

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Chegou o novo tema 6.5.5 - SSGamers - Servidores online de qualidade - Aproveite e entre para nossa comunidade, inscreva-se já! - Ouça nossa web radio - Veja nossas novidades - Participe dos nossos setores de jogos online - Parcerias aberta fale já com um administrador.

    [Tutorial] Usando y_ini

    Weslley_Script
    Weslley_Script
    SS - Fundador
    SS - Fundador


    Steam Steam : WeslleySSGames
    Zello : WeslleySSGames
    Mensagens : 11378
    Moedas : 1031971
    Data de inscrição : 06/10/2011
    Idade : 28
    Localização : Brasil

    define - [Tutorial] Usando y_ini Empty [Tutorial] Usando y_ini

    Mensagem por Weslley_Script Sáb 3 Jun 2023 - 10:27

    • Н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_ni й uma include desenvolvida porque 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.


    • Como utilizar?
    • Para utilizar a include, simplesmente inclua a include a seu script:
      pawn Код:
      #include

    • 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



    • 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 Код:

      Código:
      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 Код:

      Código:
      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 Код:

      Código:
      INI:nome_do_arquivo[nome_da_tag](name[], value[])
      {
      }


    • Para ler dados em tags diferentes usando "INI_Load", usamos da seguinte forma:
      pawn Код:

      Código:
      // 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 Код:

      Código:
      // 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 Код:

      Código:
      // 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 Код:

      Código:
      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 Код:

      Código:
      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 Код:

      Código:
      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 Код:

      Código:
      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 Код:

      Código:
      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 Код:

      Código:
      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 Код:

      Código:
      // Lк um arquivo
      INI_Load(nome_do_arquivo);


      pawn Код:

      Código:
      // 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 Код:

      Código:
      // 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 Код:

      Código:
      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 Код:

      Código:
      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 Код:

      Código:
      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 Код:

      Código:
      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 Код:

      Código:
      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 Код:

      Código:
      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 Код:

      Código:
      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 Код:

      Código:
      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 Код:

      Código:
      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 Код:

      Código:
      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 Код:

      Código:
      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 Код:

      Código:
      // Isto:
      INI:mine[exemplos](name[], value[])

      // Se torna isto:
      forward ini_exemplos_mine(name[], value[]);
      public ini_exemplos_mine(name[], value[])


      pawn Код:

      Código:
      // Isto:
      INI_Load("mine.INI");



      // Se torna isto:

      Código:
      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 Код:

        Código:
        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 Код:

        Código:
        // ...
            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 Код:

        Código:
        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)

        Código:
        {
            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 Код:

      Código:
      // 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 tutoriais como cуdigos, exemplos e trechos. Onde os crйditos vгo para o mesmo.
    Creditos: Larceny



    define - [Tutorial] Usando y_ini D07Xwqb
    define - [Tutorial] Usando y_ini Yjab9HN

      Data/hora atual: Qua 1 maio 2024 - 23:35