forked from minetest-mods/mesecons
		
	Lots of bugfixes concerning the luacontroller
- Bug when using NOT-Gates - Moved error label a little downwards - On digiline event, msg and channel are now in event.*, not in event.iid.*
This commit is contained in:
		| @@ -54,50 +54,46 @@ local merge_portstates = function (ports, vports) | |||||||
| 	return npo | 	return npo | ||||||
| end | end | ||||||
|  |  | ||||||
| local action_setports_on = function (pos, ports, vports) | local generate_name = function (ports, overwrite) | ||||||
| 	if vports.a ~= ports.a and ports.a then | 	local overwrite = overwrite or {} | ||||||
| 		mesecon:receptor_on(pos, {rules.a}) | 	local d = overwrite.d or (ports.d and 1 or 0) | ||||||
| 	end | 	local c = overwrite.d or (ports.c and 1 or 0) | ||||||
| 	if vports.b ~= ports.b and ports.b then | 	local b = overwrite.d or (ports.b and 1 or 0) | ||||||
| 		mesecon:receptor_on(pos, {rules.b}) | 	local a = overwrite.d or (ports.a and 1 or 0) | ||||||
| 	end | 	return BASENAME..d..c..b..a | ||||||
| 	if vports.c ~= ports.c and ports.c then |  | ||||||
| 		mesecon:receptor_on(pos, {rules.c}) |  | ||||||
| 	end |  | ||||||
| 	if vports.d ~= ports.d and ports.d then |  | ||||||
| 		mesecon:receptor_on(pos, {rules.d}) |  | ||||||
| 	end |  | ||||||
| end |  | ||||||
|  |  | ||||||
| local action_setports_off = function (pos, ports, vports) |  | ||||||
| 	if vports.a ~= ports.a and not ports.a then |  | ||||||
| 		mesecon:receptor_off(pos, {rules.a}) |  | ||||||
| 	end |  | ||||||
| 	if vports.b ~= ports.b and not ports.b then |  | ||||||
| 		mesecon:receptor_off(pos, {rules.b}) |  | ||||||
| 	end |  | ||||||
| 	if vports.c ~= ports.c and not ports.c then |  | ||||||
| 		mesecon:receptor_off(pos, {rules.c}) |  | ||||||
| 	end |  | ||||||
| 	if vports.d ~= ports.d and not ports.d then |  | ||||||
| 		mesecon:receptor_off(pos, {rules.d}) |  | ||||||
| 	end |  | ||||||
| end | end | ||||||
|  |  | ||||||
| local action = function (pos, ports) | local action = function (pos, ports) | ||||||
| 	local name = minetest.env:get_node(pos).name | 	local name = minetest.env:get_node(pos).name | ||||||
| 	local vports = minetest.registered_nodes[name].virtual_portstates | 	local vports = minetest.registered_nodes[name].virtual_portstates | ||||||
| 	local newname = BASENAME | 	local newname = generate_name(ports) | ||||||
| 		..tonumber(ports.d and 1 or 0) |  | ||||||
| 		..tonumber(ports.c and 1 or 0) |  | ||||||
| 		..tonumber(ports.b and 1 or 0) |  | ||||||
| 		..tonumber(ports.a and 1 or 0) |  | ||||||
|  |  | ||||||
| 	if name ~= newname and vports then | 	if name ~= newname and vports then | ||||||
| 		mesecon:swap_node(pos, "air") | 		local rules_on  = {} | ||||||
| 		action_setports_off (pos, ports, vports) | 		local rules_off = {} | ||||||
| 		mesecon:swap_node(pos, newname) | 		local ignore = {} | ||||||
| 		action_setports_on (pos, ports, vports) |  | ||||||
|  | 		if ports.a then	table.insert(rules_on,  rules.a) | ||||||
|  | 		else			table.insert(rules_off, rules.a) end | ||||||
|  | 		if ports.b then	table.insert(rules_on,  rules.b) | ||||||
|  | 		else			table.insert(rules_off, rules.b) end | ||||||
|  | 		if ports.c then	table.insert(rules_on,  rules.c) | ||||||
|  | 		else			table.insert(rules_off, rules.c) end | ||||||
|  | 		if ports.d then	table.insert(rules_on,  rules.d) | ||||||
|  | 		else			table.insert(rules_off, rules.d) end | ||||||
|  |  | ||||||
|  | 		if ports.a ~= vports.a then ignore.a = 2 end | ||||||
|  | 		if ports.b ~= vports.b then ignore.b = 2 end | ||||||
|  | 		if ports.c ~= vports.c then ignore.c = 2 end | ||||||
|  | 		if ports.d ~= vports.d then ignore.d = 2 end | ||||||
|  |  | ||||||
|  | 		mesecon:swap_node(pos, generate_name(ports, ignore)) | ||||||
|  | 		mesecon:receptor_off(pos, rules_off) | ||||||
|  | 		if minetest.env:get_node(pos).name ~= generate_name(ports, ignore) then return end -- not interrupted by another event | ||||||
|  | 		mesecon:receptor_on (pos, rules_on ) | ||||||
|  | 		if minetest.registered_nodes[minetest.env:get_node(pos).name].is_luacontroller then --didnt overheat | ||||||
|  | 			mesecon:swap_node(pos, newname) | ||||||
|  | 		end | ||||||
| 	end | 	end | ||||||
| end | end | ||||||
|  |  | ||||||
| @@ -122,7 +118,7 @@ end | |||||||
| local overheat = function (meta) -- determine if too hot | local overheat = function (meta) -- determine if too hot | ||||||
| 	h = meta:get_int("heat") | 	h = meta:get_int("heat") | ||||||
| 	if h == nil then return true end -- if nil then overheat | 	if h == nil then return true end -- if nil then overheat | ||||||
| 	if h > 10 then  | 	if h > 20 then  | ||||||
| 		return true | 		return true | ||||||
| 	else  | 	else  | ||||||
| 		return false  | 		return false  | ||||||
| @@ -210,6 +206,7 @@ local do_overheat = function (pos, meta) | |||||||
| 		minetest.env:remove_node(pos) | 		minetest.env:remove_node(pos) | ||||||
| 		minetest.after(0.2, overheat_off, pos) -- wait for pending operations | 		minetest.after(0.2, overheat_off, pos) -- wait for pending operations | ||||||
| 		minetest.env:add_item(pos, BASENAME.."0000") | 		minetest.env:add_item(pos, BASENAME.."0000") | ||||||
|  | 		return true | ||||||
| 	end | 	end | ||||||
| end | end | ||||||
|  |  | ||||||
| @@ -248,6 +245,7 @@ end | |||||||
| lc_update = function (pos, event) | lc_update = function (pos, event) | ||||||
| 	local meta = minetest.env:get_meta(pos) | 	local meta = minetest.env:get_meta(pos) | ||||||
| 	if not interrupt_allow(meta, event) then return end | 	if not interrupt_allow(meta, event) then return end | ||||||
|  | 	if do_overheat(pos, meta) then return end | ||||||
|  |  | ||||||
| 	-- load code & mem from memory | 	-- load code & mem from memory | ||||||
| 	local mem  = load_memory(meta) | 	local mem  = load_memory(meta) | ||||||
| @@ -265,7 +263,6 @@ lc_update = function (pos, event) | |||||||
| 	if not success then return msg end | 	if not success then return msg end | ||||||
| 	if ports_invalid(env.port) then return ports_invalid(env.port) end | 	if ports_invalid(env.port) then return ports_invalid(env.port) end | ||||||
|  |  | ||||||
| 	do_overheat(pos, meta) |  | ||||||
| 	save_memory(meta, mem) | 	save_memory(meta, mem) | ||||||
|  |  | ||||||
| 	-- Actually set the ports | 	-- Actually set the ports | ||||||
| @@ -284,7 +281,7 @@ local reset_meta = function(pos, code, errmsg) | |||||||
| 		"textarea[0.2,0.6;10.2,5;code;;"..code.."]".. | 		"textarea[0.2,0.6;10.2,5;code;;"..code.."]".. | ||||||
| 		"image_button[3.75,6;2.5,1;jeija_luac_runbutton.png;program;]".. | 		"image_button[3.75,6;2.5,1;jeija_luac_runbutton.png;program;]".. | ||||||
| 		"image_button_exit[9.72,-0.25;0.425,0.4;jeija_close_window.png;exit;]".. | 		"image_button_exit[9.72,-0.25;0.425,0.4;jeija_close_window.png;exit;]".. | ||||||
| 		"label[0.1,4.5;"..errmsg.."]") | 		"label[0.1,5;"..errmsg.."]") | ||||||
| 	meta:set_int("heat", 0) | 	meta:set_int("heat", 0) | ||||||
| end | end | ||||||
|  |  | ||||||
| @@ -325,15 +322,16 @@ local digiline = { | |||||||
| 	receptor = {}, | 	receptor = {}, | ||||||
| 	effector = { | 	effector = { | ||||||
| 		action = function (pos, node, channel, msg) | 		action = function (pos, node, channel, msg) | ||||||
| 			lc_update (pos, {type = "digiline", iid = {channel = channel, msg = msg}}) | 			lc_update (pos, {type = "digiline", channel = channel, msg = msg}) | ||||||
| 		end | 		end | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| for a = 0, 1 do | for a = 0, 2 do -- 0 = off; 1 = on; 2 = ignore | ||||||
| for b = 0, 1 do | for b = 0, 2 do | ||||||
| for c = 0, 1 do | for c = 0, 2 do | ||||||
| for d = 0, 1 do | for d = 0, 2 do | ||||||
|  |  | ||||||
| local cid = tostring(d)..tostring(c)..tostring(b)..tostring(a) | local cid = tostring(d)..tostring(c)..tostring(b)..tostring(a) | ||||||
| local nodename = BASENAME..cid | local nodename = BASENAME..cid | ||||||
| local top = "jeija_luacontroller_top.png" | local top = "jeija_luacontroller_top.png" | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user