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
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.
Mais ai no caso, o cara não poderia morrer né !?? Belo Script..
Quando eu chegar em casa eu testo, obrigado <3
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.
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?
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?
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},
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
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
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.
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...
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 endaaa 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?
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
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) endAqui 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
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
/NW