[Tutorial] SetTimer e SetTimerEx - Bбsico
#1

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

1. 'Mito'

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. Conceito

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

3. Diferenзa

SetTimer: Sem parametros.
SetTimerEx: Com parвmetros.

4. Explicaзгo e Exemplos de SetTimer e SetTimerEx

PHP код:
SetTimer(NomeFuncaoTempoRepetiзг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.

PHP код:
SetTimerEx(NomeFuncaoTempoRepeticaoformato, {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к bota 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 para parar o SetTimer(Ex)!

Esse й o conceito de SetTimer(Ex)... Ele vai atй onde vocк mandar!

Vamos a uns exemplos prбticos para entendermos melhor!

5.0 - Diminuindo tempo pensando em milissegundos.

O tempo do SetTimer(Ex) й feito em milissegundos. Ou Seja:

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 ******. Se alguem souber de quem criou isso, coloca nos comentбrios

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 code definido, fica muito mais fбcil trabalharmos! Vamos ver na prбtica.

6.0 - Mгo na massa

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?


6.1 - SetTimer

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"10000false);
// 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:

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 
iMAX_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.

Bizuzinho do Jonathan

PHP код:
for(new iMAX_PLAYERS; ++i)
{
    
SendClientMessage(i, -1"Vocк recebeu o PayDay!");

Para quem nгo entendeu isso, peзo para que leia os 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).


6.2 - 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.

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?

PHP код:
get_cmd_noparams(minhasinfo// ICMD ( mesma coisa que /minhasinfo )
{
    new 
Idade 18;
    new 
Float:PontosNaEscola 9.0;
    
// playerid = seu ID
     
SetTimerEx("CarregInfo"5000true"iif"playeridIdadePontosNaEscola);
    return 
true;
}
forward CarregInfo(playeridIdadePontosNaEscola);
public 
CarregInfo(playeridIdadePontosNaEscola
{
    static 
StringJFS[70];
    
format(StringJFSsizeof(StringJFS), "ID: %d | Idade: %d | PontosNaEscola %f"playerid IdadePontosNaEscola);
    
SendClientMessage(playerid, -1StringJFS);
    return 
true;

7.0 - Lembretes e informaзхes importвntes

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 https://sampwiki.blast.hk/wiki/Format.
Код:
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).
Foi isso que deu pra fazer nesse frio e com esse sono, erros de conceitos, portuguкs, cуdigos... basta comentar, eu fiz sem testar.
Reply
#2

Muito bem explicado e organizado em JonathanFeitosa, parabйns pelo tutorial, vai ajudar muitos.
+REP
Reply
#3

Esta mais para cуdigo ъtil e praticamente tudo que esta digitado ai й facilmente encontrado na wiki e para conversгo de ms para segundos minutos horas, basta ter um cerebro e ter terminado a quinta sйrie
Reply
#4

Quote:
Originally Posted by Adejair_Junior
Посмотреть сообщение
Esta mais para cуdigo ъtil e praticamente tudo que esta digitado ai й facilmente encontrado na wiki e para conversгo de ms para segundos minutos horas, basta ter um cerebro e ter terminado a quinta sйrie
Quer um tutorial pra ti? Se quiser eu crio. Tenho vбrios sistemas aqui utilizando SetTimer(Ex). Desde sistemas de dominios(+63 dominios/57 teams/rank) atй sistema de nгo sei oq lб. Mas meu objetivo й dar conhecimento aos iniciantes do fуrum, por isso 'Bбsico' no tнtulo. Ou se vocк for iniciante e jб souber isso, me desculpa cara. Tem gente que ainda nгo sabia mesmo sendo considerado programador 'mйdio'. :/
Reply
#5

Bem explicado seu cotoco, ajudara muitos novatos...

abз
Reply
#6

Nice me ajudara muito REP.
Reply
#7

Muito bem explicado, parabйns.
Foi bem legal vocк ter introduzido o que й mito e conceito, para que os novatos nгo comecem com convicзхes erradas.
Reply
#8

Excelente tutorial, parabйns.

Pede para o Input colocar na [Quick-List] SA:MP Tutoriais
Reply
#9

Уtimo tutorial, parabйns!
Reply
#10

Belo tutorial Jonathan, Tirou grandes dъvidas minhas!
Jб que estou iniciando em Pawn.
Reply
#11

Quote:
Originally Posted by Adejair_Junior
Посмотреть сообщение
Esta mais para cуdigo ъtil e praticamente tudo que esta digitado ai й facilmente encontrado na wiki e para conversгo de ms para segundos minutos horas, basta ter um cerebro e ter terminado a quinta sйrie
Nгo fala asneiras. Isso й um tutorial sim, e um tutorial bem explicado. Principalmente na parte das analogias.

Parabйns, JonathanFeitosa.
Reply
#12

Tutorial й bom, mas o assunto й para realmente quem desceu de nнvel depois que entrou para uma certa equipe(Editora de GF).

Nгo venho difamar, mas desceu de nнvel, porйm o tutorial й bom, explicativo...
Reply
#13

Quote:
Originally Posted by Dolpin
Посмотреть сообщение
Tutorial й bom, mas o assunto й para realmente quem desceu de nнvel depois que entrou para uma certa equipe(Editora de GF).

Nгo venho difamar, mas desceu de nнvel, porйm o tutorial й bom, explicativo...
Й, uma 'Editora de GF' que mantem 500/500 diariamente

@Topic
Muito bem explicado, parabens
+= 2 Rep
Reply
#14

Quote:
Originally Posted by Dolpin
Посмотреть сообщение
Tutorial й bom, mas o assunto й para realmente quem desceu de nнvel depois que entrou para uma certa equipe(Editora de GF).

Nгo venho difamar, mas desceu de nнvel, porйm o tutorial й bom, explicativo...
Te garanto que a GT nгo usa nem strtok, muito menos GF. Servidor nem ao menos й RPG. Quem criou a base dele foi o Caio, Dev, Vini, Dan.

E sobre desceu de nнvel, vocк estб muito engano, quem estб lendo o tutorial estб ganhando mais conhecimentos. Vocк que desceu de nнvel lendo um assunto que "TALVEZ" vocк jб saiba.
Reply
#15

Quote:
Originally Posted by DanDRT
Посмотреть сообщение
Й, uma 'Editora de GF' que mantem 500/500 diariamente

@Topic
Muito bem explicado, parabens
+= 2 Rep
mais a GT nгo editou o UGW? '-'
Reply
#16

Quote:
Originally Posted by bielzera[:
Посмотреть сообщение
mais a GT nгo editou o UGW? '-'
E saiu tudo que tinha lб, no ano passado, quando mudamos e tiramos alguns sistemas.
Reply
#17

Quote:
Originally Posted by JonathanFeitosa
Посмотреть сообщение
Te garanto que a GT nгo usa nem strtok, muito menos GF. Servidor nem ao menos й RPG. Quem criou a base dele foi o Caio, Dev, Vini, Dan.

E sobre desceu de nнvel, vocк estб muito engano, quem estб lendo o tutorial estб ganhando mais conhecimentos. Vocк que desceu de nнvel lendo um assunto que "TALVEZ" vocк jб saiba.
Uhm, eu penso vбrias coisas erradas mesmo, vocк й apenas um programador 'pawn'.

nгo usa strtok mas vive em manutenзгo bloqueando comandos, vive desbugando aquele Gamemode velho.

E te garanto mais ainda que foi Editado de algum gamemode, aliбs Empregos, Paydays, vбrios sistemas retirado de outro servidor.

E nгo sei se vocк jб viu o Gamemode, porйm te garanto que peguei uma casquinha e jб deu para ver como era(Ruim), e tambйm as manutenзхes acontecem e demoram muito tempo pois й grande de mais o Gamemode(Sinal nгo muito bom nй).

Desceu sim, 'SetTimer', Pensava que vocк era um garoto que progredia, mas nгo.


Aliбs vocкs estгo apenas defendendo porque й considerado o 'Scripter' de lб, parabйns sua vida de programador estб na frente!
Reply
#18

Gostaria de dizer que achei bacana da sua parte utilizar o ICMD nas amostras, realmente й algo positivo para quem usa, e me anima ver que estгo de acordo com isso.

Sobre essa discussгo acima, evitem isso, ele escolheu falar sobre SetTimer, entгo й problema dele. Eu mesmo, por exemplo, nгo sou muito chegado ao Jonathan, com tudo, tento manter a йtica e deixar esses comentбrios de fora.

Avaliem apenas a qualidade do tutorial.

Abraзos.
Reply
#19

Quote:
Originally Posted by Dolpin
Посмотреть сообщение
Uhm, eu penso vбrias coisas erradas mesmo, vocк й apenas um programador 'pawn'.

nгo usa strtok mas vive em manutenзгo bloqueando comandos, vive desbugando aquele Gamemode velho.

E te garanto mais ainda que foi Editado de algum gamemode, aliбs Empregos, Paydays, vбrios sistemas retirado de outro servidor.

E nгo sei se vocк jб viu o Gamemode, porйm te garanto que peguei uma casquinha e jб deu para ver como era(Ruim), e tambйm as manutenзхes acontecem e demoram muito tempo pois й grande de mais o Gamemode(Sinal nгo muito bom nй).

Desceu sim, 'SetTimer', Pensava que vocк era um garoto que progredia, mas nгo.


Aliбs vocкs estгo apenas defendendo porque й considerado o 'Scripter' de lб, parabйns sua vida de programador estб na frente!
Sobre a GT nгo vou falar nada cara sendo verdade ou nгo, esse tуpico que criei nгo foi pra isso.
Nгo vou perder meu tempo criando FS/GM bons e postando aqui. Postei meu FS de Login/Registro com Recuperaзгo via Email, vбrios svs usam e ninguйm bota crйditos, isso dar nojo.


Quote:
Originally Posted by Willian_Luigi
Посмотреть сообщение
Gostaria de dizer que achei bacana da sua parte utilizar o ICMD nas amostras, realmente й algo positivo para quem usa, e me anima ver que estгo de acordo com isso.

Sobre essa discussгo acima, evitem isso, ele escolheu falar sobre SetTimer, entгo й problema dele. Eu mesmo, por exemplo, nгo sou muito chegado ao Jonathan, com tudo, tento manter a йtica e deixar esses comentбrios de fora.

Avaliem apenas a qualidade do tutorial.

Abraзos.
Valeu Pessoal nгo tem o que falar, e leva pra "Caminho pessoal", sendo que nem conheзo essa pessoa '-'
Reply
#20

Parabйns, vocк conseguiu bastante conteъdo para explicar duas simples funзхes. Acho que poderia aproveitar o embalo e explicar outras formas de contagem utilizando variбvel + repetiзгo true + KillTimer.

Como por exemplo:

pawn Код:
new TimerCont;
new vContagem;
//

vContagem = 10;
TimerCont = SetTimer("Contando", 1000, true);

//

forward Contando()
public Contando()
{
    vContagem --;
    printf("%d segundos restantes.", vContagem);
    if(vContagem < 1)
    {
        KillTimer(TimerCont);
    }
    return 1;
}
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)