Detener un timer ?
#1

Hola, necesito ayuda para detener un timer una vez que uso un comando. Esto va asн: tengo un comando para encarcelar a los jugadores de mi servidor, este tiene un tiempo fijo de 1 minuto, luego es liberado el jugador. Sucede que ante mi curiosidad me dio por hacer el comando a la inversa, "unjail" en inglйs. Y funciona bien, pero, aunque ya he sacado al jugador de la cбrcel el tiempo sigue corriendo y cuando finaliza setea al jugador en la posiciуn determinada al salir de la cбrcel. Quiero detener el tiempo al usar el comando para liberar. їCуmo lo hago?
Reply
#2

Todo depende de que forma hagas que ese tiempo se tome (Puede ser con un timer por persona o un timer global usando gettime etc..)

Para detener un timer usas https://sampwiki.blast.hk/wiki/KillTimer

Si no funciona deja aqui tu codigo y veo
Reply
#3

Ejemplo:
pawn Код:
new tmTimer[MAX_PLAYERS];

// Ejecutar un timer que repita cada minuto:
tmTimer[playerid] = SetTimerEx("Timer", 60000, true, "i", playerid);

// Detener el timer:
KillTimer(tmTimer[playerid);
Reply
#4

Si quieres hacer un timer que se repita y deje de repetirse cuando ocurra un evento en especнfico, la mejor forma de hacer esto no es detenerlo, si no dejar de iniciar un timer bajo ciertas condiciones, cuando en otras deberнa volver a iniciar. No necesitas una variable adicional.

PHP код:
SetTimerEx("JailTimer"1000false"d"playerid);
// fijese como aqui no se repite el timer (repeat=false)! solo se llamarб una vez
public JailTimer(playerid)
{
    
JailTime[playerid] -= 1;
    if(
JailTime[playerid] != 0// todavнa le queda tiempo de carcel
        
SetTimerEx("JailTimer"1000false"d"playerid); // repetir el timer, ya que todavнa le queda tiempo
    
else // ya se le acabу el tiempo de carcel
        
SendClientMessage(playerid0xFFFFFFFF"Has sido liberado!"); // aquн el timer no se vuelve a iniciar, y se acaba el tiempo
    
return 1;

Sin embargo, si todos tus jail son de 1 minuto pero el timer se repite cada minuto, es porque estбs usando mal la funciуn de SetTimer(Ex). Ellas tienen un tercer parametro llamado "repeating". Si es false (falso), el timer solo se va a ejecutar una sola vez (como puedes ver en el ejemplo arriba). Si es true (verdadero), el timer se repetirб indefinidamente, hasta que utilices KillTimer.
Reply
#5

Ya se que debo usar, aunque no entiendo bien, les dejarй el cуdigo pero explнquenme, por favor.

PHP код:
dcmd_jail(playeridparams[])
{
    if(
sscanf(params"u"params[0]))
        return 
SendClientMessage(playerid, -1"/jail < playerid >");

    if(
params[0] == INVALID_PLAYER_ID)
        return 
SendClientMessage(playeridred"Player must be connected.");

    if(
Jailed[params[0]] == true)
        return 
SendClientMessage(playeridred"Player already jailed.");

    new 
string[83];
    
SetTimerEx("unjail"60000false"d"params[0]);
    
format(stringsizeof(string), "%s has been jailed"GetPlayerNameEx(params[0]));
    
SendClientMessageToAll(redstring);

    
SetPlayerInterior(params[0], 0);
    
SetPlayerPos(params[0], -27.14552321.164824.3034);
    
    
SendClientMessage(params[0], -1"You're on jail");

    
Jailed[params[0]] = true;
    return 
true;

PHP код:
dcmd_unjail(playeridparams[])
{
    if(
sscanf(params"u"params[0]))
        return 
SendClientMessage(playerid, -1"/unjail < playerid >");

    if(
params[0] == INVALID_PLAYER_ID)
        return 
SendClientMessage(playeridred"Player must be connected.");

    if(
Jailed[params[0]] == false)
        return 
SendClientMessage(playeridred"Player is not in jail.");

    new 
string[83];
    
format(stringsizeof(string), "%s now is free"GetPlayerNameEx(params[0]));
    
SendClientMessageToAll(redstring);

    
SetPlayerInterior(params[0], 0);
      
SetPlayerPos(params[0], -20.88892334.466324.1406);

    
Jailed[params[0]] = false;
    return 
true;

PHP код:
forward unjail(playerid);
public 
unjail(playerid)
{
      new 
string[128];
      
SetPlayerPos(playerid, -20.88892334.466324.1406);
      
SetPlayerInterior(playerid0);
      
format(stringsizeof(string), "%s now is free"GetPlayerNameEx(playerid));
      
SendClientMessageToAll(redstring);
      
Jailed[playerid] = false;
     return 
1;

Reply
#6

Para empezar nunca hagas esto (lo que esta en negritas):
Код:
dcmd_jail(playerid, params[])
{
    if(sscanf(params, "u", params[0]))
        return SendClientMessage(playerid, -1, "/jail < playerid >");

    if(params[0] == INVALID_PLAYER_ID)
        return SendClientMessage(playerid, red, "Player must be connected.");

    if(Jailed[params[0]] == true)
        return SendClientMessage(playerid, red, "Player already jailed.");

    new string[83];
    SetTimerEx("unjail", 60000, false, "d", params[0]);
    format(string, sizeof(string), "%s has been jailed", GetPlayerNameEx(params[0]));
    SendClientMessageToAll(red, string);

    SetPlayerInterior(params[0], 0);
    SetPlayerPos(params[0], -27.1455, 2321.1648, 24.3034);
    
    SendClientMessage(params[0], -1, "You're on jail");

    Jailed[params[0]] = true;
    return true;
}
Te retornara todo mal y algunas veces no te funcionara el codigo. Por ejemplo si creas un sistema de casas y quieres borrar una casa (3d text label, checkpoint, etc), no hara nada, aunque le das el id de la casa que le fue asignada ("si lo creastes asi: Label[params[0]] = CreateDynamic3DTextLabel(...);")

Aqui te va, tomalo como un ejemplo de como harias tus otros comandos y un arreglo del mismo:
pawn Код:
new tmUnJail[MAX_PLAYERS];

dcmd_jail(playerid, params[])
{
    new lookupid;
    if(sscanf(params, "u", lookupid)) return SendClientMessage(playerid, -1, "/jail < playerid >");
    if(!IsPlayerConnected(lookupid)) return SendClientMessage(playerid, red, "Player must be connected.");
    if(Jailed[lookupid] == true) return SendClientMessage(playerid, red, "Player already jailed.");

    new string[83];
    KillTimer(tmUnJail[lookupid]);
    tmUnJail[lookupid] = SetTimerEx("unjail", 60000, false, "i", lookupid);
    format(string, sizeof(string), "%s has been jailed", GetPlayerNameEx(lookupid));
    SendClientMessageToAll(red, string);

    SetPlayerInterior(lookupid, 0);
    SetPlayerPos(lookupid, -27.1455, 2321.1648, 24.3034);
   
    SendClientMessage(lookupid, -1, "You're on jail");

    Jailed[lookupid] = true;
    return 1;
}

dcmd_unjail(playerid, params[])
{
    new lookupid;
    if(sscanf(params, "u", lookupid)) return SendClientMessage(playerid, -1, "/unjail < playerid >");
    if(!IsPlayerConnected(lookupid)) return SendClientMessage(playerid, red, "Player must be connected.");
    if(Jailed[lookupid] == false) return SendClientMessage(playerid, red, "Player is not in jail.");

    new string[83];
    format(string, sizeof(string), "%s now is free", GetPlayerNameEx(lookupid));
    SendClientMessageToAll(red, string);

    SetPlayerInterior(lookupid, 0);
    SetPlayerPos(lookupid, -20.8889, 2334.4663, 24.1406);

    KillTimer(tmUnJail[lookupid]);
    Jailed[lookupid] = false;
    return 1;
}

forward unjail(playerid);
public unjail(playerid)
{
    new string[128];
    SetPlayerPos(playerid, -20.8889, 2334.4663, 24.1406);
    SetPlayerInterior(playerid, 0);
    format(string, sizeof(string), "%s now is free", GetPlayerNameEx(playerid));
    SendClientMessageToAll(red, string);
    Jailed[playerid] = false;
    return 1;
}
Reply
#7

Quote:
Originally Posted by SickAttack
Посмотреть сообщение
Para empezar nunca hagas esto (lo que esta en negritas):

Te retornara todo mal y algunas veces no te funcionara el codigo. Por ejemplo si creas un sistema de casas y quieres borrar una casa (3d text label, checkpoint, etc), no hara nada, aunque le das el id de la casa que le fue asignada ("si lo creastes asi: Label[params[0]] = CreateDynamic3DTextLabel(...);")

Aqui te va, tomalo como un ejemplo de como harias tus otros comandos y un arreglo del mismo:
Gracias, por la correcciуn y el dato.
Reply
#8

Quote:
Originally Posted by SickAttack
Посмотреть сообщение
Para empezar nunca hagas esto (lo que esta en negritas):
Podrнas explicarle porque ese es un mйtodo absurdo de obtener informaciуn de los parametros. params es una cadena (o string). Si tienes un comando cualquiera, y escribes un texto cualquiera despuйs, ese texto serб params, es decir, los parбmetros que has introducido. Estos no han sido procesados aъn, por lo que no puedes saber cual parбmetro es cada cosa.

pawn Код:
/hola esto es una prueba
COMANDO: /hola
PARAMS: "esto es una prueba"
PARAMS[0]: "e"
PARAMS[1]: "s"
PARAMS[3]: "o"
Esto es obviamente carente de sentido al querer procesar comandos, ademбs de dificil de leer y comprender (їporquй los parбmetros estarнan ordenados por nъmeros cuando puedes identificarlos fбcilmente con variables? - infinitamente mejor y mбs fбcil). La mejor forma de procesar este recurso bruto y separarlo en diferentes argumentos es usando sscanf, la cual separarб las palabras introducidas por el usuario por espacios.
PHP код:
// Esto usa sscanf y zcmd!
CMD:jail(playeridparams[])
{
    new 
victimtime// definimos las variables que usaremos, y en las que sscanf almacenarб el valor obtenido mediante "params"
    
if(sscanf(params"ud"victimtime))
    
/* con sscanf separamos "params" y usamos los identificadores "u" (para jugadores) y "d" (para nъmeros).
       por orden, se asignan estos valores a "victim" y "time".
       este cуdigo comprueba si el orden de "params" coincide con el orden de los identificadores.
    */
    
{
         
SendClientMessage(playerid, -1"uso correcto: /jail [jugador] [tiempo]");
         return 
1;
    }
    
    
// Aqui ya puedes procesar al jugaor usando las variables. Un ejemplo usando variable imaginaria:
    
JailTime[victim] = time;
    return 
1;

Tutoriales:
https://sampforum.blast.hk/showthread.php?tid=206237
https://sampforum.blast.hk/showthread.php?tid=280476
https://sampforum.blast.hk/showthread.php?tid=300397
https://sampwiki.blast.hk/wiki/Fast_Commands#zcmd
Reply
#9

Quote:
Originally Posted by SickAttack
Посмотреть сообщение
Para empezar nunca hagas esto (lo que esta en negritas):
ї Tratas de decir que sscanf tiene errores ?. Es lo mismo, lo ъnico diferente que noto es el leer el cуdigo mбs fбcil, sн te da error al usar esto es porque no lo haces bien.
Reply
#10

Quote:
Originally Posted by JuanStone
Посмотреть сообщение
ї Tratas de decir que sscanf tiene errores ?. Es lo mismo, lo ъnico diferente que noto es el leer el cуdigo mбs fбcil, sн te da error al usar esto es porque no lo haces bien.
Yo no veo que haya dicho eso, es mбs, tiene razуn.

Probablemente ese comando funcione dependiendo de la ID que haya introducido, pero si ya admantis ha dado la explicaciуn correcta anteriormente, їpara quй comentan buscando guerra? No lo entiendo colega.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)