SSGamers - 13 Anos online por você.

#SSGamers - A Comunidade que mais crescer no brasil!

Participe do fórum, é rápido e fácil

SSGamers - 13 Anos online por você.

#SSGamers - A Comunidade que mais crescer no brasil!

SSGamers - 13 Anos online por você.

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Chegou o novo tema 6.5.5 - SSGamers - Servidores online de qualidade - Aproveite e entre para nossa comunidade, inscreva-se já! - Ouça nossa web radio - Veja nossas novidades - Participe dos nossos setores de jogos online - Parcerias aberta fale já com um administrador.

    [Tutorial] » SetTimer e SetTimerEx - Básico

    Weslley_Script
    Weslley_Script
    SS - Fundador
    SS - Fundador


    Steam Steam : WeslleySSGames
    Zello : WeslleySSGames
    Mensagens : 11644
    Moedas : 1032954
    Data de inscrição : 06/10/2011
    Idade : 29
    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: Ter 26 Nov 2024 - 15:18