diff options
Diffstat (limited to 'mesecons_gates')
-rw-r--r-- | mesecons_gates/depends.txt | 2 | ||||
-rw-r--r-- | mesecons_gates/init.lua | 124 |
2 files changed, 126 insertions, 0 deletions
diff --git a/mesecons_gates/depends.txt b/mesecons_gates/depends.txt new file mode 100644 index 0000000..52fb260 --- /dev/null +++ b/mesecons_gates/depends.txt @@ -0,0 +1,2 @@ +mesecons +mesecons_microcontroller diff --git a/mesecons_gates/init.lua b/mesecons_gates/init.lua new file mode 100644 index 0000000..1c84005 --- /dev/null +++ b/mesecons_gates/init.lua @@ -0,0 +1,124 @@ +gates = {"diode", "not", "nand", "and", "xor"} +for g in ipairs(gates) do gate = gates[g] + + inrules = {} + outrules = {} + rules = {} + table.insert(outrules, {x=1, y=0, z=0}) + table.insert(rules, {x=1, y=0, z=0}) + if g < 3 then + table.insert(inrules, {x=-1, y=0, z=0}) + table.insert(rules, {x=-1, y=0, z=0}) + else + table.insert(inrules, {x=0, y=0, z=1}) + table.insert(rules, {x=0, y=0, z=1}) + table.insert(inrules, {x=0, y=0, z=-1}) + table.insert(rules, {x=0, y=0, z=-1}) + end + --table.insert(rules, inrules) + --table.insert(rules, outrules) + + for on=0,1 do + if on == 1 then + onoff = "on" + else + onoff = "off" + end + if on == 1 then + groups = {dig_immediate=2, not_in_creative_inventory=1, mesecon = 3} + else + groups = {dig_immediate=2, mesecon = 3} + end + + nodename = "mesecons_gates:"..gate.."_"..onoff + + minetest.register_node(nodename, { + description = gate.." Gate", + drawtype = "normal", + tiles = { + "jeija_gate_"..onoff..".png^".. + "jeija_gate_"..gate..".png", + }, + walkable = true, + on_construct = function(pos) + update_gate(pos) + end, + groups = groups, + + }) + + mesecon:add_rules(gate,outrules) + mesecon:register_effector(nodename, nodename, rules) + --if on then + -- mesecon:add_receptor_node(nodename, outrules) + --end + --mesecon:add_receptor_node("mesecons_gates:and_off", + --mesecon:add_receptor_node("mesecons_gates:and_on", + end +end + +function get_gate(pos) + string = minetest.env:get_node(pos).name + string = string.gsub(string, "mesecons_gates:", "") + --gate + string = string.gsub(string, "_on", "") + string = string.gsub(string, "_off", "") + return string +end + +function gate_state(pos) + name = minetest.env:get_node(pos).name + if string.find(name, "off")~=nil then + return false + else + return true + end +end +--[[ +function gate_on(pos) + if !gate_state(pos) then + minetest.env:add_node("mesecons_gates:"..get_gate(pos).."_on") + end +end + +function gate_off(pos) + if gate_state(pos) then + minetest.env:add_node("mesecons_gates:"..get_gate(pos).."_off") + end +end +--]] +function set_gate(pos, open) + if open then + if not gate_state(pos) then + minetest.env:add_node(pos, {name="mesecons_gates:"..get_gate(pos).."_on"}) + end + else + if gate_state(pos) then + minetest.env:add_node(pos, {name="mesecons_gates:"..get_gate(pos).."_off"}) + end + end +end + +function update_gate(pos) + gate = get_gate(pos) + L = yc_get_real_portstates(pos) + if gate == "diode" then + set_gate(pos, L.a) + elseif gate == "not" then + set_gate(pos, not L.a) + elseif gate == "nand" then + set_gate(pos, not(L.b and L.d)) + elseif gate == "and" then + set_gate(pos, L.b and L.d) + else--if gate == "xor" then + set_gate(pos, (L.b and not L.d) or (not L.b and L.d)) + end +end + +mesecon:register_on_signal_change(function(pos,node) + if string.find(node.name, "mesecons_gates:")~=nil then + update_gate(pos) + end +end) + + |