48 lines
1 KiB
Lua
48 lines
1 KiB
Lua
-- interrupt.lua
|
|
-- implements interrupt queue
|
|
|
|
--to be saved: pos and evtdata
|
|
local iq={}
|
|
local queue={}
|
|
local timer=0
|
|
local run=false
|
|
|
|
function iq.load(data)
|
|
local d=data or {}
|
|
queue = d.queue or {}
|
|
timer = d.timer or 0
|
|
end
|
|
function iq.save()
|
|
return {queue = queue, timer=timer}
|
|
end
|
|
|
|
function iq.add(t, pos, evtdata)
|
|
queue[#queue+1]={t=t+timer, p=pos, e=evtdata}
|
|
run=true
|
|
end
|
|
|
|
function iq.mainloop(dtime)
|
|
timer=timer + math.min(dtime, 0.2)
|
|
for i=1,#queue do
|
|
local qe=queue[i]
|
|
if not qe then
|
|
table.remove(queue, i)
|
|
i=i-1
|
|
elseif timer>qe.t then
|
|
local pos, evtdata=queue[i].p, queue[i].e
|
|
local node=advtrains.ndb.get_node(pos)
|
|
local ndef=minetest.registered_nodes[node.name]
|
|
if ndef and ndef.luaautomation and ndef.luaautomation.fire_event then
|
|
ndef.luaautomation.fire_event(pos, evtdata)
|
|
else
|
|
atwarn("[atlatc][interrupt] Couldn't run event",evtdata.type,"on",pos,", something wrong with the node",node)
|
|
end
|
|
table.remove(queue, i)
|
|
i=i-1
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
atlatc.interrupt=iq
|