From f959c16763592c2638261ea1ba64c435cbe6c207 Mon Sep 17 00:00:00 2001 From: Jeija Date: Sat, 8 Sep 2012 15:10:31 +0200 Subject: [PATCH] Fix Microcontroller bug (discovered by Fenris) and some others that propably noone found --- mesecons/init.lua | 22 +++++++++------------- mesecons/internal.lua | 15 +-------------- mesecons_microcontroller/init.lua | 31 ++++++++++++------------------- 3 files changed, 22 insertions(+), 46 deletions(-) diff --git a/mesecons/init.lua b/mesecons/init.lua index babfca4..40aa7d9 100644 --- a/mesecons/init.lua +++ b/mesecons/init.lua @@ -60,14 +60,13 @@ function mesecon:receptor_on(pos, rules) end for i, rule in ipairs(rules) do - local np = {} - np.x = pos.x + rule.x - np.y = pos.y + rule.y - np.z = pos.z + rule.z + local np = { + x = pos.x + rule.x, + y = pos.y + rule.y, + z = pos.z + rule.z} if mesecon:rules_link(pos, np, rules) then mesecon:turnon(np, pos) end - i=i+1 end end @@ -76,17 +75,14 @@ function mesecon:receptor_off(pos, rules) rules = mesecon:get_rules("default") end - local connected = false - for i, rule in ipairs(rules) do - local np = {} - np.x = pos.x + rule.x - np.y = pos.y + rule.y - np.z = pos.z + rule.z - if mesecon:rules_link(pos, np, rules) and mesecon:connected_to_pw_src(np) == false then + local np = { + x = pos.x + rule.x, + y = pos.y + rule.y, + z = pos.z + rule.z} + if mesecon:rules_link(pos, np, rules) and not mesecon:connected_to_pw_src(np) then mesecon:turnoff(np, pos) end - i=i+1 end end diff --git a/mesecons/internal.lua b/mesecons/internal.lua index 71b5172..ce43ce5 100644 --- a/mesecons/internal.lua +++ b/mesecons/internal.lua @@ -2,23 +2,19 @@ --Receptors function mesecon:is_receptor_node(nodename) - local i = 1 for i, receptor in ipairs(mesecon.receptors) do if receptor.onstate == nodename then return true end - i = i + 1 end return false end function mesecon:is_receptor_node_off(nodename, pos, ownpos) - local i = 1 for i, receptor in ipairs(mesecon.receptors) do if receptor.offstate == nodename then return true end - i = i + 1 end return false end @@ -87,7 +83,6 @@ end function mesecon:deactivate(pos) local node = minetest.env:get_node(pos) - local i = 1 for i, action in ipairs(mesecon.actions_off) do action(pos, node) end @@ -95,7 +90,6 @@ end function mesecon:changesignal(pos) local node = minetest.env:get_node(pos) - local i = 1 for i, action in ipairs(mesecon.actions_change) do action(pos, node) end @@ -189,7 +183,6 @@ end function mesecon:turnon(pos) local node = minetest.env:get_node(pos) - local i = 1 if mesecon:is_conductor_off(node.name) then local rules = mesecon:conductor_get_rules(node) @@ -215,7 +208,6 @@ end function mesecon:turnoff(pos) --receptor rules used because output could have been dug local node = minetest.env:get_node(pos) - local i = 1 local rules if mesecon:is_conductor_on(node.name) then @@ -246,7 +238,7 @@ function mesecon:connected_to_pw_src(pos, checked) local c = 1 if checked == nil then checked = {} end while checked[c] ~= nil do --find out if node has already been checked (to prevent from endless loop) - if compare_pos(checked[c], pos) then + if compare_pos(checked[c], pos) then return false, checked end c = c + 1 @@ -265,7 +257,6 @@ function mesecon:connected_to_pw_src(pos, checked) local connected local rules = mesecon:conductor_get_rules(node) - local i = 1 for i, rule in ipairs(rules) do local np = {} np.x = pos.x + rule.x @@ -417,7 +408,6 @@ end --Rules rotation Functions: function mesecon:rotate_rules_right(rules) - local i=1 local nr={}; for i, rule in ipairs(rules) do nr[i]={} @@ -429,7 +419,6 @@ function mesecon:rotate_rules_right(rules) end function mesecon:rotate_rules_left(rules) - local i=1 local nr={}; for i, rule in ipairs(rules) do nr[i]={} @@ -441,7 +430,6 @@ function mesecon:rotate_rules_left(rules) end function mesecon:rotate_rules_down(rules) - local i=1 local nr={}; for i, rule in ipairs(rules) do nr[i]={} @@ -453,7 +441,6 @@ function mesecon:rotate_rules_down(rules) end function mesecon:rotate_rules_up(rules) - local i=1 local nr={}; for i, rule in ipairs(rules) do nr[i]={} diff --git a/mesecons_microcontroller/init.lua b/mesecons_microcontroller/init.lua index 3a2ce2b..59269b3 100644 --- a/mesecons_microcontroller/init.lua +++ b/mesecons_microcontroller/init.lua @@ -72,6 +72,7 @@ minetest.register_node(nodename, { "button_exit[3.5,1;2,3;program;Program]") meta:set_string("infotext", "Unprogrammed Microcontroller") meta:set_int("heat", 0) + meta:set_int("working", 0) local r = "" for i=1, EEPROM_SIZE+1 do r=r.."0" end --Generate a string with EEPROM_SIZE*"0" meta:set_string("eeprom", r) @@ -181,12 +182,15 @@ function yc_code_remove_commentary(code) end function yc_parsecode(code, pos) + local meta = minetest.env:get_meta(pos) + if meta:get_int("working") == 1 then return false end + meta:set_int("working", 1) local endi = 1 local Lreal = yc_get_real_portstates(pos) local Lvirtual = yc_get_virtual_portstates(pos) if Lvirtual == nil then return nil end local c - local eeprom = minetest.env:get_meta(pos):get_string("eeprom") + local eeprom = meta:get_string("eeprom") while true do command, endi = parse_get_command(code, endi) if command == nil then return nil end @@ -231,6 +235,7 @@ function yc_parsecode(code, pos) minetest.env:get_meta(pos):set_string("eeprom", eeprom) end end yc_action(pos, Lvirtual) + minetest.env:get_meta(pos):set_int("working", 0) return true end @@ -569,29 +574,17 @@ end --Real I/O functions function yc_action(pos, L) --L-->Lvirtual - Lv = yc_get_virtual_portstates(pos) - local meta = minetest.env:get_meta(pos) - local code = meta:get_string("code") - local afterid = meta:get_int("afterid") - local heat = meta:get_int("heat") - local eeprom = meta:get_string("eeprom") - local infotext = meta:get_string("infotext") - local formspec = meta:get_string("formspec") + local Lv = yc_get_virtual_portstates(pos) + local metatable = minetest.env:get_meta(pos):to_table() local name = "mesecons_microcontroller:microcontroller" ..tonumber(L.d and 1 or 0) ..tonumber(L.c and 1 or 0) ..tonumber(L.b and 1 or 0) ..tonumber(L.a and 1 or 0) minetest.env:add_node(pos, {name=name}) - local meta = minetest.env:get_meta(pos) - meta:set_string("code", code) - meta:set_int("heat", heat) - meta:set_int("afterid", afterid) - meta:set_string("eeprom", eeprom) - meta:set_string("infotext", infotext) - meta:set_string("formspec", formspec) + minetest.env:get_meta(pos):from_table(metatable) - yc_action_setports(pos, L, Lv, rules) + yc_action_setports(pos, L, Lv) end function yc_action_setports(pos, L, Lv) @@ -602,7 +595,7 @@ function yc_action_setports(pos, L, Lv) if L.a == true then mesecon:receptor_on(pos, rules) else mesecon:receptor_off(pos, rules) end end - if Lv.b ~= L.b then + if Lv.b ~= L.b then rules = mesecon:get_rules(name.."0010") if L.b == true then mesecon:receptor_on(pos, rules) else mesecon:receptor_off(pos, rules) end @@ -692,7 +685,7 @@ end function yc_overheat_off(pos) rules = mesecon:get_rules("mesecons_microcontroller:microcontroller1111") - mesecon:receptor_off(pos, rules); + mesecon:receptor_off(pos, rules) end mesecon:register_on_signal_change(function(pos, node)