- O que й y_ini?
- Onde posso encontra-la?
- Como utilizar?
- Escrita
- Leitura
- INI_Load (Leitura)
- Funзхes
- INI_ParseFile (Leitura)
- Contas de usuбrio
- Verificando se um arquivo existe
- 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.
- A include faz parte da YSI(******'s Script Includes), onde pode ser encontrada.
- 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
- 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 Код:
- 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);
}
- 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);
- 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");
}
• 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).
• 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".
- 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.
- Partes deste tutorial foram retirados do tutoriais como cуdigos, exemplos e trechos. Onde os crйditos vгo para o mesmo.