In questa guida vi spiegherò come usare il y_ini.
Prima di tutto bisogna sapere che il y_ini è un sistema di gestione file simile al dini ma molto più veloce.
In questa pagina:
Click trovate il download di tutti gli include di y_less, però a noi per ora servirà soltanto il y_ini.
Prima di tutto dobbiamo sapere che il y_ini, come ogni include per la gestione dei file, ha delle funzioni per salvare variabili in un file e alcune per gettare variabili da un file già esistente.
Salvare nel File
Salvare nel file una variabile, cioè un numero intero, decimale o una stringa ecc..., è il lavoro più semplice, prima dobbiamo aprire il file, poi salviamo ciò che vogliamo ed infine richiudiamo il file, la struttura è molto simile al file, quindi chi sa usare il file capirà prima come fare, esempio:
Codice:
new INI:iniFile; //File INI che verrà aperto
INI:iniFile = INI_Open("Esempio.ini"); //aprirà il file nel percorso "CartellaServer/scriptfiles/Esempio.ini"
INI_Write(iniFile, "Esempio", "Ciao");
INI_Close(iniFile);
Come abbiamo visto nello script qua sopra, prima creiamo la variabile che conterrà il file, poi apriamo il file, scriviamo nel file "Esempio = Ciao" e infine chiudiamo il file
Ovviamente nei file si potranno salvare altre cose oltre le stringhe, qui sotto posto tutte le funzioni che potrete utilizzare per salvare Float, Interi, Hex, Binari, Variabili Booleane ecc...
- INI_Open(file[]); //Apre il file nel percorso indicato da "file", per poterci scrivere sopra
- INI_Close(file); //Chiude il file su cui abbiamo scritto qualcosa
- INI_WriteString(INI:file, key[], value[]);
Il INI_WriteString scrive nel file una stringa, esempio
Codice:
INI_WriteString(file, "Nome", "Giovanni");
Nel file troveremo scritto "Nome = Giovanni"
- INI_WriteInt(INI:file, key[], value);
Uguale al INI_WriteString solo che invece di scrivere una stringa scrive un numero, esempio:
Codice:
INI_WriteInt(file, "Numero", 4);
Nel file troveremo Numero = 4
- INI_WriteFloat(INI:file, key[], Float:value);
Uguale al INI_WriteInt, differenzia dal fatto che invece di salvare numeri interi salva numeri decimali
- INI_WriteHex(INI:file, key[], value);
Il INI_WriteHex salva nel file un esadecimale, esempio
Codice:
INI_WriteHex(file, "Nero", 0x000000FF);
Scriverà nel file: Nero = 0x000000FF
- INI_WriteBin(INI:file, key[], value);
Il INI_WriteBin salva nel file un Binario, esempio:
Codice:
INI_WriteBin(file, "Binario", 010101);
Scriverà nel file Binario = 010101
- INI_WriteBool(INI:file, key[], value);
Il INI_WriteBool scrive nel file la condizione della variabile booleana, cioè true o false, esempio:
Codice:
INI_WriteBool(file, "Registrato", false);
Scriverà nel file Registrato = false
- INI_RemoveEntry(INI:file, key[]);
Il INI_RemoveEntry elimina dal file una riga segnalata da key, esempio:
Codice:
INI_WriteInt(file, "Numero", 0);
INI_WriteString(file, "Stringa", "Ciao");
INI_RemoveEntry(file, "Numero");
Nel file troveremo scritto: Stringa = Ciao
questo perchè prima abbiamo scritto nel file: Numero = 0, ma poi con INI_RemoveEntry l'abbiamo cancellato.
Una specialità che troviamo nel y_ini sono le tag, ovvero targhette che verranno scritte nel file, la funzione è la seguente:
- INI_SetTag(file, tag[]);
Le tag servono per ordinare le righe inserite nel file.ini, ma possono essere anche omesse, le tag si possono rivelare utili nel momento in cui carichiamo da un file.
Codice:
INI_SetTag(file, "Esempio");
INI_WriteString(file, "Stringa", "Ciao");
Nel file troveremo scritto:
Codice:
[Esempio]
Stringa = Ciao
Caricare da un file
Dopo che il file verrà compilato e salvato, dovrà pur sempre servire a qualcosa, e qui dobbiamo gettare dal file i valori.
Col dini basta creare una variabile ed usare un = per settare il valore alla variabile, qui invece abbiamo due procedimenti, il primo lo utilizziamo quando conosciamo il nome del file.ini salvato mentre il secondo lo utilizziamo quando non sappiamo il nome del file salvato.
Il primo caso, per esempio, verrà utilizzato quando abbiamo creato un file di impostazioni per il server, il quale ha un nome già conosciuto dal momento della compilazione di pawn mentre il secondo caso può essere utilizzato per salvare gli account dei player, infatti quando compiliamo non possiamo sapere in anticipo il nome degli account del player.
Primo caso: INI_Load
Nel primo caso, cioè quando sappiamo il nome del file.ini, per caricare da un file useremo il INI_Load.
In questo caso dobbiamo creare una funzione simile a questa:
Codice:
INI:we[esempio](name[], value[])
{
return 1;
}
we sta ad indicare il nome del file mentre esempio è la tag setta quando abbiamo salvato il file, in questo modo leggeremo(nel file) soltanto le righe che si trovano sotto "[esempio]" e che si trovano sopra una altra targhetta
dentro questa funzione possiamo gettare dalle righe i valori molto semplicemente, esempio:
In un callback o funzione
Codice:
new Percorso[32];
new INI:File;
Percorso = "Percorso.ini";
File = INI_Open(Percorso);
INI_SetTag(File, "Info");
INI_WriteString(File, "Colore", "Blu");
INI_WriteFloat(File, "Vita", 100.0);
INI_Close(File);
Dove vogliamo che vengano gettati i file, io uso il main come esempio
Codice:
new health;
INI:Percorso[Info](name[], value[])
{
if(!strcmp(name, "Vita", false)) health = float(strval(value));
return 1;
}
main()
{
INI_Load(Percorso);
printf("Vita = %f", health);
}
Come possiamo vedere, INI_Load ripeterà ciò che ha c'è nella funzione INI:Percorso, però sempre sotto la tag [Info]
Nel file possiamo anche trovare più di una tag, esempio:
Codice:
new Percorso[32];
new INI:File;
Percorso = "Percorso.ini";
File = INI_Open(Percorso);
INI_SetTag(File, "Colore");
INI_WriteString(File, "Colore", "Blu");
INI_SetTag(File, "Info");
INI_WriteFloat(File, "Vita", 100.0);
INI_Close(File);
Codice:
new health, colore[8];
INI:Percorso[Colore](name[], value[])
{
if(!strcmp(name, "Colore", false)) colore = Name;
return 1;
}
INI:Percorso[Info](name[], value[])
{
if(!strcmp(name, "Vita", false)) health = float(strval(value));
return 1;
}
main()
{
INI_Load(Percorso);
printf("Vita = %f", health);
}
In Questo caso abbiamo creato due funzioni, in questo caso INI_Load avrà caricherà sia l'una che l'altra quindi se mettiamo nel main:
Codice:
main()
{
INI_Load(Percorso);
printf("Vita = %f", health);
printf("Colore = %s", colore);
}
Printerà:
Vita = 100.0
Colore = Blu
Come avete visto nelle funzioni io ho usato per esempio:
Codice:
if(!strcmp(name, "Vita", false)) health = float(strval(value));
potete anche usare le funzioni per caricare da un file, sono le seguenti:
- INI_Int(key[], dest);
Il INI_Int caricherà un valore dal file e lo attribuirà a dest, esempio:
Codice:
new destination;
INI_Int("Numero", destination);
a destination verrà dato il valore di "Numero"
- INI_String(key[], dest[], sizeof(dest));
Il INI_String caricherà una stringa dal file e la attribuirà a dest, esempio:
Codice:
new dest[12];
INI_String("Stringa", dest, 12);
dest prenderà la stringa che era stata attribuita alla key "Stringa"
- INI_Bool(key[], dest);
Il INI_Bool caricherà la condizione (true o false) di key e la darà a dest
- INI_Float(key[], Float:dest);
Il INI_Float caricherà il valore decimale di key e lo darà a dest
- INI_Hex(key[], dest); | INI_Bin(key[], dest);
INI_Hex e INI_Bin caricheranno il valore esadecimale o binario di key e lo daranno a dest
In questo modo lo script sopra:
Codice:
new health, colore[8];
INI:Percorso[Colore](name[], value[])
{
if(!strcmp(name, "Colore", false)) colore = Name;
return 1;
}
INI:Percorso[Info](name[], value[])
{
if(!strcmp(name, "Vita", false)) health = float(strval(value));
return 1;
}
main()
{
INI_Load(Percorso);
printf("Vita = %f", health);
}
Lo trasformeremo in:
Codice:
new health, colore[8];
INI:Percorso[Colore](name[], value[])
{
INI_String("Colore", colore, 8);
return 1;
}
INI:Percorso[Info](name[], value[])
{
INI_Float("Vita", health);
return 1;
}
main()
{
INI_Load(Percorso);
printf("Vita = %f", health);
}
Ma non cambierà assolutamente niente.
Secondo Caso: INI_ParseFile
Nel secondo caso useremo la funzione: INI_ParseFile grazie alla quale potremmo caricare da file di cui il compilatore non sa il nome come un account utente.
Prima di tutto spieghiamo cos'è il INI_ParseFile:
Il INI_ParseFile è simile al INI_Load, solo che è più avanzato e sfrutta più memoria, vediamo però cosa cambia:
Codice:
forward ini_Info_Percorso(name[], value[]);
public ini_Info_Percorso(name[], value[])
{
return 1;
}
main()
{
INI_ParseFile("Percorso.ini", "ini_%s_%s");
}
quindi cambia soltanto che la funzione diventa callback, per farvi capire meglio:
Codice:
INI:Percorso[Info](name[], value[])
diventa
forward ini_Info_Percorso(name[], value[]);
public ini_Info_Percorso(name[], value[])
mentre:
INI_Load(Percorso);
diventa
INI_ParseFile(Percorso, "ini_%s_%s");
Come possiamo vedere INI_ParseFile ha un parametro che INI_Load non ha, ovvero il nome della funzione da chiamare, il quale va lasciato così in questo caso
Codice:
forward Esempio_Info(name[], value[]);
public Esempio_Info(name[], value[])
{
return 1;
}
forward Esempio_Info2(name[], value[]);
public Esempio_Info2(name[], value[])
{
return 1;
}
main()
{
INI_ParseFile("we.ini", "Esempio_%s");
INI_ParseFile("ciao.ini", "Esempio_%s");
}
Come possiamo vedere abbiamo due file (we.ini e ciao.ini) che potrebbero caricare dalla stessa funzione, per ovviare a questo problema dobbiamo separarli tramite le Extra Data.
Extra Data
Le Extra data sono degli ulteriori parametri inseriti nel INI_ParseFile o nel INI_Load, esempio:
Codice:
new
Intero[2],
Float:Decimale[2],
Stringa[2][32];
forward Esempio_Info(idx, name[], value[]);
public Esempio_Info(idx, name[], value[])
{
INI_Int("Numero", Intero[idx]);
}
forward Esempio_Info2(idx, name[], value[]);
public Esempio_Info2(idx, name[], value[])
{
INI_Int("Decimale", Decimale[idx]);
INI_String("Stringa", Stringa[idx], sizeof (Stringa[]));
}
main()
{
INI_ParseFile("we.ini", "anyini_%s", .bExtra = true, .extra = 0);
INI_ParseFile("ciao.ini", "anyini_%s", .bExtra = true, .extra = 1);
}
Come possiamo vedere abbiamo aggiunto bExtra = true per indicare che metto un extra il quale poi sarà idx, nella prima funzione con valore 0, nella seconda con valore 1
File Untenti
Infine vi spiego come creare un account utente col nome del player
Codice:
enum Info
{
Float:health,
weapon,
pass[24]
}
new
PlayerInfo[MAX_PLAYERS][Info];
public User_Info(playerid, name[], value[])
{
INI_String("Password", PlayerInfo[playerid][pass], 24);
}
CMD:login(playerid, params[])
{
new
pName[24];
GetPlayerName(playerid, pName, 24);
new
userFile[32];
format(userFile, sizeof (userFile), "users\%s.ini", pName);
INI_ParseFile(userFile, "User_%s", .bExtra = true, .extra = playerid);
if(!strcmp(PlayerInfo[playerid][pass], params, false))
{
INI_Float("health", PlayerInfo[playerid][health]);
INI_Int("weapon", PlayerInfo[playerid][weapon]);
SendClientMessage(playerid, -1, "Ti sei loggato con successo");
}
else SendClientMessage(playerid, -1, "Password Sbagliata");
}
Guida finita, se non avete capito qualcosa chiedete pure
![Wink ;)](./images/smilies/icon_wink.gif)