Ir para conteúdo

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


Posts Recomendados

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.

Link para o comentário
Compartilhar em outros sites

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

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/

Link para o comentário
Compartilhar em outros sites

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

 

#semata

 

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

 

-k

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

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

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

  • 2 months later...

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

×
×
  • Criar Novo...