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:
SetTimer(NomeFuncao, Tempo, Repetição);
Tempo: O tempo de duração que você quer chamar ela.
Repetição: true = repetir sempre, false = apenas uma vez.
SetTimerEx:
Código PHP:
SetTimerEx(NomeFuncao, Tempo, Repeticao, formato, {Float,_}:...)
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:
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:
#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:
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:
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:
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:
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:
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:
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.
Discord:https://discord.gg/Vg5HMqgdP9