04.10.2012, 18:07
Hola, me gustaria saber como limitar el uso de un comando, un ejemplo si pongo /saludar 10 veces me salga un mensaje diciendo no puedes usar este comando por hoy y me vuelva a dejar usarlo en un tiempo determinado.
#include <a_samp>
/*Definimos el uso maximo de veces que el comando puede ser utilizado.
Puedes colocarlo directamente en el comando, yo lo hice asi para que sea mas
generico*/
#define MAX_USE (10)
/*Algunas variables que utilizaremos para el comando definidas en forma de enum
para utilizarlas en el array que aparece debajo*/
enum PD
{
//Este sera el contador, variable que almacena la cantidad de veces que se utilizo el comando
MiComando_Contador,
//Este es el temporizador que ira reduciendo el tiempo que le falta al jugador para volver a utilizar el comando
MiComando_Timer,
//Tiempo en segundos que le quedan de espera al jugador para utilizar el comando nuevamente
MiComando_Segundos
};
new Info[MAX_PLAYERS][PD];
//Callback llamado donde se crean los comandos
public OnPlayerCommandText(playerid, cmdtext[])
{
//Nuestro comando
if(!strcmp(cmdtext, "/micomando", true))
{
//Si el comando fue utilizado la cantidad de veces definidas (o mas por error), entonces paramos el comando
if(Info[playerid][MiComando_Contador] >= MAX_USE)
{
//Espacio calculado para utilizar grandes tiempos de espera (superiores a 24hs), caso contrario basta con 60 celdas.
new str[70];
//Creamos nuestro temporizador
Info[playerid][MiComando_Timer] = SetTimerEx("MiComando_Reset", 1000, 1, "i", playerid);
//Asignamos el tiempo que debera esperar el jugador para utilizar el comando nuevamente (1Hs=60segundos*60minutos)
Info[playerid][MiComando_Segundos] = 60*60;
//Extra, formateamos un string para avisarle al jugador el tiempo de espera que le queda
format(str, 128, "Debes esperar %i:%i:%i para volver a utilizar este comando.", (((Info[playerid][MiComando_Segundos] / (60*60)) != 0) ? (Info[playerid][MiComando_Segundos] / (60*60)) : (0)), (((Info[playerid][MiComando_Segundos] / (60)) != 0) ? (Info[playerid][MiComando_Segundos] / (60)) : (0)), Info[playerid][MiComando_Segundos]);
//Enviamos el mensaje y cortamos el comando
return SendClientMessage(playerid, -1, str);
}
//El jugador puede utilizar el comando y se lo decimos.
SendClientMessage(playerid, -1, "Aun puedes utilizar el comando!");
//Sumamos 1 al contador por la cantidad de veces que el jugador utilizo el comando
Info[playerid][MiComando_Contador]++;
return 1;
}
return 0;
}
//Definimos nuestro temporizador (su callback)
forward MiComando_Reset(playerid);
public MiComando_Reset(playerid)
{
//Si el tiempo es mayor a 0, entonces restamos otro segundo, caso contrario eliminamos el temporizador y reiniciamos su contador
if(Info[playerid][MiComando_Segundos] > 0)
Info[playerid][MiComando_Segundos]--;
else
{
KillTimer(Info[playerid][MiComando_Timer]);
Info[playerid][MiComando_Contador] = 0;
}
}
hazlo con GetTickCount es mejor . https://sampforum.blast.hk/showthread.php?tid=357690
|
El problema con esta funcion es que tiende a buguearse luego de un tiempo y deja de funcionar correctamente. En todo caso deberia utilizar getdate y ya no seria tan precisa.
|
Originally Posted by Wiki_SAMP
Important Note: GetTickCount will cause problems on servers with uptime of over 24 days (physical server, not SA:MP server) as GetTickCount will eventually warp past the integer size constraints
|
Aca te dejo un ejemplo de como seria lo que tu quieres con algunas otras cosas que te pueden interesar:
pawn Код:
|