FoxyLolz 0 Postado Janeiro 8, 2016 Share Postado Janeiro 8, 2016 Por exemplo o player loga e fica 1 hora online ele ganha uma "Water Stone"Fica 2 horas onlines uma "Box 1"Porem se ele deslogar o tempo é resetado para 0 denovo Link para o comentário https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/ Compartilhar em outros sites More sharing options...
0 Caronte 446 Postado Janeiro 8, 2016 Share Postado Janeiro 8, 2016 (editado) Vá em seu login.lua, e em baixo de: if(lastLogin > 0) then adicione: doCreatureSetStorage(cid, 5412, os.time()) agora crie um arquivo.lua na mesma pasta do login.lua, e adicione isto dentro: function onLogout(cid) doCreatureSetStorage(cid, 5412, 0) return true end vá em data/creaturescripts/creaturescripts.xml adicione esta tag: <!-- nao se esqueca de colocar o nome do seu arquivo --> <event type="logout" name="ResetTime" event="script" value="arquivo.lua"/> Agora vá para pasta globalevents/scripts e crie um arquivo.lua adicione dentro: function onThink() local tab {-- Siga o exemplo: --[hora] = {id do item, quantidade}, [1] = {2160, 10}, [2] = {2160, 20}, } for k, v in pairs(getOnlinePlayers()) do for i = #tab, 0 do -- 1 = hora inicial para receber, caso mudar acima, mudar aqui também if tab[i] and (os.time() - getCreatureStorage(cid, 5412) / 60*60) > i then doPlayerAddItem(k, tab[i][1], tab[i][2]) if tab[i] == tab[#tab] and (os.time() - getCreatureStorage(cid, 5412) / 60*60) > i then doCreatureSetStorage(cid, 5412, os.time()) end break return true end end end return true end em globalevents.xml adicione: globalevent name="CheckTimePrize" interval="60000" event="script" value="arquivo.lua"/> PS: editei umas coisinhas, que adicionei. Editado Janeiro 8, 2016 por Caronte Link para o comentário https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/#findComment-1680430 Compartilhar em outros sites More sharing options...
0 Nickbhz 15 Postado Janeiro 8, 2016 Share Postado Janeiro 8, 2016 Mais ai no caso, o cara não poderia morrer né !?? Belo Script.. Link para o comentário https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/#findComment-1680433 Compartilhar em outros sites More sharing options...
0 FoxyLolz 0 Postado Janeiro 8, 2016 Autor Share Postado Janeiro 8, 2016 Quando eu chegar em casa eu testo, obrigado <3 Link para o comentário https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/#findComment-1680434 Compartilhar em outros sites More sharing options...
0 Caronte 446 Postado Janeiro 8, 2016 Share Postado Janeiro 8, 2016 Mais ai no caso, o cara não poderia morrer né !?? Belo Script.. Acho que sim, se acontecer, você manda uma resposta, eu dou umas editadas. Link para o comentário https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/#findComment-1680438 Compartilhar em outros sites More sharing options...
0 Skulls 331 Postado Janeiro 8, 2016 Share Postado Janeiro 8, 2016 (editado) Caronte, belo script. Custei a entender algumas coisas devido à falta de prática/proximidade com lua.Mas gostei, o nível ta legal aqui. rs Só uma pergunta, ele checa só de hora em hora, correto? (pq no meu aqui quando interval = 60000 ele vai checar de 60 em 60 segundos, mas você deve ter feito pensando no seu que é em segundos e nao ms). E com relação a morrer, eu acho que ele quebra o ciclo sim. Apesar de morrer ser outro evento, acho que ele chama o logout sozinho, o que zeraria o tempo de login. Pq você colocou, em login.lua, dentro de lastLogin > 0? Outra coisa, acredito que o zerar ao logar é "desnecessário", não? Pq toda vez que ele logar ele vai alterar o storage, e vc so checa os storages de players online, então tanto faz. Mais uma coisa (rs to aproveitando e tirando minhas duvidas), pq você usou o k em doPlayerAddItem(k, tab[i][1], tab[i][2]) e não o v? Quando você chama getOnlinePlayers() o que te interessa ali é o value, não? Editado Janeiro 8, 2016 por Skulls Link para o comentário https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/#findComment-1680460 Compartilhar em outros sites More sharing options...
0 FoxyLolz 0 Postado Janeiro 8, 2016 Autor Share Postado Janeiro 8, 2016 Acho que sim, se acontecer, você manda uma resposta, eu dou umas editadas. Se eu quiser adicionar mais de 1 item nessa parte function onThink() local tab {-- Siga o exemplo: --[hora] = {id do item, quantidade}, [1] = {2160, 10}, [2] = {2160, 25}, } como faço? Link para o comentário https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/#findComment-1680462 Compartilhar em outros sites More sharing options...
0 Skulls 331 Postado Janeiro 8, 2016 Share Postado Janeiro 8, 2016 Se eu quiser adicionar mais de 1 item nessa parte function onThink() local tab {-- Siga o exemplo: --[hora] = {id do item, quantidade}, [1] = {2160, 10}, [2] = {2160, 25}, } como faço? local tab {-- Siga o exemplo: --[hora] = {id do item, quantidade}, [1] = {2160, 10}, [2] = {2160, 25}, [Tempo_Online_Necessario] = {ITEM, QUANTIDADE}, } Então, se voce quer adicionar 20 vezes o item 104912 quando o player tiver 5 horas online: [5] = {104912, 20}, Link para o comentário https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/#findComment-1680463 Compartilhar em outros sites More sharing options...
0 FoxyLolz 0 Postado Janeiro 8, 2016 Autor Share Postado Janeiro 8, 2016 local tab {-- Siga o exemplo: --[hora] = {id do item, quantidade}, [1] = {2160, 10}, [2] = {2160, 25}, [Tempo_Online_Necessario] = {ITEM, QUANTIDADE}, } Então, se voce quer adicionar 20 vezes o item 104912 quando o player tiver 5 horas online: [5] = {104912, 20}, Eu entendi isso, porem se eu quiser adicinar para o player ganhar por exemplo 2 items na mesma hora, exemplo ele ganhar uma Box e uma water stone quando ficar 3 horas onlines Link para o comentário https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/#findComment-1680464 Compartilhar em outros sites More sharing options...
0 Skulls 331 Postado Janeiro 8, 2016 Share Postado Janeiro 8, 2016 (editado) Eu entendi isso, porem se eu quiser adicinar para o player ganhar por exemplo 2 items na mesma hora, exemplo ele ganhar uma Box e uma water stone quando ficar 3 horas onlines Saquei, é ele não vai aceitar dois index iguais na tabela. Faz o seguinte então: Troca: doPlayerAddItem(k, tab[i][1], tab[i][2]) Por: for j = #tab, 0, -2 do doPlayerAddItem(k, tab[j], tab[j-1]) end E na sua tabela você pode fazer: [1] = {2160, 10, ITEM2, Quant2, Item3, Quant3}, --So lembre que você precisa colocar sempre um número para de elementos, isto é, sempre um item e sua quantidade, se não vai dar pau. Eu ainda acho que o doPlayerAddItem tem que receber como player o V e nao o K, mas vou deixar isso pro dono do código, pois estou enferrujado e posso estar falando bobagem. Editado Janeiro 8, 2016 por Skulls Link para o comentário https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/#findComment-1680467 Compartilhar em outros sites More sharing options...
0 Caronte 446 Postado Janeiro 8, 2016 Share Postado Janeiro 8, 2016 function onThink() local tab {-- Siga o exemplo: --[hora] = {[itemid] = quantidade}, [1] = {[2160] = 10, [2161] = 20}, [2] = {[2162] = 30, [2163] = 40}, } for k, v in pairs(getOnlinePlayers()) do for i = #tab, 0 in pairs(tab) do -- 1 = hora inicial para receber, caso mudar acima, mudar aqui também if tab[i] and (os.time() - getCreatureStorage(cid, 5412) / 360000) > i then for item, count in pairs(tab[i]) doPlayerAddItem(k, item, count) end if tab[i] == tab[#tab] and (os.time() - getCreatureStorage(cid, 5412) / 360000) > i then doCreatureSetStorage(cid, 5412, 0) end break return true end end end return true end aaa só adicionando: doCreatureSetStorage(cid, 5412, 0) vai fazer ele parar de receber, até logar novamente. doCreatureSetStorage(cid, 5412, os.time()) vai fazer ele voltar do inicio da tabela de prêmios, ou seja, se ele chegar ao 500 e 500 for o último, ele vai voltar ao 1... Link para o comentário https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/#findComment-1680468 Compartilhar em outros sites More sharing options...
0 Skulls 331 Postado Janeiro 8, 2016 Share Postado Janeiro 8, 2016 function onThink() local tab {-- Siga o exemplo: --[hora] = {[itemid] = quantidade}, [1] = {[2160] = 10, [2161] = 20}, [2] = {[2162] = 30, [2163] = 40}, } for k, v in pairs(getOnlinePlayers()) do for i = #tab, 0 in pairs(tab) do -- 1 = hora inicial para receber, caso mudar acima, mudar aqui também if tab[i] and (os.time() - getCreatureStorage(cid, 5412) / 360000) > i then for item, count in pairs(tab[i]) doPlayerAddItem(k, item, count) end if tab[i] == tab[#tab] and (os.time() - getCreatureStorage(cid, 5412) / 360000) > i then doCreatureSetStorage(cid, 5412, 0) end break return true end end end return true end aaa só adicionando: doCreatureSetStorage(cid, 5412, 0) vai fazer ele parar de receber, até logar novamente. doCreatureSetStorage(cid, 5412, os.time()) vai fazer ele voltar do inicio da tabela de prêmios, ou seja, se ele chegar ao 500 e 500 for o último, ele vai voltar ao 1... Ainda não consegui entender pq você usa K e não V no getOnlinePlayers(), rola de explicar? Link para o comentário https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/#findComment-1680476 Compartilhar em outros sites More sharing options...
0 Caronte 446 Postado Janeiro 8, 2016 Share Postado Janeiro 8, 2016 Ainda não consegui entender pq você usa K e não V no getOnlinePlayers(), rola de explicar? Claro. O for um pairs() desmembra uma tabela através de duas variáveis, no caso K e V, eu tô acostumado a usar K e V porque elas dizem o que são (KEY e VALUE) no caso KEY seria o índice, VALUE seria o que está dentro do índice. Exemplo: local t = {[1] = {1, 2, 3}, [2] = {4, 5, 6} } for k, v in pairs(t) do print(k, v) end Aqui será retornado os seguintes elementos: 1 e {1, 2, 3} 2 e {4, 5, 6} No caso do getOnlinePlayers, eu fiz isso porque essa função retorna uma tabela, com índices númericos que representam o Id de cada player online, que seria o K do for. Já o V, se não me engano é o nome. Logo a tabela seria algo assim Online = {[173726437] = "Caronte"} Tem o ipairs também, que em vez de retornar o índice, retorna a posição se não me engano. Qualquer dúvida só perguntar de novo Link para o comentário https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/#findComment-1680482 Compartilhar em outros sites More sharing options...
0 Skulls 331 Postado Janeiro 8, 2016 Share Postado Janeiro 8, 2016 Claro. O for um pairs() desmembra uma tabela através de duas variáveis, no caso K e V, eu tô acostumado a usar K e V porque elas dizem o que são (KEY e VALUE) no caso KEY seria o índice, VALUE seria o que está dentro do índice. Exemplo: local t = {[1] = {1, 2, 3}, [2] = {4, 5, 6} } for k, v in pairs(t) do print(k, v) end Aqui será retornado os seguintes elementos: 1 e {1, 2, 3} 2 e {4, 5, 6} No caso do getOnlinePlayers, eu fiz isso porque essa função retorna uma tabela, com índices númericos que representam o Id de cada player online, que seria o K do for. Já o V, se não me engano é o nome. Logo a tabela seria algo assim Online = {[173726437] = "Caronte"} Tem o ipairs também, que em vez de retornar o índice, retorna a posição se não me engano. Qualquer dúvida só perguntar de novo Ah, era isso mesmo que eu tinha pensado. Mas pra mim o getOnlinePlayers retornava outra coisa, pra mim o value dele era o ID e o key era arbitrário. Muito obrigado, agora fez sentido. Ps: a solução que eu fiz pra adicionar vários itens na hora x também funcionaria, certo? Abraços Link para o comentário https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/#findComment-1680483 Compartilhar em outros sites More sharing options...
0 Night Wolf 285 Postado Janeiro 8, 2016 Share Postado Janeiro 8, 2016 Eu ainda acho que o doPlayerAddItem tem que receber como player o V e nao o K, mas vou deixar isso pro dono do código, pois estou enferrujado e posso estar falando bobagem. sim, é o v. Se o código realmente foi testado e funcionou, eu não sei dizer porquê. getPlayersOnline() retorna tabela de players online na forma{uid1, uid2, uid3}vc ta querendo dar os itens via uid na função pois doPlayerAddItem requer um uid no parâmetro, logo vc quer o value da tabela, não o índice.A diferença entre pairs e ipairs é que ambas são funções de busca porém pairs itera em pares sequenciais (i = i + 1) enquanto que ipairs busca o próximo elemento diferente de nil.Há casos em que pairs não irá funcionar e casos que ipairs não irá funcionar. Portanto é bom conhecer os dois usos e testar sempre.pairs e ipairs não retornam informações diferentes, quem dita isso é o return da função, pairs e ipairs são meras funções pra percorrer a tabela retornada.Leia isso daqui tb: http://www.lua.org/pil/7.3.html Link para o comentário https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/#findComment-1680489 Compartilhar em outros sites More sharing options...
0 Skulls 331 Postado Janeiro 8, 2016 Share Postado Janeiro 8, 2016 (editado) sim, é o v. Se o código realmente foi testado e funcionou, eu não sei dizer porquê. getPlayersOnline() retorna tabela de players online na forma {uid1, uid2, uid3} vc ta querendo dar os itens via uid na função pois doPlayerAddItem requer um uid no parâmetro, logo vc quer o value da tabela, não o índice. A diferença entre pairs e ipairs é que ambas são funções de busca porém pairs itera em pares sequenciais (i = i + 1) enquanto que ipairs busca o próximo elemento diferente de nil. Há casos em que pairs não irá funcionar e casos que ipairs não irá funcionar. Portanto é bom conhecer os dois usos e testar sempre. pairs e ipairs não retornam informações diferentes, quem dita isso é o return da função, pairs e ipairs são meras funções pra percorrer a tabela retornada. Leia isso daqui tb: http://www.lua.org/pil/7.3.html Bom, se realmente retornar uma lista de ids, eu estava certo. Mas se ele retorna uma lista de nomes indexada por ids, o código dele faz sentido. Vai depender do return do getPlayersOnline(). Valeu pela explicação, deixou mais claro ainda pra mim. E, pelo que entendi da leitura, a diferença entre o ipairs e o pairs é que o ipairs é em ordem e o pairs aleatório, assim sendo, no pairs você consegue fazer a leitura de tabelas com a indexação sem ordem (como tab = { [123] = "Lucas", [16123] = "Goulart"}, o que não é possível pelo ipairs, (é possível, mas ele não retorna esses indexes aleatórios, ele vai retornar o número do elemento) correto? Abraços Editado Janeiro 8, 2016 por Skulls Link para o comentário https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/#findComment-1680493 Compartilhar em outros sites More sharing options...
Pergunta
FoxyLolz 0
Por exemplo o player loga e fica 1 hora online ele ganha uma "Water Stone"
Fica 2 horas onlines uma "Box 1"
Porem se ele deslogar o tempo é resetado para 0 denovo
Link para o comentário
https://xtibia.com/forum/topic/238704-recompensas-por-tempo-online/Compartilhar em outros sites
21 respostass a esta questão
Posts Recomendados