[AYUDA] Tiempo para reusar un comando
#1

Hola, quisiera saber como aplico un "antispam" (lo llamaria yo asi), con eso me refiero, a que uses un comando y no se pueda usar hasta que transcurra un determinado tiempo... Por ejemplo, como le aplicaria a este sencillo cmd?

if (strcmp("/chaleco", cmdtext, true, 10) == 0)
{
SetPlayerArmour(playerid,100);
return 1;
}

Les agradeceria mucho que me ayudaran
Reply
#2

Crйa una variable que influya sobre el jugador, ej: TiempoChaleco[playerid]; y tras el comando aplicas la variable positivamente y crйas un timer, cuando el tiempo del timer concluya cancelas la variable nuevamente.
Reply
#3

Un ejemplo de lo que va en el cmd?, soy novato en esto :S
Reply
#4

Hay una forma mбs eficiente que hacerla con un timer.

En primer lugar, creas una array global para todos los jugadores, por ejemplo:

pawn Код:
new UsarComando[MAX_PLAYERS];
Luego, en la parte del comando, haces algo asн:

pawn Код:
if(!strcmp("/comando", cmdtext))
{
    if(GetTickCount() - UsarComando[playerid] > 1000)
    {
        // Aquн va el cуdigo de tu comando...
        UsarComando[playerid] = GetTickCount();
    }
}
El 1000 es la cantidad de tiempo en ms que tiene que pasar hasta que se pueda volver a usar el comando (en este ejemplo, un segundo).
GetTickCount devuelve la cantidad de milisegundos que pasaron desde que se iniciу la PC, por lo cual guardando en que momento se usу en una variable, y luego chequeando si pasу cierta cantidad de tiempo desde que se usу por ъltima vez, se puede lograr lo mismo sin usar un timer.
Reply
#5

Es mejor el mйtodo que propuso Zamaroht, evitas usar un Timer comparando los milisegundos que pasaron entre cada acciуn.
Reply
#6

Hola! Si sos novato te sugiero que Seria mejor como lo hizo Zamaroth xD
Salu2
Reply
#7

Quote:
Originally Posted by FeniXzone-Tincho2009
Посмотреть сообщение
Hola! Si sos novato te sugiero que Seria mejor como lo hizo Zamaroth xD
Salu2
sea o no novato, es la mejor forma, dado que utiliza menos recursos y x ende es mas eficaz
Reply
#8

Quote:
Originally Posted by Zamaroht
Посмотреть сообщение
Hay una forma mбs eficiente que hacerla con un timer.

En primer lugar, creas una array global para todos los jugadores, por ejemplo:

pawn Код:
new UsarComando[MAX_PLAYERS];
Luego, en la parte del comando, haces algo asн:

pawn Код:
if(!strcmp("/comando", cmdtext))
{
    if(GetTickCount() - UsarComando[playerid] > 1000)
    {
        // Aquн va el cуdigo de tu comando...
        UsarComando[playerid] = GetTickCount();
    }
}
El 1000 es la cantidad de tiempo en ms que tiene que pasar hasta que se pueda volver a usar el comando (en este ejemplo, un segundo).
GetTickCount devuelve la cantidad de milisegundos que pasaron desde que se iniciу la PC, por lo cual guardando en que momento se usу en una variable, y luego chequeando si pasу cierta cantidad de tiempo desde que se usу por ъltima vez, se puede lograr lo mismo sin usar un timer.
Lo adapte y me quedo asi:
Код:
if (strcmp("/vida", cmdtext, true, 10) == 0)
	{
      if(IsPlayerVipMember(playerid))
	  {
	   if(GetTickCount() - Antispam[playerid] > 300000)
	   {
		SetPlayerHealth(playerid,100);
		Antispam[playerid] = GetTickCount();
		}
		else SendClientMessage(playerid, COLOR_RED, "Tienes que esperar 5 minutos para reusar este comando!");
	   }
	   else SendClientMessage (playerid, COLOR_RED, "No eres VIP!");
	  return 1;
	}
	return 0;
}
Pero le encontre 2 bugs, cuando escribes /vida varias veces, el te avisa que tienes que esperar 5 minutos y no te da la vida, pero si antes de volver a escribir /vida dices otra cualquier cosa, te la recarga sin ningun aviso ni nada, y el otro es que solo te lo dice cuando tu vida esta en 100, si tu vida baja te la regenera de nuevo al escribir el cmd :S

Pero le consegui 2 bugs,
Reply
#9

Intenta esto:
pawn Код:
if(strcmp("/vida", cmdtext, true) == 0)
{
    if(!IsPlayerVipMember(playerid)) return SendClientMessage (playerid, COLOR_RED, "No eres VIP!");
    else if((GetTickCount() - Antispam[playerid]) < 300000) return SendClientMessage(playerid, COLOR_RED, "Tienes que esperar 5 minutos para reusar este comando!");
    SetPlayerHealth(playerid, 100);
    Antispam[playerid] = GetTickCount();
    return 1;
}
Reply
#10

Quote:
Originally Posted by Miguel
Посмотреть сообщение
Intenta esto:
pawn Код:
if(strcmp("/vida", cmdtext, true) == 0)
{
    if(!IsPlayerVipMember(playerid)) return SendClientMessage (playerid, COLOR_RED, "No eres VIP!");
    else if((GetTickCount() - Antispam[playerid]) < 300000) return SendClientMessage(playerid, COLOR_RED, "Tienes que esperar 5 minutos para reusar este comando!");
    SetPlayerHealth(playerid, 100);
    Antispam[playerid] = GetTickCount();
    return 1;
}
Excelente, lo testee y funciono a la perfecciуn

їPuedes tener la amabilidad de explicarme estas lineas? (Para entender y no tener la misma duda en el futuro)

if(!IsPlayerVipMember(playerid)) return SendClientMessage (playerid, COLOR_RED, "No eres VIP!");
else if((GetTickCount() - Antispam[playerid]) < 300000) return SendClientMessage(playerid, COLOR_RED,
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)