Portal SAMP
[Tutorial] SetTimer e SetTimerEx - Básico - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Guias e Tutoriais (https://portalsamp.com/forumdisplay.php?fid=7)
+--- Tópico: [Tutorial] SetTimer e SetTimerEx - Básico (/showthread.php?tid=821)

Páginas: 1 2


RE: SetTimer e SetTimerEx - Básico - White_Blue - 24/11/2022

(24/11/2022 07:00)MisteriumBr Escreveu: Para isto existe a função KillTimer.

Código PHP:
new timer[MAX_PLAYERS];

public 
OnPlayerConnect(playerid) {
           Timer[playerid] = SetTimerEx("StartTimer"10000true"i"playerid); // Inicia o timer quando o player entra no servidor
      return 1;
}

public 
OnPlayerDisconnect(playeridreason) {
       KillTimer(Timer[playerid]); // Executamos a KillTimer, que para o timer.
       return 1;
}

forward StartTimer(playerid);
public 
StartTimer(playerid) {
     GivePlayerMoney(playerid1000); // Neste exemplo, o timer dará $1,000 para o player a cada 10 segundos enquanto ele estiver desconectado
     return 1;



Me tira uma dúvida para ver se estou fazendo certo, estou querendo colocar um anti farm na hora de vender veiculos, para o player não ficar comprando e vendendo o veículo o tempo todo, então pensei em colocar um SetTimer para limitar o uso do comando caso ele seja executado de novo. E seja liberado depois de 1 hora por exemplo. O uso do SetTimeEx serve para fazer isso, se puder me dar uma luz de código alternativo mais simples, valeu irmão
Para isso não é necessário SetTimerEx. Você pode usar timestamp.

OBS: Se o jogador sair do servidor e entrar, o tempo será zerado. Então se quiser salvar terá que usar seu sistema de salvamento.

Código PHP:
CMD:teste(playerid) {
     if(
gettime() - GetPVarInt(playerid"Time") < 3600000) return SendClientMessage(playerid, -1"Aguarde 1 hora para usar o comando novamente.");
     
SetPVarInt(playerid"Time"gettime());
     
SendClientMessage(playerid, -1"Você usou o comando! Agora só poderá usar novamente em 1 hora.");
     return 
1;




RE: SetTimer e SetTimerEx - Básico - MisteriumBr - 24/11/2022

(24/11/2022 09:17)White_Blue Escreveu:
(24/11/2022 07:00)MisteriumBr Escreveu: Para isto existe a função KillTimer.

Código PHP:
new timer[MAX_PLAYERS];

public 
OnPlayerConnect(playerid) {
           Timer[playerid] = SetTimerEx("StartTimer"10000true"i"playerid); // Inicia o timer quando o player entra no servidor
      return 1;
}

public 
OnPlayerDisconnect(playeridreason) {
       KillTimer(Timer[playerid]); // Executamos a KillTimer, que para o timer.
       return 1;
}

forward StartTimer(playerid);
public 
StartTimer(playerid) {
     GivePlayerMoney(playerid1000); // Neste exemplo, o timer dará $1,000 para o player a cada 10 segundos enquanto ele estiver desconectado
     return 1;



Me tira uma dúvida para ver se estou fazendo certo, estou querendo colocar um anti farm na hora de vender veiculos, para o player não ficar comprando e vendendo o veículo o tempo todo, então pensei em colocar um SetTimer para limitar o uso do comando caso ele seja executado de novo. E seja liberado depois de 1 hora por exemplo. O uso do SetTimeEx serve para fazer isso, se puder me dar uma luz de código alternativo mais simples, valeu irmão
Para isso não é necessário SetTimerEx. Você pode usar timestamp.

OBS: Se o jogador sair do servidor e entrar, o tempo será zerado. Então se quiser salvar terá que usar seu sistema de salvamento.

Código PHP:
CMD:teste(playerid) {
     if(gettime() - GetPVarInt(playerid"Time") < 3600000) return SendClientMessage(playerid, -1"Aguarde 1 hora para usar o comando novamente.");
     SetPVarInt(playerid"Time"gettime());
     SendClientMessage(playerid, -1"Você usou o comando! Agora só poderá usar novamente em 1 hora.");
     return 1;


Cara queria te agradecer primeiramente esta me ajudando demais.
Esse codigo acima me funcionou legal, mas como eu poderia estar salvando essa informação para cada player, sou um pouco iniciante e é a primeira vez que estou mexendo com gettime, quebrei a cabeça com o SetTimeEx antes mas você me ajudou XD


RE: SetTimer e SetTimerEx - Básico - White_Blue - 24/11/2022

(24/11/2022 15:37)MisteriumBr Escreveu:
(24/11/2022 09:17)White_Blue Escreveu:
(24/11/2022 07:00)MisteriumBr Escreveu: Para isto existe a função KillTimer.

Código PHP:
new timer[MAX_PLAYERS];

public 
OnPlayerConnect(playerid) {
           Timer[playerid] = SetTimerEx("StartTimer"10000true"i"playerid); // Inicia o timer quando o player entra no servidor
      return 1;
}

public 
OnPlayerDisconnect(playeridreason) {
       KillTimer(Timer[playerid]); // Executamos a KillTimer, que para o timer.
       return 1;
}

forward StartTimer(playerid);
public 
StartTimer(playerid) {
     GivePlayerMoney(playerid1000); // Neste exemplo, o timer dará $1,000 para o player a cada 10 segundos enquanto ele estiver desconectado
     return 1;



Me tira uma dúvida para ver se estou fazendo certo, estou querendo colocar um anti farm na hora de vender veiculos, para o player não ficar comprando e vendendo o veículo o tempo todo, então pensei em colocar um SetTimer para limitar o uso do comando caso ele seja executado de novo. E seja liberado depois de 1 hora por exemplo. O uso do SetTimeEx serve para fazer isso, se puder me dar uma luz de código alternativo mais simples, valeu irmão
Para isso não é necessário SetTimerEx. Você pode usar timestamp.

OBS: Se o jogador sair do servidor e entrar, o tempo será zerado. Então se quiser salvar terá que usar seu sistema de salvamento.

Código PHP:
CMD:teste(playerid) {
     if(gettime() - GetPVarInt(playerid"Time") < 3600000) return SendClientMessage(playerid, -1"Aguarde 1 hora para usar o comando novamente.");
     SetPVarInt(playerid"Time"gettime());
     SendClientMessage(playerid, -1"Você usou o comando! Agora só poderá usar novamente em 1 hora.");
     return 1;


Cara queria te agradecer primeiramente esta me ajudando demais.
Esse codigo acima me funcionou legal, mas como eu poderia estar salvando essa informação para cada player, sou um pouco iniciante e é a primeira vez que estou mexendo com gettime, quebrei a cabeça com o SetTimeEx antes mas você me ajudou XD

Ficarei feliz em ajudar. Mas primeiro tenho que saber qual sistema de salvamento você usa. Ex: MySQL, DOF2, Dini.


RE: SetTimer e SetTimerEx - Básico - MisteriumBr - 24/11/2022

No momento estou usando DOF2


RE: SetTimer e SetTimerEx - Básico - White_Blue - 24/11/2022

(24/11/2022 15:46)MisteriumBr Escreveu: No momento estou usando DOF2

Então é simples. Nesse caso, usaremos o timer para salvar.

Código PHP:
new Timer[MAX_PLAYERS];

forward Timer(playerid);
public 
Timer(playerid) {
     new 
Arquivo[128], pname[MAX_PLAYER_NAME];
     
GetPlayerName(playeridpnameMAX_PLAYER_NAME);
     
format(Arquivosizeof(Arquivo), "/Sua_Pasta_de_Contas/%s",);
     
DOF2_SetInt(Arquivo"Time"0);
     return 
1;
}

CMD:teste(playerid) {
      new 
Arquivo[128], pname[MAX_PLAYER_NAME];
      GetPlayerName(playeridpnameMAX_PLAYER_NAME);
      format(Arquivosizeof(Arquivo), "/Sua_Pasta_de_Contas/%s",);
     if(
DOF2_GetInt(Arquivo"Time")) return SendClientMessage(playerid, -1"Você só pode usar este comando dentro de 1 hora!");
     
DOF2_SetInt(Arquivo"Time"1);
     
SendClientMessage(playerid, -1"Comando efetuado! Agora você só poderá usar este comando dentro de 1 hora.");
     
Timer[playerid] = SetTimerEx("Timer"3600000false"i"playerid); // Seta o timer para 1 hora para resetar e o player poder usar o comando novamente.
     
DOF2_SetInt(Arquivo"Tempo"Timer);
     return 
1;
}

public 
OnPlayerDisconnect(playeridreason) {
     
KillTimer(Timer[playerid]);
     return 
1;




RE: SetTimer e SetTimerEx - Básico - MisteriumBr - 24/11/2022

[quote pid="11827" dateline="1669316672"]


Então é simples. Nesse caso, usaremos o timer para salvar.

Código PHP:
new Timer[MAX_PLAYERS];

forward Timer(playerid);
public 
Timer(playerid) {
     new Arquivo[128], pname[MAX_PLAYER_NAME];
     GetPlayerName(playeridpnameMAX_PLAYER_NAME);
     format(Arquivosizeof(Arquivo), "/Sua_Pasta_de_Contas/%s",);
     DOF2_SetInt(Arquivo"Time"0);
     return 1;
}

CMD:teste(playerid) {
      new Arquivo[128], pname[MAX_PLAYER_NAME];
      GetPlayerName(playeridpnameMAX_PLAYER_NAME);
      format(Arquivosizeof(Arquivo), "/Sua_Pasta_de_Contas/%s",);
     if(DOF2_GetInt(Arquivo"Time")) return SendClientMessage(playerid, -1"Você só pode usar este comando dentro de 1 hora!");
     DOF2_SetInt(Arquivo"Time"1);
     SendClientMessage(playerid, -1"Comando efetuado! Agora você só poderá usar este comando dentro de 1 hora.");
     Timer[playerid] = SetTimerEx("Timer"3600000false"i"playerid); // Seta o timer para 1 hora para resetar e o player poder usar o comando novamente.
     DOF2_SetInt(Arquivo"Tempo"Timer);
     return 1;
}

public 
OnPlayerDisconnect(playeridreason) {
     KillTimer(Timer[playerid]);
     return 1;


[/quote]

Nesse caso quando o player conectar novamente ele recupera o tempo?

Eu vi que tem um KillTimer em OnPlayerDisconnect ele apenas para o timer ou apaga?


RE: SetTimer e SetTimerEx - Básico - White_Blue - 24/11/2022

(24/11/2022 16:16)MisteriumBr Escreveu: [quote pid="11827" dateline="1669316672"]


Código PHP:
Então é simplesNesse casousaremos o timer para salvar.

[
php]new Timer[MAX_PLAYERS];

forward Timer(playerid);
public 
Timer(playerid) {
     new Arquivo[128], pname[MAX_PLAYER_NAME];
     GetPlayerName(playeridpnameMAX_PLAYER_NAME);
     format(Arquivosizeof(Arquivo), "/Sua_Pasta_de_Contas/%s",);
     DOF2_SetInt(Arquivo"Time"0);
     return 1;
}

CMD:teste(playerid) {
      new Arquivo[128], pname[MAX_PLAYER_NAME];
      GetPlayerName(playeridpnameMAX_PLAYER_NAME);
      format(Arquivosizeof(Arquivo), "/Sua_Pasta_de_Contas/%s",);
     if(DOF2_GetInt(Arquivo"Time")) return SendClientMessage(playerid, -1"Você só pode usar este comando dentro de 1 hora!");
     DOF2_SetInt(Arquivo"Time"1);
     SendClientMessage(playerid, -1"Comando efetuado! Agora você só poderá usar este comando dentro de 1 hora.");
     Timer[playerid] = SetTimerEx("Timer"3600000false"i"playerid); // Seta o timer para 1 hora para resetar e o player poder usar o comando novamente.
     DOF2_SetInt(Arquivo"Tempo"Timer);
     return 1;
}

public 
OnPlayerDisconnect(playeridreason) {
     KillTimer(Timer[playerid]);
     return 1;

Nesse caso quando o player conectar novamente ele recupera o tempo?

Eu vi que tem um KillTimer em OnPlayerDisconnect ele apenas para o timer ou apaga?

Não salva o tempo quando o player reconectar, se ele quita o timer reseta.

O KillTimer na OnPlayerDisconnect é para otimizar melhor.