Jump to content

Ajuda com oque devo usar.


Recommended Posts

criei um script simples na qual o jogador ao iniciar uma tarefa dispara um cronometro criado com getTickCount no lado client porém preciso agora armazenar esse tempo em um rank de quem levou mais tempo para fazer uma coisa tipo. exemplo:
1- Player 1, 5 Minutos para entregar.  

e assim vai, é melhor eu realizar isso com o setAccountData ou criar um script separado com os comandos em sqlite para armazenar no propio script? e em ambos vai funcionar essa ideia?

Função que esta salvando por enquanto: 

Link to comment
  • Other Languages Moderators

E aí, @zezzok7 — tudo em cima?

Primeiramente, não acho necessário usar o getTickCount no client-side para salvar o tempo decorrido, a menos que você esteja usando para outros propósitos. Você pode usar um banco de dados ou a função mencionada por você mesmo (setAccountData). No banco de dados, você precisará salvar os segundos que passou desde o início ao fim da entrega. Tudo isso pode ser feito sem problemas no server-side apenas.

Você precisa de uma tabela que armazenará o tick atual assim que o jogador iniciar a entrega. Depois, quando ela for realizada, você obtém o tick atual e acha a diferença entre o que foi salvo. Vamos ao exemplo:
 

local players_delivery_time = { }

-- Quando o trabalho inicia (função somente a fim de exemplo!)
function startWork( player )
    players_delivery_time[ player ] = getTickCount( )
end

-- Quando o trabalho finalizar/for entregue
function stopWork( player )
    local current_tick = getTickCount( ) -- Pegamos o tick atual
    local old_tick = players_delivery_time[ player ] -- Pegamos o tick antigo, que foi salvo anteriormente assim que iniciou-se o trabalho
  
    local elapsed_time = current_tick - old_tick -- Finalmente obtemos a diferença, retornando em milisegundos
    elapsed_time = elapsed_time / 1000 -- Convertendo pra segundos...
end

De forma direta, esse elapsed_time você salvaria no banco de dados e com o uso da matemática, poderia transformar os segundos em minutos, horas, seja lá como queira.

Link to comment
On 17/01/2024 at 10:53, androksi said:

E aí, @zezzok7 — tudo em cima?

Primeiramente, não acho necessário usar o getTickCount no client-side para salvar o tempo decorrido, a menos que você esteja usando para outros propósitos. Você pode usar um banco de dados ou a função mencionada por você mesmo (setAccountData). No banco de dados, você precisará salvar os segundos que passou desde o início ao fim da entrega. Tudo isso pode ser feito sem problemas no server-side apenas.

Você precisa de uma tabela que armazenará o tick atual assim que o jogador iniciar a entrega. Depois, quando ela for realizada, você obtém o tick atual e acha a diferença entre o que foi salvo. Vamos ao exemplo:
 

local players_delivery_time = { }

-- Quando o trabalho inicia (função somente a fim de exemplo!)
function startWork( player )
    players_delivery_time[ player ] = getTickCount( )
end

-- Quando o trabalho finalizar/for entregue
function stopWork( player )
    local current_tick = getTickCount( ) -- Pegamos o tick atual
    local old_tick = players_delivery_time[ player ] -- Pegamos o tick antigo, que foi salvo anteriormente assim que iniciou-se o trabalho
  
    local elapsed_time = current_tick - old_tick -- Finalmente obtemos a diferença, retornando em milisegundos
    elapsed_time = elapsed_time / 1000 -- Convertendo pra segundos...
end

De forma direta, esse elapsed_time você salvaria no banco de dados e com o uso da matemática, poderia transformar os segundos em minutos, horas, seja lá como queira.

bom então fiz algo um pouco diferente precisava que o tempo ficasse na tela e obtive um erro que não consegui identificar quando ocorre, se puder me ajudar ficarei grato, o erro é o seguinte: o jogador libera o getTickCount quando inicia a rota e finaliza quando passa pelo ultimo marker, nisso a logica que eu tentei usar seria de salvar o tempo mais recente com  setElementData e compara-lo com o tempo registrado na conta com getAccountData  e se o setElementData for menor subistituir o tempo salvo na conta, porém ao executar isso ele não salva o primeiro tempo e só começa a salvar a partir do segundo oque resulta em um erro que se o jogador concluiu o percurso em 3 minutos na primeira vez que fez esse tempo é salvo na data mas nao é salvo na conta e a segunda vez q ele realizar a tarefa ele terminar em 5 minutos o tempo de 3 minutos vai ser salvo na conta e o 5 minutos vai ficar salvo na elementData, tenho uma noção do que pode ser mas não estou conseguindo resolver. 
Codigo. 

server:
 

function compare()
	dataTime = getElementData(source, "LastTime") or false
    account = getPlayerAccount(source)
	accountTime = getAccountData(account, "bestTimeData") or false
    
	if accountTime == false then 
	    setAccountData(account, "bestTimeData", dataTime)
		outputChatBox("conta sem registro, melhor tempo setado", source, 255, 255, 0)
		outputChatBox("tempo agora: "..accountTime, source, 255, 255, 0)
	else
		outputChatBox("ja tem", source, 255, 255, 255)
		if dataTime < accountTime then 
			setAccountData(account, "bestTimeData", dataTime)
			outputChatBox("novo tempo registrado!", source, 0, 255, 0)
		else
			outputChatBox("seu tempo não foi melhor!", source, 255, 0, 0)
		end
    end 
end

 

client: 

function startTimer()
    local screenX, screenY = guiGetScreenSize()
    local currentCount = 0
    local startTime = 0
    local timerVisible = true


function onClientRenderClock()
    local playerTick = getElementData(localPlayer, "startTick") or 0
    currentCount = getTickCount()
    elapsedTime = currentCount - startTime
    dxDrawText(formatTime(elapsedTime), screenW * 0.8099, screenH * 0.0868, screenW * 0.9826, screenH * 0.1400, tocolor(0, 0, 0, 124), 3.50, "default-bold", "left", "top", false, false, false, false, false)

end
addEventHandler("onClientRender", root, onClientRenderClock)


function formatTime(milliseconds)
    local totalSeconds = math.floor(milliseconds / 1000)
    local minutes = math.floor(totalSeconds / 60)
    local seconds = totalSeconds % 60
    local remainingMilliseconds = milliseconds % 1000
    return string.format("%02d:%02d.%03d", minutes, seconds, remainingMilliseconds)
end


startTime = getTickCount()
elapsedTime = 0 -- Zera o tempo decorrido


function markersave()
    setElementData(source, "LastTime", elapsedTime)
    outputChatBox("tempo formatado agora: "..formatTime(elapsedTime), 255, 255, 255)
end
addEvent("saveTiming1", true)
addEventHandler("saveTiming1", root, markersave)
    
function stopTimerF()
    if currentCount > 0 then
        currentCount = 0
    else
        outputChatBox("erro.")
    end
    if timerVisible == true then
        timerVisible = false
        removeEventHandler("onClientRender", getRootElement(), onClientRenderClock)
    end
end
addEvent("stopTimer", true)
addEventHandler("stopTimer", localPlayer, stopTimerF)


 

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...