Problema con timers y objetos.
#1

Que tal, estoy creando un sistema que le de realismo a granjas, con pastos y demбs, que al ser pasados por encima estos se destruyan(Y al rato se creen nuevamente, obvio).

Y bueno, estoy teniendo un problema a la hora de testearlo InGame.

El timer "TimerPasto" lo estoy llamando desde OnPlayerConnect.
("function" es una forma que tengo de definir un callback con rapidez en mi GameMode).

Код:
function TimerPasto(playerid)
{
	new string[128];
	if(IsPlayerConnected(playerid))
	{
		for(new i = 0; i < sizeof(PastoInfo); i++)//Aca crearia el ciclo for para obtener el ID del objeto en donde el jugador esta.
                {
			if(IsPlayerInRangeOfPoint(playerid,3,PastoInfo[i][hpastoX], PastoInfo[i][hpastoY], PastoInfo[i][hpastoZ]))//Aca detectaria si esta cerca del objeto y sus floats asignados.
			{
		 		DestroyObject(PastoInfo[i][hObjID]);//Destruyo el objeto.
				CosechaActual[playerid] += 1;//Todo esto de la cosecha lo hize a modo debug, para ver en que sentido andaba bien y mal el codigo. Esto anda "bien".
				format(string, sizeof(string), "%d/%d COSECHA",CosechaActual[playerid],CosechaMaxima[playerid]);
				SetTimerEx("ArribaPasto", 15000, false, "i", PastoInfo[i][hObjID]);//Llamo al timer con el parametro de la ID del objeto.
			}
		}
		GameTextForPlayer(playerid,string,500,1);
	}
}

function ArribaPasto(objectid)//Objectid seria mi ID del pasto.
{
		new pastoobjeto, randompasto = random(2);//Simplemente creo un random para que no sea el mismo objeto siempre.
		switch(randompasto)
		{
			case 0:
			{
				pastoobjeto = 819;//PastoInfo[iIndex][pastoID] = CreateObject(819, PastoInfo[iIndex][pastoX], PastoInfo[iIndex][pastoY], PastoInfo[iIndex][pastoZ], 0.00, 0.00, 0.00);
			}
			case 1:
			{
				pastoobjeto = 824;//PastoInfo[iIndex][pastoID] = CreateObject(824, PastoInfo[iIndex][pastoX], PastoInfo[iIndex][pastoY], PastoInfo[iIndex][pastoZ], 0.00, 0.00, 0.00);
			}
		}
		PastoInfo[objectid][hObjID] = CreateObject(pastoobjeto, PastoInfo[objectid][hpastoX], PastoInfo[objectid][hpastoY], PastoInfo[objectid][hpastoZ], 0.00, 0.00, 0.00);//Esta parte no tiene acciуn. El codigo no llega hasta aca o no se que onda, pero el objeto no se crea.
}
En el codigo deje la mayoria de las aclaraciones, solo me falta decir que el GameTextForPlayer que puse a modo debug, cada vez que un jugador se conecta, este aparece(Y con numeros extremadamente altos, como 7000 o 8000, teniendo en cuenta que yo en OnPlayerConnect puse que el jugador aparezca con la variable de CosechaActual a 0, al igual que CosechaMaxima, y tecnicamente no deberia aparecer el GameText alli ;V)


Muchas gracias de antemano.


EDIT: Algo que olbide mencionar, tambien recibo estos warnings.
Код:
[warning] client exceeded 'ackslimit' 127.0.0.1:56980 (6481) Limit: 3000/sec
Reply
#2

Pues es obvio por que GameTextForPlayer lo pusiste fuera del parбmetro IsPlayerInRangeOfPoint, lo cual cuantas veces llames el callback aparecerб el mensaje y si el timer es de (ejemplo) 100 ms te alguna forma te crashearб o te ultra lagearб el server, por eso client exceeded 'ackslimit' 127.0.0.1:56980 (6481) Limit: 3000/sec.

Lo correcto serнa:

Код:
function TimerPasto(playerid)
{
	if(IsPlayerConnected(playerid))
	{
		for(new i = 0; i < sizeof(PastoInfo); i++)
        {
			if(IsPlayerInRangeOfPoint(playerid, 3.0, PastoInfo[i][hpastoX], PastoInfo[i][hpastoY], PastoInfo[i][hpastoZ]))
			{
		 		DestroyObject(PastoInfo[i][hObjID]);
				CosechaActual[playerid] ++;
				SetTimerEx("ArribaPasto", 15000, false, "i", PastoInfo[i][hObjID]);
				new string[24];
				format(string, sizeof(string), "%d/%d COSECHA", CosechaActual[playerid], CosechaMaxima[playerid]);
				GameTextForPlayer(playerid, string, 1000, 1);
			}
		}
	}
}
Otra cosa, estбs abusando de la cantidad de valor que le das a una cadena, usa lo necesario, en йste caso no creo que pase de 24 caracteres.
Reply
#3

Que tal Fynn., bueno, ya la primer parte del timer la pude terminar y anda perfectamente.

Ahora mi problema esta con el segundo timer, el que crea el objeto nuevamente, pues bueno, no lo crea.

Gracias por ayudarme.
Reply
#4

Reemplazando las funciones que te dejarй deberнa de funcionar.

Код:
SetTimerEx("ArribaPasto", 15000, false, "ifff", i, PastoInfo[i][hpastoX], PastoInfo[i][hpastoY], PastoInfo[i][hpastoZ]);

function ArribaPasto(objectid, Float:pX, Float:pY, Float:pZ)
{
	new objeto, random = random(2);
	switch(random)
	{
		case 0: objeto = 819;
		case 1: objeto = 824;
	}
	PastoInfo[objectid][hObjID] = CreateObject(objeto, pX, pY, pZ, 0.00, 0.00, 0.00);
	return true;
}
Si no usas Streamer, ъsalo, tarde o temprano lo vas a necesitar si o si.

Link streamer: https://sampforum.blast.hk/showthread.php?tid=102865
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)