zezzok7 Posted January 16 Share Posted January 16 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 androksi Posted January 17 Other Languages Moderators Share Posted January 17 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
zezzok7 Posted January 18 Author Share Posted January 18 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now