SA-MP Forums Archive
[Duda] Limitar el uso de un comando a x veces - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Español/Spanish (https://sampforum.blast.hk/forumdisplay.php?fid=29)
+---- Thread: [Duda] Limitar el uso de un comando a x veces (/showthread.php?tid=382708)



[Duda] Limitar el uso de un comando a x veces - sergios - 04.10.2012

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.


Respuesta: [Duda] Limitar el uso de un comando a x veces - xSDx - 04.10.2012

lo necesitas x veces o por x tiempo?


Re: [Duda] Limitar el uso de un comando a x veces - sergios - 04.10.2012

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


Respuesta: [Duda] Limitar el uso de un comando a x veces - TheChaoz - 04.10.2012

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;
    }
}



Respuesta: [Duda] Limitar el uso de un comando a x veces - OTACON - 04.10.2012

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


Respuesta: [Duda] Limitar el uso de un comando a x veces - TheChaoz - 04.10.2012

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.


Respuesta: [Duda] Limitar el uso de un comando a x veces - OTACON - 04.10.2012

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


Respuesta: [Duda] Limitar el uso de un comando a x veces - Jovanny - 04.10.2012

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
....


Respuesta: [Duda] Limitar el uso de un comando a x veces - OTACON - 05.10.2012

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 ?


Re: Respuesta: [Duda] Limitar el uso de un comando a x veces - sergios - 05.10.2012

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