Portal SAMP
[Pedido] Relógio Payday - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Pedido] Relógio Payday (/showthread.php?tid=4694)



Relógio Payday - Duzzxls - 14/04/2024

Alguém pode fazer um sistema de mostrar as horas e minutos em textodraw de Payday? Eu já fiz a Textdraw, só falta ela funcionar. Ela tá assim: 59:21 (demonstração), só preciso do looping pra fazer funcionar o tempo e mostrar na tela, ela é para o Player não global.


RE: Relógio Payday - samuelmatheus0502 - 14/04/2024

Olá meu amigo, fiz um aqui rapidinho pra você ter ideia e adaptar para você, lembrando existe inumeras maneiras de fazer, essa foi a maneira que eu fiz...

Código:
// No começo do seu gamemode juntos com suas variaveis adicione essas abaixos
new bool:timerPayday[MAX_PLAYERS];//variavel para ligar o timer
new idTimerPayday[MAX_PLAYERS];//variavel para armazenar o timer unico de cada player

new secondTimer[MAX_PLAYERS];//variavel para armazenar os segundos do timer
new minuteTimer[MAX_PLAYERS];//variavel para armazenar os minutos do timer


// ligarTimerPayday adicione essa função na public onplayerspawn da seguinte maniera: ligarTimerPayday(playerid);
/* EXEMPLO -------------------
OnPlayerSpawn(playerid) {
    ligarTimerPayday(playerid);
    return 1;
}
-----------------------------*/
// desligarTimerPayday adicione essa função na public onplayerdisconnect da seguinte maniera: desligarTimerPayday(playerid);
/* EXEMPLO ---------------------
OnPlayerDisconnect(playerid) {
    desligarTimerPayday(playerid);
    return 1;
}----------------------------*/

/* todas esses códigos abaixos adicione no final do seu gamemode, essas são as funções que rodará o seu timer,
OBS: eu fiz a atualizar em sendclientmessage, você terá que mudar para textdraw usando playertextdrawsetstring*/
ligarTimerPayday(playerid) { // função para ligar o timer
    if(timerPayday[playerid] == false) {
        timerPayday[playerid] = true;
        idTimerPayday[playerid] = SetTimerEx("timerPaydayForPlayer", 1000, true,"i", playerid);
        minuteTimer[playerid] = 60;
        secondTimer[playerid] = 0;
    }
    return 1;
}
desligarTimerPayday(playerid) {// função desligar timer
    if(timerPayday[playerid] == true) {
        KillTimer(idTimerPayday[playerid]);
    }
    return 1;
}

forward timerPaydayForPlayer(playerid);
public timerPaydayForPlayer(playerid) {
    new string[256];
    if(minuteTimer[playerid] == 0 && secondTimer[playerid] == 0) { // aqui é se o timer finalizar, ou seja se ficar 00:00, onde você atualizaria sua textdraw com playertextdrawsetstring
        SendClientMessage(playerid, -1, "SEU PAGAMENTO CHEGOU!!");
        minuteTimer[playerid] = 60;
        secondTimer[playerid] = 0;
        return 1;
    }
    if(secondTimer[playerid] == 0) { // aqui é se o segundo zerar, ou seja, ex: 51:00 vai para 50:59
        minuteTimer[playerid] --;
        secondTimer[playerid] = 59;
        format(string, sizeof(string),"%02d:%02d",minuteTimer[playerid], secondTimer[playerid]);
        SendClientMessage(playerid, -1, string);
    } else { // aqui é se nenhum dos casos acima ocorrer, nocaso subtrai 1 segundo do timer
        secondTimer[playerid] --;
        format(string, sizeof(string),"%02d:%02d",minuteTimer[playerid], secondTimer[playerid]);
        SendClientMessage(playerid, -1, string);
    }
    return 1;
}
Lembrando: você terá que adaptar ao seu sistema de salvamento. Tendo que setar o segundo e minuto que ficou da última vez que o player logou, aí terá que criar uma função para isso
estou disposto a te ajudar se tiver alguma dúvida.


RE: Relógio Payday - Duzzxls - 16/04/2024

(14/04/2024 21:44)samuelmatheus0502 Escreveu: Olá meu amigo, fiz um aqui rapidinho pra você ter ideia e adaptar para você, lembrando existe inumeras maneiras de fazer, essa foi a maneira que eu fiz...

Código:
// No começo do seu gamemode juntos com suas variaveis adicione essas abaixos
new bool:timerPayday[MAX_PLAYERS];//variavel para ligar o timer
new idTimerPayday[MAX_PLAYERS];//variavel para armazenar o timer unico de cada player

new secondTimer[MAX_PLAYERS];//variavel para armazenar os segundos do timer
new minuteTimer[MAX_PLAYERS];//variavel para armazenar os minutos do timer


// ligarTimerPayday adicione essa função na public onplayerspawn da seguinte maniera: ligarTimerPayday(playerid);
/* EXEMPLO -------------------
OnPlayerSpawn(playerid) {
    ligarTimerPayday(playerid);
    return 1;
}
-----------------------------*/
// desligarTimerPayday adicione essa função na public onplayerdisconnect da seguinte maniera: desligarTimerPayday(playerid);
/* EXEMPLO ---------------------
OnPlayerDisconnect(playerid) {
    desligarTimerPayday(playerid);
    return 1;
}----------------------------*/

/* todas esses códigos abaixos adicione no final do seu gamemode, essas são as funções que rodará o seu timer,
OBS: eu fiz a atualizar em sendclientmessage, você terá que mudar para textdraw usando playertextdrawsetstring*/
ligarTimerPayday(playerid) { // função para ligar o timer
    if(timerPayday[playerid] == false) {
        timerPayday[playerid] = true;
        idTimerPayday[playerid] = SetTimerEx("timerPaydayForPlayer", 1000, true,"i", playerid);
        minuteTimer[playerid] = 60;
        secondTimer[playerid] = 0;
    }
    return 1;
}
desligarTimerPayday(playerid) {// função desligar timer
    if(timerPayday[playerid] == true) {
        KillTimer(idTimerPayday[playerid]);
    }
    return 1;
}

forward timerPaydayForPlayer(playerid);
public timerPaydayForPlayer(playerid) {
    new string[256];
    if(minuteTimer[playerid] == 0 && secondTimer[playerid] == 0) { // aqui é se o timer finalizar, ou seja se ficar 00:00, onde você atualizaria sua textdraw com playertextdrawsetstring
        SendClientMessage(playerid, -1, "SEU PAGAMENTO CHEGOU!!");
        minuteTimer[playerid] = 60;
        secondTimer[playerid] = 0;
        return 1;
    }
    if(secondTimer[playerid] == 0) { // aqui é se o segundo zerar, ou seja, ex: 51:00 vai para 50:59
        minuteTimer[playerid] --;
        secondTimer[playerid] = 59;
        format(string, sizeof(string),"%02d:%02d",minuteTimer[playerid], secondTimer[playerid]);
        SendClientMessage(playerid, -1, string);
    } else { // aqui é se nenhum dos casos acima ocorrer, nocaso subtrai 1 segundo do timer
        secondTimer[playerid] --;
        format(string, sizeof(string),"%02d:%02d",minuteTimer[playerid], secondTimer[playerid]);
        SendClientMessage(playerid, -1, string);
    }
    return 1;
}
Lembrando: você terá que adaptar ao seu sistema de salvamento. Tendo que setar o segundo e minuto que ficou da última vez que o player logou, aí terá que criar uma função para isso
estou disposto a te ajudar se tiver alguma dúvida.

obrigado, adaptei ao meu servidor e esta funcionando certinho. So queria saber como funciona o SetTimerEx, os parametros e etc Smile


RE: Relógio Payday - samuelmatheus0502 - 16/04/2024

Então cara, confesso que eu mesmo não sei exatamente ta, mas até onde eu sei é que settimerex é usada para setar timer diratamente para o player, e o settimer quando é coisas relacionado ao servidor que não tem nada a ver com nenhum player.
Que bom que deu tudo certo aí, fico feliz


RE: Relógio Payday - White_Blue - 17/04/2024

(16/04/2024 21:52)samuelmatheus0502 Escreveu: Então cara, confesso que eu mesmo não sei exatamente ta, mas até onde eu sei é que settimerex é usada para setar timer diratamente para o player, e o settimer quando é coisas relacionado ao servidor que não tem nada a ver com nenhum player.
Que bom que deu tudo certo aí, fico feliz

Não exatamente. O SetTimerEx permite você passar especificadores para o timer, isso inclui o ID do jogador por exemplo. Mas não se limita a isso.


RE: Relógio Payday - Carlos Victor - 17/04/2024

Fiz uma forma mais simples e mais "otimizado", manipulando apenas uma variável.

Código PHP:
#include <a_samp>

new gPayday[MAX_PLAYERS];

public 
OnGameModeInit()
{
    
SetTimer("OnPaydayTimer"1000true);
    return 
1;
}

public 
OnPlayerConnect(playerid)
{
    
gPayday[playerid] = 3600;
    return 
1;
}

forward OnPaydayTimer();
public 
OnPaydayTimer()
{
    for (new 
0GetPlayerPoolSize(); <= ji++) {
        if (
IsPlayerConnected(i))
        {
            if (--
gPayday[i] <= 0)
            {
                
gPayday[i] = 3600;
                
GivePlayerMoney(i2500);

                
SendClientMessage(i, -1"* Você recebeu seu pagamento!");
            } else {
                
format(stringsizeof(string), "Payday~n~%02d:%02d"gPayday[i] / 60gPayday[i] % 60);
                
GameTextForPlayer(istring12003);
            }
        }
    }
    return 
1;




RE: Relógio Payday - Duzzxls - 20/04/2024

O que é esse parâmetro "i"?


RE: Relógio Payday - White_Blue - 20/04/2024

(20/04/2024 08:19)Duzzxls Escreveu: O que é esse parâmetro "i"?

"i" nesse caso não é um parâmetro, sim o que a gente chama de iterador (i é a letra inicial de I-terator, que virou uma convenção na programação nomear o iterador de "i"). Eu recomendo estudar bastante sobre loops se você ainda não sabe o que é, por que é algo que você vai precisar usar bastante.