summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesecons/init.lua6
-rw-r--r--mesecons/internal.lua134
-rw-r--r--mesecons/services.lua2
-rw-r--r--mesecons/util.lua137
-rw-r--r--mesecons_extrawires/crossing.lua49
-rw-r--r--mesecons_extrawires/crossover.lua151
-rw-r--r--mesecons_extrawires/init.lua3
-rw-r--r--mesecons_luacontroller/init.lua8
-rw-r--r--mesecons_microcontroller/init.lua16
9 files changed, 409 insertions, 97 deletions
diff --git a/mesecons/init.lua b/mesecons/init.lua
index 7f6fe5d..587937a 100644
--- a/mesecons/init.lua
+++ b/mesecons/init.lua
@@ -79,7 +79,7 @@ dofile(minetest.get_modpath("mesecons").."/legacy.lua");
function mesecon:receptor_on(pos, rules)
rules = rules or mesecon.rules.default
- for _, rule in ipairs(rules) do
+ for _, rule in ipairs(mesecon:flattenrules(rules)) do
local np = mesecon:addPosRule(pos, rule)
local link, rulename = mesecon:rules_link(pos, np, rules)
if link then
@@ -91,11 +91,11 @@ end
function mesecon:receptor_off(pos, rules)
rules = rules or mesecon.rules.default
- for _, rule in ipairs(rules) do
+ for _, rule in ipairs(mesecon:flattenrules(rules)) do
local np = mesecon:addPosRule(pos, rule)
local link, rulename = mesecon:rules_link(pos, np, rules)
if link then
- if not mesecon:connected_to_receptor(np) then
+ if not mesecon:connected_to_receptor(np, mesecon:invertRule(rule)) then
mesecon:turnoff(np, rulename)
else
mesecon:changesignal(np, minetest.env:get_node(np), rulename, mesecon.state.off)
diff --git a/mesecons/internal.lua b/mesecons/internal.lua
index 5e243cf..8ab0bf6 100644
--- a/mesecons/internal.lua
+++ b/mesecons/internal.lua
@@ -212,18 +212,38 @@ end
-- Conductors
-function mesecon:is_conductor_on(nodename)
+function mesecon:is_conductor_on(nodename, rulename)
local conductor = mesecon:get_conductor(nodename)
- if conductor and conductor.state == mesecon.state.on then
- return true
+ if conductor then
+ if conductor.state then
+ return conductor.state == mesecon.state.on
+ end
+ if conductor.states then
+ if not rulename then
+ return mesecon:getstate(nodename, conductor.states) ~= 1
+ end
+ local bit = mesecon:rule2bit(rulename, mesecon:conductor_get_rules(minetest.registered_nodes[nodename]))
+ local binstate = mesecon:getbinstate(nodename, conductor.states)
+ return mesecon:get_bit(binstate, bit)
+ end
end
return false
end
-function mesecon:is_conductor_off(nodename)
+function mesecon:is_conductor_off(nodename, rulename)
local conductor = mesecon:get_conductor(nodename)
- if conductor and conductor.state == mesecon.state.off then
- return true
+ if conductor then
+ if conductor.state then
+ return conductor.state == mesecon.state.off
+ end
+ if conductor.states then
+ if not rulename then
+ return mesecon:getstate(nodename, conductor.states) == 1
+ end
+ local bit = mesecon:rule2bit(rulename, mesecon:conductor_get_rules(minetest.registered_nodes[nodename]))
+ local binstate = mesecon:getbinstate(nodename, conductor.states)
+ return not mesecon:get_bit(binstate, bit)
+ end
end
return false
end
@@ -236,20 +256,36 @@ function mesecon:is_conductor(nodename)
return false
end
-function mesecon:get_conductor_on(offstate)
+function mesecon:get_conductor_on(offstate, rulename)
local conductor = mesecon:get_conductor(offstate)
if conductor then
- return conductor.onstate
+ if conductor.onstate then
+ return conductor.onstate
+ end
+ if conductor.states then
+ local bit = mesecon:rule2bit(rulename, mesecon:conductor_get_rules(minetest.registered_nodes[offstate]))
+ local binstate = mesecon:getbinstate(offstate, conductor.states)
+ binstate = mesecon:set_bit(binstate, bit, "1")
+ return conductor.states[tonumber(binstate,2)+1]
+ end
end
- return false
+ return offstate
end
-function mesecon:get_conductor_off(onstate)
+function mesecon:get_conductor_off(onstate, rulename)
local conductor = mesecon:get_conductor(onstate)
if conductor then
- return conductor.offstate
+ if conductor.offstate then
+ return conductor.offstate
+ end
+ if conductor.states then
+ local bit = mesecon:rule2bit(rulename, mesecon:conductor_get_rules(minetest.registered_nodes[onstate]))
+ local binstate = mesecon:getbinstate(onstate, conductor.states)
+ binstate = mesecon:set_bit(binstate, bit, "0")
+ return conductor.states[tonumber(binstate,2)+1]
+ end
end
- return false
+ return onstate
end
function mesecon:conductor_get_rules(node)
@@ -267,17 +303,17 @@ end
-- some more general high-level stuff
-function mesecon:is_power_on(pos)
+function mesecon:is_power_on(pos, rulename)
local node = minetest.env:get_node(pos)
- if mesecon:is_conductor_on(node.name) or mesecon:is_receptor_on(node.name) then
+ if mesecon:is_conductor_on(node.name, rulename) or mesecon:is_receptor_on(node.name) then
return true
end
return false
end
-function mesecon:is_power_off(pos)
+function mesecon:is_power_off(pos, rulename)
local node = minetest.env:get_node(pos)
- if mesecon:is_conductor_off(node.name) or mesecon:is_receptor_off(node.name) then
+ if mesecon:is_conductor_off(node.name, rulename) or mesecon:is_receptor_off(node.name) then
return true
end
return false
@@ -286,11 +322,21 @@ end
function mesecon:turnon(pos, rulename)
local node = minetest.env:get_node(pos)
- if mesecon:is_conductor_off(node.name) then
+ if mesecon:is_conductor_off(node.name, rulename) then
local rules = mesecon:conductor_get_rules(node)
- minetest.env:add_node(pos, {name = mesecon:get_conductor_on(node.name), param2 = node.param2})
- for _, rule in ipairs(rules) do
+ if not rulename then
+ for _, rule in ipairs(mesecon:flattenrules(rules)) do
+ if mesecon:connected_to_receptor(pos, rule) then
+ mesecon:turnon(pos, rule)
+ end
+ end
+ return
+ end
+
+ minetest.env:add_node(pos, {name = mesecon:get_conductor_on(node.name, rulename), param2 = node.param2})
+
+ for _, rule in ipairs(mesecon:rule2meta(rulename, rules)) do
local np = mesecon:addPosRule(pos, rule)
local link, rulename = mesecon:rules_link(pos, np)
@@ -309,11 +355,21 @@ end
function mesecon:turnoff(pos, rulename)
local node = minetest.env:get_node(pos)
- if mesecon:is_conductor_on(node.name) then
+ if mesecon:is_conductor_on(node.name, rulename) then
local rules = mesecon:conductor_get_rules(node)
- minetest.env:add_node(pos, {name = mesecon:get_conductor_off(node.name), param2 = node.param2})
+ --[[
+ if not rulename then
+ for _, rule in ipairs(mesecon:flattenrules(rules)) do
+ if mesecon:is_powered(pos, rule) then
+ mesecon:turnoff(pos, rule)
+ end
+ end
+ return
+ end
+ --]]
+ minetest.env:add_node(pos, {name = mesecon:get_conductor_off(node.name, rulename), param2 = node.param2})
- for _, rule in ipairs(rules) do
+ for _, rule in ipairs(mesecon:rule2meta(rulename, rules)) do
local np = mesecon:addPosRule(pos, rule)
local link, rulename = mesecon:rules_link(pos, np)
@@ -331,17 +387,17 @@ function mesecon:turnoff(pos, rulename)
end
-function mesecon:connected_to_receptor(pos)
+function mesecon:connected_to_receptor(pos, rulename)
local node = minetest.env:get_node(pos)
-- Check if conductors around are connected
local rules = mesecon:get_any_inputrules(node)
if not rules then return false end
- for _, rule in ipairs(rules) do
+ for _, rule in ipairs(mesecon:rule2meta(rulename, rules)) do
local np = mesecon:addPosRule(pos, rule)
if mesecon:rules_link(np, pos) then
- if mesecon:find_receptor_on(np, {}) then
+ if mesecon:find_receptor_on(np, {}, mesecon:invertRule(rule)) then
return true
end
end
@@ -350,7 +406,7 @@ function mesecon:connected_to_receptor(pos)
return false
end
-function mesecon:find_receptor_on(pos, checked)
+function mesecon:find_receptor_on(pos, checked, rulename)
-- find out if node has already been checked (to prevent from endless loop)
for _, cp in ipairs(checked) do
if mesecon:cmpPos(cp, pos) then
@@ -368,10 +424,10 @@ function mesecon:find_receptor_on(pos, checked)
if mesecon:is_conductor(node.name) then
local rules = mesecon:conductor_get_rules(node)
- for _, rule in ipairs(rules) do
+ for _, rule in ipairs(mesecon:rule2meta(rulename, rules)) do
local np = mesecon:addPosRule(pos, rule)
if mesecon:rules_link(np, pos) then
- if mesecon:find_receptor_on(np, checked) then
+ if mesecon:find_receptor_on(np, checked, mesecon:invertRule(rule)) then
return true
end
end
@@ -390,13 +446,13 @@ function mesecon:rules_link(output, input, dug_outputrules) --output/input are p
return
end
- for _, outputrule in ipairs(outputrules) do
+ for _, outputrule in ipairs(mesecon:flattenrules(outputrules)) do
-- Check if output sends to input
if mesecon:cmpPos(mesecon:addPosRule(output, outputrule), input) then
- for _, inputrule in ipairs(inputrules) do
+ for _, inputrule in ipairs(mesecon:flattenrules(inputrules)) do
-- Check if input accepts from output
if mesecon:cmpPos(mesecon:addPosRule(input, inputrule), output) then
- return true, inputrule.name
+ return true, inputrule
end
end
end
@@ -408,16 +464,26 @@ function mesecon:rules_link_anydir(pos1, pos2)
return mesecon:rules_link(pos1, pos2) or mesecon:rules_link(pos2, pos1)
end
-function mesecon:is_powered(pos)
+function mesecon:is_powered(pos, rule)
local node = minetest.env:get_node(pos)
local rules = mesecon:get_any_inputrules(node)
if not rules then return false end
- for _, rule in ipairs(rules) do
+ if not rule then
+ for _, rule in ipairs(mesecon:flattenrules(rules)) do
+ local np = mesecon:addPosRule(pos, rule)
+ local nn = minetest.env:get_node(np)
+
+ if (mesecon:is_conductor_on (nn.name, mesecon:invertRule(rule)) or mesecon:is_receptor_on (nn.name))
+ and mesecon:rules_link(np, pos) then
+ return true
+ end
+ end
+ else
local np = mesecon:addPosRule(pos, rule)
local nn = minetest.env:get_node(np)
- if (mesecon:is_conductor_on (nn.name) or mesecon:is_receptor_on (nn.name))
+ if (mesecon:is_conductor_on (nn.name, mesecon:invertRule(rule)) or mesecon:is_receptor_on (nn.name))
and mesecon:rules_link(np, pos) then
return true
end
diff --git a/mesecons/services.lua b/mesecons/services.lua
index a2f9d01..4260a2e 100644
--- a/mesecons/services.lua
+++ b/mesecons/services.lua
@@ -5,7 +5,7 @@ mesecon.on_placenode = function (pos)
elseif mesecon:is_powered(pos) then
if mesecon:is_conductor(node.name) then
mesecon:turnon (pos)
- mesecon:receptor_on (pos, mesecon:conductor_get_rules(node))
+ --mesecon:receptor_on (pos, mesecon:conductor_get_rules(node))
else
mesecon:changesignal(pos, node)
mesecon:activate(pos, node)
diff --git a/mesecons/util.lua b/mesecons/util.lua
index 08b46d1..12d2af1 100644
--- a/mesecons/util.lua
+++ b/mesecons/util.lua
@@ -14,6 +14,143 @@ function mesecon:move_node(pos, newpos)
minetest.env:get_meta(pos):from_table(meta)
end
+--[[ new functions:
+mesecon:flattenrules(allrules)
+mesecon:rule2bit(findrule, allrules)
+mesecon:rule2meta(findrule, allrules)
+dec2bin(n)
+mesecon:getstate(nodename, states)
+mesecon:getbinstate(nodename, states)
+mesecon:get_bit(binary, bit)
+mesecon:set_bit(binary, bit, value)
+mesecon:invertRule(r)
+--]]
+
+function mesecon:flattenrules(allrules)
+--[[
+ {
+ {
+ {xyz},
+ {xyz},
+ },
+ {
+ {xyz},
+ {xyz},
+ },
+ }
+--]]
+ if allrules[1] and
+ allrules[1].x then
+ return allrules
+ end
+
+ local shallowrules = {}
+ for _, metarule in ipairs( allrules) do
+ for _, rule in ipairs(metarule ) do
+ table.insert(shallowrules, rule)
+ end
+ end
+ return shallowrules
+--[[
+ {
+ {xyz},
+ {xyz},
+ {xyz},
+ {xyz},
+ }
+--]]
+end
+
+function mesecon:rule2bit(findrule, allrules)
+ --get the bit of the metarule the rule is in, or bit 1
+ if (allrules[1] and
+ allrules[1].x) or
+ not findrule then
+ return 1
+ end
+ for m,metarule in ipairs( allrules) do
+ for _, rule in ipairs(metarule ) do
+ if mesecon:cmpPos(findrule, rule) then
+ return m
+ end
+ end
+ end
+end
+
+function mesecon:rule2meta(findrule, allrules)
+ --get the metarule the rule is in, or allrules
+
+ if allrules[1].x then
+ return allrules
+ end
+
+ if not(findrule) then
+ return mesecon:flattenrules(allrules)
+ end
+
+ for m, metarule in ipairs( allrules) do
+ for _, rule in ipairs(metarule ) do
+ if mesecon:cmpPos(findrule, rule) then
+ return metarule
+ end
+ end
+ end
+end
+
+if convert_base then
+ print(
+ "base2dec is tonumber(num,base1)\n"..
+ "commonlib needs dec2base(num,base2)\n"..
+ "and it needs base2base(num,base1,base2),\n"..
+ "which is dec2base(tonumber(num,base1),base2)"
+ )
+else
+ function dec2bin(n)
+ local x, y = math.floor(n / 2), n % 2
+ if (n > 1) then
+ return dec2bin(x)..y
+ else
+ return ""..y
+ end
+ end
+end
+
+function mesecon:getstate(nodename, states)
+ for state, name in ipairs(states) do
+ if name == nodename then
+ return state
+ end
+ end
+ error(nodename.." doesn't mention itself in "..dump(states))
+end
+
+function mesecon:getbinstate(nodename, states)
+ return dec2bin(mesecon:getstate(nodename, states)-1)
+end
+
+function mesecon:get_bit(binary,bit)
+ bit = bit or 1
+ local c = binary:len()-(bit-1)
+ return binary:sub(c,c) == "1"
+end
+
+function mesecon:set_bit(binary,bit,value)
+ if value == "1" then
+ if not mesecon:get_bit(binary,bit) then
+ return dec2bin(tonumber(binary,2)+math.pow(2,bit-1))
+ end
+ elseif value == "0" then
+ if mesecon:get_bit(binary,bit) then
+ return dec2bin(tonumber(binary,2)-math.pow(2,bit-1))
+ end
+ end
+ return binary
+
+end
+
+function mesecon:invertRule(r)
+ return {x = -r.x, y = -r.y, z = -r.z}
+end
function mesecon:addPosRule(p, r)
return {x = p.x + r.x, y = p.y + r.y, z = p.z + r.z}
diff --git a/mesecons_extrawires/crossing.lua b/mesecons_extrawires/crossing.lua
deleted file mode 100644
index 9b381bf..0000000
--- a/mesecons_extrawires/crossing.lua
+++ /dev/null
@@ -1,49 +0,0 @@
--- CODE NOT ACTIVE
-
-local crossing_get_rules = function(node)
- --TODO: calculate the real port states and use rules to link to them only if
-end
-
-minetest.register_node("mesecons_extrawires:crossing_on", {
- drawtype = "nodebox",
- tiles = {"jeija_insulated_wire_sides_on.png"},
- paramtype = "light",
- walkable = false,
- stack_max = 99,
- selection_box = {type="fixed", fixed={-16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001}},
- node_box = {
- type = "fixed",
- fixed = {
- { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 },
- { -3/32, -17/32, -16/32-0.001, 3/32, -13/32, -6/32 },
- { -3/32, -13/32, -9/32, 3/32, -6/32, -6/32 },
- { -3/32, -9/32, -9/32, 3/32, -6/32, 9/32 },
- { -3/32, -13/32, 6/32, 3/32, -6/32, 9/32 },
- { -3/32, -17/32, 6/32, 3/32, -13/32, 16/32+0.001 },
- },
- },
- groups = {dig_immediate=3, mesecon=3, mesecon_conductor_craftable=1, not_in_creative_inventory=1},
- mesecons = {
- receptor = {
- state = mesecon.state.on,
- rules = crossing_get_rules,
- }
- },
-})
-
-minetest.register_craft({
- type = "shapeless",
- output = "mesecons_extrawires:crossing",
- recipe = {
- "mesecons_insulated:insulated_off",
- "mesecons_insulated:insulated_off",
- },
-})
-
-minetest.register_craft({
- type = "shapeless",
- output = "mesecons_insulated:insulated_off 2",
- recipe = {
- "mesecons_extrawires:crossing",
- },
-})
diff --git a/mesecons_extrawires/crossover.lua b/mesecons_extrawires/crossover.lua
new file mode 100644
index 0000000..b150e03
--- /dev/null
+++ b/mesecons_extrawires/crossover.lua
@@ -0,0 +1,151 @@
+function crossover_get_rules(node)
+ return {
+ {--first wire
+ {x=-1,y=0,z=0},
+ {x=1,y=0,z=0},
+ },
+ {--second wire
+ {x=0,y=0,z=-1},
+ {x=0,y=0,z=1},
+ },
+ }
+end
+
+local crossover_states = {
+ "mesecons_extrawires:crossover_off",
+ "mesecons_extrawires:crossover_01",
+ "mesecons_extrawires:crossover_10",
+ "mesecons_extrawires:crossover_on",
+}
+
+minetest.register_node("mesecons_extrawires:crossover_off", {
+ description = "Insulated Crossover",
+ drawtype = "nodebox",
+ tiles = {"jeija_insulated_wire_sides_off.png"},
+ paramtype = "light",
+ walkable = false,
+ stack_max = 99,
+ selection_box = {type="fixed", fixed={-16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001}},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 },
+ { -3/32, -17/32, -16/32-0.001, 3/32, -13/32, -6/32 },
+ { -3/32, -13/32, -9/32, 3/32, -6/32, -6/32 },
+ { -3/32, -9/32, -9/32, 3/32, -6/32, 9/32 },
+ { -3/32, -13/32, 6/32, 3/32, -6/32, 9/32 },
+ { -3/32, -17/32, 6/32, 3/32, -13/32, 16/32+0.001 },
+ },
+ },
+ groups = {dig_immediate=3, mesecon=3, mesecon_conductor_craftable=1},
+ mesecons = {
+ conductor = {
+ states = crossover_states,
+ rules = crossover_get_rules(),
+ }
+ },
+})
+
+minetest.register_node("mesecons_extrawires:crossover_01", {
+ description = "You hacker you!",
+ drop = "mesecons_extrawires:crossover_off",
+ drawtype = "nodebox",
+ tiles = {"default_dirt.png"},
+ paramtype = "light",
+ walkable = false,
+ stack_max = 99,
+ selection_box = {type="fixed", fixed={-16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001}},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 },
+ { -3/32, -17/32, -16/32-0.001, 3/32, -13/32, -6/32 },
+ { -3/32, -13/32, -9/32, 3/32, -6/32, -6/32 },
+ { -3/32, -9/32, -9/32, 3/32, -6/32, 9/32 },
+ { -3/32, -13/32, 6/32, 3/32, -6/32, 9/32 },
+ { -3/32, -17/32, 6/32, 3/32, -13/32, 16/32+0.001 },
+ },
+ },
+ groups = {dig_immediate=3, mesecon=3, mesecon_conductor_craftable=1, not_in_creative_inventory=1},
+ mesecons = {
+ conductor = {
+ states = crossover_states,
+ rules = crossover_get_rules(),
+ }
+ },
+})
+
+minetest.register_node("mesecons_extrawires:crossover_10", {
+ description = "You hacker you!",
+ drop = "mesecons_extrawires:crossover_off",
+ drawtype = "nodebox",
+ tiles = {"default_stone.png"},
+ paramtype = "light",
+ walkable = false,
+ stack_max = 99,
+ selection_box = {type="fixed", fixed={-16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001}},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 },
+ { -3/32, -17/32, -16/32-0.001, 3/32, -13/32, -6/32 },
+ { -3/32, -13/32, -9/32, 3/32, -6/32, -6/32 },
+ { -3/32, -9/32, -9/32, 3/32, -6/32, 9/32 },
+ { -3/32, -13/32, 6/32, 3/32, -6/32, 9/32 },
+ { -3/32, -17/32, 6/32, 3/32, -13/32, 16/32+0.001 },
+ },
+ },
+ groups = {dig_immediate=3, mesecon=3, mesecon_conductor_craftable=1, not_in_creative_inventory=1},
+ mesecons = {
+ conductor = {
+ states = crossover_states,
+ rules = crossover_get_rules(),
+ }
+ },
+})
+
+minetest.register_node("mesecons_extrawires:crossover_on", {
+ description = "You hacker you!",
+ drop = "mesecons_extrawires:crossover_off",
+ drawtype = "nodebox",
+ tiles = {"jeija_insulated_wire_sides_on.png"},
+ paramtype = "light",
+ walkable = false,
+ stack_max = 99,
+ selection_box = {type="fixed", fixed={-16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001}},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 },
+ { -3/32, -17/32, -16/32-0.001, 3/32, -13/32, -6/32 },
+ { -3/32, -13/32, -9/32, 3/32, -6/32, -6/32 },
+ { -3/32, -9/32, -9/32, 3/32, -6/32, 9/32 },
+ { -3/32, -13/32, 6/32, 3/32, -6/32, 9/32 },
+ { -3/32, -17/32, 6/32, 3/32, -13/32, 16/32+0.001 },
+ },
+ },
+ groups = {dig_immediate=3, mesecon=3, mesecon_conductor_craftable=1, not_in_creative_inventory=1},
+ mesecons = {
+ conductor = {
+ states = crossover_states,
+ rules = crossover_get_rules(),
+ }
+ },
+})
+
+minetest.register_craft({
+ type = "shapeless",
+ output = "mesecons_extrawires:crossover_off",
+ recipe = {
+ "mesecons_insulated:insulated_off",
+ "mesecons_insulated:insulated_off",
+ },
+})
+
+minetest.register_craft({
+ type = "shapeless",
+ output = "mesecons_insulated:insulated_off 2",
+ recipe = {
+ "mesecons_extrawires:crossover_off",
+ },
+})
diff --git a/mesecons_extrawires/init.lua b/mesecons_extrawires/init.lua
index c076e3d..b22f2e5 100644
--- a/mesecons_extrawires/init.lua
+++ b/mesecons_extrawires/init.lua
@@ -1,5 +1,4 @@
--- dofile(minetest.get_modpath("mesecons_extrawires").."/crossing.lua");
--- The crossing code is not active right now because it is hard to maintain
+dofile(minetest.get_modpath("mesecons_extrawires").."/crossover.lua");
dofile(minetest.get_modpath("mesecons_extrawires").."/tjunction.lua");
dofile(minetest.get_modpath("mesecons_extrawires").."/corner.lua");
dofile(minetest.get_modpath("mesecons_extrawires").."/vertical.lua");
diff --git a/mesecons_luacontroller/init.lua b/mesecons_luacontroller/init.lua
index 02bde9f..3016014 100644
--- a/mesecons_luacontroller/init.lua
+++ b/mesecons_luacontroller/init.lua
@@ -33,13 +33,13 @@ rules.d = {x = 0, y = 0, z = -1, name="D"}
local get_real_portstates = function(pos) -- determine if ports are powered (by itself or from outside)
ports = {
- a = mesecon:is_power_on(mesecon:addPosRule(pos, rules.a))
+ a = mesecon:is_power_on(mesecon:addPosRule(pos, rules.a), mesecon:invertRule(rules.a))
and mesecon:rules_link(mesecon:addPosRule(pos, rules.a), pos),
- b = mesecon:is_power_on(mesecon:addPosRule(pos, rules.b))
+ b = mesecon:is_power_on(mesecon:addPosRule(pos, rules.b), mesecon:invertRule(rules.b))
and mesecon:rules_link(mesecon:addPosRule(pos, rules.b), pos),
- c = mesecon:is_power_on(mesecon:addPosRule(pos, rules.c))
+ c = mesecon:is_power_on(mesecon:addPosRule(pos, rules.c), mesecon:invertRule(rules.c))
and mesecon:rules_link(mesecon:addPosRule(pos, rules.c), pos),
- d = mesecon:is_power_on(mesecon:addPosRule(pos, rules.d))
+ d = mesecon:is_power_on(mesecon:addPosRule(pos, rules.d), mesecon:invertRule(rules.d))
and mesecon:rules_link(mesecon:addPosRule(pos, rules.d), pos),
}
return ports
diff --git a/mesecons_microcontroller/init.lua b/mesecons_microcontroller/init.lua
index 0f6a7cd..99ccb8a 100644
--- a/mesecons_microcontroller/init.lua
+++ b/mesecons_microcontroller/init.lua
@@ -635,10 +635,18 @@ function yc_get_real_portstates(pos) -- port powered or not (by itself or from o
rulesC = mesecon:get_rules("mesecons_microcontroller:microcontroller0100")
rulesD = mesecon:get_rules("mesecons_microcontroller:microcontroller1000")
L = {
- a = mesecon:is_power_on({x=pos.x+rulesA[1].x, y=pos.y+rulesA[1].y, z=pos.z+rulesA[1].z}) and mesecon:rules_link({x=pos.x+rulesA[1].x, y=pos.y+rulesA[1].y, z=pos.z+rulesA[1].z}, pos),
- b = mesecon:is_power_on({x=pos.x+rulesB[1].x, y=pos.y+rulesB[1].y, z=pos.z+rulesB[1].z}) and mesecon:rules_link({x=pos.x+rulesB[1].x, y=pos.y+rulesB[1].y, z=pos.z+rulesB[1].z}, pos),
- c = mesecon:is_power_on({x=pos.x+rulesC[1].x, y=pos.y+rulesC[1].y, z=pos.z+rulesC[1].z}) and mesecon:rules_link({x=pos.x+rulesC[1].x, y=pos.y+rulesC[1].y, z=pos.z+rulesC[1].z}, pos),
- d = mesecon:is_power_on({x=pos.x+rulesD[1].x, y=pos.y+rulesD[1].y, z=pos.z+rulesD[1].z}) and mesecon:rules_link({x=pos.x+rulesD[1].x, y=pos.y+rulesD[1].y, z=pos.z+rulesD[1].z}, pos)
+ a = mesecon:is_power_on(mesecon:addPosRule(pos, rulesA[1]),
+ mesecon:invertRule(rulesA[1])) and
+ mesecon:rules_link(mesecon:addPosRule(pos, rulesA[1]), pos),
+ b = mesecon:is_power_on(mesecon:addPosRule(pos, rulesB[1]),
+ mesecon:invertRule(rulesB[1])) and
+ mesecon:rules_link(mesecon:addPosRule(pos, rulesB[1]), pos),
+ c = mesecon:is_power_on(mesecon:addPosRule(pos, rulesC[1]),
+ mesecon:invertRule(rulesC[1])) and
+ mesecon:rules_link(mesecon:addPosRule(pos, rulesC[1]), pos),
+ d = mesecon:is_power_on(mesecon:addPosRule(pos, rulesD[1]),
+ mesecon:invertRule(rulesD[1])) and
+ mesecon:rules_link(mesecon:addPosRule(pos, rulesD[1]), pos),
}
return L
end