[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
![Wink](images/smilies/wink.png)
.
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!
![Cheesy](images/smilies/biggrin.png)
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