From 9eda62df7b45659ff704db9a63a633a6bc4f70a7 Mon Sep 17 00:00:00 2001 From: Ciaran Gultnieks Date: Tue, 11 Mar 2014 22:42:59 +0000 Subject: [PATCH] Add timer() function/event (node timer based) to luacontroller This adds a timer() 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 --- mesecons_luacontroller/init.lua | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/mesecons_luacontroller/init.lua b/mesecons_luacontroller/init.lua index 263a66a..20f2ec1 100644 --- a/mesecons_luacontroller/init.lua +++ b/mesecons_luacontroller/init.lua @@ -219,13 +219,19 @@ local getinterrupt = function(pos) return interrupt end -local getdigiline_send = function (pos) - local digiline_send = function (channel, msg) - if digiline then - digiline:receptor_send(pos, digiline.rules.default, channel, msg) - end +local handle_timer = function(pos, elapsed) + local err = lc_update(pos, {type="timer"}) + if err then print(err) end + return false +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 - return digiline_send + return timer end local create_environment = function(pos, mem, event) @@ -239,7 +245,11 @@ local create_environment = function(pos, mem, event) pin = merge_portstates(vports, rports), port = vports, 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, tostring = tostring, tonumber = tonumber, @@ -527,6 +537,7 @@ minetest.register_node(nodename, { if err then print(err) end reset_meta(pos, fields.code, err) end, + on_timer = handle_timer, sounds = default.node_sound_stone_defaults(), mesecons = mesecons, digiline = digiline,