02.08.2015, 15:19
vale, mira un ejemplo.
Yo creo un negocio vale?, ese negocio se crea correctamente con una estructura por default que es esta:
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):
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)
Y SubirDatoInt significa esto:
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:
A esto despuйs de realizar la compras:
Es decir se elimina gran parte del .ini y solo queda esto (muchas veces.. no todas las veces)
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
Код:
// /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."); } } }
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]]);
Код:
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); }
Код:
[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
Код:
[negocio] II = 0 IVw = 0 IR = 68.219268 IZ = 12.911973 IY = -1402.007568 IX = 875.572265 Dinero = 13 Producto2Cantidad = 148 Producto3Cantidad = 148