Problema con timers y objetos. -
ByMatt20030 - 13.12.2016
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
Re: Problema con timers y objetos. -
Unrea1 - 13.12.2016
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.
Re: Problema con timers y objetos. -
ByMatt20030 - 14.12.2016
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.
Re: Problema con timers y objetos. -
Unrea1 - 14.12.2016
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