summaryrefslogtreecommitdiff
path: root/mesecons
diff options
context:
space:
mode:
authorJeija <norrepli@gmail.com>2012-12-11 19:49:55 +0100
committerJeija <norrepli@gmail.com>2012-12-11 19:49:55 +0100
commitde46729b971b5e59394834b8a01d4a7005318114 (patch)
tree5a2cf1f18b485ddefa8e255ac6d6a600ef2e2e12 /mesecons
parent31f3c99288355193dc68a6e83dfc63140fd02fa0 (diff)
parent5540fcbcb31eb32003fa0391113ed3b1dea25e47 (diff)
downloadmesecons-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.lua139
-rw-r--r--mesecons/internal.lua241
-rw-r--r--mesecons/legacy.lua47
-rw-r--r--mesecons/presets.lua39
-rw-r--r--mesecons/settings.lua1
-rw-r--r--mesecons/util.lua15
-rw-r--r--mesecons/wires.lua87
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