Add timer() function/event (node timer based) to luacontroller

This adds a timer(<seconds>) function, which causes an event of type
"timer" to be fired after that many seconds has elapsed.

Because it's node timer based, it works properly across server restarts
and block unloading. Thus, simplest example, a blinky plant replacement
with a 10 second period:

if event.type == "program" then
  timer(10)
elseif event.type == "timer" then
  port.a = not port.a
  timer(10)
end
This commit is contained in:
Ciaran Gultnieks 2014-03-11 22:42:59 +00:00
parent a59f53d71a
commit 9eda62df7b
1 changed files with 18 additions and 7 deletions

View File

@ -219,13 +219,19 @@ local getinterrupt = function(pos)
return interrupt return interrupt
end end
local getdigiline_send = function (pos) local handle_timer = function(pos, elapsed)
local digiline_send = function (channel, msg) local err = lc_update(pos, {type="timer"})
if digiline then if err then print(err) end
digiline:receptor_send(pos, digiline.rules.default, channel, msg) return false
end end
local gettimer = function(pos)
local timer = function (time)
if type(time) ~= "number" then return end
local nodetimer = minetest.get_node_timer(pos)
nodetimer:start(time)
end end
return digiline_send return timer
end end
local create_environment = function(pos, mem, event) local create_environment = function(pos, mem, event)
@ -239,7 +245,11 @@ local create_environment = function(pos, mem, event)
pin = merge_portstates(vports, rports), pin = merge_portstates(vports, rports),
port = vports, port = vports,
interrupt = getinterrupt(pos), interrupt = getinterrupt(pos),
digiline_send = getdigiline_send(pos), timer = gettimer(pos),
digiline_msgs = {},
digiline_send = function(channel, msg)
table.insert(lc_digiline_msgs, {["channel"]=channel, ["msg"]=msg})
end,
mem = mem, mem = mem,
tostring = tostring, tostring = tostring,
tonumber = tonumber, tonumber = tonumber,
@ -527,6 +537,7 @@ minetest.register_node(nodename, {
if err then print(err) end if err then print(err) end
reset_meta(pos, fields.code, err) reset_meta(pos, fields.code, err)
end, end,
on_timer = handle_timer,
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
mesecons = mesecons, mesecons = mesecons,
digiline = digiline, digiline = digiline,