diff options
author | Jeija <norrepli@gmail.com> | 2012-12-11 19:49:55 +0100 |
---|---|---|
committer | Jeija <norrepli@gmail.com> | 2012-12-11 19:49:55 +0100 |
commit | de46729b971b5e59394834b8a01d4a7005318114 (patch) | |
tree | 5a2cf1f18b485ddefa8e255ac6d6a600ef2e2e12 /mesecons | |
parent | 31f3c99288355193dc68a6e83dfc63140fd02fa0 (diff) | |
parent | 5540fcbcb31eb32003fa0391113ed3b1dea25e47 (diff) | |
download | mesecons-de46729b971b5e59394834b8a01d4a7005318114.tar mesecons-de46729b971b5e59394834b8a01d4a7005318114.tar.gz mesecons-de46729b971b5e59394834b8a01d4a7005318114.tar.bz2 mesecons-de46729b971b5e59394834b8a01d4a7005318114.tar.xz mesecons-de46729b971b5e59394834b8a01d4a7005318114.zip |
Merge branch 'mesecons_in_nodedef'
Conflicts:
mesecons/internal.lua
Diffstat (limited to 'mesecons')
-rw-r--r-- | mesecons/init.lua | 139 | ||||
-rw-r--r-- | mesecons/internal.lua | 241 | ||||
-rw-r--r-- | mesecons/legacy.lua | 47 | ||||
-rw-r--r-- | mesecons/presets.lua | 39 | ||||
-rw-r--r-- | mesecons/settings.lua | 1 | ||||
-rw-r--r-- | mesecons/util.lua | 15 | ||||
-rw-r--r-- | mesecons/wires.lua | 87 |
7 files changed, 350 insertions, 219 deletions
diff --git a/mesecons/init.lua b/mesecons/init.lua index 40aa7d9..aa3f001 100644 --- a/mesecons/init.lua +++ b/mesecons/init.lua @@ -3,63 +3,82 @@ -- | \/ | |___ ____ |___ | | | | \ | |____ -- | | | | | | | | | \ | | -- | | |___ ____| |___ |____ |____| | \| ____| --- by Jeija and Minerd247 +-- by Jeija, Uberi (Temperest), sfan5, VanessaE -- -- -- -- This mod adds mesecons[=minecraft redstone] and different receptors/effectors to minetest. --- -- See the documentation on the forum for additional information, especially about crafting -- --- For developer documentation see the Developers' section on mesecons.tk +-- +-- For developer documentation see the Developers' section on mesecons.TK +-- +-- +-- +--Quick draft for the mesecons array in the node's definition +--mesecons = +--{ +-- receptor = +-- { +-- state = mesecon.state.on/off +-- rules = rules/get_rules +-- } +-- effector = +-- { +-- action_on = function +-- action_off = function +-- action_change = function +-- rules = rules/get_rules +-- } +-- conductor = +-- { +-- state = mesecon.state.on/off +-- offstate = opposite state (for state = on only) +-- onstate = opposite state (for state = off only) +-- rules = rules/get_rules +-- } +--} -- PUBLIC VARIABLES mesecon={} -- contains all functions and all global variables -mesecon.actions_on={} -- Saves registered function callbacks for mesecon on -mesecon.actions_off={} -- Saves registered function callbacks for mesecon off -mesecon.actions_change={} -- Saves registered function callbacks for mesecon change -mesecon.receptors={} -mesecon.effectors={} -mesecon.rules={} -mesecon.conductors={} - --- INCLUDE SETTINGS +mesecon.actions_on={} -- Saves registered function callbacks for mesecon on | DEPRECATED +mesecon.actions_off={} -- Saves registered function callbacks for mesecon off | DEPRECATED +mesecon.actions_change={} -- Saves registered function callbacks for mesecon change | DEPRECATED +mesecon.receptors={} -- saves all information about receptors | DEPRECATED +mesecon.effectors={} -- saves all information about effectors | DEPRECATED +mesecon.conductors={} -- saves all information about conductors | DEPRECATED + +-- Settings dofile(minetest.get_modpath("mesecons").."/settings.lua") ---Internal API -dofile(minetest.get_modpath("mesecons").."/internal.lua"); +-- Presets (eg default rules) +dofile(minetest.get_modpath("mesecons").."/presets.lua"); --- API API API API API API API API API API API API API API API API API API -function mesecon:register_receptor(onstate, offstate, rules, get_rules) - if get_rules == nil and rules == nil then - rules = mesecon:get_rules("default") - end - table.insert(mesecon.receptors, - {onstate = onstate, - offstate = offstate, - rules = rules, - get_rules = get_rules}) -end +-- Utilities like comparing positions, +-- adding positions and rules, +-- mostly things that make the source look cleaner +dofile(minetest.get_modpath("mesecons").."/util.lua"); -function mesecon:register_effector(onstate, offstate, input_rules, get_input_rules) - if get_input_rules==nil and input_rules==nil then - rules=mesecon:get_rules("default") - end - table.insert(mesecon.effectors, - {onstate = onstate, - offstate = offstate, - input_rules = input_rules, - get_input_rules = get_input_rules}) -end +-- Internal stuff +-- This is the most important file +-- it handles signal transmission and basically everything else +-- It is also responsible for managing the nodedef things, +-- like calling action_on/off/change +dofile(minetest.get_modpath("mesecons").."/internal.lua"); + +-- Deprecated stuff +-- To be removed in future releases +dofile(minetest.get_modpath("mesecons").."/legacy.lua"); + +-- API +-- these are the only functions you need to remember function mesecon:receptor_on(pos, rules) - if rules == nil then - rules = mesecon:get_rules("default") - end + rules = rules or mesecon.rules.default - for i, rule in ipairs(rules) do + for _, rule in ipairs(rules) do local np = { x = pos.x + rule.x, y = pos.y + rule.y, @@ -71,11 +90,9 @@ function mesecon:receptor_on(pos, rules) end function mesecon:receptor_off(pos, rules) - if rules == nil then - rules = mesecon:get_rules("default") - end + rules = rules or mesecon.rules.default - for i, rule in ipairs(rules) do + for _, rule in ipairs(rules) do local np = { x = pos.x + rule.x, y = pos.y + rule.y, @@ -86,45 +103,11 @@ function mesecon:receptor_off(pos, rules) end end -function mesecon:register_on_signal_on(action) - table.insert(mesecon.actions_on, action) -end - -function mesecon:register_on_signal_off(action) - table.insert(mesecon.actions_off, action) -end - -function mesecon:register_on_signal_change(action) - table.insert(mesecon.actions_change, action) -end - -function mesecon:register_conductor (onstate, offstate, rules, get_rules) - if rules == nil then - rules = mesecon:get_rules("default") - end - table.insert(mesecon.conductors, {onstate = onstate, offstate = offstate, rules = rules, get_rules = get_rules}) -end -mesecon:add_rules("default", -{{x=0, y=0, z=-1}, -{x=1, y=0, z=0}, -{x=-1, y=0, z=0}, -{x=0, y=0, z=1}, -{x=1, y=1, z=0}, -{x=1, y=-1, z=0}, -{x=-1, y=1, z=0}, -{x=-1, y=-1, z=0}, -{x=0, y=1, z=1}, -{x=0, y=-1, z=1}, -{x=0, y=1, z=-1}, -{x=0, y=-1, z=-1}}) - -print("[MESEcons] Main mod Loaded!") +print("[OK] mesecons") --The actual wires dofile(minetest.get_modpath("mesecons").."/wires.lua"); --Services like turnoff receptor on dignode and so on dofile(minetest.get_modpath("mesecons").."/services.lua"); ---Deprecated stuff -dofile(minetest.get_modpath("mesecons").."/legacy.lua"); diff --git a/mesecons/internal.lua b/mesecons/internal.lua index e197879..575bee3 100644 --- a/mesecons/internal.lua +++ b/mesecons/internal.lua @@ -1,7 +1,14 @@ -- INTERNAL ---Receptors +-- Receptors +-- Nodes that can power mesecons function mesecon:is_receptor_node(nodename) + if minetest.registered_nodes[nodename] + and minetest.registered_nodes[nodename].mesecons + and minetest.registered_nodes[nodename].mesecons.receptor + and minetest.registered_nodes[nodename].mesecons.receptor.state == mesecon.state.on then + return true + end for _, receptor in ipairs(mesecon.receptors) do if receptor.onstate == nodename then return true @@ -11,6 +18,12 @@ function mesecon:is_receptor_node(nodename) end function mesecon:is_receptor_node_off(nodename, pos, ownpos) + if minetest.registered_nodes[nodename] + and minetest.registered_nodes[nodename].mesecons + and minetest.registered_nodes[nodename].mesecons.receptor + and minetest.registered_nodes[nodename].mesecons.receptor.state == mesecon.state.off then + return true + end for _, receptor in ipairs(mesecon.receptors) do if receptor.offstate == nodename then return true @@ -20,7 +33,16 @@ function mesecon:is_receptor_node_off(nodename, pos, ownpos) end function mesecon:receptor_get_rules(node) - for i, receptor in ipairs(mesecon.receptors) do + if minetest.registered_nodes[node.name].mesecons + and minetest.registered_nodes[node.name].mesecons.receptor then + local rules = minetest.registered_nodes[node.name].mesecons.receptor.rules + if type(rules) == 'function' then + return rules(node) + elseif rules then + return rules + end + end + for _, receptor in ipairs(mesecon.receptors) do --TODO if receptor.onstate == node.name or receptor.offstate == node.name then if receptor.get_rules ~= nil then return receptor.get_rules(node.param2) @@ -31,12 +53,19 @@ function mesecon:receptor_get_rules(node) end end end - return nil + return mesecon.rules.default end -- Effectors +-- Nodes that can be powered by mesecons function mesecon:is_effector_on(nodename) - for i, effector in ipairs(mesecon.effectors) do + if minetest.registered_nodes[nodename] + and minetest.registered_nodes[nodename].mesecons + and minetest.registered_nodes[nodename].mesecons.effector + and minetest.registered_nodes[nodename].mesecons.effector.action_off then + return true + end + for _, effector in ipairs(mesecon.effectors) do --TODO if effector.onstate == nodename then return true end @@ -45,7 +74,13 @@ function mesecon:is_effector_on(nodename) end function mesecon:is_effector_off(nodename) - for i, effector in ipairs(mesecon.effectors) do + if minetest.registered_nodes[nodename] + and minetest.registered_nodes[nodename].mesecons + and minetest.registered_nodes[nodename].mesecons.effector + and minetest.registered_nodes[nodename].mesecons.effector.action_on then + return true + end + for _, effector in ipairs(mesecon.effectors) do --TODO if effector.offstate == nodename then return true end @@ -54,43 +89,73 @@ function mesecon:is_effector_off(nodename) end function mesecon:is_effector(nodename) - return mesecon:is_effector_on(nodename) or mesecon:is_effector_off(nodename) + if minetest.registered_nodes[nodename] + and minetest.registered_nodes[nodename].mesecons + and minetest.registered_nodes[nodename].mesecons.effector then + return true + end + return mesecon:is_effector_on(nodename) or mesecon:is_effector_off(nodename) --TODO end function mesecon:effector_get_input_rules(node) - for i, effector in ipairs(mesecon.effectors) do + if minetest.registered_nodes[node.name].mesecons + and minetest.registered_nodes[node.name].mesecons.effector then + local rules = minetest.registered_nodes[node.name].mesecons.effector.rules + if type(rules) == 'function' then + return rules(node) + elseif rules then + return rules + end + end + for _, effector in ipairs(mesecon.effectors) do if effector.onstate == node.name or effector.offstate == node.name then if effector.get_input_rules ~= nil then return effector.get_input_rules(node.param2) - elseif mesecon.effectors[i].input_rules ~=nil then + elseif effector.input_rules ~=nil then return effector.input_rules else return mesecon:get_rules("default") end end end + return mesecon.rules.default end --Signals -function mesecon:activate(pos) - local node = minetest.env:get_node(pos) - for i, action in ipairs(mesecon.actions_on) do +function mesecon:activate(pos, node) + if minetest.registered_nodes[node.name] + and minetest.registered_nodes[node.name].mesecons + and minetest.registered_nodes[node.name].mesecons.effector + and minetest.registered_nodes[node.name].mesecons.effector.action_on then + minetest.registered_nodes[node.name].mesecons.effector.action_on (pos, node) + end + for _, action in ipairs(mesecon.actions_on) do --TODO action(pos, node) end end -function mesecon:deactivate(pos) - local node = minetest.env:get_node(pos) - for i, action in ipairs(mesecon.actions_off) do +function mesecon:deactivate(pos, node) --TODO + if minetest.registered_nodes[node.name] + and minetest.registered_nodes[node.name].mesecons + and minetest.registered_nodes[node.name].mesecons.effector + and minetest.registered_nodes[node.name].mesecons.effector.action_off then + minetest.registered_nodes[node.name].mesecons.effector.action_off(pos, node) + end + for _, action in ipairs(mesecon.actions_off) do action(pos, node) end end -function mesecon:changesignal(pos) - local node = minetest.env:get_node(pos) - for i, action in ipairs(mesecon.actions_change) do +function mesecon:changesignal(pos, node) --TODO + if minetest.registered_nodes[node.name] + and minetest.registered_nodes[node.name].mesecons + and minetest.registered_nodes[node.name].mesecons.effector + and minetest.registered_nodes[node.name].mesecons.effector.action_change then + minetest.registered_nodes[node.name].mesecons.effector.action_change(pos, node) + end + for _, action in ipairs(mesecon.actions_change) do action(pos, node) end end @@ -98,21 +163,22 @@ end --Rules function mesecon:add_rules(name, rules) - table.insert(mesecon.rules, {name = name, rules = rules}) + mesecon.rules[name] = rules end function mesecon:get_rules(name) - for i, rule in ipairs(mesecon.rules) do - if rule.name==name then - return rule.rules - end - end + return mesecon.rules[name] end ---Conductor system stuff +-- Conductors function mesecon:get_conductor_on(offstate) - for i, conductor in ipairs(mesecon.conductors) do + if minetest.registered_nodes[offstate] + and minetest.registered_nodes[offstate].mesecons + and minetest.registered_nodes[offstate].mesecons.conductor then + return minetest.registered_nodes[offstate].mesecons.conductor.onstate + end + for _, conductor in ipairs(mesecon.conductors) do --TODO if conductor.offstate == offstate then return conductor.onstate end @@ -121,7 +187,12 @@ function mesecon:get_conductor_on(offstate) end function mesecon:get_conductor_off(onstate) - for i, conductor in ipairs(mesecon.conductors) do + if minetest.registered_nodes[onstate] + and minetest.registered_nodes[onstate].mesecons + and minetest.registered_nodes[onstate].mesecons.conductor then + return minetest.registered_nodes[onstate].mesecons.conductor.offstate + end + for _, conductor in ipairs(mesecon.conductors) do --TODO if conductor.onstate == onstate then return conductor.offstate end @@ -129,30 +200,53 @@ function mesecon:get_conductor_off(onstate) return false end -function mesecon:is_conductor_on(name) - for i, conductor in ipairs(mesecon.conductors) do - if conductor.onstate == name then +function mesecon:is_conductor_on(nodename) + if minetest.registered_nodes[nodename] + and minetest.registered_nodes[nodename].mesecons + and minetest.registered_nodes[nodename].mesecons.conductor + and minetest.registered_nodes[nodename].mesecons.conductor.state == mesecon.state.on then + return true + end + for _, conductor in ipairs(mesecon.conductors) do --TODO + if conductor.onstate == nodename then return true end end return false end -function mesecon:is_conductor_off(name) - for i, conductor in ipairs(mesecon.conductors) do - if conductor.offstate == name then +function mesecon:is_conductor_off(nodename) + if minetest.registered_nodes[nodename] + and minetest.registered_nodes[nodename].mesecons + and minetest.registered_nodes[nodename].mesecons.conductor + and minetest.registered_nodes[nodename].mesecons.conductor.state == mesecon.state.off then + return true + end + for _, conductor in ipairs(mesecon.conductors) do --TODO + if conductor.offstate == nodename then return true end end return false end -function mesecon:is_conductor(name) - return mesecon:is_conductor_on(name) or mesecon:is_conductor_off(name) +function mesecon:is_conductor(nodename) + --TODO + return mesecon:is_conductor_on(nodename) or mesecon:is_conductor_off(nodename) end function mesecon:conductor_get_rules(node) - for i, conductor in ipairs(mesecon.conductors) do + if minetest.registered_nodes[node.name] + and minetest.registered_nodes[node.name].mesecons + and minetest.registered_nodes[node.name].mesecons.conductor then + local rules = minetest.registered_nodes[node.name].mesecons.conductor.rules + if type(rules) == 'function' then + return rules(node) + elseif rules then + return rules + end + end + for _, conductor in ipairs(mesecon.conductors) do --TODO if conductor.onstate == node.name or conductor.offstate == node.name then if conductor.get_rules ~= nil then @@ -162,6 +256,7 @@ function mesecon:conductor_get_rules(node) end end end + return mesecon.rules.default end -- @@ -186,13 +281,10 @@ function mesecon:turnon(pos) if mesecon:is_conductor_off(node.name) then local rules = mesecon:conductor_get_rules(node) - minetest.env:add_node(pos, {name=mesecon:get_conductor_on(node.name), param2 = node.param2}) + mesecon:swap_node(pos, mesecon:get_conductor_on(node.name)) - 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 + for _, rule in ipairs(rules) do + local np = mesecon:addPosRule(pos, rule) if mesecon:rules_link(pos, np) then mesecon:turnon(np) @@ -201,25 +293,22 @@ function mesecon:turnon(pos) end if mesecon:is_effector(node.name) then - mesecon:changesignal(pos) - if mesecon:is_effector_off(node.name) then mesecon:activate(pos) end + mesecon:changesignal(pos, node) + if mesecon:is_effector_off(node.name) then + mesecon:activate(pos, node) + end end end function mesecon:turnoff(pos) --receptor rules used because output could have been dug local node = minetest.env:get_node(pos) - local rules if mesecon:is_conductor_on(node.name) then - rules = mesecon:conductor_get_rules(node) - - minetest.env:add_node(pos, {name=mesecon:get_conductor_off(node.name), param2 = node.param2}) + local rules = mesecon:conductor_get_rules(node) + mesecon:swap_node(pos, mesecon:get_conductor_off(node.name)) - for i, rule in ipairs(rules) do - local np = { - x = pos.x + rule.x, - y = pos.y + rule.y, - z = pos.z + rule.z,} + for _, rule in ipairs(rules) do + local np = mesecon:addPosRule(pos, rule) if mesecon:rules_link(pos, np) then mesecon:turnoff(np) @@ -228,8 +317,11 @@ function mesecon:turnoff(pos) --receptor rules used because output could have be end if mesecon:is_effector(node.name) then - mesecon:changesignal(pos) - if mesecon:is_effector_on(node.name) and not mesecon:is_powered(pos) then mesecon:deactivate(pos) end + mesecon:changesignal(pos, node) + if mesecon:is_effector_on(node.name) + and not mesecon:is_powered(pos) then + mesecon:deactivate(pos, node) + end end end @@ -238,7 +330,7 @@ function mesecon:connected_to_pw_src(pos, checked) local c = 1 checked = checked or {} 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 mesecon:cmpPos(checked[c], pos) then return false, checked end c = c + 1 @@ -257,10 +349,7 @@ function mesecon:connected_to_pw_src(pos, checked) local rules = mesecon:conductor_get_rules(node) for _, 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 = mesecon:addPosRule(pos, rule) if mesecon:rules_link(pos, np) then connected, checked = mesecon:connected_to_pw_src(np, checked) if connected then @@ -272,9 +361,6 @@ function mesecon:connected_to_pw_src(pos, checked) end function mesecon:rules_link(output, input, dug_outputrules) --output/input are positions (outputrules optional, used if node has been dug) - local k = 1 - local l = 1 - local outputnode = minetest.env:get_node(output) local inputnode = minetest.env:get_node(input) @@ -300,15 +386,10 @@ function mesecon:rules_link(output, input, dug_outputrules) --output/input are p end - for k, outputrule in ipairs(outputrules) do - if outputrule.x + output.x == input.x - and outputrule.y + output.y == input.y - and outputrule.z + output.z == input.z then -- Check if output sends to input - l = 1 - for k, inputrule in ipairs(inputrules) do - if inputrule.x + input.x == output.x - and inputrule.y + input.y == output.y - and inputrule.z + input.z == output.z then --Check if input accepts from output + for _, outputrule in ipairs(outputrules) do + if mesecon:cmpPos(mesecon:addPosRule(output, outputrule), input) then -- Check if output sends to input + for _, inputrule in ipairs(inputrules) do + if mesecon:cmpPos(mesecon:addPosRule(input, inputrule), output) then --Check if input accepts from output return true end end @@ -339,11 +420,8 @@ function mesecon:is_powered_by_conductor(pos) return false end - for i, rule in ipairs(rules) do - local con_pos = { - x = pos.x + rule.x, - y = pos.y + rule.y, - z = pos.z + rule.z} + for _, rule in ipairs(rules) do + local con_pos = mesecon:addPosRule(pos, rule) con_node = minetest.env:get_node(con_pos) @@ -373,11 +451,8 @@ function mesecon:is_powered_by_receptor(pos) return false end - for i, rule in ipairs(rules) do - local rcpt_pos = { - x = pos.x + rule.x, - y = pos.y + rule.y, - z = pos.z + rule.z} + for _, rule in ipairs(rules) do + local rcpt_pos = mesecon:addPosRule(pos, rule) rcpt_node = minetest.env:get_node(rcpt_pos) @@ -401,10 +476,6 @@ function mesecon:updatenode(pos) end end -function compare_pos(pos1, pos2) - return pos1.x == pos2.x and pos1.y == pos2.y and pos1.z == pos2.z -end - --Rules rotation Functions: function mesecon:rotate_rules_right(rules) local nr={}; diff --git a/mesecons/legacy.lua b/mesecons/legacy.lua index 4fd73dd..947c100 100644 --- a/mesecons/legacy.lua +++ b/mesecons/legacy.lua @@ -1,3 +1,5 @@ +--very old: + function mesecon:add_receptor_node(name, rules, get_rules) if get_rules==nil and rules==nil then rules=mesecon:get_rules("default") @@ -11,3 +13,48 @@ function mesecon:add_receptor_node_off(name, rules, get_rules) end table.insert(mesecon.receptors, {offstate = name, rules = rules, get_rules = get_rules}) end + +--old: + +function mesecon:register_receptor(onstate, offstate, rules, get_rules) + if get_rules == nil and rules == nil then + rules=mesecon:get_rules("default") + end + table.insert(mesecon.receptors, + {onstate = onstate, + offstate = offstate, + rules = input_rules, + get_rules = get_rules}) +end + +function mesecon:register_effector(onstate, offstate, input_rules, get_input_rules) + if get_input_rules==nil and input_rules==nil then + rules=mesecon:get_rules("default") + end + table.insert(mesecon.effectors, + {onstate = onstate, + offstate = offstate, + input_rules = input_rules, + get_input_rules = get_input_rules}) +end + +function mesecon:register_on_signal_on(action) + table.insert(mesecon.actions_on, action) +end + +function mesecon:register_on_signal_off(action) + table.insert(mesecon.actions_off, action) +end + +function mesecon:register_on_signal_change(action) + table.insert(mesecon.actions_change, action) +end + +function mesecon:register_conductor (onstate, offstate, rules, get_rules) + if rules == nil then + rules = mesecon:get_rules("default") + end + table.insert(mesecon.conductors, {onstate = onstate, offstate = offstate, rules = rules, get_rules = get_rules}) +end + +mesecon:add_rules("default", mesecon.rules.default) diff --git a/mesecons/presets.lua b/mesecons/presets.lua new file mode 100644 index 0000000..9988d22 --- /dev/null +++ b/mesecons/presets.lua @@ -0,0 +1,39 @@ +mesecon.rules = {} +mesecon.state = {} + +mesecon.rules.default = +{{x=0, y=0, z=-1}, +{x=1, y=0, z=0}, +{x=-1, y=0, z=0}, +{x=0, y=0, z=1}, +{x=1, y=1, z=0}, +{x=1, y=-1, z=0}, +{x=-1, y=1, z=0}, +{x=-1, y=-1, z=0}, +{x=0, y=1, z=1}, +{x=0, y=-1, z=1}, +{x=0, y=1, z=-1}, +{x=0, y=-1, z=-1}} + +mesecon.rules.buttonlike = +{{x = 1, y = 0, z = 0}, +{x = 1, y = 1, z = 0}, +{x = 1, y =-1, z = 0}, +{x = 1, y =-1, z = 1}, +{x = 1, y =-1, z =-1}, +{x = 2, y = 0, z = 0}} + +mesecon.rules.buttonlike_get = function(node) + local rules = mesecon.rules.buttonlike + if node.param2 == 2 then + rules=mesecon:rotate_rules_left(rules) + elseif node.param2 == 3 then + rules=mesecon:rotate_rules_right(mesecon:rotate_rules_right(rules)) + elseif node.param2 == 0 then + rules=mesecon:rotate_rules_right(rules) + end + return rules +end + +mesecon.state.on = "on" +mesecon.state.off = "off" diff --git a/mesecons/settings.lua b/mesecons/settings.lua index db084c6..398ee6d 100644 --- a/mesecons/settings.lua +++ b/mesecons/settings.lua @@ -2,3 +2,4 @@ BLINKY_PLANT_INTERVAL = 3
NEW_STYLE_WIRES = true -- true = new nodebox wires, false = old raillike wires
PRESSURE_PLATE_INTERVAL = 0.1
+OBJECT_DETECTOR_RADIUS = 6
diff --git a/mesecons/util.lua b/mesecons/util.lua new file mode 100644 index 0000000..b95cf6e --- /dev/null +++ b/mesecons/util.lua @@ -0,0 +1,15 @@ +function mesecon:swap_node(pos, name) + local node = minetest.env:get_node(pos) + local data = minetest.env:get_meta(pos):to_table() + node.name = name + minetest.env:add_node(pos, node) + minetest.env:get_meta(pos):from_table(data) +end + +function mesecon:addPosRule(p, r) + return {x = p.x + r.x, y = p.y + r.y, z = p.z + r.z} +end + +function mesecon:cmpPos(p1, p2) + return (p1.x == p2.x and p1.y == p2.y and p1.z == p2.z) +end diff --git a/mesecons/wires.lua b/mesecons/wires.lua index bda872f..bea84dd 100644 --- a/mesecons/wires.lua +++ b/mesecons/wires.lua @@ -41,7 +41,6 @@ else -- NEW STYLE WIRES box_center = {-1/16, -.5, -1/16, 1/16, -.5+1/16, 1/16} box_bump1 = { -2/16, -8/16, -2/16, 2/16, -13/32, 2/16 } -box_bump2 = { -3/32, -13/32, -3/32, 3/32, -12/32, 3/32 } box_xp = {1/16, -.5, -1/16, 8/16, -.5+1/16, 1/16} box_zp = {-1/16, -.5, 1/16, 1/16, -.5+1/16, 8/16} @@ -69,10 +68,10 @@ for zmy=0, 1 do tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy) if nodeid == "00000000" then - groups = {dig_immediate = 3, mesecon = 2, mesecon_conductor_craftable=1} + groups = {dig_immediate = 3, mesecon_conductor_craftable=1} wiredesc = "Mesecon" else - groups = {dig_immediate = 3, mesecon = 2, not_in_creative_inventory = 1} + groups = {dig_immediate = 3, not_in_creative_inventory = 1} wiredesc = "Mesecons Wire (ID: "..nodeid..")" end @@ -90,7 +89,6 @@ for zmy=0, 1 do if adjx and adjz and (xp + zp + xm + zm > 2) then table.insert(nodebox, box_bump1) - table.insert(nodebox, box_bump2) tiles_off = { "wires_bump_off.png", "wires_bump_off.png", @@ -153,7 +151,11 @@ for zmy=0, 1 do groups = groups, walkable = false, stack_max = 99, - drop = "mesecons:wire_00000000_off" + drop = "mesecons:wire_00000000_off", + mesecons = {conductor={ + state = mesecon.state.off, + onstate = "mesecons:wire_"..nodeid.."_on" + }} }) minetest.register_node("mesecons:wire_"..nodeid.."_on", { @@ -174,9 +176,12 @@ for zmy=0, 1 do groups = {dig_immediate = 3, mesecon = 2, not_in_creative_inventory = 1}, walkable = false, stack_max = 99, - drop = "mesecons:wire_00000000_off" + drop = "mesecons:wire_00000000_off", + mesecons = {conductor={ + state = mesecon.state.on, + offstate = "mesecons:wire_"..nodeid.."_off" + }} }) - mesecon:register_conductor("mesecons:wire_"..nodeid.."_on", "mesecons:wire_"..nodeid.."_off") end end end @@ -186,17 +191,15 @@ end end end -minetest.register_on_placenode(function(pos, node) - if minetest.get_item_group(node.name, "mesecon") > 1 then +local update_on_place_dig = function (pos, node) + if minetest.registered_nodes[node.name] + and minetest.registered_nodes[node.name].mesecons then mesecon:update_autoconnect(pos) end -end) +end -minetest.register_on_dignode(function(pos, node) - if minetest.get_item_group(node.name, "mesecon") > 1 then - mesecon:update_autoconnect(pos) - end -end) +minetest.register_on_placenode(update_on_place_dig) +minetest.register_on_dignode(update_on_place_dig) function mesecon:update_autoconnect(pos, secondcall, replace_old) local xppos = {x=pos.x+1, y=pos.y, z=pos.z} @@ -234,48 +237,20 @@ function mesecon:update_autoconnect(pos, secondcall, replace_old) nodename = minetest.env:get_node(pos).name if string.find(nodename, "mesecons:wire_") == nil and not replace_old then return nil end + if mesecon:rules_link_bothdir(pos, xppos) then xp = 1 else xp = 0 end + if mesecon:rules_link_bothdir(pos, xmpos) then xm = 1 else xm = 0 end + if mesecon:rules_link_bothdir(pos, zppos) then zp = 1 else zp = 0 end + if mesecon:rules_link_bothdir(pos, zmpos) then zm = 1 else zm = 0 end + + if mesecon:rules_link_bothdir(pos, xpympos) then xp = 1 end + if mesecon:rules_link_bothdir(pos, xmympos) then xm = 1 end + if mesecon:rules_link_bothdir(pos, zpympos) then zp = 1 end + if mesecon:rules_link_bothdir(pos, zmympos) then zm = 1 end - --if the groups mesecon == 1 then wires won't connect to it - local zmg = minetest.get_item_group(minetest.env:get_node(zmpos ).name, "mesecon") - local zmymg = minetest.get_item_group(minetest.env:get_node(zmympos).name, "mesecon") - local xmg = minetest.get_item_group(minetest.env:get_node(xmpos ).name, "mesecon") - local xmymg = minetest.get_item_group(minetest.env:get_node(xmympos).name, "mesecon") - local zpg = minetest.get_item_group(minetest.env:get_node(zppos ).name, "mesecon") - local zpymg = minetest.get_item_group(minetest.env:get_node(zpympos).name, "mesecon") - local xpg = minetest.get_item_group(minetest.env:get_node(xppos ).name, "mesecon") - local xpymg = minetest.get_item_group(minetest.env:get_node(xpympos).name, "mesecon") - - - local xpyg = minetest.get_item_group(minetest.env:get_node(xpypos).name, "mesecon") - local zpyg = minetest.get_item_group(minetest.env:get_node(zpypos).name, "mesecon") - local xmyg = minetest.get_item_group(minetest.env:get_node(xmypos).name, "mesecon") - local zmyg = minetest.get_item_group(minetest.env:get_node(zmypos).name, "mesecon") - - if ((zmg == 2) or (zmymg == 2)) == true then zm = 1 else zm = 0 end - if ((xmg == 2) or (xmymg == 2)) == true then xm = 1 else xm = 0 end - if ((zpg == 2) or (zpymg == 2)) == true then zp = 1 else zp = 0 end - if ((xpg == 2) or (xpymg == 2)) == true then xp = 1 else xp = 0 end - - if xpyg == 2 then xpy = 1 else xpy = 0 end - if zpyg == 2 then zpy = 1 else zpy = 0 end - if xmyg == 2 then xmy = 1 else xmy = 0 end - if zmyg == 2 then zmy = 1 else zmy = 0 end - - -- If group == 3 then the mesecon only connects to input and output ports - if xpg == 3 and mesecon:rules_link_bothdir(pos, xppos) then xp = 1 end - if xmg == 3 and mesecon:rules_link_bothdir(pos, xmpos) then xm = 1 end - if zpg == 3 and mesecon:rules_link_bothdir(pos, zppos) then zp = 1 end - if zmg == 3 and mesecon:rules_link_bothdir(pos, zmpos) then zm = 1 end - - if xpymg == 3 and mesecon:rules_link_bothdir(pos, xpympos) then xp = 1 end - if xmymg == 3 and mesecon:rules_link_bothdir(pos, xmympos) then xm = 1 end - if zpymg == 3 and mesecon:rules_link_bothdir(pos, zpympos) then zp = 1 end - if zmymg == 3 and mesecon:rules_link_bothdir(pos, zmympos) then zm = 1 end - - if xpyg == 3 then if mesecon:rules_link(pos, xpypos) then xpy = 1 end end - if zpyg == 3 then if mesecon:rules_link(pos, zpypos) then zpy = 1 end end - if xmyg == 3 then if mesecon:rules_link(pos, xmypos) then xmy = 1 end end - if zmyg == 3 then if mesecon:rules_link(pos, zmypos) then zmy = 1 end end + if mesecon:rules_link(pos, xpypos) then xpy = 1 else xpy = 0 end + if mesecon:rules_link(pos, zpypos) then zpy = 1 else zpy = 0 end + if mesecon:rules_link(pos, xmypos) then xmy = 1 else xmy = 0 end + if mesecon:rules_link(pos, zmypos) then zmy = 1 else zmy = 0 end -- Backward compatibility if replace_old then |