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
- Fórum
- OTServ
- Recursos
- Scripting
- Mods, funções e outros
- Função Addevent(Func, Time, Arg)
Função Addevent(Func, Time, Arg)
Por Demonbholder, 03 de jul. de 2011 em Mods, funções e outros
info
Grupo: Conde
Registrado: 09/09/09
Posts: 528
Reputação: +424
Char no Tibia: Emekalo Makalo

info
Grupo: Infante
Registrado: 13/10/08
Posts: 1.6k
Reputação: +420
Char no Tibia: Demonbholder

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.
info
Grupo: Visconde
Registrado: 23/02/08
Posts: 273
Reputação: +101
Char no Tibia: Foxx Rookslayer

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
info
Grupo: Conde
Registrado: 09/09/09
Posts: 528
Reputação: +424
Char no Tibia: Emekalo Makalo

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...
info
Grupo: Visconde
Registrado: 23/02/08
Posts: 273
Reputação: +101
Char no Tibia: Foxx Rookslayer

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/
info
Grupo: Infante
Registrado: 13/10/08
Posts: 1.6k
Reputação: +420
Char no Tibia: Demonbholder

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
info
Grupo: Barão
Registrado: 18/10/10
Posts: 246
Reputação: +89
Char no Tibia: Elite Pamcadaum

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
info
Grupo: Infante
Registrado: 13/10/08
Posts: 1.6k
Reputação: +420
Char no Tibia: Demonbholder

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.
info
Grupo: Conde
Registrado: 09/09/09
Posts: 528
Reputação: +424
Char no Tibia: Emekalo Makalo

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
info
Grupo: Infante
Registrado: 13/10/08
Posts: 1.6k
Reputação: +420
Char no Tibia: Demonbholder

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
info
Grupo: Conde
Registrado: 09/09/09
Posts: 528
Reputação: +424
Char no Tibia: Emekalo Makalo

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...
info
Grupo: Infante
Registrado: 13/10/08
Posts: 1.6k
Reputação: +420
Char no Tibia: Demonbholder

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.
#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




info
Grupo: Infante
Registrado: 13/10/08
Posts: 1.6k
Reputação: +420
Char no Tibia: Demonbholder
Mesmo que não funcione com milisegundos, vc acha mais prático baixar os arquivos? Por favor né cara.