diff options
Diffstat (limited to 'mesecons_luacontroller')
| -rw-r--r-- | mesecons_luacontroller/init.lua | 36 | 
1 files changed, 17 insertions, 19 deletions
| diff --git a/mesecons_luacontroller/init.lua b/mesecons_luacontroller/init.lua index d2033e1..940b5da 100644 --- a/mesecons_luacontroller/init.lua +++ b/mesecons_luacontroller/init.lua @@ -2,7 +2,7 @@  -- ports = get_real_portstates(pos): gets if inputs are powered from outside  -- newport = merge_portstates(state1, state2): just does result = state1 or state2 for every port  -- action_setports(pos, rule, state): activates/deactivates the mesecons according to the portstates (helper for action) --- action(pos, ports, digiline_msgs): Applies new portstates to a luacontroller at pos, and sends pending digiline messages +-- action(pos, ports): Applies new portstates to a luacontroller at pos  -- lc_update(pos): updates the controller at pos by executing the code  -- reset_meta (pos, code, errmsg): performs a software-reset, installs new code and prints error messages  -- reset (pos): performs a hardware reset, turns off all ports @@ -99,7 +99,7 @@ local setport = function (pos, rule, state)  	end  end -local action = function (pos, ports, digiline_msgs) +local action = function (pos, ports)  	local node = minetest.get_node(pos)  	local name = node.name  	local vports = minetest.registered_nodes[name].virtual_portstates @@ -116,13 +116,6 @@ local action = function (pos, ports, digiline_msgs)  		if ports.c ~= vports.c then setport(pos, rules.c, ports.c) end  		if ports.d ~= vports.d then setport(pos, rules.d, ports.d) end  	end - -	if digiline then -		for i = 1, #digiline_msgs do -			digiline:receptor_send(pos, digiline.rules.default, -			    digiline_msgs[i].channel, digiline_msgs[i].msg) -		end -	end  end  -------------------- @@ -241,6 +234,16 @@ local gettimer = function(pos)  	return timer  end +local getdigiline_send = function(pos) +	if not digiline then return end +	-- Send messages on next serverstep +	return function(channel, msg) +		minetest.after(0, function() +			digiline:receptor_send(pos, digiline.rules.default, channel, msg) +		end) +	end +end +  local create_environment = function(pos, mem, event)  	-- Gather variables for the environment  	local vports = minetest.registered_nodes[minetest.get_node(pos).name].virtual_portstates @@ -253,10 +256,7 @@ local create_environment = function(pos, mem, event)  			port = vports,  			interrupt = getinterrupt(pos),  			timer = gettimer(pos), -			digiline_msgs = {}, -			digiline_send = function(channel, msg) -				table.insert(lc_digiline_msgs, {["channel"]=channel, ["msg"]=msg}) -			end, +			digiline_send = getdigiline_send(pos),  			mem = mem,  			tostring = tostring,  			tonumber = tonumber, @@ -373,7 +373,6 @@ end  -- Parsing function --  ---------------------- -lc_digiline_msgs = nil  lc_update = function (pos, event)  	local meta = minetest.get_meta(pos)  	if not interrupt_allow(meta, event) then return end @@ -385,11 +384,10 @@ lc_update = function (pos, event)  	-- make sure code is ok and create environment  	local prohibited = code_prohibited(code) -	if 	prohibited then return prohibited end +	if prohibited then return prohibited end  	local env = create_environment(pos, mem, event)  	-- create the sandbox and execute code -	lc_digiline_msgs = {}  	local chunk, msg = create_sandbox (code, env)  	if not chunk then return msg end  	local success, msg = pcall(f) @@ -398,8 +396,8 @@ lc_update = function (pos, event)  	save_memory(meta, mem) -	-- Actually set the ports and send digiline messages -	minetest.after(0, action, pos, env.port, lc_digiline_msgs) +	-- Actually set the ports +	minetest.after(0, action, pos, env.port)  end  local reset_meta = function(pos, code, errmsg) @@ -418,7 +416,7 @@ end  local reset = function (pos)  	minetest.get_meta(pos):set_string("lc_interrupts", "") -	action(pos, {a=false, b=false, c=false, d=false}, {}) +	action(pos, {a=false, b=false, c=false, d=false})  end  --        ______ | 
