Jump to content

[AJUDA] Ver tempo logado


Recommended Posts

Salve, estou tentando fazer um sistema que, reconheça a quanto tempo o player se encontra online no servidor. A partir do momento que ele faz login na conta! Porém estou tendo problemas para conseguir...
 
Segue abaixo o código feito ( tentei de diversas formas), porém essa foi a ultima tentativa de agora:
 
addEventHandler("onPlayerLogin", root,
function( _, acc )
    tempo = getTickCount()
 end
)

function Timer_Tempo_Jogador (jogador, timer)
    outputChatBox("1")
    local time = getTickCount() - tempo
    local hora = time.hour or 0
    local minuto = time.minute or 0
    outputChatBox("2")
    setElementData(jogador, "Tempo_Jogado", ""..hora..":"..minuto.."")
    outputChatBox("refresh")
end
setTimer(Timer_Tempo_Jogador, 1000, 0)

function Ver_Tempo_Jogador (jog, cmd)
    if jog then
        local tempo_jogandos = getElementData(jog, "Tempo_Jogado")
        outputChatBox("Você esta jogando a exatamente:"..tempo_jogandos.."", jog)
    end
end
addCommandHandler("temp", Ver_Tempo_Jogador)

 

Edited by Eder
Link to comment
  • Other Languages Moderators

Por se tratar de um script server-side, você precisa indexar as variáveis no jogador. Você não pode usar variáveis simples pois outros jogadores irão influenciar nela. Isso significa, que quando um segundo jogador logar, a variável tempo do primeiro jogador será substituída pelo tempo do segundo jogador, perdendo o tempo online do primeiro jogador.

E não use setElementData dentro de timers curtos. Pois eles são muito pesados.

  • Thanks 1
Link to comment

Compreendi no caso qual a melhor forma de ta fazendo essa index? Um Loop com FOR, getElementsBytype e DO numa TABLE resolveria??

E quanto a parte do setElementData eu vou necessitar dele pois vou puxar esse tempo para um Dx, no caso lado client. Talvez eu poderia fazer com trigger mas do mesmo jeito iria precisar dessas datas, um modo que eu pensei junto com o trigger é:

Toda vez que o painel for acionado ele:

- verifica o  tick

- seta a Data com o valor do tick.

ativa o trigger

- No client Pega essa data e renderiza ao player!

sendo assim não teria esse setTimer de um 1 em 1 segundo e sim só no momento que o player renderizar o painel com o onClientRender, sera que teria como?

Edited by Eder
Link to comment
  • Other Languages Moderators
addEventHandler ("onPlayerLogin", root, function (prevAcc, currAcc)
	setElementData (source, "tempo.Logou", getTickCount())
end)

function meuTempoOnline (thePlayer, cmd)
	if (getElementData (thePlayer, "tempo.Logou")) then
		local tempoJogando = getTickCount() - getElementData (thePlayer, "tempo.Logou") -- Isso também pode ser usado no client.
		outputChatBox ("Você esta jogando a exatamente: "..tempoJogando.." segundos.", thePlayer)
	end
end
addCommandHandler ("temp", meuTempoOnline)

Em vez de salvar em variável, daria pra salvar como elementData para ser possível usar no client também.

Edited by Lord Henry
  • Thanks 1
Link to comment

Vlw mano, me salvou! Fiz a divisão e consegui obter as horas, minutos e segundos. Agradeço pela ajuda.❤️

Segue abaixo caso alguém queira usar :)

 

    
Lado Cliente:
 
    local tempoJogando = getTickCount() - getElementData (localPlayer"tempo.Logou");
    local time = tempoJogando;
    local hours = time/3600000;
    local minutes = (time/60000% 60;
    local seconds = (time/1000% 60;
    tempoOnline = string.format("%02d:%02d:%02d", hours, minutes, seconds);
 
   dxDrawText("Tempo Online: "..tempoOnline..""653413874441tocolor(000255), 1.00"default""left""top"falsefalsefalsefalsefalse);
 
Lado Server: 
 
function meuTempoOnline (thePlayercmd)
    if (getElementData (thePlayer, "tempo.Logou")) then
        local tempoJogando = getTickCount() - getElementData (thePlayer, "tempo.Logou"); 
        local time = tempoJogando;
        local hours = time/3600000;
        local minutes = (time/60000% 60;
        local seconds = (time/1000% 60;
        tempoOnline = string.format("%02d:%02d:%02d", hours, minutes, seconds);
        outputChatBox ("Você esta jogando a exatamente: "..tempoOnline.." segundos.", thePlayer);
    end
end
addCommandHandler ("temp", meuTempoOnline)
 
Edited by Eder
Link to comment
4 hours ago, Lord Henry said:

No lado server, não precisa disso:

 local time = tempoJogando;

E o outputChatBox acabou ficando estranho: "Você está jogando a exatamente 0:10:14 segundos."

Compreendi, eu acabei fazendo as divisões direto pela variável tempoJogando. No server-side esta tudo funcionando como os conformes porém, no client-side ele esta com um certo bug...

UG1Po6t.jpg

 

Como foi especificado na imagem o TEMPO CORRETO é o que esta no CHAT (00:00:14) , mas por algum motivo o que esta aparecendo no Dx é outro numero (00:40:17).

Obs: Nos segundos tem uma diferença de 3 segundos pois foi o tempo q eu levei para dar o comando /temp e tirar o print!!

abaixo segue o que esta no lado client até o Momento:


local tempoJogando = getTickCount() - getElementData (localPlayer, "tempo:Logou");
local hours = (tempoJogando/3600000);
local minutes = ((tempoJogando/60000) % 60);
local seconds = ((tempoJogando/1000) % 60);
tempoOnline = string.format("%02d:%02d:%02d", hours, minutes, seconds);

dxDrawText("Tempo Online: "..tempoOnline.."", 653, 413, 874, 441, tocolor(0, 0, 0, 255), 1.00, "default", "left", "top", false, false, false, false, false)

Não entendo o porque deste bug, pois no Lado server esta do mesmo jeito a unica coisa que esta diferente  é localPlayer (client) | thePlayer (server). Porém localPlayer e thePlayer são as mesmas pessoas...

Edited by Eder
Link to comment

No server side também esta dessa forma:

addEventHandler ("onPlayerLogin", root, function (prevAcc, currAcc)
	setElementData (source, "tempo:Logou", getTickCount())
end)



function meuTempoOnline (thePlayer, cmd)
	if (getElementData (thePlayer, "tempo:Logou")) then
		local tempoJogando = getTickCount() - getElementData (thePlayer, "tempo:Logou"); -- Isso também pode ser usado no client.
		local hours = tempoJogando/3600000;
		local minutes = (tempoJogando/60000) % 60;
		local seconds = (tempoJogando/1000) % 60;
		tempoOnline = string.format("%02d:%02d:%02d", hours, minutes, seconds);
		outputChatBox ("Você esta jogando a exatamente: "..tempoOnline.." segundos.", thePlayer);
	end
end
addCommandHandler ("temp", meuTempoOnline)

 

Edited by Eder
Link to comment

Bom, ajeitei os pontos que vc apontou. Deixei exatamente como esta no server-side, porém o certo bug permanece. Deixei o tempo rolar e percebi que digito 2 dos minutos esta correto, porém o digito 1, ele aparenta estar sei lá com uma especie de subtração ex:

Aos 15:10 no chat, o DX marcou 05:10

Aos 25:10 no chat, o DX marcou 15:10

 

Entende? Ele ta sempre mostrando 1 numero a menos do que deveria... Irei continuar observando mais algum tempo para ver se é isto mesmo...

 

Edit; Acabei de confirmar isto...

No chat estava 33:05

Mas no DX tava 23:05

 

Sabe o porque de estar tendo essa subtração no primeiro digito dos minutos?

Edited by Eder
Link to comment
  • Other Languages Moderators

Já descobri o erro.

getTickCount no servidor, mostra os milissegundos desde que o servidor foi iniciado, no caso de servidor local, quantos milissegundos o MTA Server.exe está em execução. No cliente, é quantos milissegundos desde que o cliente Multi Theft Auto.exe está em execução. Por isso que sempre dará diferença entre eles.

Isso significa, que quando o player loga e salva o getTickCount() nele. No cliente, esse getTickCount salvo no jogador é do servidor, mas ele tenta fazer uma subtração com o getTickCount do cliente. Gerando essa diferença.

Edited by Lord Henry
  • Thanks 1
Link to comment
  • Other Languages Moderators

Isto resolve o problema:

function getStart ()
	if (getElementData (localPlayer, "tempo:Logou")) then return end -- Evita de resetar o tempo online quando este resource for reiniciado, impedindo que os players resetem suas datas.
	setElementData (localPlayer, "tempo:Logou", getTickCount())
end
addEventHandler ("onClientResourceStart", resourceRoot, getStart)

function renderTest ()
    if getElementData (localPlayer, "tempo:Logou") then
        local tempoJogando = getTickCount() - getElementData (localPlayer, "tempo:Logou")
        local hours = tempoJogando/3600000
        local minutes = (tempoJogando/60000) % 60
        local seconds = (tempoJogando/1000) % 60
        local tempoOnline = string.format("%02d:%02d:%02d", hours, minutes, seconds)

        dxDrawText ("Tempo Online: "..tempoOnline.."", 653, 413, 874, 441, tocolor(0, 0, 0, 255), 1.00, "default", "left", "top", false, false, false, false, false)
    end
end
addEventHandler ("onClientRender", root, renderTest)

Obs: No cálculo do servidor, estará errado agora. Pois a data do jogador foi obtida no cliente e não no servidor. Mas seu DX estará sempre certo.

Remova a parte de setar a data no jogador ao fazer login no servidor.

Edited by Lord Henry
  • Thanks 1
Link to comment

Hmmm caramba, agora faz sentido a tal diferença dos dígitos. O.o Muito obrigado pela ajuda. ❤️ 

 

Aproveitando, quero agradecer e parabenizá-lo pelo vídeo do voice em seu canal. Aquilo me salvou de uma forma gigantesca no resource que estou tentando fazer de call kksksks...

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...