SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Español/Spanish

 
 
Thread Tools Display Modes
Old 14/05/2017, 11:16 PM   #1
Lucille
Little Clucker
 
Lucille's Avatar
 
Join Date: May 2017
Posts: 44
Reputation: 0
Default Por que envia muchos mensajes :(

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

Code:
#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;
}
Lucille is offline  
Old 15/05/2017, 12:02 AM   #2
FelipeAndres
Huge Clucker
 
FelipeAndres's Avatar
 
Join Date: Feb 2015
Location: Chile
Posts: 249
Reputation: 20
Default Respuesta: Por que envia muchos mensajes :(

OnPlayerUpdate se ejecuta como 20 veces por segundo xd

debes usar un timer:

PHP Code:
SetTimer("anticheat"10000true); 
Lo puedes poner en OnGameModeInit, pero sacalo de OnPlayerUpdate
__________________
SuperDanova Freeroam: samp.superdanova.com:8888
SuperDanova RolePlay: samp.superdanova.com:5555

Last edited by FelipeAndres; 15/05/2017 at 02:06 AM.
FelipeAndres is offline  
Old 15/05/2017, 12:04 AM   #3
Toroi
Gangsta
 
Toroi's Avatar
 
Join Date: Feb 2017
Location: Venezuela
Posts: 744
Reputation: 137
Default Re: Por que envia muchos mensajes :(

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 Code:
    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?
__________________
Scripting Help in a nutshell

Quote:
Originally Posted by Thanks View Post
So.. hey everyone im trying to searching at ****** how to make leaderboard with Textdraws so i find many but Not in my brain...
Toroi is offline  
Old 15/05/2017, 12:12 AM   #4
FelipeAndres
Huge Clucker
 
FelipeAndres's Avatar
 
Join Date: Feb 2015
Location: Chile
Posts: 249
Reputation: 20
Default Respuesta: Por que envia muchos mensajes :(

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

PHP Code:
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
__________________
SuperDanova Freeroam: samp.superdanova.com:8888
SuperDanova RolePlay: samp.superdanova.com:5555
FelipeAndres is offline  
Old 15/05/2017, 12:28 AM   #5
x3378
Little Clucker
 
Join Date: Jul 2015
Posts: 33
Reputation: 10
Default Respuesta: Por que envia muchos mensajes :(

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.


Code:
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;
}
x3378 is offline  
Old 15/05/2017, 12:37 AM   #6
Lucille
Little Clucker
 
Lucille's Avatar
 
Join Date: May 2017
Posts: 44
Reputation: 0
Default Re: Por que envia muchos mensajes :(

Muchas gracias shacos
Lucille is offline  
Old 15/05/2017, 12:39 AM   #7
Toroi
Gangsta
 
Toroi's Avatar
 
Join Date: Feb 2017
Location: Venezuela
Posts: 744
Reputation: 137
Default Re: Respuesta: Por que envia muchos mensajes :(

Quote:
Originally Posted by x3378 View Post
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.
__________________
Scripting Help in a nutshell

Quote:
Originally Posted by Thanks View Post
So.. hey everyone im trying to searching at ****** how to make leaderboard with Textdraws so i find many but Not in my brain...
Toroi is offline  
Old 15/05/2017, 12:44 AM   #8
Lucille
Little Clucker
 
Lucille's Avatar
 
Join Date: May 2017
Posts: 44
Reputation: 0
Default Re: Respuesta: Por que envia muchos mensajes :(

Quote:
Originally Posted by Troydere View Post
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
Lucille is offline  
Old 15/05/2017, 02:03 AM   #9
FelipeAndres
Huge Clucker
 
FelipeAndres's Avatar
 
Join Date: Feb 2015
Location: Chile
Posts: 249
Reputation: 20
Default Respuesta: Por que envia muchos mensajes :(

Quote:
Originally Posted by x3378 View Post
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.


Code:
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
__________________
SuperDanova Freeroam: samp.superdanova.com:8888
SuperDanova RolePlay: samp.superdanova.com:5555
FelipeAndres is offline  
Old 15/05/2017, 04:38 AM   #10
Lucille
Little Clucker
 
Lucille's Avatar
 
Join Date: May 2017
Posts: 44
Reputation: 0
Default Re: Por que envia muchos mensajes :(

Saben por que sigue dando flood :/, se supone que cada 10 srgundos, para manda un mensaje cada 1 srgundo, es bien extraño
Lucille is offline  
 

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Comando envia menssagem marcelowinchester Português/Portuguese 2 06/03/2017 07:00 AM
[Ajuda] Não envia a mensagem . xxRaioxx Português/Portuguese 11 29/08/2013 07:12 PM
[Ajuda] String não envia.. B4dB0y Português/Portuguese 9 31/07/2013 06:08 PM
[Ajuda] SendClientMessage envia mensagem fora da ordem. Strike_Legends Português/Portuguese 10 27/04/2013 08:00 PM


All times are GMT. The time now is 07:08 AM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.