[Tutorial] Uso de Y_INI
#1

Uso de Y_INI
Hola a todos, he decidido crear este tutorial porque en la secciуn espaсola hay gente que tiene dudas sobre el funcionamiento de Y_INI o no sabe como funciona.

En este tutorial, me estarй basando entre mis conocimientos, en el tutorial original de ****** y la wiki.sa-mp/ysi

Si tienes conocimientos con Dini, poco a poco entenderбs como funciona este. se te harб mas facil..

- Que es Y_INI?

Y_INI, actualmente es el include, codigo, sistema o como quieran llamarlo, mas rapido en guardar datos en una extensiуn .ini (tambien en otras ej: .cfg. txt etc)

- Descarga

Lo puedes descargar desde el topic de ******

https://sampforum.blast.hk/showthread.php?tid=321092

- Uso

Principalmente, tienes que declarar que vas a usar dicho include, queda asн

pawn Код:
#include <YSI\y_ini>
Recuerda que tiene que estar declarado debajo de #include <a_samp>.

OJO: Si deseas guardar una contraseсa con WHIRPOOL (whirlpool hashes) con este sistema. tienes que aumentar el tamaсo bъfer del .AMX

pawn Код:
#define MAX_INI_ENTRY_TEXT 160
#include <YSI\y_ini>
- Leyendo archivos..

Para leer archivos, y datos que contiene ese archivo ahi dos formas

-INI_Load
-INI_ParseFile


explicarй primero el funcionamiento de INI_Load.
  • INI_Load
Si tienes conocimientos con Dini, sabrбs que para guardar un dato o varios datos tu escribнas el cуdigo de esta siguiente manera.


pawn Код:
// definiremos las variables que utilizaremos...
new Var1;
new Float:Var2;
new Var3[5] = Hola;

Var1 = dini_Get("miarchivo.ini", "a");
Var2 = dini_Get("miarchivo.ini", "b");
Var3 = dini_Get("miarchivo.ini", "c");
y asн quedarнa en el archivo (en este caso, "miarchivo.ini")

pawn Код:
a = 1
b = 2.02223
c = Hola
Asi que, en Y_INI serб mucho mas eficiente y cуmodo, ya que leeras el archivo una vez sin tener que hacerlo una y otra vez (caso Dini)

para sacar/cargar los datos que estбn guardados, serнa asн

pawn Код:
INI:miarchivo[](name[], value[])
{
    INI_Int("a", Var1);
    INI_Float("b", Var2);
    INI_String("c", Var3, Longitud_de_Var3); // la longitud en este caso de Var3, es 5 ya que Var3[5]; "5" es la longitud, las celdas que definistes.
    return 0; // Se tiene que retornar 0, segъn ******.
}
y lo cargarнas por un comando, cuando un jugador se conecta (OnPlayerConnect) como tu quieras

pawn Код:
CMD:cargardatos(playerid, params[])
{
    INI_Load("miarchivo.ini");
    SendClientMessage(playerid, -1, "Los datos de \"miarchivo.ini\" se han cargado con йxito!");
    return 1;
}
  • INI_ParseFile
Lo mismo que lo que dije arriba, definiremos Var1 Var2 .... y lo cargaremos despuйs, pero estб vez es diferente, ya que INI_ParseFile carga los archivos de esta forma y son para playerid..

pawn Код:
// como arriba, definiremos las variables
new Var1;
new Var2;
new Var3;

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

CMD:cargardatos(playerid, params[])
{
    INI_ParseFile("miarchivo.ini", "CargarDatos");
    SendClientMessage(playerid, -1, "Los datos de \"miarchivo.ini\" se han cargado con йxito!");
    return 1;
}

public CargarDatos_Datos(name[], value[])
{
    INI_Int("a", Var1);
    INI_Float("b", Var2);
    INI_String("c", Var3, Longitud_de_Var3); // la longitud en este caso de Var3, es 5 ya que Var3[5]; "5" es la longitud, las celdas que definistes.
    return 1;    
}
quedarнa asн en el archivo .ini

pawn Код:
[Datos]
a = 1
b = 2.02223
c = Hola
OJO: es necesario usar un tag/identificador en INI_ParseFile. eso responde a tu pregunta porque el Datos despuйs del " _ " ( CargarDatos_Datos )

- Guardando/escribiendo archivos/datos..

Para escribir datos tendremos que declarar que vamos a abrir el archivo y allн procederemos a escribir o reemplazar los datos..

En este caso le pondrй un ejemplo diferente al anterior.. esta vez guardando datos de un jugador

pawn Код:
CMD:modificar(playerid, params[])
{
    new celdas[5] = "Hola";
    new INI:archivo = INI_Open("miarchivo.ini");
    INI_SetTag(archivo,"Datos"); // esto si estбs usando INI_ParseFile, de lo contrario, lo podrнas quitar
    INI_WriteString(archivo,"Texto", celdas);
    INI_WriteInt(archivo,"Dinero", GetPlayerMoney(playerid));
    INI_Close(archivo);
    return 1;
}
new INI:archivo = INI_Open("miarchivo.ini"); - acб estamos declarando que estamos abriendo el archivo .ini para que sea modificado

INI_SetTag(archivo,"Datos"); - estamos diciendo que crearemos o que leera el tag "Datos" y esto hace que solo se carguen los datos que estan dentro de ese tag

un ejemplo:

pawn Код:
[Datos]
Dinero = 4000
[otrosDatos]
Dinero = 5000
como puedes ver, hay dos tags, de los cuales tu podrнas seleccionar cual cargar. si cargamos [Datos] se cargarнan los 4000 de dinero, y no los 5000 de [otrosDatos]. Pero si cargamos [otrosDatos] se cargarнan los 5000 y no los 4000 del otro tag, entonces, como dije arriba, solo se cargaran los datos que estan dentro de un tag (si estбs declarando que lo leyera o que se creara claro..)

INI_WriteInt(archivo,"Dinero",GetPlayerMoney(playe rid)); - aquн estamos escribiendo/creando un dato, en este caso, "Dinero". Dinero llevarб caracteres, texto lo que tu quieras guardar, pero aquн estoy declarando que se escribira o reemplazara el dinero que contiene el jugador que escribiу ese comando.

INI_WriteString(archivo,"Texto", celdas); -aquн escribiremos que se guarde el contenido de "celdas" en este caso "Hola"

INI_Close(archivo); - y aquн declaramos que se cierre el .ini y no sea modificable hasta que se abra.

Quedarнa asн en el archivo.

pawn Код:
[Datos] // Si no estбs usando el tag, no te aparecera esto.
Dinero = 4000
Texto = Hola
- Eliminando Datos

Tomaremos el mismo ejemplo anterior

pawn Код:
CMD:modificar(playerid, params[])
{
    new celdas[5] = "Hola";
    new INI:archivo = INI_Open("miarchivo.ini");
    INI_SetTag(archivo,"Datos"); // esto si estбs usando INI_ParseFile, de lo contrario, lo podrнas quitar
    INI_WriteString(archivo,"Texto", celdas);
    INI_WriteInt(archivo,"Dinero",GetPlayerMoney(playerid));
    INI_WriteInt(archivo,"Score", GetPlayerScore(playerid));
    INI_RemoveEntry(archivo, "Texto");
    INI_Close(archivo);
    return 1;
}
Que hacemos acб? Escribiremos y eliminaremos a la vez, es decir..

INI_WriteString(archivo,"Texto", celdas); - escribimos el dato
INI_RemoveEntry(archivo, "Texto"); - eliminaremos el dato (en este caso "Texto")


- Tags

en Y_INI, se utiliza tags para separar datos de otros, un ejemplo de ello es:

pawn Код:
[primerTag]
Score = 100
Vida = 100

[segundoTag]
Score = 50
Vida = 10
Para leer un tag o dos puedes utilizar INI_Load o INI_ParseFile, como ustedes gusten

en INI_Load, es de estб forma:

pawn Код:
INI:miarchivo[nombredeltag](name[], value[])
{
// funciones
}
asн quedarнa con el ejemplo anterior
pawn Код:
INI:miarchivo[primerTag](name[], value[])
{
    INI_Int("Score", VarScore[playerid]);
    INI_Int("Vida", VarVida[playerid]);
    return 1;
}
pawn Код:
en otras funciones...

SetPlayerScore(playerid, VarScore[playerid]); // para cada jugador
con INI_ParseFile, serнa de esta forma:

pawn Код:
INI_ParseFile("miarchivo.ini", "CargarDatos_%s",.bExtra = true, .extra = playerid);
%s significa que va a leer el tag que estб puesto despuйs de " _ "

їno sabes que significan esto: .bExtra = true, .extra = playerid? mбs abajo lo explicarй!

Eso serнa para cargar las variables a un jugador, por eso he puesto esto: .bExtra = true, .extra = playerid

ahora, tenemos que cargar las variables desde una callback

pawn Код:
forward CargarDatos_segundoTag(playerid, name[], value[]);
public CargarDatos_segundoTag(playerid, name[], value[])
{
   INI_Int("Score", VarScore[playerid]);
   INI_Int("Vida", VarVida[playerid]);
}
aqui usamos la variable para cada jugador, no utilizamos la variable global porque ocaciona bugs.

Diferencias:

Para cada jugador: aquн cada jugador tendrб una variable que tenga un valor de su personaje en su defecto

Global: la variable global ( new VarGlobal; ) esa variable, el valor para todos serб el mismo.


Para escribir un dato con tag's serнa como siempre, pero siempre se tiene que poner el INI_SetTag.


pawn Код:
CMD:modificar(playerid, params[])
{
    new Float:VariableVida; GetPlayerHealth(playerid, VariableVida);
    new INI:archivo = INI_Open("miarchivo.ini");
    INI_SetTag(archivo,"primerTag"); // para colocar el tag
    INI_WriteInt(archivo,"Score", GetPlayerScore(playerid));
    INI_WriteInt(archivo, "Vida", VariableVida);
    INI_Close(archivo);
    return 1;
}
- Funciones

Acб explicarй para que sirve cada funciуn y sus parametros

INI_Int
name[] - el nombre de la variable/dato guardad@
variable - La variable que guarda/almacena ese dato

INI_Int solo lee numeros enteros (1, 2, 3, 4) si quieres leer por ejemplo, floats, debes usar INI_Float. al igual que string se usa INI_String
pawn Код:
new VarMaxPing;

// en el .ini
MaxPing = 500;

// cargandolo
INI_Int("MaxPing", VarMaxPing);
VarMaxPing variable que serб seteada/modificada a 500.

INI_Float
name[] - el nombre de la variable/dato guardad@
variable - La variable que guarda/almacena ese dato

pawn Код:
new Float:VarChaleco; // es IMPORTANTE declarar la variable como " Float ", si no lo haces, no harб dicha acciуn ( almacenar '50.0' )

// en el .ini
Chaleco = 50.0;

// cargandolo
INI_Float("Chaleco", VarChaleco);
pawn Код:
new Float:VarCoordenadas; // es IMPORTANTE declarar la variable como " Float ", si no lo haces, no harб dicha acciуn ( almacenar '2500 1968 7.3' )

// en el .ini
Coordenadas = 2500 1968 7.3;

// cargandolo
if (!strcmp(name, "Coordenadas") && !sscanf(value, "fff", X, Y, Z))
{
    INI_Float("Coordenadas",VarCoordenadas);
}
VarChaleco variable que serб seteada/modificada a 50.0.
VarCoordenadas variable que serб seteada/modificada a 2500 1968 7.3.

INI_Bin
name[] - el nombre de la variable/dato guardad@
variable - La variable que guarda/almacena ese dato

INI_Bin solo lee datos binarios ( ej: 0b1001101 )

pawn Код:
new VarCodigoBinario;

// en el .ini
Binario = 1001101;

// cargandolo
INI_Int("Binario", VarCodigoBinario);
VarCodigoBinario variable que serб seteada/modificada a 1001101.

INI_Hex
name[] - el nombre de la variable/dato guardad@
variable - La variable que guarda/almacena ese dato

INI_Hex lee solo hexadecimales

pawn Код:
new VarHexadecimal;

// en el .ini
Hex = 0xFFFFFF;

// cargandolo
INI_Hex("Hex", VarHexadecimal);
VarHexadecimal variable que serб seteada/modificada a 0xFFFFFF.

INI_Bool
name[] - el nombre de la variable/dato guardad@
variable - La variable que guarda/almacena ese dato

pawn Код:
new bool:VarBool;

// en el .ini
Bool = true;

// cargandolo
INI_Bool("Bool", VarBool);
VarBool variable que serб seteada/modificada a true.

INI_String
name[] - el nombre de la variable/dato guardad@
variable - La variable que guarda/almacena ese dato
longitud - Longitud de la variable

pawn Код:
new VarString[17]; // la longitud de esa variable es "17"

// en el .ini
String = Hola Forum SAMP;

// cargandolo
INI_String("String", VarString, 17); // o tambien puedes usar sizeof, pero es tu gusto.
VarString variable que serб seteada/modificada a Hola Forum SAMP.

INI_Open
filename[] - Nombre del INI a abrir

INI_Open abre el archivo .INI para empezar a modificar/setear/escribir valores y guardarlos en el archivo.

pawn Код:
new INI:archivo = INI_Open("miarchivo.ini"); // abre el archivo (miarchivo.ini)
INI_SetTag(archivo, "NombreTag");
INI_WriteInt(archivo, "Valor", variablevalor);
INI_WriteString(archivo, "Texto", variablestring);
INI_Close(archivo);

INI_Close
INI:file - Nombre del archivo que sera modificado

INI_Close cierra el archivo INI para que esta no sea modificada

pawn Код:
new INI:archivo = INI_Open("miarchivo.ini");
INI_SetTag(archivo, "NombreTag");
INI_WriteInt(archivo, "Valor", variablevalor);
INI_WriteString(archivo, "Texto", variablestring);
INI_Close(archivo); // cierra el archivo (miarchivo.ini)
INI_SetTag
INI:file - Nombre del archivo que sera modificado.
tag[] - Nombre del tag donde se guardan los datos de ese dicho tag

pawn Код:
new INI:archivo = INI_Open("miarchivo.ini");
INI_SetTag(archivo, "NombreTag"); // nombre del tag que sera agregado.
INI_WriteInt(archivo, "Valor", variablevalor);
INI_WriteString(archivo, "Texto", variablestring);
INI_Close(archivo);

INI_RemoveEntry
INI:file - Nombre del archivo que sera modificado.
name[] - Nombre de datos

pawn Код:
new INI:archivo = INI_Open("miarchivo.ini");
INI_SetTag(archivo, "NombreTag");
INI_WriteInt(archivo, "Valor", variablevalor);
INI_WriteString(archivo, "Texto", variablestring);
INI_RemoveEntry(archivo, "Texto"); // se elimina el dato "Texto"
INI_Close(archivo);
INI_RemoveEntry elimina datos que esten dentro de un tag de un archivo.

INI_WriteString
INI:file - Nombre del archivo que sera modificado.
name[] - Nombre de datos
data[] - Datos

pawn Код:
new INI:archivo = INI_Open("miarchivo.ini");
INI_SetTag(archivo, "NombreTag");
INI_WriteString(archivo, "Texto", variablestring); // guarda el texto que estб dentro de la variable "variablestring"
INI_Close(archivo);
INI_WriteString modifica el dato de un texto

INI_WriteInt
INI:file - Nombre del archivo que sera modificado.
name[] - Nombre de datos
data[] - Datos

pawn Код:
new INI:archivo = INI_Open("miarchivo.ini");
INI_SetTag(archivo, "NombreTag");
INI_WriteInt(archivo, "Valor", variablevalor); // guarda el valor de la variable "variablevalor"
INI_Close(archivo);
INI_WriteHex
INI:file - Nombre del archivo que sera modificado.
name[] - Nombre de datos
data[] - Datos

pawn Код:
new INI:archivo = INI_Open("miarchivo.ini");
INI_SetTag(archivo, "NombreTag");
INI_WriteHex(archivo, "Hex", variablehex); // guarda el valor hexadecimal de la variable "varhex"
INI_Close(archivo);
INI_WriteBool
INI:file - Nombre del archivo que sera modificado.
name[] - Nombre de datos
data[] - Datos (bool: true/false)

pawn Код:
new INI:archivo = INI_Open("miarchivo.ini");
INI_SetTag(archivo, "NombreTag");
INI_WriteBool(archivo, "Bool", variablebool); // guarda el valor de la variable booleana (variablebool)
INI_Close(archivo);
INI_WriteBin
INI:file - Nombre del archivo que sera modificado.
name[] - Nombre de datos
data[] - Datos (numeros enteros)

pawn Код:
new INI:archivo = INI_Open("miarchivo.ini");
INI_SetTag(archivo, "NombreTag");
INI_WriteBin(archivo, "Bin", variablebin); // guarda el valor de la variable que tiene almacenada cуdigo binario (variablebin)
INI_Close(archivo);
INI_WriteBin guarda datos en cуdigo binario (b1001010)

INI_WriteFloat
INI:file - Nombre del archivo que sera modificado.
name[] - Nombre de datos
Float:data - Datos
accuracy - Nombre de decimales a escribir

pawn Код:
new Float:variablefloat;
new INI:archivo = INI_Open("miarchivo.ini");
INI_SetTag(archivo, "NombreTag");
INI_WriteFloat(archivo, "Float", variablefloat); // guarda el valor de la variable  (variablefloat)
INI_Close(archivo);
el parametro accuracy significa cuantos decimales tendrб ese float, un ejemplo:

si guardo una coordenada, y la coordenada es esta: 2.456433, si te das cuenta, la coordenada tiene 6 decimales, con accuracy lo disminuimos al nъmero que tu quieras, 2, 3, 4..

entonces:

pawn Код:
new Float:variablefloat;
new INI:archivo = INI_Open("miarchivo.ini");
INI_SetTag(archivo, "NombreTag");
INI_WriteFloat(archivo, "Float", variablefloat, 2); // 2 es el nъmero de decimales que contendrб ese valor, queda asн: 2.45
INI_Close(archivo);

INI_Load
filename[] - Nombre del archivo a cargar/leer
bool:bExtra - Leer datos adicionales
extra - Datos adicionales a leer
bLocal - Funciones de llamada local en lugar de los globales.

leyendo un archivo sin parametros adicionales

pawn Код:
INI_Load(nombredearchivo);
leyendo un archivo con parametros adicionales (con playerid)
pawn Код:
INI_Load(nombredearchivo, true, playerid);
y para leerlos, es decir, poner el INI_Int y esas cosas, es asн:

pawn Код:
INI:nombredearchivo[nombretag](playerid, name[], value[])
{
// funciones, INI_Int y todo eso.
}
para enviar toda los datos a todos los scripts

pawn Код:
INI_Load(nombredearchivo, .bLocal = false);
INI_ParseFile
filename[] - Nombre del archivo a cargar/leer
remoteFormat[] - Funciуn a llamar
bool:bFileFirst - El orden de la funciуn a llamar (Que pase primero el archivo)
bool:bExtra - Leer datos adicionales
extra - El dato a leer
bLocal - Funciones de llamada local en lugar de los globales.
bool:bPassTag - El orden de la funciуn a llamar (Que pase despuйs el tag, es decir, que estй donde estб el name[],value[])

remoteFormat - define el formato o orden a la hora de llamar la funciуn. ejemplo:

si estamos leyendo el archivo de de estб forma en la callback

pawn Код:
forward CargarDatos_Datos(name[], value[]);
public CargarDatos_Datos(name[], value[])
pawn Код:
INI_ParseFile("miarchivo.ini", "CargarDatos_%s");
porque? Porque estamos diciendo que "CargarDatos, y despuйs, Datos" es decir, que primero el nombre de la callback y despuйs el tag (CargarDatos_Datos)

bFileFirst - Esto intercambia el orden de los datos que se pasan al formato de la funciуn, si esto es cierto (por defecto falso (false) ) la primera %s en el remoteFormat es el nombre del archivo y el segundo es el tag.

pawn Код:
forward CargarDatos_miarchivo_Datos(name[], value[]);
public CargarDatos_miarchivo_Datos(name[], value[])
pawn Код:
INI_ParseFile("miarchivo.ini", "CargarDatos_%s_%s", .bFileFirst = true); // primero el nombre del archivo (primer %s) y de segundo el nombre del tag (segundo %s)
bPassTag - Si esto es verdadero (true), aсade un parбmetro adicional para la devoluciуn de llamada con la etiqueta actual, por lo que puede cargar un archivo completo de una sola funciуn. El nombre de la etiqueta viene inmediatamente antes que el parбmetro "name", por lo que despuйs de cualquier parбmetro opcional:

es decir, que sн se llamarнa o se coloca el bPassTag en INI_ParseFile, en la callback se ordena de esta forma, y tambiйn se cargarнan todos los datos de todos los tags de una sola vez:

pawn Код:
forward CargarDatos(tag[], name[], value[]);
public CargarDatos(tag[], name[], value[])
{
    if (!strcmp(tag, "primernombretag"))
    {
        // funciones, datos
    }
    if (!strcmp(tag, "segundonombretag"))
    {
        // funciones, datos
    }
}
pawn Код:
INI_ParseFile("miarchivo.ini", "CargarDatos", .bPassTag = true);
bExtra y extra se usa para pasar datos adicionales como puede ser un guardado de datos de jugador (playerid), es decir, que se pueda usar el "playerid" dentro de la callback, si esto es verdadero (true) se coloca "playerid" antes del "name[], value[]"

he aquн un ejemplo para que se carguen los datos para cada jugador (sus propios datos guardados)

pawn Код:
forward CargarDatos_Datos(playerid, name[], value[]);
public CargarDatos_Datos(playerid, name[], value[])
pawn Код:
INI_ParseFile(archivodejugador(playerid), "CargarDatos_%s", .bExtra = true, .extra = playerid);
o si quieres tener playerid y cargar todos los tags (pasando el tag a la funciуn) , serнa de esta forma:

pawn Код:
forward CargarDatos(playerid, tag[], name[], value[]);
public CargarDatos(playerid, tag[], name[], value[])
pawn Код:
INI_ParseFile(archivodejugador(playerid), "CargarDatos",.bExtra = true, .extra = playerid, .bPassTag = true);
el "archivodejugador(playerid)" lo podrнas hacer de estб forma.

pawn Код:
#define Jugadores "Jugadores/%s.ini"

stock archivodejugador(playerid)
{
    new Celdas[128], Nombre[MAX_PLAYER_NAME];
    GetPlayerName(playerid,Nombre,sizeof(Nombre));
    format(Celdas,128,Jugadores,Nombre);
    return Celdas;
}
Tampoco hay necesidad de poner .bExtra ni .bPassTag. con solo poner "true,false,true" INI_ParseFile los leerнas pero del orden que tienes colocado la callback.

ejemplo:

pawn Код:
forward CargarDatos_miarchivo(playerid, tag[], name[], value[]);
public CargarDatos_miarchivo(playerid, tag[], name[], value[])
{
}
aqui estas diciendo que se lea primero el nombre del archivo, que tenga un parametro extra (playerid) y que pase a la funciуn el tag

en INI_ParseFile:

pawn Код:
INI_ParseFile("miarchivo.ini", "Load_%s", true, true, playerid, false, true);
el primer true es .bFileFirst = true, despuйs .bExtra = true, .extra = playerid, despues bPassTag = true, despues bLocal = false y por ъltimo bPassTag = true

si no entendistes, fijate el orden de los parametros. de donde comenzу INI_ParseFile

- Tiempos, comparaciуn entre otros sistemas

resaltare esta nota de ******

Код:
dini: 63810 - Sн, un poco mбs de un minuto (63810 milisegundos)
yini: 1564 - Sн, es un poco mбs de un segundo
yini y dini 1: 6009 - Un poco mбs de 6 segundos, o en su defecto, 6 segundos.
yini y dini 2: 91159 - Alrededor de un minuto y medio
SII: 52807 - 52 segundos
- Creditos

****** por Y_INI
SA-MP Wiki y ****** - tutorial de Y_INI, sin eso no habrнa aprendido a usarlo.
Y a mн por poder enseсarles a como usar Y_INI.



Si me ha faltado explicar algo, o me equivoquй, por favor haganme avisar para modificarlo
Reply


Messages In This Thread
Uso de Y_INI - by Adoniiz - 25.09.2013, 22:55
Respuesta: Uso de Y_INI - by OTACON - 25.09.2013, 22:58
Respuesta: Uso de Y_INI - by EduGTA - 25.09.2013, 23:04
Respuesta: Uso de Y_INI - by Adoniiz - 25.09.2013, 23:05
Respuesta: Uso de Y_INI - by Swedky - 25.09.2013, 23:09
Re: Uso de Y_INI - by PT - 25.09.2013, 23:17
Respuesta: Re: Uso de Y_INI - by adrianxd - 25.09.2013, 23:19
Respuesta: Uso de Y_INI - by RafaelZam - 26.09.2013, 02:33
Respuesta: Uso de Y_INI - by BecksLennon - 26.09.2013, 09:14
Re: Respuesta: Re: Uso de Y_INI - by PT - 26.09.2013, 23:26

Forum Jump:


Users browsing this thread: 1 Guest(s)