Por que envia muchos mensajes :(
#1

Alguien podria por favor decirme por que con este siguiente codigo, me envia muchos mensajes, y no uno cada 10 segundos como yo queria /_/

Код:
#include <a_samp>

new FlyHack[MAX_PLAYERS];

forward anticheat(playerid);
public anticheat(playerid)
{
	for(new i = 0; i < MAX_PLAYERS; i++)
	{
        if(IsPlayerConnected(i))
        {
       		new Float:Vel[3], Float:Pos[3];
			GetPlayerVelocity(playerid, Vel[0], Vel[1], Vel[2]);
			new nombre[MAX_PLAYER_NAME], string[24+MAX_PLAYER_NAME];
			GetPlayerName(playerid, nombre, sizeof(nombre));
			GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
			if(Vel[0] <= -0.800000  || Vel[1] <= -0.800000 || Vel[2] <= -0.800000)
			{
	    		SetPlayerPos(playerid, Pos[0], Pos[1]-10, Pos[2]);
				format(string, sizeof(string), "El jugador (%s) esta a una velocidad de X: %f, Y: %f, Z: %f", nombre, Vel[0], Vel[1], Vel[2]);
				SendClientMessage(playerid, 0xFFFFFFFF, string);
				FlyHack[playerid] = SetTimerEx("anticheat",10000,0,"d",playerid);//10 segundos
    			return 1;
			}
   		}
   	}
	return 1;
}

public OnPlayerUpdate(playerid)
{
	anticheat(playerid);
	return 1;
}
Reply
#2

OnPlayerUpdate se ejecuta como 20 veces por segundo xd

debes usar un timer:

PHP код:
SetTimer("anticheat"10000true); 
Lo puedes poner en OnGameModeInit, pero sacalo de OnPlayerUpdate
Reply
#3

Quote:

Lo puedes poner en OnGameModeInit, pero sacalo de OnPlayerUpdate

Serнa mejor bajo OnPlayerConnect ya que el parбmetro a pasar serнa playerid.

Para agregar a lo anterior:

PHP код:
    for(new 0MAX_PLAYERSi++)
    {
        if(
IsPlayerConnected(i))
        {
               new 
Float:Vel[3], Float:Pos[3];
            
GetPlayerVelocity(playeridVel[0], Vel[1], Vel[2]);
            new 
nombre[MAX_PLAYER_NAME], string[24+MAX_PLAYER_NAME];
            
GetPlayerName(playeridnombresizeof(nombre));
            
GetPlayerPos(playeridPos[0], Pos[1], Pos[2]);
            if(
Vel[0] <= -0.800000  || Vel[1] <= -0.800000 || Vel[2] <= -0.800000)
            {
                
SetPlayerPos(playeridPos[0], Pos[1]-10Pos[2]);
                
format(stringsizeof(string), "El jugador (%s) esta a una velocidad de X: %f, Y: %f, Z: %f"nombreVel[0], Vel[1], Vel[2]);
                
SendClientMessage(playerid0xFFFFFFFFstring);
                
FlyHack[playerid] = SetTimerEx("anticheat",10000,0,"d",playerid);//10 segundos
                
return 1;
            }
           }
       } 
Tienes un loop desde cero hasta el valor en el cual tengas definido MAX_PLAYERS, dentro del mismo tienes la funciуn SendClientMessage, que crees que pase cada vuelta que dй el loop?

EDIT: Y para agregar a todo, їpara quй pasas un parбmetro de playerid si haces un loop igual por todos los jugadores?
Reply
#4

un timer por cada jugador? na, te fijaste en el loop que estб haciendo en anticheat?

PHP код:
forward anticheat();
public 
anticheat()
{
    for(new 
playerid 0playerid MAX_PLAYERSplayerid++)
    {
        if(
IsPlayerConnected(playerid))
        {
               new 
Float:Vel[3], Float:Pos[3];
            
GetPlayerVelocity(playeridVel[0], Vel[1], Vel[2]);
            new 
nombre[MAX_PLAYER_NAME], string[24+MAX_PLAYER_NAME];
            
GetPlayerName(playeridnombresizeof(nombre));
            
GetPlayerPos(playeridPos[0], Pos[1], Pos[2]);
            if(
Vel[0] <= -0.800000  || Vel[1] <= -0.800000 || Vel[2] <= -0.800000)
            {
                
SetPlayerPos(playeridPos[0], Pos[1]-10Pos[2]);
                
format(stringsizeof(string), "El jugador (%s) esta a una velocidad de X: %f, Y: %f, Z: %f"nombreVel[0], Vel[1], Vel[2]);
                
SendClientMessage(playerid0xFFFFFFFFstring);
            }
           }
       }
    return 
1;

eso seria lo mejor
Reply
#5

Ni uno ni lo otro serнa mejor porque el cуdigo estб mal.

Con el cуdigo de FelipeAndres el anticheat harнa su funciуn cada diez segundos y йl sуlo quiere enviar el mensaje cada diez segundos pero estar comprobando constantemente.

El ъnico buen consejo de FelipeAndres es no utilizar un temporizador por cada jugador.

Troydere comentу su idea pero no arreglo el cуdigo, no es un pedido de un cуdigo pero si dejas uno; es porque asн lo tomaste y tu cуdigo deberнa funcionar(y el tuyo no lo hace correctamente).

Lo correcto es comprobar constantemente y enviar un mensaje cada diez segundos, serнa con un solo temporizador para todos los jugadores y comprobando con una PVAR para enviar el mensaje cada diez segundos, tambiйn puedes agregar las variables fuera del bucle para no crear las variables que utilizas en la funciуn anticheat por la cantidad de todos tus jugadores, las creas una vez y ya, en lugar de hasta 1000 veces.


Код:
public OnGameModeInit()
{
	SetTimer("AntiCheat", 1000, true);
	return 1;
}

forward AntiCheat();
public AntiCheat()
{
	new Float:velocity[3], Float:pos[3], UserName[MAX_PLAYER_NAME], message[100];

	for (new i = 0; i != MAX_PLAYERS; i++)
	{
	    if (! IsPlayerConnected(i))
	        continue;

		GetPlayerVelocity(i, velocity[0], velocity[1], velocity[2]);
		GetPlayerPos(i, pos[0], pos[1], pos[2]);
		
		if (velocity[0] <= -0.800000 || velocity[1] <= -0.800000 || velocity[2] <= -0.800000)
		{
		    if (GetPVarInt(i, "AnticheatMessage") < gettime())
		    {
		    	SetPlayerPos(i, pos[0], pos[1], pos[2]);
		    	GetPlayerName(i, UserName, sizeof (UserName));

		    	format(message, sizeof (message), "El jugador (%s) esta a una velocidad de X: %f, Y: %f, Z: %f", UserName, velocity[0], velocity[1], velocity[2]);
		    	SendClientMessage(i, 0xFFFFFFFF, message);
		    	SetPVarInt(i, "AnticheatMessage", (gettime() +10));
	    	}
		}
	}
	return 1;
}
Reply
#6

Muchas gracias shacos
Reply
#7

Quote:
Originally Posted by x3378
Посмотреть сообщение
pared de texto
Esta forma de hacerlo serнa la mas indicada. No obstante, a mi punto de vista, es mejor darle las ideas estructuradas a las personas en vez de darles un cуdigo para copiar y pegar con el cual no aprenderбn absolutamente nada.
Reply
#8

Quote:
Originally Posted by Troydere
Посмотреть сообщение
Esta forma de hacerlo serнa la mas indicada. No obstante, a mi punto de vista, es mejor darle las ideas estructuradas a las personas en vez de darles un cуdigo para copiar y pegar con el cual no aprenderбn absolutamente nada.
Jaja si
Reply
#9

Quote:
Originally Posted by x3378
Посмотреть сообщение
Ni uno ni lo otro serнa mejor porque el cуdigo estб mal.

Con el cуdigo de FelipeAndres el anticheat harнa su funciуn cada diez segundos y йl sуlo quiere enviar el mensaje cada diez segundos pero estar comprobando constantemente.

El ъnico buen consejo de FelipeAndres es no utilizar un temporizador por cada jugador.

Troydere comentу su idea pero no arreglo el cуdigo, no es un pedido de un cуdigo pero si dejas uno; es porque asн lo tomaste y tu cуdigo deberнa funcionar(y el tuyo no lo hace correctamente).

Lo correcto es comprobar constantemente y enviar un mensaje cada diez segundos, serнa con un solo temporizador para todos los jugadores y comprobando con una PVAR para enviar el mensaje cada diez segundos, tambiйn puedes agregar las variables fuera del bucle para no crear las variables que utilizas en la funciуn anticheat por la cantidad de todos tus jugadores, las creas una vez y ya, en lugar de hasta 1000 veces.


Код:
public OnGameModeInit()
{
	SetTimer("AntiCheat", 1000, true);
	return 1;
}

forward AntiCheat();
public AntiCheat()
{
	new Float:velocity[3], Float:pos[3], UserName[MAX_PLAYER_NAME], message[100];

	for (new i = 0; i != MAX_PLAYERS; i++)
	{
	    if (! IsPlayerConnected(i))
	        continue;

		GetPlayerVelocity(i, velocity[0], velocity[1], velocity[2]);
		GetPlayerPos(i, pos[0], pos[1], pos[2]);
		
		if (velocity[0] <= -0.800000 || velocity[1] <= -0.800000 || velocity[2] <= -0.800000)
		{
		    if (GetPVarInt(i, "AnticheatMessage") < gettime())
		    {
		    	SetPlayerPos(i, pos[0], pos[1], pos[2]);
		    	GetPlayerName(i, UserName, sizeof (UserName));

		    	format(message, sizeof (message), "El jugador (%s) esta a una velocidad de X: %f, Y: %f, Z: %f", UserName, velocity[0], velocity[1], velocity[2]);
		    	SendClientMessage(i, 0xFFFFFFFF, message);
		    	SetPVarInt(i, "AnticheatMessage", (gettime() +10));
	    	}
		}
	}
	return 1;
}
Lo unico bueno que hiciste fue poner las variables arriba del loop, lo demбs del gettime y el pvar estб de sobra, porque de todas formas el mensaje se enviarб cada 10 segundos, para que quieres comprobar que si se enviу el mensaje cada 10 segundos, si el loop se ejecuta cada 10 segundos... no le veo la lуgica
Reply
#10

Saben por que sigue dando flood :/, se supone que cada 10 srgundos, para manda un mensaje cada 1 srgundo, es bien extraсo
Reply
#11

Cambia el settimer de 1000 a 10000
Reply
#12

Porque esta en OnPlayerUpdate :/
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)