Problema con INI de YSI (Y_Lees)
#1

Ok tengo un problema con INI (como dice en el tнtulo) el problema estб en que muchas veces cuando mando peticiones de escribir muchas veces lo hace bien y otras veces hace un desastre, es decir, elimina tags etc, aqui les doy un ejemplo:

Esta serнa la manera correcta:
Код:
[negocio]
PRZ = 0.000000
PRY = 0.000000
PRX = 0.000000
PZ = 12.942074
PY = -1403.480224
PX = 871.246032
Nivel = 0
Precio = 0
II = 0
IVw = 0
IR = 359.622070
IZ = 12.919179
IY = -1406.149169
IX = 872.193969
EZ = 12.942074
EY = -1403.880249
EX = 870.946044
Dinero = 0
Seguro = 1
Estado = 1
Estilo = 2
Dueno = Joaquin_Zambrano
Nombre = Jasta
Id = 1
y despuйs (como es un sistema de negocio) si aсado un producto IG haciendo la peticiуn de escribir hace un desorden total (solo aveces), ejemplo:
Код:
[negocio]
II = 0
IVw = 0
IR = 68.219268
IZ = 12.911973
IY = -1402.007568
IX = 875.572265
Dinero = 13
Producto2Cantidad = 148
Producto3Cantidad = 148
Asн queda cuando en realidad solo debe de aсadir 3 nuevos elementos, estos: "Producto2Cantidad" (el 2 es el id del producto) "Producto2Tipo" y "Producto2Precio"
Reply
#2

El Y_INI guarda informaciуn, segъn se le van ingresando datos para escribir o sobrescribir, si en tu cуdigo lo tienes desordenado obviamente se va a guardar de esa manera, lo que hacia yo para evitar el desorden inicializar todas las variables con un valor que posiblemente despuйs se cambiarнa, y en la misma funciуn guardarlo con los valores "predeterminados", luego al ir llenando se actualizaran los datos y en ese mismo orden. Al final al cerrar el servidor actualizar todos los datos de este.

EJEMPLO:
PHP код:
ResetearNegocio(playerid)
{
    
format(negocio[playerid][nombreNegocio], 24"Jasta");
    new 
INI:Archivo INI_Open("negocios.ini"); //Todo esto modificado a como lo tengas.
    
INI_SetTag(Archivo"negocio");
    
INI_WriteFloat(Archivo"PRZ"negocio[playerid][rPosX] = 0.000000);
    
INI_WriteFloat(Archivo"PRY"negocio[playerid][rPosY] = 0.000000);
    
INI_WriteFloat(Archivo"PRX"negocio[playerid][rPosZ] = 0.000000);
    .
    .
    .
    
INI_WriteInt(Archivo"Id"negocio[playerid][id] = 1);
    
INI_WriteString(Archivo"Nombre"negocio[playerid][nombreNegocio]);

Reply
#3

Muchas gracias pero el problema no es el desorden, me referia a que elimina elementos lo cual hace que al reiniciar el servidor no coge la informaciуn necesaria y se rompe el negocio (por asi decirlo).

PD: Yo hago que todo sea directamente, es decir, si el negocio es comprado directamente envia peticiones de escribir que cambie el nombre del dueсo y del estado en el mismo comando de comprar, no uso la forma de cuando se cierra el servidor se guarde todo.
Reply
#4

Entonces, supongo que no estas almacenando de manera correcta lo que hay en el archivo hacia las funciones. Si no es asн, explнcate mejor que no se te entiende.
Reply
#5

vale, mira un ejemplo.
Yo creo un negocio vale?, ese negocio se crea correctamente con una estructura por default que es esta:
Код:
[negocio]
PRZ = 0.000000
PRY = 0.000000
PRX = 0.000000
PZ = 12.942074
PY = -1403.480224
PX = 871.246032
Nivel = 0
Precio = 0
II = 0
IVw = 0
IR = 359.622070
IZ = 12.919179
IY = -1406.149169
IX = 872.193969
EZ = 12.942074
EY = -1403.880249
EX = 870.946044
Dinero = 0
Seguro = 1
Estado = 1
Estilo = 2
Dueno = Joaquin_Zambrano
Nombre = Jasta
Id = 1
Vale, ahora.. yo tengo el comando /comprar, (los negocios tiene productos limitados) y la hora de comprar un producto hace 2 cosas, ver si ese producto es mayor o igual a 2 si es 1 entonces se borra el elemento a caso contrario solo guarda el "Producto(n)Cantidad", mejor te paso el cуdigo que hace esto (creo que etenderбs mejor asi):
Код:
// /comprar lo que hace es esto:
CMD:comprar(playerid, params[])
{
 	new i = -1;

	for(new a = 0; a < MAX_NEGOCIOS; a++)
	{
	    if(ExisteNegocio(a))
	    {
			if(IsPlayerInRangeOfPoint(playerid, 2.3, Negocio[a][nInteriorX], Negocio[a][nInteriorY], Negocio[a][nInteriorZ]))
			{
			    i = a;
				break;
			}
		}
	}

	if(i != -1)
	{
	    if(Negocio[i][nSeguro] == 1)
	    {
			if(Negocio[i][nEstilo] == NEGOCIO_ESTILO_NORMAL)
			{
			    new formato[1000];
			    new id;
			    for(new p = 0; p < MAX_PRODUCTOS_NEGOCIO; p++)
			    {
			        if(Negocio[i][nProductoTipo][p] != 0)
			        {
			            IdComprar[playerid][id] = p;
			            id++;
			    		format(formato, sizeof(formato), "%s"COLOR_BLANCO_HTML"%s "COLOR_ROJO_HTML"(Cantidad: %d)"COLOR_VERDE_HTML"(Precio: %d)\n", formato, ProductosTipo[Negocio[i][nProductoTipo][p]-1], Negocio[i][nProductoCantidad][p], Negocio[i][nProductoPrecio][p]);
	    			}
	    		}

	    		if(id == 0)
				{
				    SendClientMessage(playerid, COLOR_GRIS, "No hay productos para vender.");
				    return 1;
				}

	    		ShowPlayerDialog(playerid, DIALOG_COMPRAR_PRODUCTO, DIALOG_STYLE_LIST, "Productos", formato, "Aceptar", "Salir");
				return 1;
			}
                  }
		else SendClientMessage(playerid, COLOR_GRIS, "Este negocio estб cerrado.");
	}
	else SendClientMessage(playerid, COLOR_GRIS, "No estбs en un lugar para comprar.");
	return 1;
}

// y el DIALOG es este.
case DIALOG_COMPRAR_PRODUCTO:
		{
		    if(response)
		    {
		        if(listitem >= 0)
		        {
		            new id_n = DetectarNegocio(playerid);

		            if(DineroJugador(playerid) >= Negocio[id_n][nProductoPrecio][IdComprar[playerid][listitem]])
		            {
		                //Dar Objeto al jugador
		                new a = DarProductoJugador(playerid, Negocio[id_n][nProductoTipo][IdComprar[playerid][listitem]], id_n);

		                if(!a) {return a;}

		                //Dar valores
		                Negocio[id_n][nDinero] += Negocio[id_n][nProductoPrecio][IdComprar[playerid][listitem]] - 5;
		                Negocio[id_n][nProductoCantidad][IdComprar[playerid][listitem]] --;

		                //Subir datos
		                SubirDatoInt(DirectorioNegocio(id_n), "negocio", "Dinero", Negocio[id_n][nDinero]);

		                new formato[60];
		                if(Negocio[id_n][nProductoCantidad][IdComprar[playerid][listitem]] == 0)
		                {
							new INI: File = INI_Open(DirectorioNegocio(id_n));
		                    format(formato, sizeof(formato), "Producto%iCantidad", IdComprar[playerid][listitem]);
		                    INI_RemoveEntry(File, formato);
		                    //EliminarDato(DirectorioNegocio(id_n), "negocio", formato);
		                    Negocio[id_n][nProductoCantidad][IdComprar[playerid][listitem]] = 0;
		                    format(formato, sizeof(formato), "Producto%iTipo", IdComprar[playerid][listitem]);
		                    INI_RemoveEntry(File, formato);
		                    //EliminarDato(DirectorioNegocio(id_n), "negocio", formato);
		                    Negocio[id_n][nProductoTipo][IdComprar[playerid][listitem]] = 0;
		                    format(formato, sizeof(formato), "Producto%iPrecio", IdComprar[playerid][listitem]);
		                    INI_RemoveEntry(File, formato);
		                    //EliminarDato(DirectorioNegocio(id_n), "negocio", formato);
		                    Negocio[id_n][nProductoPrecio][IdComprar[playerid][listitem]] = 0;
		                    INI_Close(File);
		                }
		                else
		                {
		                    format(formato, sizeof(formato), "Producto%iCantidad", IdComprar[playerid][listitem]);
		                    SubirDatoInt(DirectorioNegocio(id_n), "negocio", formato, Negocio[id_n][nProductoCantidad][IdComprar[playerid][listitem]]);
		                }
		            }
		            else SendClientMessage(playerid, COLOR_GRIS, "No tienes el dinero suficiente.");
		        }
		    }
		}
ahн verбs claramente lo que te explique arriba de una manera mejor.

Ahora..

supuestamente cuando yo compro algo y existe una cantidad mayor que 2 o igual (en mi caso 150, cantidad de ese producto) se ejecuta esto: (como pudiste ver)
Код:
SubirDatoInt(DirectorioNegocio(id_n), "negocio", formato, Negocio[id_n][nProductoCantidad][IdComprar[playerid][listitem]]);
Y SubirDatoInt significa esto:
Код:
stock SubirDatoInt(directorio[], Tag[], name[], value)
{
 	new INI:File = INI_Open(directorio);
 	if(File != INI_NO_FILE)
 	{
		INI_SetTag(File, Tag);
		INI_WriteInt(File, name, value);
	}
	INI_Close(File);
}
Que es algo simple y que estб claro que es para facilitar la escritura, pero ese es el problema (creo) que hace que el archivo .ini se borra, es decir hace que todo se haga un desorden (no un desorden exactamente, pero elimina muchos elementos del .ini y solo quedan algunos, no sй si es un BUG de INI de YSI o si es que yo hago algo mal), pasa de ser esto:
Код:
[negocio]
PRZ = 0.000000
PRY = 0.000000
PRX = 0.000000
PZ = 12.942074
PY = -1403.480224
PX = 871.246032
Nivel = 0
Precio = 0
II = 0
IVw = 0
IR = 359.622070
IZ = 12.919179
IY = -1406.149169
IX = 872.193969
EZ = 12.942074
EY = -1403.880249
EX = 870.946044
Dinero = 0
Seguro = 1
Estado = 1
Estilo = 2
Dueno = Joaquin_Zambrano
Nombre = Jasta
Id = 1
Producto1Tipo = 1
Producto1Cantidad = 148
Producto1Precio = 30
Producto2Tipo = 2
Producto2Cantidad = 150
Producto2Precio = 15
Producto3Tipo = 3
Producto3Cantidad = 148
Producto3Precio = 140
A esto despuйs de realizar la compras:
Код:
[negocio]
II = 0
IVw = 0
IR = 68.219268
IZ = 12.911973
IY = -1402.007568
IX = 875.572265
Dinero = 13
Producto2Cantidad = 148
Producto3Cantidad = 148
Es decir se elimina gran parte del .ini y solo queda esto (muchas veces.. no todas las veces)
Reply
#6

PHP код:
new formato[60];
if(
Negocio[id_n][nProductoCantidad][IdComprar[playerid][listitem]] == 0)
{
    new 
INIFile INI_Open(DirectorioNegocio(id_n));
    
INI_SetTag(File"negocio"); // Agregale el tag para que no de errores
    
format(formatosizeof(formato), "Producto%iCantidad"IdComprar[playerid][listitem]);
    
INI_RemoveEntry(Fileformato);
    
//EliminarDato(DirectorioNegocio(id_n), "negocio", formato);
    
Negocio[id_n][nProductoCantidad][IdComprar[playerid][listitem]] = 0;
    
format(formatosizeof(formato), "Producto%iTipo"IdComprar[playerid][listitem]);
    
INI_RemoveEntry(Fileformato);
    
//EliminarDato(DirectorioNegocio(id_n), "negocio", formato);
    
Negocio[id_n][nProductoTipo][IdComprar[playerid][listitem]] = 0;
    
format(formatosizeof(formato), "Producto%iPrecio"IdComprar[playerid][listitem]);
    
INI_RemoveEntry(Fileformato);
    
//EliminarDato(DirectorioNegocio(id_n), "negocio", formato);
    
Negocio[id_n][nProductoPrecio][IdComprar[playerid][listitem]] = 0;
    
INI_Close(File);

En mi opiniуn no deberнas borrar el nombre producto, si no que dejarlo vacнo, por que estar borrando cada que el producto se acaba puede ser un proceso que tarde un poco mбs que los demбs, No se si era el tag mira bien, pero creo que el error esta en esas lineas.
Reply
#7

LOL Muchas gracias habia olvidado poner el TAG!! jajaja que tonto soy
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)