Ir para conteúdo

Função Addevent(Func, Time, Arg)


Posts Recomendados

Fala pessoal, hoje eu tive um ideia para refazer a função addEvent que é uma função que acompanha somente a biblioteca de OtServers. Pensando nisso, eu resolvi refaze-la em lua pura.

 

Como funciona: A função executa as funções desejadas depois de tantos milisegundos.

 

 

Função

 

function addEvent(func, time, ...)

i = os.time()

for a = 1, math.huge do
if os.time() - i >= time/1000 then
func(...)
break
end
end

end

 

Parâmetros: Como primeiro parâmetro, usamos a função desejada, tal como, print, por exemplo.

No segundo parâmetro usamos o tempo em milisegundos.

Por último, colocamos os argumentos da função usada no primeiro parâmetro.

 

 

Exemplo de Uso

 

addEvent(print, 5000, "Inicio")
addEvent(print, 6000, "Meio")
addEvent(print, 7000, "Fim")

 

A seguinte ordem acontecerá:

 

S   Palavra

5 > Inicio
6 > Meio
7 > Fim

 

 

Bom, simples e útil. To sem saco para escrever aqui, abraços.

Editado por Demonbholder
Link para o comentário
Compartilhar em outros sites

  • 2 weeks later...
  • 1 month later...
  • 2 weeks later...

Uma pequena correção, como o script vai ser executado por algumas centenas ou milhares de vezes por segundo, você poderia passar tudo para variaveis locais, e usar while, que não seta nenhuma variavel.

 

È claro que não altera muita coisa no script em si, mas olhando pelo lado do desempenho, assim concerteza é melhor.

 

function addEvent(func, time, ...)

local i, timeLimit, timeFunc = os.time(), time/1000, os.time

while true do
if timeFunc() - i >= timeLimit then
func(...)
break
end
end

end

Editado por linkay
Link para o comentário
Compartilhar em outros sites

  • 2 weeks later...

É na verdade ele vai deixar mais rapido, porquê variaveis e funções locais são muito mais rapidas

que globais, exatamente porque são locais. Eu que agradeço, ótima função para quando você tem um programa usando LUA

e não tem as sources.

Link para o comentário
Compartilhar em outros sites

  • 3 weeks later...

cara me ajuda a fazer uma função assim da para usar a besse desse seu script, mais queria assim eu tenho 1 box mais so depois de tantos dias, ou horas ela pode ser aberta. eu n consegui pegar essa função nunca vi algo parecido comu isso :X ajuda aew please...

Link para o comentário
Compartilhar em outros sites

  • 3 months later...

Demonbholder, porque em vez de voce fazer um loop infinito e ainda nao suportar milesegundos porque voce nao faz algo desse tipo:

 

function addEvent(func, t, ...)
   require "ex"
   os.sleep(t, 1e3)
   func(unpack(arg))
end

 

Muito mais pratico.

Link para o comentário
Compartilhar em outros sites

 

Demonb, será que você pode me fazer um favor? Não sei se é possível (deve ser), mas eu queria uma função execArray(array).

Ela executaria um array parecido com esse:

{doPlayerSendCancel,cid,'Demonbholder'}

 

Não consegui fazer :(

Editado por Byerne
Link para o comentário
Compartilhar em outros sites

Como assim cara, tipo isso?

 

local tab = {print, "OK", 2}

tab[1](tab[2], tab[3])

 

Só que pra qualquer função e com o número de argumentos diferentes?

 

Demonbholder, porque em vez de voce fazer um loop infinito e ainda nao suportar milesegundos porque voce nao faz algo desse tipo:

 

function addEvent(func, t, ...)
require "ex"
os.sleep(t, 1e3)
func(unpack(arg))
end

 

Muito mais pratico.

 

Pelos seguintes motivos:

 

1_ Precisa baixar os arquivos para que possa usar as funções desta API.

 

2_ Ele trava o interpretador do mesmo jeito.

 

3_ Se fosse testar a minha função, vai ver que suporta milisegundos.

 

Então, meu caro, eu duvido que seja mais prático ter que baixar arquivos só para diminuir algumas linha do script.

 

Ah, e mkalo, favor não ficar pedindo pras pessoas do seu msn postarem essas merdas no meu tópico. Valeu.

 

 

Owned.

 

 

-k

 

Eu acho que não hein brother :)

Editado por Demonbholder
Link para o comentário
Compartilhar em outros sites

Funciona com milesegundos???? DUSAGHUDSAUYDGSA os.time retorna milesegundos agora neh ¬¬

 

Filho o os.time nao retorna o tempo em milesegundos e sim em segundos.

 

E trava o interpretador mas come menos memoria...

 

O seu parametro pode ate ser posto em milesegundos mas na pratica nao vai dar em nada xD, vai arredondar pra cima

 

Ou seja se eu botar 1500 vai demorar 2 segundos pra rodar o addEvent

 

Se eu botar 1100 vai demorar 2 segundos

Se eu botar 1001 vai demorar 2 segundos

Se eu botar 1000.001 vai demorar 2 segundos

 

OBS: Eu nao pedi nada pra ele, mostrei o topico, pra ele aprender algo novo e ele tava mexendo com a lib ex entao eu decidi mostrar pra ele.... ele posta oq ele quizer

 

Byerne:

 

function executeArray(array)
   local func = array[1]
   local parameters = {}
   table.remove(array, 1)
   for i,x in pairs(array) do
  	 table.insert(parameters, x)
   end
   return func(unpack(parameters))
end

 

executeArray({doPlayerSendCancel, cid, "LOOOOL."})

Editado por MatheusMkalo
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...