Portal SAMP
[Ajuda] Cronometro - 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: [Ajuda] Cronometro (/showthread.php?tid=2311)



Cronometro - Treze_. - 18/04/2022

Bom dia, estava criando um sistema de up, mas me deparei com problema que os segundos pula em 2 em 2 exemplo: 60 ,58,56,54...

Código:
new segup1[MAX_PLAYERS];
new minup1[MAX_PLAYERS];
Código:
hook OnPlayerSpawn(playerid)
{
    segup1[playerid] = 60;
    minup1[playerid] = 59;
    SetTimerEx("tempoup",1000 ,true ,"d",playerid);
    mostrar_up(playerid);
    return 1;
}
forward tempoup(playerid);

public tempoup(playerid)
{

    segup1[playerid] --;
    if(segup1[playerid] == 0)
    {
        minup1[playerid] --;
        segup1[playerid] = 60;
        if(minup1[playerid] == 0)
        {
            minup1[playerid] = 60;
        }
    }
    format(formattempo,6,"%02d:%2d",minup1[playerid],segup1[playerid]);
    PlayerTextDrawSetString(playerid,Up_relogio[playerid],formattempo);
    PlayerTextDrawShow(playerid,Up_relogio[playerid]);
    return 1;
}





Obs:Não existe nenhum outro timer ou variável com mesmo nome e já estou usando timerfix.


RE: Cronometro - MarcosBrazz - 18/04/2022

O timer ficará sendo multiplicado a cada spawn, por exemplo, quando eu logar o timer vai iniciar e contar de 1 em 1 segundo, se eu morrer e spawnar novamente, vai iniciar outro timer, ficando 2 timers agora indo de 2 em 2

Recomendo colocar em OnPlayerConnect(pois só conecta uma vez) e utilizar um ID no timer e dar kill nele em OnPlayerDisconnect(pois se nao dar kill no timer e o jogador pegar o mesmo ID ao logar, vai iniciar outro timer assim ficando 2, e consequentemente indo de 2 em 2) e assim sucessivamente.


RE: Cronometro - Treze_. - 18/04/2022

Funcionou mano,vlw


RE: Cronometro - Carlos Victor - 18/04/2022

(18/04/2022 10:51)Treze_. Escreveu: Bom dia, estava criando um sistema de up, mas me deparei com problema que os segundos pula em 2 em 2 exemplo: 60 ,58,56,54...

Código:
new segup1[MAX_PLAYERS];
new minup1[MAX_PLAYERS];
Código:
hook OnPlayerSpawn(playerid)
{
    segup1[playerid] = 60;
    minup1[playerid] = 59;
    SetTimerEx("tempoup",1000 ,true ,"d",playerid);
    mostrar_up(playerid);
    return 1;
}
forward tempoup(playerid);

public tempoup(playerid)
{

    segup1[playerid] --;
    if(segup1[playerid] == 0)
    {
        minup1[playerid] --;
        segup1[playerid] = 60;
        if(minup1[playerid] == 0)
        {
            minup1[playerid] = 60;
        }
    }
    format(formattempo,6,"%02d:%2d",minup1[playerid],segup1[playerid]);
    PlayerTextDrawSetString(playerid,Up_relogio[playerid],formattempo);
    PlayerTextDrawShow(playerid,Up_relogio[playerid]);
    return 1;
}





Obs:Não existe nenhum outro timer ou variável com mesmo nome e já estou usando timerfix.


Olá, você pode simplesmente otimizar seu código e deixar bem mais viável desse modo:

Código PHP:
new varUpgrade[MAX_PLAYERS];
new 
timerUpgrade[MAX_PLAYERS];

public 
OnPlayerConnect(playerid)
{
    
varUpgrade[playerid] = 3600//Tempo em segundos, 3600 = 1h
    
timerUpgrade[playerid] = SetTimerEx("OnPlayerUpgradeLevel"1000true"i"playerid);
    return 
1;
}

forward OnPlayerUpgradeLevel(playerid);
public 
OnPlayerUpgradeLevel(playerid)
{
    if(--
varUpgrade[playerid] <= 0)
    {
        
//Função ao terminar o timer aqui
    
}    
    else
    {
        new 
str[32];
        
format(strsizeof(str), "%02d:%02d"varUpgrade[playerid] / 60varUpgrade[playerid] % 60);
    
    PlayerTextDrawSetString(playeridUp_relogio[playerid], str);
    
    PlayerTextDrawShow(playeridUp_relogio[playerid]);
    }



Ai nesse sistema, você possui duas variáveis, uma para manipular o timer(OnPlayerUpgradeLevel) e outra para manipular o tempo do upgrade
e lembrando que o tempo é em segundos, porque o settimerex é chamado a cada 1s então é -1 a cada 1 segundo da variável varUpgrade.

Você pode usar a variável timerUpgrade para matar o timer e não funcionar mais, recomendo usar em OnPlayerDisconnect pra não passar o timer
para o próximo jogador e a variável varUpgrade para manipular o tempo que irá demorar.