[Duda] Limitar el uso de un comando a x veces
#1

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.
Reply
#2

lo necesitas x veces o por x tiempo?
Reply
#3

Pues que si lo usas 10 veces no te deje usarlo mas hasta que pasen por ejemplo 1 hora
Reply
#4

Aca te dejo un ejemplo de como seria lo que tu quieres con algunas otras cosas que te pueden interesar:
pawn Код:
#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;
    }
}
Reply
#5

hazlo con GetTickCount es mejor . https://sampforum.blast.hk/showthread.php?tid=357690
Reply
#6

Quote:
Originally Posted by bytytus
Посмотреть сообщение
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.
Reply
#7

Quote:
Originally Posted by the_chaoz
Посмотреть сообщение
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.
:S por ke de buguea ? con esta forma del tutorial ?

yo lo tengo con GetTickCount pero de otra forma me asustas ahora :S xD
Reply
#8

Quote:
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
....
Reply
#9

ah ok, entonce yo diria para ke no se buguee se deberia colocar la variable ke fue combinada con GetTickCount a 0 cuando termina el temporizador no ?
Reply
#10

Quote:
Originally Posted by the_chaoz
Посмотреть сообщение
Aca te dejo un ejemplo de como seria lo que tu quieres con algunas otras cosas que te pueden interesar:
pawn Код:
#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;
    }
}
Gracias chaoz un genio! solo una duda mas, donde pones los segundos que te dejara volver a usar el comando? es que no lo encuentro xD

PD: El return 0 ese creo que sobra
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)