Portal SAMP
[Ajuda] Segundos > Minutos (Jail System) - 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] Segundos > Minutos (Jail System) (/showthread.php?tid=2230)



Segundos > Minutos (Jail System) - Carlos Victor - 25/03/2022

Bom galera, sistema de cadeia administrativa consiste em definir um valor * 60 como o tempo, exemplo: /cadeia Joao 120 Motivo

Código PHP:
tempo 120 60;
Igual a '7200' segundos 


Depois eu pego a variável e jogo na Textdraw, porém estou tendo muitos problemas na parte dos minutos, que as vezes ultrapassa 59m ficando tipo:

02:119:59.... (O certo: 02:59:59)

E não estou conseguindo solucionar, já procurei em outros sites e outros sistemas mas continuo ainda não conseguindo, irei deixar o código aqui:
Código PHP:
CMD:cadeia(playeridparams[])
{
    new 
idtempomotivo[32];
    if(
sscanf(params"uds[32]"idtempomotivo))
        return 
SendClientMessage(playeridCinza"* USE: /cadeia [ID] [Tempo] [Motivo]");

    
ajailInfo[id][ajailTime] = tempo 60;
        ajailInfo[id][ajailTimer] = SetTimerEx("onAjailTimer"1000true"i"id);
        return 1;
}

function 
onAjailTimer(playerid)
{
    if(--
ajailInfo[playerid][ajailTime] < 0)
    {
        
KillTimer(ajailInfo[playerid][ajailTimer]);
        
ajailInfo[playerid][ajailTime] = 0;

        
SendClientMessage(playeridBranco"SERVER: Voce foi solto.");
        
SpawnPlayer(playerid);
    }
    else 
    {
        new 
string[128];        

        new 
horas ajailInfo[playerid][ajailTime] / 3600;
        new 
minutos ajailInfo[playerid][ajailTime] - (horas 3600) / 60;
        new 
segundos ajailInfo[playerid][ajailTime] % 60;

        
format(stringsizeof(string), "Tempo: %02d:%02d:%02d"horasminutossegundos);
        
PlayerTextDrawSetString(playeridajail_time[playerid][0], string);
        
PlayerTextDrawShow(playeridajail_time[playerid][0]);
    }
    return 
1;




RE: Segundos > Minutos (Jail System) - k2bi_YT - 25/03/2022

Altere apenas a função OnJailTimer e adicione a função ConvertTime()

Código PHP:
function onAjailTimer(playerid)
{
    if(--
ajailInfo[playerid][ajailTime] < 0)
    {
        
KillTimer(ajailInfo[playerid][ajailTimer]);
        
ajailInfo[playerid][ajailTime] = 0;

        
SendClientMessage(playeridBranco"SERVER: Voce foi solto.");
        
SpawnPlayer(playerid);
    }
    else 
    {
        new 
string[128];        
        
format(stringsizeof(string), "Tempo: %s"ConvertTime(ajailInfo[playerid][ajailTime]));
        
PlayerTextDrawSetString(playeridajail_time[playerid][0], string);
        
PlayerTextDrawShow(playeridajail_time[playerid][0]);
    }
    return 
1;



stock ConvertTime(number)
{
    new 
hours 0mins 0secs 0string[100];
    
hours floatround(number 3600);
    
mins floatround((number 60) - (hours 60));
    
secs floatround(number - ((hours 3600) + (mins 60)));
    new 
days 0;

    if(
hours >= 24)
    {
        
days floatround((hours/24), floatround_floor);
        
hours hours 24;
    }

    if(
days 0)
    {
        
format(string100"%d dias, %02d:%02d:%02d"dayshoursminssecs);
    }
    else if(
hours 0)
    {
        
format(string100"%02d:%02d:%02d"hoursminssecs);
    }
    else
    {
        
format(string100"%02d:%02d"minssecs);
    }
    return 
string;


Essa função ConvertTime(..) é muito util para no caso, você queira mostrar um tempo tanto em textdraw, como chat/dialog


RE: Segundos > Minutos (Jail System) - Carlos Victor - 25/03/2022

O problema foi corrigido, a variável minutos estava dividindo antes de fazer a subtração, colocando alguns parentêses consegui solucionar o erro.

Código com o problema resolvido:
Código PHP:
function onAjailTimer(playerid)
{
    if(--ajailInfo[playerid][ajailTime] < 0)
    {
        KillTimer(ajailInfo[playerid][ajailTimer]);
        ajailInfo[playerid][ajailTime] = 0;

        SendClientMessage(playeridBranco"SERVER: Voce foi solto.");
        SpawnPlayer(playerid);
    }
    else 
    {
        new string[128];        

        
new horas ajailInfo[playerid][ajailTime] / 3600;
        new minutos = (ajailInfo[playerid][ajailTime] - (horas 3600)) 60;
        new segundos ajailInfo[playerid][ajailTime] % 60;

        format(stringsizeof(string), "Tempo: %02d:%02d:%02d"horasminutossegundos);
        PlayerTextDrawSetString(playeridajail_time[playerid][0], string);
        PlayerTextDrawShow(playeridajail_time[playerid][0]);
    }
    return 1;


Citar:@k2bi_YT 
Altere apenas a função 
OnJailTimer e adicione a função ConvertTime()

Código PHP:

Código:
function onAjailTimer(playerid)
{
    if(--ajailInfo[playerid][ajailTime] < 0)
    {
        KillTimer(ajailInfo[playerid][ajailTimer]);
        ajailInfo[playerid][ajailTime] = 0;

        SendClientMessage(playerid, Branco, "SERVER: Voce foi solto.");
        SpawnPlayer(playerid);
    }
    else 
    {
        new string[128];        
        format(string, sizeof(string), "Tempo: %s", ConvertTime(ajailInfo[playerid][ajailTime]));
        PlayerTextDrawSetString(playerid, ajail_time[playerid][0], string);
        PlayerTextDrawShow(playerid, ajail_time[playerid][0]);
    }
    return 1;



stock ConvertTime(number)
{
    new hours = 0, mins = 0, secs = 0, string[100];
    hours = floatround(number / 3600);
    mins = floatround((number / 60) - (hours * 60));
    secs = floatround(number - ((hours * 3600) + (mins * 60)));
    new days = 0;

    if(hours >= 24)
    {
        days = floatround((hours/24), floatround_floor);
        hours = hours % 24;
    }

    if(days > 0)
    {
        format(string, 100, "%d dias, %02d:%02d:%02d", days, hours, mins, secs);
    }
    else if(hours > 0)
    {
        format(string, 100, "%02d:%02d:%02d", hours, mins, secs);
    }
    else
    {
        format(string, 100, "%02d:%02d", mins, secs);
    }
    return string;

Essa função ConvertTime(..) é muito util para no caso, você queira mostrar um tempo tanto em textdraw, como chat/dialog
> Obrigado pela força, e pela função que tu enviou, eu testei e também funcionou! +rep


RE: Segundos > Minutos (Jail System) - xbruno1000x - 25/03/2022

Apesar do problema já ter sido solucionado, é importante ressaltar o problema para quem tiver o problema futuramente.

Em decorrência da ordem das operações matemáticas o calculo foi feito de forma incorreta. A prioridade do computador é resolver as divisões e multiplicações caso não existam parêntesis. Os parêntesis indicam o calculo que deve ser priorizado.