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)