Renaz Posted May 7, 2019 Share Posted May 7, 2019 (edited) estou editando um script de agencia e aqui para o player pegar certo trabalho ele precisa de ter "x" lvl , porém eu tava querendo colocar por tempo jogado. no caso como faria? function EntregadorDeJornal() local Level = getElementData ( source, "Level" ) or 0 if Level >= 0 then é assim que funciona para pegar o lvl , para pegar horas como faço? Edited May 7, 2019 by Renazz Link to comment
Other Languages Moderators Lord Henry Posted May 7, 2019 Other Languages Moderators Share Posted May 7, 2019 Eu usaria o timestamp do GetRealTime. Com ele é possível contar grandes períodos de tempo sem ficar usando setTimer. 1 Link to comment
Renaz Posted May 7, 2019 Author Share Posted May 7, 2019 não é isso propriamente, eu queria pegar as horas jogadas no servidor do player (horas totais) e ai , para ele trabalhar em certo trabalho ele teria que ter "x" horas jogadas no total no servidor. Link to comment
Other Languages Moderators Lord Henry Posted May 7, 2019 Other Languages Moderators Share Posted May 7, 2019 Sim, eu entendi que é isso que vc quer. Como eu disse, usando timestamp. Vc salva na conta do jogador o instante que ele logou com o timestamp. (vai salvar um número bem grande de segundos) Quando o jogador for deslogar ou desconectar do servidor, pega outro timestamp (outro número grande, maior do que o que estava salvo na conta dele) e diminui com o que estava salvo na conta dele. Isso vai marcar quantos segundos ele permaneceu logado nessa sessão de jogo. Esses segundos vc soma em outra accountData do jogador, que vai somar com os segundos de jogo que ele já tinha. Dai pra saber em horas ou minutos, só fazer uma conversão simples de segundos > hora ou segundos > minuto. 1 Link to comment
Renaz Posted May 7, 2019 Author Share Posted May 7, 2019 2 minutes ago, Lord Henry said: Quando o jogador for deslogar ou desconectar do servidor, pega outro timestamp (outro número grande, maior do que o que estava salvo na conta dele) e diminui com o que estava salvo na conta dele. Isso vai marcar quantos segundos ele permaneceu logado nessa sessão de jogo. Esses segundos vc soma em outra accountData do jogador, que vai somar com os segundos de jogo que ele já tinha. achei meio confuso , terei que fazer tudo manualmente ou dá pra automatizar? Link to comment
Other Languages Moderators Lord Henry Posted May 7, 2019 Other Languages Moderators Share Posted May 7, 2019 Dá pra automatizar. 1 Link to comment
Renaz Posted May 7, 2019 Author Share Posted May 7, 2019 1 minute ago, Lord Henry said: Dá pra automatizar. pode dar um exemplo? Link to comment
Other Languages Moderators Lord Henry Posted May 7, 2019 Other Languages Moderators Share Posted May 7, 2019 function loadPeriodo (_, currentAcc) if not getAccountData (currentAcc, "periodo.Total") then -- Se o jogador não tem registro de tempo total, então cria uma data na conta e atribui valor 0. setAccountData (currentAcc, "periodo.Total", 0) end local agora = getRealTime().timestamp -- agora = instante que o jogador logou. setAccountData (currentAcc, "periodo.Sessao", agora) -- Inicia o período da sessão do jogador quando ele loga, salvando o instante de login nela. outputChatBox ("Bem Vindo ao servidor. Você já jogou um total de "..getAccountData (currentAcc, "periodo.Total").." segundos de jogo.", source) end addEventHandler ("onPlayerLogin", root, loadPeriodo) function savePeriodo (previousAcc, _) if not getAccountData (previousAcc, "periodo.Total") then setAccountData (previousAcc, "periodo.Total", 0) end local agora = getRealTime().timestamp -- agora = instante que o jogador deslogou. local antes = getAccountData (previousAcc, "periodo.Sessao") or agora -- Se por algum motivo o jogador não tem registro do instante de login, considera como login feito agora. (logou no mesmo instante que deslogou) local tempoSessao = agora - antes -- Calcula quantos segundos se passaram desde o login até o logout do jogador (tempo que ele ficou online nesta Sessão) local tempoTotal = getAccountData (previousAcc, "periodo.Total") -- Recebe quanto tempo o jogador já possui acumulado na conta. setAccountData (previousAcc, "periodo.Total", tempoTotal + tempoSessao) -- Soma o tempo que o jogador já tinha salvo na conta com o tempo que ele ficou online nesta sessão. end addEventHandler ("onPlayerLogout", root, savePeriodo) function loadEverybody () for i, player in ipairs (getElementsByType("player")) do -- Para cada jogador conectado no servidor (incluindo os que estão em download deslogados) faça: local acc = getPlayerAccount(player) if not isGuestAccount (acc) then -- Se o jogador não está deslogado, então: if not getAccountData (acc, "periodo.Sessao") then -- Se o jogador não tem registro do login de sua sessão, então: local agora = getRealTime().timestamp setAccountData (acc, "periodo.Sessao", agora) -- Salva o registro de login como agora. end end end end addEventHandler ("onResourceStart", resourceRoot, loadEverybody) -- Executa isso quando este resource iniciar. 1 Link to comment
Renaz Posted May 7, 2019 Author Share Posted May 7, 2019 coloquei no script , agora substituo function EntregadorDeJornal() local Level = getElementData ( source, "Level" ) or 0 if Level >= 0 then isso pelo que? resolvido. Link to comment
Jonas^ Posted May 7, 2019 Share Posted May 7, 2019 (edited) getAccountData com os minutos ou segundos que o cara tem que estar logado pra poder pegar o emprego. function EntregadorDeJornal () local Level = getElementData ( source, "Level" ) or 0 if Level >= 0 then if getAccountData (getPlayerAccount (source), "periodo.Total", 1) -- Se o jogador estiver logado a 1 segundo então: -- Código do emprego else --Senão: outputChatBox ("Você precisa estar logado x segundos para poder pegar este emprego.", source, 230, 30, 30) end end end Edited May 7, 2019 by Jonas^ Correção: getAccountData. Link to comment
Jonas^ Posted May 7, 2019 Share Posted May 7, 2019 (edited) Fiz uns testes aqui e vi que parece que o código do Lord esta com problema na hora de setar na conta do jogador o tempo total fiz um comando pra testar se quiser testar ai também: addCommandHandler ("checkt", function (thePlayer, cmd) local tempoEmprego = getAccountData (getPlayerAccount (thePlayer), "periodo.Total") if tempoEmprego >= 15 then -- Se o jogador estiver logado a 15 ou mais segundos então: outputChatBox ("Você jogou "..getAccountData (getPlayerAccount (thePlayer), "periodo.Total").." e agora esta trabalhando neste emprego.", thePlayer, 0, 255, 0) else outputChatBox ("Você ainda não jogou 15 segundos", thePlayer, 230, 30, 30) end end) Dai eu setei manualmente na db o valor 1 e executou normal. @Lord Henry Na verdade é só adicionar o evento onPlayerQuit pra salvar também quando o jogador quitar. Edited May 7, 2019 by Jonas^ 1 Link to comment
Other Languages Moderators Lord Henry Posted May 8, 2019 Other Languages Moderators Share Posted May 8, 2019 Sim. Eu estava com pressa pois eu tinha compromisso e também era só um exemplo, nem testei fiz tudo de cabeça. Mas agradeço pela correção. 1 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