DE

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

Por Demonbholder, 03 de jul. de 2011 em Mods, funções e outros

otserv
29
6.8k
21 de janeiro de 2012 às 20:27

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

 

Mesmo que não funcione com milisegundos, vc acha mais prático baixar os arquivos? Por favor né cara.

MatheusGladM
21 de janeiro de 2012 às 21:06

Se voce acha que baixar 17 kb da lib eh MTO DIFICIL tanto que vai perder o braço pra isso, mesmo assim ainda vale a pena xD

21 de janeiro de 2012 às 21:24

da pra usar com outras libs também.

 

não é mais prático, é mais aprimorado.

 

e eu acho que a função que ele quer é com várias functions dentro da array.

bepokemonB
21 de janeiro de 2012 às 21:31

Na verdade era exatamente assim. Era pra uma merda boba que eu to tentando fazer. (Um "update" no NPC System pra colocar Quests "automaticas".)

Não briguem T.T Não quero ter que escolher quem eu vou ser fã nos fim de semanas o/

 

@Mkalo

Só não entendi uma coisa:

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

 

Eu não poderia usar:

unpack(array)

Ou:

parameters = array
unpack(parameters)

?

 

@Demonbholder

e eu acho que a função que ele quer é com várias functions dentro da array.

Tipo assim? .-.

local rewards = {{doPlayerAddItem,cid,2160,1},{doPlayerAddItem,cid,2152,50}}
for _,v in pairs(rewards) do
executeArray(v)
end

Editado Janeiro 21 por Byerne

MatheusGladM
21 de janeiro de 2012 às 21:39

Eu nao sabia oq voce queria exatamente a minha funçao voce pode fazer isso:

 

executeArray({print, ["text"] = "OII"})

 

se voce fizer como voce disse dando unpack no array, simplesmente nao vai printar nada...

bepokemonB
21 de janeiro de 2012 às 21:44

Eu nao sabia oq voce queria exatamente a minha funçao voce pode fazer isso:

 

executeArray({print, ["text"] = "OII"})

 

se voce fizer como voce disse dando unpack no array, simplesmente nao vai printar nada...

 

Ah sim, então ele só "têm a certeza" de que estará rodando os valores .. Saquei =) Obrigado o/

21 de janeiro de 2012 às 22:22

por que vc não usa assim:

 

 

function executeArray(array)

for _, tab in pairs(array) do
local func = tab[1]
table.remove(tab, 1)
func(unpack(tab))
end

end

 

Ai vc pode usar desse jeito:

 

 

local array = {{print, "OK"}, {print, "N"}}
executeArray(array)

 

Eu nao sabia oq voce queria exatamente a minha funçao voce pode fazer isso:

 

executeArray({print, ["text"] = "OII"})

 

se voce fizer como voce disse dando unpack no array, simplesmente nao vai printar nada...

 

Ah sim, então ele só "têm a certeza" de que estará rodando os valores .. Saquei =) Obrigado o/

Editado Janeiro 21 por Demonbholder

MaXwEllDeNM
24 de janeiro de 2012 às 10:41

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

 

#semata

 

ele não mandou/pediu pra que eu postasse nada, só achei que você foi owned.

 

-k

28 de janeiro de 2012 às 05:01

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.

 

 

function addEvent(func, time, ...)

local clock = os.clock

while true do
if time/1000 - clock() <= 0 then
func(...)
break
end
end

end

 

Funcionando com milisegundos sem precisar de nenhuma biblioteca adicional.

 

Logo, não vejo mais vantagens na sua função.

MatheusGladM
29 de janeiro de 2012 às 04:14

voce acha mesmo que a funçao os.sleep faz um loop ate o tempo acabar? acho que nao hein

 

e ja que voce usou a funçao os.clock creio que voce saiba oq ela retorna

 

vejamos tente fazer isso:

 

for i = 1, 400000000 do
end
print("oi")
addEvent(print, 5000, "aee")

 

vai printar oi, e aee praticamente ao mesmo tempo :)

 

concerta seu script ai plz

 

Edit:

 

Whatever, pra acabar com esse seu argumento tosco de falar que eu to usando lib externa:

 

local Events = {}
function Events:new()
return setmetatable({} ,{__index = self})
end
function Events:add(func, time, ...)
table.insert(self, {func, time, arg})
end
function Events:check()
local n = os.clock()
while #self > 0 do
	for i,x in ipairs(self) do
	 if os.clock()-n > x[2]/1000 then
	  x[1](unpack(x[3]))
   table.remove(self, i)
  end
 end
end
end

 

Com isso voce adiciona eventos e no final do script voce bota o check, claro se voce botar um loop grande antes do check nao vai funcionar de acordo, eh o maximo que pode chegar sem nenhuma lib.

 

local events = Events:new()
events:add(print, 5000, "Aee")
events:add(print, 1000, "Oii")
events:check()

Editado Janeiro 29 por MatheusMkalo

29 de janeiro de 2012 às 05:17

Você simplesmente aprimorou o script pra que possa usar 2 vezes, ou mais, a função, sem ter que esperar o tempo de uma acabar pra usar a outra.

 

Resolvendo o real problema do código:

 

 

function addEvent(func, time, ...)

local clock = os.clock
local time = time/1000 + clock()

while true do
if time - clock() <= 0 then
func(...)
break
end
end

end

 

Feito. No seu script ficaria assim:

 

 

local Events = {}
function Events:new()
       return setmetatable({} ,{__index = self})
end
function Events:add(func, time, ...)
       table.insert(self, {func, time/1000 + os.clock(), arg})
end
function Events:check()

local n = os.clock()
while #self > 0 do
for i,x in ipairs(self) do
if os.clock()-n > x[2] then
x[1](unpack(x[3]))
table.remove(self, i)
end
end
end
end

 

OBS: Ipb ta tirando a identação.

 

voce acha mesmo que a funçao os.sleep faz um loop ate o tempo acabar? acho que nao hein

 

Quem foi que disse isso?

Editado Janeiro 29 por Demonbholder

MatheusGladM
29 de janeiro de 2012 às 05:48

voce incluiu isso quando disse que o meu script nao tinha mais vantagens...

ja que fzer 1 loop infinito eh mais prejudicial do que 1 lib externa...

29 de janeiro de 2012 às 06:35

Não sei da onde você tirou isso.

 

Embora o método seja diferente, as consequências são as mesmas, portanto nenhum é mais prejudicial que o outro.

 

Concluindo, não vejo mais vantagens na sua função.

3 meses depois...
dalvorsnD
28 de abril de 2012 às 04:49

#Topic

Fiz de um modo POG, porém mil vezes mais funcional que o de vocês, veja:

function addEvent(f, t, ...)
 os.execute("ping -n "..(tonumber(t) + 1).." 127.0.0.1 >NUL")
 return f(unpack(... and ... or {}))
end

Exemplo de uso:

addEvent(function ()
			return print(collectgarbage("count"))
	 end, 10)

Mas ainda assim não fica fiel a de otserv, pra ficar igual igual acho que teria que chamar dentro de uma coroutine e suspender ela pro resto do bloco executar

Agora nao to com tempo, depois tento fazer

 

Eu nao sabia oq voce queria exatamente a minha funçao voce pode fazer isso:

 

executeArray({print, ["text"] = "OII"})

 

se voce fizer como voce disse dando unpack no array, simplesmente nao vai printar nada...

 

Achei inútil a parte:

for i,x in pairs(array) do
table.insert(parameters, x)
end

 

Não tem a minima necessidade de usar indices em parametros, e a função table.remove retorna o valor removido, o que torna desnecessário o uso disso:

local func = array[1]

 

O código pode ser simplificado a isso:

function executeArray(array)
local func = table.remove(array, 1)	
return func(unpack(array))
end

Editado Abril 28 por dalvorsn