Ir para conteúdo
  • 0

Recompensas por tempo online


FoxyLolz

Pergunta

Posts Recomendados

  • 0

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 por Caronte
Link para o comentário
Compartilhar em outros sites

  • 0

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
Compartilhar em outros sites

  • 0

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 por Skulls
Link para o comentário
Compartilhar em outros sites

  • 0

 

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
Compartilhar em outros sites

  • 0

 

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
Compartilhar em outros sites

  • 0

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
Compartilhar em outros sites

  • 0

 

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 por Skulls
Link para o comentário
Compartilhar em outros sites

  • 0

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
Compartilhar em outros sites

  • 0
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? D:

Link para o comentário
Compartilhar em outros sites

  • 0

Ainda não consegui entender pq você usa K e não V no getOnlinePlayers(), rola de explicar? D:

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 :D

Link para o comentário
Compartilhar em outros sites

  • 0

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 :D

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
Compartilhar em outros sites

  • 0

 

 

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
Compartilhar em outros sites

  • 0

​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 por Skulls
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...