02.01.2013, 16:08 
	(
 Последний раз редактировалось Larceny; 19.10.2014 в 13:45.
)
	
	
		• Нndice
- Partes deste tutorial foram retirados do tutorial do ******, como cуdigos, exemplos e trechos. Onde os crйditos vгo para o mesmo.
	
	
	
- 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
- 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.
- A include faz parte da YSI(******'s Script Includes), onde pode ser encontrada neste tуpico.
-  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>
-  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).
-   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.
-  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);
 }
- 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);
-  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.
 
 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");
 }
-  INI_ParseFile
-  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[])• Repetindo, o primeiro %s й o nome da TAG o segundo %s й o nome do arquivo(e ambos sгo OPCIONAIS).pawn Код:// Isto:
 INI_Load("mine.INI");
 // Se torna isto:
 INI_ParseFile("mine.INI", "ini_%s_%s");
 -  Contas de usuбrio
 
 • Um melhor modo de entender isto й usando contas de usuбrios.
 • O exemplo acima carrega a conta de um jogador apуs ele se conectar ao servidor, agora vamos estudar parte por parte.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;
 }
 
 • Aqui obtemos o nome do jogador(que tambйm serб o nome do arquivo - userFile)pawn Код:// ...
 INI_ParseFile(userFile, "load_user_data", .bExtra = true, .extra = playerid);
 }
 • 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.
 • Poderiamos fazer isso com TAGS: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;
 }
 • Aqui carregamos os dados do jogador da TAG "roleplay".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;
 }
 
-  Contas de usuбrio
-  Salvando e carregando dados de um usuбrio
 - Este cуdigo faz com que salve as coordenadas do jogador quando ele se desconectar e carregue-as apуs ele se conectar.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);
 }
-  Verificando se um arquivo existe
 - Para verificar se um arquivo existe utilize a funзгo fexist do sa-mp.
- Partes deste tutorial foram retirados do tutorial do ******, como cуdigos, exemplos e trechos. Onde os crйditos vгo para o mesmo.







 
	







