summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesecons/init.lua97
-rw-r--r--mesecons/internal.lua94
-rw-r--r--mesecons/legacy.lua80
-rw-r--r--mesecons/presets.lua19
4 files changed, 189 insertions, 101 deletions
diff --git a/mesecons/init.lua b/mesecons/init.lua
index 40aa7d9..d980419 100644
--- a/mesecons/init.lua
+++ b/mesecons/init.lua
@@ -3,7 +3,7 @@
-- | \/ | |___ ____ |___ | | | | \ | |____
-- | | | | | | | | | \ | |
-- | | |___ ____| |___ |____ |____| | \| ____|
--- by Jeija and Minerd247
+-- by Jeija, Uberi (Temperest), sfan5, VanessaE,
--
--
--
@@ -21,110 +21,29 @@ 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
dofile(minetest.get_modpath("mesecons").."/settings.lua")
+--Presets (eg default rules)
+dofile(minetest.get_modpath("mesecons").."/presets.lua");
+
--Internal API
dofile(minetest.get_modpath("mesecons").."/internal.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
-
-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:receptor_on(pos, rules)
- if rules == nil then
- rules = mesecon:get_rules("default")
- end
-
- for i, rule in ipairs(rules) do
- 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
- end
-end
-
-function mesecon:receptor_off(pos, rules)
- if rules == nil then
- rules = mesecon:get_rules("default")
- end
-
- for i, rule in ipairs(rules) do
- 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
- end
-end
-
-function mesecon:register_on_signal_on(action)
- table.insert(mesecon.actions_on, action)
-end
+--Deprecated stuff
+dofile(minetest.get_modpath("mesecons").."/legacy.lua");
-function mesecon:register_on_signal_off(action)
- table.insert(mesecon.actions_off, action)
-end
+-- API API API API API API API API API API API API API API API API API API
-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 7a576d6..8c4ccaf 100644
--- a/mesecons/internal.lua
+++ b/mesecons/internal.lua
@@ -2,6 +2,11 @@
--Receptors
function mesecon:is_receptor_node(nodename)
+ if 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 +16,11 @@ function mesecon:is_receptor_node(nodename)
end
function mesecon:is_receptor_node_off(nodename, pos, ownpos)
+ if 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 +30,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)
+ else
+ return rules
+ end
+ end
+ for i, 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)
@@ -36,28 +55,51 @@ end
-- Effectors
function mesecon:is_effector_on(nodename)
- for i, effector in ipairs(mesecon.effectors) do
+ for i, effector in ipairs(mesecon.effectors) do --TODO
if effector.onstate == nodename then
return true
end
end
+ if minetest.registered_nodes[nodename].mesecons
+ and minetest.registered_nodes[nodename].mesecons.effector
+ and minetest.registered_nodes[nodename].mesecons.effector.state == mesecon.state.on then
+ return true
+ end
return false
end
function mesecon:is_effector_off(nodename)
- for i, effector in ipairs(mesecon.effectors) do
+ for i, effector in ipairs(mesecon.effectors) do --TODO
if effector.offstate == nodename then
return true
end
end
+ if minetest.registered_nodes[nodename].mesecons
+ and minetest.registered_nodes[nodename].mesecons.effector
+ and minetest.registered_nodes[nodename].mesecons.effector.state == mesecon.state.off then
+ return true
+ end
return false
end
function mesecon:is_effector(nodename)
- return mesecon:is_effector_on(nodename) or mesecon:is_effector_off(nodename)
+ if 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)
+ 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)
+ else
+ return rules
+ end
+ end
for i, effector in ipairs(mesecon.effectors) do
if effector.onstate == node.name
or effector.offstate == node.name then
@@ -74,21 +116,21 @@ end
--Signals
-function mesecon:activate(pos)
+function mesecon:activate(pos) --TODO
local node = minetest.env:get_node(pos)
for i, action in ipairs(mesecon.actions_on) do
action(pos, node)
end
end
-function mesecon:deactivate(pos)
+function mesecon:deactivate(pos) --TODO
local node = minetest.env:get_node(pos)
for i, action in ipairs(mesecon.actions_off) do
action(pos, node)
end
end
-function mesecon:changesignal(pos)
+function mesecon:changesignal(pos) --TODO
local node = minetest.env:get_node(pos)
for i, action in ipairs(mesecon.actions_change) do
action(pos, node)
@@ -112,7 +154,11 @@ end
--Conductor system stuff
function mesecon:get_conductor_on(offstate)
- for i, conductor in ipairs(mesecon.conductors) do
+ if minetest.registered_nodes[nodename].mesecons
+ and minetest.registered_nodes[nodename].mesecons.condcutor then
+ return minetest.registered_nodes[nodename].mesecons.conductor.onstate
+ end
+ for i, conductor in ipairs(mesecon.conductors) do --TODO
if conductor.offstate == offstate then
return conductor.onstate
end
@@ -121,7 +167,11 @@ 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[nodename].mesecons
+ and minetest.registered_nodes[nodename].mesecons.condcutor then
+ return minetest.registered_nodes[nodename].mesecons.conductor.offstate
+ end
+ for i, conductor in ipairs(mesecon.conductors) do --TODO
if conductor.onstate == onstate then
return conductor.offstate
end
@@ -130,7 +180,12 @@ function mesecon:get_conductor_off(onstate)
end
function mesecon:is_conductor_on(name)
- for i, conductor in ipairs(mesecon.conductors) do
+ if minetest.registered_nodes[nodename].mesecons
+ and minetest.registered_nodes[nodename].mesecons.condcutor
+ and minetest.registered_nodes[nodename].mesecons.condcutor.state == mesecon.state.on then
+ return true
+ end
+ for i, conductor in ipairs(mesecon.conductors) do --TODO
if conductor.onstate == name then
return true
end
@@ -139,7 +194,12 @@ function mesecon:is_conductor_on(name)
end
function mesecon:is_conductor_off(name)
- for i, conductor in ipairs(mesecon.conductors) do
+ if minetest.registered_nodes[nodename].mesecons
+ and minetest.registered_nodes[nodename].mesecons.condcutor
+ and minetest.registered_nodes[nodename].mesecons.condcutor.state == mesecon.state.off then
+ return true
+ end
+ for i, conductor in ipairs(mesecon.conductors) do --TODO
if conductor.offstate == name then
return true
end
@@ -148,11 +208,21 @@ function mesecon:is_conductor_off(name)
end
function mesecon:is_conductor(name)
+ --TODO: simplify
return mesecon:is_conductor_on(name) or mesecon:is_conductor_off(name)
end
function mesecon:conductor_get_rules(node)
- for i, conductor in ipairs(mesecon.conductors) do
+ if minetest.registered_nodes[node.name].mesecons
+ and minetest.registered_nodes[node.name].mesecons.condcutor then
+ local rules = minetest.registered_nodes[node.name].mesecons.condcutor.rules
+ if type(rules) == 'function' then
+ return rules(node)
+ else
+ return rules
+ end
+ end
+ for i, conductor in ipairs(mesecon.conductors) do --TODO
if conductor.onstate == node.name
or conductor.offstate == node.name then
if conductor.get_rules ~= nil then
diff --git a/mesecons/legacy.lua b/mesecons/legacy.lua
index 4fd73dd..271221a 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,81 @@ 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 = 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:receptor_on(pos, rules)
+ if rules == nil then
+ rules = mesecon:get_rules("default")
+ end
+
+ for i, rule in ipairs(rules) do
+ 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
+ end
+end
+
+function mesecon:receptor_off(pos, rules)
+ if rules == nil then
+ rules = mesecon:get_rules("default")
+ end
+
+ for i, rule in ipairs(rules) do
+ 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
+ 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", mesecon.rules.default)
diff --git a/mesecons/presets.lua b/mesecons/presets.lua
new file mode 100644
index 0000000..450f039
--- /dev/null
+++ b/mesecons/presets.lua
@@ -0,0 +1,19 @@
+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.state.on = "on"
+mesecon.state.off = "off"