SSGamers - 10 Anos online por você.

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

[Tutorial] » SetTimer e SetTimerEx - Básico

Weslley_Script
Weslley_Script
SS - Fundador
SS - Fundador


Steam Steam : WeslleySSGames
Zello : WeslleySSGames
Mensagens : 9464
Moedas : 1025828
Data de inscrição : 06/10/2011
Idade : 26
Localização : Brasil

[Tutorial] » SetTimer e SetTimerEx - Básico Empty [Tutorial] » SetTimer e SetTimerEx - Básico

Mensagem por Weslley_Script Qui 26 Ago 2021 - 17:50

SetTimer & SetTimerEx




Como vejo muitas dificuldades nas diferenças entre SetTimer e SetTimerEx, venho aqui trazer um tutorial simples para vocês.


1. De certeza você já ouviu falar daquela expressão: "SetTimer é para todos os jogadores e SetTimerEx é para cada um." Isso está meio que errado. Não é pra isso que foi criado o SetTimer e SetTimerEx.

2. Usamos SetTimer e SetTimerEx quando queremos chamar uma função com atraso, ou seja, por um determinado tempo depois.

3. SetTimer: Sem parametros.    SetTimerEx: Com parâmetros.



Explicação:

SetTimer:
Código PHP:
Código:
SetTimer(NomeFuncao, Tempo, Repetição); 
NomeFuncao: Será o nome de sua função pública.
Tempo: O tempo de duração que você quer chamar ela.
Repetição: true = repetir sempre, false = apenas uma vez.


SetTimerEx:
Código PHP:
Código:
SetTimerEx(NomeFuncao, Tempo, Repeticao, formato, {Float,_}:...) 
NomeFuncao: Será o nome de sua função pública.
Tempo: O tempo de duração que você quer chamar ela.
Repetição: true = repetir sempre, false = apenas uma vez.
formato: tipos de valores.
{Float,_}:... : parâmetros (seguindo o formato definido anteriormente).




Até agora, se você é iniciante, você provavelmente está pensando: Eu não entendi nada! Enfim, para isso estou aqui, vou explicar na sua experiência dia-dia.

Vamos imaginar na sua casa: O Microondas, você coloca algo apenas para esquentar, programa ele pra 1 minuto e a contagem começa a descer até chegar ao 0... ( porém o SetTimer(Ex) é incrementando(subindo), e não descendo.

Outro exemplo: você está brincando de esconde-esconde e tem que contar até 10. Quando chegar ao 10, você já pode procurar eles..
Isso é o SetTimer(Ex). Você faz um SetTimer que 'conte' até 10, e quando chegar no 10, irá executar a função de procurar eles.

Agora digamos que você tenha roubado e parou de contar antes dos 10 segundos. Nesse caso, utilizamos o KillTimer parando o SetTimer(Ex)!
Esse é o conceito de SetTimer(Ex)... Ele vai até onde você mandar! Vamos a uns exemplos práticos para entendermos melhor!


Diminuindo tempo pensando em milissegundos.

O tempo do SetTimer(Ex) é feito em milissegundos. Ou Seja:
Código PHP:
Código:
1 segundo = 1000
60 segundos = 60000
// [...] 



Se você precisa de 2 minutos e 27 segundos por exemplo, sem gerador ou algo do tipo você teria que bater muita cabeça até conseguir. Para facilitar seu trabalho, iniciante, você bota isso no topo do seu GM/FS. Não me lembro do criador do code, mas vou deixar aqui os créditos pro Y_Less. Se alguem souber de quem criou isso, coloca nos comentários
Código PHP:
Código:
#define minutos(%0) (1000 * %0 * 60)
#define horas(%0) (1000 * %0 * 60 * 60)
#define segundos(%0) (1000 * %0)
#define dias(%0) (1000 * %0 * 60 * 60  * 24)
#define semanas(%0) (1000 * %0 * 60 * 60  * 24 * 7)
#define meses(%0) (1000 * %0 * 60 * 60  * 24 * 30)
#define anos(%0) (1000 * %0 * 60 * 60  * 24 * 30 * 12)
#define decadas(%0) (1000 * %0 * 60 * 60  * 24 * 30 * 12 * 10)
#define seculos(%0) (1000 * %0 * 60 * 60  * 24 * 30 * 12 * 10 * 10) 

É claro que você não usaria pra dias, semanas, meses, anos, década e muito menos seculos. Para isso usamos GetTimer, mas fica pra outra explicação.
Agora sim! Com esse código definido, fica muito mais fácil trabalharmos! Vamos ver na prática.

Como ficaria o exemplo: "Você está brincando de esconde-esconde e tem que contar até 10. Quando chegar ao 10, você já pode procurar eles.." na prática?


SetTimer
Código PHP:
Código:
SetTimer("Contando", segundos(10), false);
// Veja como ficou mais fácil definir o tempo. Mas você também pode optar pelo normal:
SetTimer("Contando", 10000, false);
// Ele cria uma função contando 10 segundos sem repetição!

// Como SetTimer não tem parametro, nunca passamos valor para ela. Sempre utilizaremos ( ).

forward Contando();
public Contando()  // Quando completar os 10 segundos, funciona a callback.
{
    print("Contei até 10 segundos ! Agora posso começar a procurar!");
    return true;


Outro exemplo muito conhecido, o sistema de payday:
Código PHP:
Código:
public OnGameModeInit()
{
    SetTimer("PayDay", horas(1), true);
/* Criamos um Timer com o nome da função PayDay
Ele irá contar até 1 hora.
/ true = ele irá se repetir depois de terminar. ( voltará a funcionar sozinho ).*/
    return true;
}

forward PayDay();
public PayDay() // Quando completar as 1 hora, funciona a Callback:
{
    for(new i; i < MAX_PLAYERS; ++i) // Loop - Todos os Players
    {
        // Mensagem para todos os players.
        SendClientMessage(i, -1, "Você recebeu o PayDay!");
    }
    return true;


Realmente, SetTimer poderia ser para todos os players(usando loop). Mas não é isso o conceito dela. Ela vai muito além disso, como utilizar pra sistema de salvamentos ou outras coisas.
Código PHP:
Código:
for(new i; i < MAX_PLAYERS; ++i)
{
    SendClientMessage(i, -1, "Você recebeu o PayDay!");


Para quem não entendeu isso, procure por tutoriais de Loop.
MAX_PLAYERS definido por padrão é 500... Ou seja vai pegar 500 números que são os slots. Até aqui tudo bem. Mas porque trocou no meu SendClientMessage playerid por i ?

playerid = ID DO PLAYER! LEMBREM-SE DISSO!

O Loop, portanto, vai dar 500 voltas... e vai mandar para todos os ID's.
O ID 0 que é o Fulano com Nick A...
Pro ID 1 que é o Fulano com Nick B...
Assim vai até os 500 players(slots).


SetTimerEx

Existem vários exemplos. Mais vou dar apenas dois. Esse, é um simples bloqueio de comando. Depois de usar, ele permitirá que você utilize o comando de novo só depois de 15 segundos.
Código PHP:
Código:
new bool:BloquearComando[MAX_PLAYERS char];

get_cmd_noparams(bloquearcomando) // ICMD ( mesma coisa que /bloquearcomando )
{
    if(BloquearComando{playerid} == true)
        return SendClientMessage(playerid, -1, "Você já utilizou o comando! Aguarde 15 segundos para utlizar de novo.");

    BloquearComando{playerid} = true;
    SetTimerEx("BloqComando", segundos(15), false, "i", playerid);
    // Ele irá criar uma função de 15 segundos e não vai ficar se repetindo.
    // Como eu falei no meu BIZU: playerid carrega o ID do Player. Ele vai levar o ID do player para a função.
    SendClientMessage(playerid, -1, "Você Utilizou o Comando: /BloquearComando");
     return true;
}

forward BloqComando(playerid);
public BloqComando(playerid) // playerid CARREGA O ID DO PLAYER !
{
    BloquearComando{playerid} = false;
    SendClientMessage(playerid, -1, "Já se passou 15 segundos! Agora você já pode utilizar o comando!");
    return true;



Agora que tal um sistema de carregar suas informações simples?
Código PHP:
Código:
get_cmd_noparams(minhasinfo) // ICMD ( mesma coisa que /minhasinfo )
{
    new Idade = 18;
    new Float:PontosNaEscola = 9.0;
    // playerid = seu ID
     SetTimerEx("CarregInfo", 5000, true, "iif", playerid, Idade, PontosNaEscola);
    return true;
}

forward CarregInfo(playerid, Idade, PontosNaEscola);
public CarregInfo(playerid, Idade, PontosNaEscola) 
{
    static StringJFS[70];
    format(StringJFS, sizeof(StringJFS), "ID: %d | Idade: %d | PontosNaEscola %f", playerid , Idade, PontosNaEscola);
    SendClientMessage(playerid, -1, StringJFS);
    return true;



Lembretes e informações importantes:

Temporizadores não são 100% precisos e sim 75%;
Uso de muitos temporizadores aumentará o uso de Memória/CPU.
Lembrando daqueles "i", "iif", etc.. Sugiro ver melhor os tutoriais de Format.


Código:
Código:
i    Integer.
d    Integer.
a    Array. The next parameter must be an integer ("i") with the array's size. [CURRENTLY UNUSABLE]
s    String. [CURRENTLY UNUSABLE]
f    Float.
b    Boolean (true/false).


Créditos ao Jonathan Feitosa.



[Tutorial] » SetTimer e SetTimerEx - Básico D07Xwqb
[Tutorial] » SetTimer e SetTimerEx - Básico Yjab9HN

    Data/hora atual: Sab 27 Nov 2021 - 5:17