[Ayuda] Timer de revisiуn de casas lagea
#1

Buenas a todos, en mi GM cree una informaciуn para las casas "hTiempo", que sirve que cada segundo se descuente un segundo del total en cada casa, el cуdigo es el siguiente:

Код:
timer HouseUpdate[1000]()
{
	for(new h = 0; h < sizeof(HouseInfo); h++)
	{
	    if(HouseInfo[h][hOwned] != 0)
   		{
	        --HouseInfo[iIndex][hTiempo];
		}
	}
	SaveHouses();
}
El timer se repite cada segundo, las casas con propietario (HouseInfo[h][hOwned] != 0) se les irб descontando un segundo cada vez, para una vez llegen a cero se retire el propietario. El problema es que esto causa mucho lag, suponiendo que se tienen 800 casas que tienen que ser chequeadas cada segundo y comprobar su propietario. No sй si cambiar esto por minutos o horas para hacerlo mбs estable o me recomiendan hacerlo cada 24 horas. Si es cada 24 horas, se tendrнa que poner un Timer o con gettime seria suficiente, gracias.
Reply
#2

ї1 segundo?, es algo depravado tendrнas que poner cada 24 horas o 36 horas, en mili segundos no se muy bien cuanto es, pero en realidad cada segundo no hace falta, un saludo. Creo que con un 'Timer' queda bien.
Reply
#3

Utiliza timestamps y comprueba cada 30 segundos por lo menos.
Reply
#4

Se trata de un sistema que afecta a 800 casas, no sй si ven bien el tema de que sea cada 24 horas o que si son las 00:00 por ejemplo se ejecute la funciуn de revisiуn o una hora en la que no hayan usuarios, que opinan de esto, gracias.
Reply
#5

Quote:
Originally Posted by Colomina37
Посмотреть сообщение
...
Que quieres hacer exactamemte?
Reply
#6

puedes usar gettime, asi no tendrбs que andar restandole a una variable y usando SaveHouses(); cada 1 segundo

podrias comprobar cada 1 minuto si ya acabу el tiempo de renta de la casa, y si es asн guardar solo esa casa que se le acabo la renta

Код:
//esta funcion la usas cuando le asignas el tiempo de renta a la casa, la 3 es mas exacta por dias horas y minutos incluso le podrias agregar segundos para un tiempo mas exacto
HouseInfo[i][hTiempo] = (gettime() + 86400*dias); //solo por dias
HouseInfo[i][hTiempo] = (gettime() + 86400*dias + 3600*horas); //por dias y horas
HouseInfo[i][hTiempo] = (gettime() + 86400*dias + 3600*horas + 60*minutos); //por dias, horas y minutos
//86400 son los segundos que tiene un dia
//3600 son los segundos que tiene una hora
//60 son los segundos que tiene un minuto


y la funcion qe sea llamada cada un tiempo mas prudente 
timer HouseUpdate[60000]()
{
    for(new h = 0; h < sizeof(HouseInfo); h++)
    {
        if(HouseInfo[h][hOwned] != 0)
        {
            if(gettime() < HouseInfo[h][hTiempo])
            {
                //aqui van las funciones para retirar al propietario de la casa
                HouseInfo[h][hOwned] = 0;
				//GuardarCasa(h); tambien podrias crear una funcion que solo guarde una casa en especifica
            }
        }
    }
}
Reply
#7

Quote:
Originally Posted by SickAttack
Посмотреть сообщение
Que quieres hacer exactamemte?
Una funciуn que vaya reduciendo el tiempo de cada casa comprada, una vez llegen a 0 se pondrбn en venta. Tanto la venta de casas como la compra ya lo tengo editado.

El problema es el timer, que al ejecutarse cada segundo lagea el servidor.

HouseInfo[iIndex][hTiempo] no estб especificado si es segundos, horas, minutos o dнas. Pensaba en hacerlo cada 24 horas, pero no sй si con timer o gettime, gracias. Con el gettime me refiero a que cierta hora de la noche se ejecute esto (Cuando no hay usuarios On).
Reply
#8

Quote:
Originally Posted by FelipeAndres
Посмотреть сообщение
puedes usar gettime, asi no tendrбs que andar restandole a una variable y usando SaveHouses(); cada 1 segundo

podrias comprobar cada 1 minuto si ya acabу el tiempo de renta de la casa, y si es asн guardar solo esa casa que se le acabo la renta

Код:
//esta funcion la usas cuando le asignas el tiempo de renta a la casa, la 3 es mas exacta por dias horas y minutos incluso le podrias agregar segundos para un tiempo mas exacto
HouseInfo[i][hTiempo] = (gettime() + 86400*dias); //solo por dias
HouseInfo[i][hTiempo] = (gettime() + 86400*dias + 3600*horas); //por dias y horas
HouseInfo[i][hTiempo] = (gettime() + 86400*dias + 3600*horas + 60*minutos); //por dias, horas y minutos
//86400 son los segundos que tiene un dia
//3600 son los segundos que tiene una hora
//60 son los segundos que tiene un minuto


y la funcion qe sea llamada cada un tiempo mas prudente 
timer HouseUpdate[60000]()
{
    for(new h = 0; h < sizeof(HouseInfo); h++)
    {
        if(HouseInfo[h][hOwned] != 0)
        {
            if(gettime() < HouseInfo[h][hTiempo])
            {
                //aqui van las funciones para retirar al propietario de la casa
                HouseInfo[h][hOwned] = 0;
				//GuardarCasa(h); tambien podrias crear una funcion que solo guarde una casa en especifica
            }
        }
    }
}
No entiendo el cуdigo, osea sumas al tiempo real los minutos, horas para obtener el resultado mбs preciso, en este caso seria segundos. Se podria decir que HouseInfo[h][hTiempo] estб en segundos. Tiempo actual + 7 Dias por ejemplo, hice eso y al revisar cuбnto quedaba de tiempo me aparecia esto: 45678310. Lo que pienso que son todos los segundos acumulados durante todo este tiempo, supongo que enero y parte de febrero en segundos y el tiempo de la casa. Cuando llege el dia de finalizaciуn, que serб en 7 dias habrб un momento que el nъmero de segundos acumulados con gettime sea mayor que el tiempo de la casa, lo que provoca su venta automбtica.

El problema es que cuando se estб dentro del servidor y se revisa el parametro de tiempo de cada casa aparece un largo nъmero de digitos complicado de entender. Supongo que la soluciуn serб otra, no usar el gettime o algo, gracias por tu ayuda, buscarй un modo similar. Para hacerlo mбs fбcil, formato HouseInfo[h][hTiempo] = 7, es decir 7 dнas, gracias.
Reply
#9

pon el timer cada 1 dia y listo
Reply
#10

Pero puedes usar esto:

Код:
CMD:mirenta(playerid, params[])
{
	TiempoRenta(playerid, HouseInfo[index_house][hTiempo]-gettime());
	return 1;
}

stock TiempoRenta(playerid, tiempo)
{
	new dias, horas, minutos, segundos;
	dias = floatround((tiempo / 86400), floatround_floor);
	segundos = (tiempo - (dias * 86400));
	Hours = floatround((segundos / 3600), floatround_floor);
	segundos = (segundos - (horas * 3600));
	minutos = floatround((segundos / 60), floatround_floor);
	segundos = (segundos - (minutos * 60));

    new string[128];
	format(string, sizeof(string), "Tiempo restante de renta: %d dias, %d horas, %d minutos, %d segundos", dias, horas, minutos, segundos);
	SendClientMessage(playerid, -1, string);
	return 1;
}
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)