summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesecons/init.lua27
-rw-r--r--mesecons/internal.lua557
-rw-r--r--mesecons/legacy.lua60
-rw-r--r--mesecons/oldwires.lua38
-rw-r--r--mesecons/services.lua48
-rw-r--r--mesecons/settings.lua1
-rw-r--r--mesecons/util.lua9
-rw-r--r--mesecons/wires.lua99
-rw-r--r--mesecons_alias/init.lua8
-rw-r--r--mesecons_delayer/init.lua98
-rw-r--r--mesecons_extrawires/corner.lua83
-rw-r--r--mesecons_extrawires/crossing.lua2
-rw-r--r--mesecons_extrawires/init.lua1
-rw-r--r--mesecons_extrawires/tjunction.lua27
-rw-r--r--mesecons_extrawires/vertical.lua18
-rw-r--r--mesecons_insulated/init.lua18
-rw-r--r--mesecons_lamp/init.lua35
-rw-r--r--mesecons_microcontroller/init.lua10
-rw-r--r--mesecons_movestones/init.lua16
-rw-r--r--mesecons_mvps/init.lua117
-rw-r--r--mesecons_pistons/depends.txt1
-rw-r--r--mesecons_pistons/init.lua897
-rw-r--r--mesecons_pressureplates/init.lua246
-rw-r--r--mesecons_textures/textures/jeija_insulated_wire_curved_tb_off.pngbin0 -> 253 bytes
-rw-r--r--mesecons_textures/textures/jeija_insulated_wire_curved_tb_on.pngbin0 -> 196 bytes
-rw-r--r--mesecons_textures/textures/jeija_insulated_wire_ends_off.pngbin172 -> 173 bytes
-rw-r--r--mesecons_textures/textures/jeija_insulated_wire_ends_on.pngbin172 -> 166 bytes
-rw-r--r--mesecons_textures/textures/jeija_insulated_wire_sides_off.png (renamed from mesecons_textures/textures/jeija_insulated_wire_sides.png)bin200 -> 200 bytes
-rw-r--r--mesecons_textures/textures/jeija_insulated_wire_sides_on.pngbin0 -> 169 bytes
-rw-r--r--mesecons_textures/textures/jeija_insulated_wire_tjunction_tb_off.pngbin0 -> 244 bytes
-rw-r--r--mesecons_textures/textures/jeija_insulated_wire_tjunction_tb_on.pngbin0 -> 207 bytes
-rw-r--r--mesecons_textures/textures/jeija_piston_pusher_normal.pngbin793 -> 0 bytes
-rw-r--r--mesecons_textures/textures/jeija_piston_pusher_sticky.pngbin782 -> 0 bytes
-rw-r--r--mesecons_textures/textures/jeija_piston_side.pngbin793 -> 0 bytes
-rw-r--r--mesecons_textures/textures/jeija_piston_sticky_side.pngbin782 -> 0 bytes
-rw-r--r--mesecons_textures/textures/jeija_piston_tb.pngbin778 -> 0 bytes
-rw-r--r--mesecons_textures/textures/mesecons_piston_back.pngbin0 -> 763 bytes
-rw-r--r--mesecons_textures/textures/mesecons_piston_bottom.pngbin0 -> 791 bytes
-rw-r--r--mesecons_textures/textures/mesecons_piston_left.pngbin0 -> 790 bytes
-rw-r--r--mesecons_textures/textures/mesecons_piston_on_front.pngbin0 -> 759 bytes
-rw-r--r--mesecons_textures/textures/mesecons_piston_pusher_back.pngbin0 -> 781 bytes
-rw-r--r--mesecons_textures/textures/mesecons_piston_pusher_bottom.pngbin0 -> 762 bytes
-rw-r--r--mesecons_textures/textures/mesecons_piston_pusher_front.pngbin0 -> 759 bytes
-rw-r--r--mesecons_textures/textures/mesecons_piston_pusher_front_sticky.pngbin0 -> 738 bytes
-rw-r--r--mesecons_textures/textures/mesecons_piston_pusher_left.pngbin0 -> 790 bytes
-rw-r--r--mesecons_textures/textures/mesecons_piston_pusher_right.pngbin0 -> 802 bytes
-rw-r--r--mesecons_textures/textures/mesecons_piston_pusher_top.pngbin0 -> 787 bytes
-rw-r--r--mesecons_textures/textures/mesecons_piston_right.pngbin0 -> 786 bytes
-rw-r--r--mesecons_textures/textures/mesecons_piston_top.pngbin0 -> 790 bytes
-rw-r--r--mesecons_textures/textures/wires_full_off.pngbin0 -> 465 bytes
-rw-r--r--mesecons_textures/textures/wires_full_on.pngbin0 -> 464 bytes
-rw-r--r--mesecons_torch/init.lua140
52 files changed, 1368 insertions, 1188 deletions
diff --git a/mesecons/init.lua b/mesecons/init.lua
index aa3f001..011c96f 100644
--- a/mesecons/init.lua
+++ b/mesecons/init.lua
@@ -22,14 +22,14 @@
-- {
-- 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
@@ -70,6 +70,7 @@ dofile(minetest.get_modpath("mesecons").."/internal.lua");
-- Deprecated stuff
-- To be removed in future releases
+-- Currently there is nothing here
dofile(minetest.get_modpath("mesecons").."/legacy.lua");
-- API
@@ -79,12 +80,10 @@ function mesecon:receptor_on(pos, rules)
rules = rules or mesecon.rules.default
for _, 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)
+ local np = mesecon:addPosRule(pos, rule)
+ local link, rulename = mesecon:rules_link(pos, np, rules)
+ if link then
+ mesecon:turnon(np, rulename)
end
end
end
@@ -93,18 +92,16 @@ function mesecon:receptor_off(pos, rules)
rules = rules or mesecon.rules.default
for _, 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)
+ local np = mesecon:addPosRule(pos, rule)
+ local link, rulename = mesecon:rules_link(pos, np, rules)
+ if link and not mesecon:connected_to_receptor(np) then
+ mesecon:turnoff(np, rulename)
end
end
end
-print("[OK] mesecons")
+print("[OK] Mesecons")
--The actual wires
dofile(minetest.get_modpath("mesecons").."/wires.lua");
diff --git a/mesecons/internal.lua b/mesecons/internal.lua
index a4beb4a..2d84787 100644
--- a/mesecons/internal.lua
+++ b/mesecons/internal.lua
@@ -1,162 +1,202 @@
--- INTERNAL
+-- Internal.lua - The core of mesecons
+--
+-- For more practical developer resources see mesecons.tk
+--
+-- Function overview
+-- mesecon:get_effector(nodename) --> Returns the mesecons.effector -specifictation in the nodedef by the nodename
+-- mesecon:get_receptor(nodename) --> Returns the mesecons.receptor -specifictation in the nodedef by the nodename
+-- mesecon:get_conductor(nodename) --> Returns the mesecons.conductor-specifictation in the nodedef by the nodename
+-- mesecon:get_any_inputrules (node) --> Returns the rules of a node if it is a conductor or an effector
+-- mesecon:get_any_outputrules (node) --> Returns the rules of a node if it is a conductor or a receptor
+
+-- RECEPTORS
+-- mesecon:is_receptor(nodename) --> Returns true if nodename is a receptor
+-- mesecon:is_receptor_on(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.on
+-- mesecon:is_receptor_off(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.off
+-- mesecon:receptor_get_rules(node) --> Returns the rules of the receptor (mesecon.rules.default if none specified)
+
+-- EFFECTORS
+-- mesecon:is_effector(nodename) --> Returns true if nodename is an effector
+-- mesecon:is_effector_on(nodename) --> Returns true if nodename is an effector with nodedef.mesecons.effector.action_off
+-- mesecon:is_effector_off(nodename) --> Returns true if nodename is an effector with nodedef.mesecons.effector.action_on
+-- mesecon:effector_get_rules(node) --> Returns the input rules of the effector (mesecon.rules.default if none specified)
+
+-- SIGNALS
+-- mesecon:activate(pos, node) --> Activates the effector node at the specific pos (calls nodedef.mesecons.effector.action_on)
+-- mesecon:deactivate(pos, node) --> Deactivates the effector node at the specific pos (calls nodedef.mesecons.effector.action_off)
+-- mesecon:changesignal(pos, node) --> Changes the effector node at the specific pos (calls nodedef.mesecons.effector.action_change)
+
+-- RULES
+-- mesecon:add_rules(name, rules) | deprecated? --> Saves rules table by name
+-- mesecon:get_rules(name, rules) | deprecated? --> Loads rules table with name
+
+-- CONDUCTORS
+-- mesecon:is_conductor(nodename) --> Returns true if nodename is a conductor
+-- mesecon:is_conductor_on(nodename) --> Returns true if nodename is a conductor with state = mesecon.state.on
+-- mesecon:is_conductor_off(nodename) --> Returns true if nodename is a conductor with state = mesecon.state.off
+-- mesecon:get_conductor_on(offstate) --> Returns the onstate nodename of the conductor with the name offstate
+-- mesecon:get_conductor_off(onstate) --> Returns the offstate nodename of the conductor with the name onstate
+-- mesecon:conductor_get_rules(node) --> Returns the input+output rules of a conductor (mesecon.rules.default if none specified)
+
+-- HIGH-LEVEL Internals
+-- mesecon:is_power_on(pos) --> Returns true if pos emits power in any way
+-- mesecon:is_power_off(pos) --> Returns true if pos does not emit power in any way
+-- mesecon:turnon(pos, rulename) --> Returns true whatever there is at pos. Calls itself for connected nodes (if pos is a conductor) --> recursive, the rulename is the name of the input rule that caused calling turnon
+-- mesecon:turnoff(pos, rulename) --> Turns off whatever there is at pos. Calls itself for connected nodes (if pos is a conductor) --> recursive, the rulename is the name of the input rule that caused calling turnoff
+-- mesecon:connected_to_receptor(pos) --> Returns true if pos is connected to a receptor directly or via conductors; calls itself if pos is a conductor --> recursive
+-- mesecon:rules_link(output, input, dug_outputrules) --> Returns true if outputposition + outputrules = inputposition and inputposition + inputrules = outputposition (if the two positions connect)
+-- mesecon:rules_link_anydir(outp., inp., d_outpr.) --> Same as rules mesecon:rules_link but also returns true if output and input are swapped
+-- mesecon:is_powered(pos) --> Returns true if pos is powered by a receptor or a conductor
+
+-- RULES ROTATION helpsers
+-- mesecon:rotate_rules_right(rules)
+-- mesecon:rotate_rules_left(rules)
+-- mesecon:rotate_rules_up(rules)
+-- mesecon:rotate_rules_down(rules)
+-- These functions return rules that have been rotated in the specific direction
+
+-- General
+function mesecon:get_effector(nodename)
+ if minetest.registered_nodes[nodename]
+ and minetest.registered_nodes[nodename].mesecons
+ and minetest.registered_nodes[nodename].mesecons.effector then
+ return minetest.registered_nodes[nodename].mesecons.effector
+ end
+end
--- Receptors
--- Nodes that can power mesecons
-function mesecon:is_receptor_node(nodename)
+function mesecon:get_receptor(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
+ and minetest.registered_nodes[nodename].mesecons.receptor then
+ return minetest.registered_nodes[nodename].mesecons.receptor
end
- for _, receptor in ipairs(mesecon.receptors) do
- if receptor.onstate == nodename then
- return true
- end
+end
+
+function mesecon:get_conductor(nodename)
+ if minetest.registered_nodes[nodename]
+ and minetest.registered_nodes[nodename].mesecons
+ and minetest.registered_nodes[nodename].mesecons.conductor then
+ return minetest.registered_nodes[nodename].mesecons.conductor
+ end
+end
+
+function mesecon:get_any_outputrules (node)
+ if mesecon:is_conductor(node.name) then
+ return mesecon:conductor_get_rules(node)
+ elseif mesecon:is_receptor(node.name) then
+ return mesecon:receptor_get_rules(node)
end
return false
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
+function mesecon:get_any_inputrules (node)
+ if mesecon:is_conductor(node.name) then
+ return mesecon:conductor_get_rules(node)
+ elseif mesecon:is_effector(node.name) then
+ return mesecon:effector_get_rules(node)
+ end
+ return false
+end
+
+-- Receptors
+-- Nodes that can power mesecons
+function mesecon:is_receptor_on(nodename)
+ local receptor = mesecon:get_receptor(nodename)
+ if receptor and receptor.state == mesecon.state.on then
return true
end
- for _, receptor in ipairs(mesecon.receptors) do
- if receptor.offstate == nodename then
- return true
- end
+ return false
+end
+
+function mesecon:is_receptor_off(nodename)
+ local receptor = mesecon:get_receptor(nodename)
+ if receptor and receptor.state == mesecon.state.off then
+ return true
+ end
+ return false
+end
+
+function mesecon:is_receptor(nodename)
+ local receptor = mesecon:get_receptor(nodename)
+ if receptor then
+ return true
end
return false
end
function mesecon:receptor_get_rules(node)
- 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
+ local receptor = mesecon:get_receptor(node.name)
+ if receptor then
+ local rules = 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)
- elseif receptor.rules ~=nil then
- return receptor.rules
- else
- return mesecon:get_rules("default")
- end
- end
- end
+
return mesecon.rules.default
end
-- Effectors
-- Nodes that can be powered by mesecons
function mesecon:is_effector_on(nodename)
- 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
+ local effector = mesecon:get_effector(nodename)
+ if effector and effector.action_off then
return true
end
- for _, effector in ipairs(mesecon.effectors) do --TODO
- if effector.onstate == nodename then
- return true
- end
- end
return false
end
function mesecon:is_effector_off(nodename)
- 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
+ local effector = mesecon:get_effector(nodename)
+ if effector and effector.action_on then
return true
end
- for _, effector in ipairs(mesecon.effectors) do --TODO
- if effector.offstate == nodename then
- return true
- end
- end
return false
end
function mesecon:is_effector(nodename)
- if minetest.registered_nodes[nodename]
- and minetest.registered_nodes[nodename].mesecons
- and minetest.registered_nodes[nodename].mesecons.effector then
+ local effector = mesecon:get_effector(nodename)
+ if effector then
return true
end
- return mesecon:is_effector_on(nodename) or mesecon:is_effector_off(nodename) --TODO
+ return false
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
+function mesecon:effector_get_rules(node)
+ local effector = mesecon:get_effector(node.name)
+ if effector then
+ local rules = 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 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, 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)
+function mesecon:activate(pos, node, rulename)
+ local effector = mesecon:get_effector(node.name)
+ if effector and effector.action_on then
+ effector.action_on (pos, node, rulename)
end
end
-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)
+function mesecon:deactivate(pos, node, rulename)
+ local effector = mesecon:get_effector(node.name)
+ if effector and effector.action_off then
+ effector.action_off (pos, node, rulename)
end
end
-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)
+function mesecon:changesignal(pos, node, rulename)
+ local effector = mesecon:get_effector(node.name)
+ if effector and effector.action_change then
+ effector.action_change (pos, node, rulename)
end
end
@@ -172,97 +212,64 @@ end
-- Conductors
-function mesecon:get_conductor_on(offstate)
- 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
+function mesecon:is_conductor_on(nodename)
+ local conductor = mesecon:get_conductor(nodename)
+ if conductor and conductor.state == mesecon.state.on then
+ return true
end
return false
end
-function mesecon:get_conductor_off(onstate)
- 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
+function mesecon:is_conductor_off(nodename)
+ local conductor = mesecon:get_conductor(nodename)
+ if conductor and conductor.state == mesecon.state.off then
+ return true
end
return false
end
-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
+function mesecon:is_conductor(nodename)
+ local conductor = mesecon:get_conductor(nodename)
+ if conductor 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(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
+function mesecon:get_conductor_on(offstate)
+ local conductor = mesecon:get_conductor(offstate)
+ if conductor then
+ return conductor.onstate
end
return false
end
-function mesecon:is_conductor(nodename)
- --TODO
- return mesecon:is_conductor_on(nodename) or mesecon:is_conductor_off(nodename)
+function mesecon:get_conductor_off(onstate)
+ local conductor = mesecon:get_conductor(onstate)
+ if conductor then
+ return conductor.offstate
+ end
+ return false
end
function mesecon:conductor_get_rules(node)
- 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
+ local conductor = mesecon:get_conductor(node.name)
+ if conductor then
+ local rules = 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
- return conductor.get_rules(node.param2)
- else
- return conductor.rules
- end
- end
- end
return mesecon.rules.default
end
---
+-- some more general high-level stuff
+
function mesecon:is_power_on(pos)
local node = minetest.env:get_node(pos)
- if mesecon:is_conductor_on(node.name) or mesecon:is_receptor_node(node.name) then
+ if mesecon:is_conductor_on(node.name) or mesecon:is_receptor_on(node.name) then
return true
end
return false
@@ -270,13 +277,13 @@ end
function mesecon:is_power_off(pos)
local node = minetest.env:get_node(pos)
- if mesecon:is_conductor_off(node.name) or mesecon:is_receptor_node_off(node.name) then
+ if mesecon:is_conductor_off(node.name) or mesecon:is_receptor_off(node.name) then
return true
end
return false
end
-function mesecon:turnon(pos)
+function mesecon:turnon(pos, rulename)
local node = minetest.env:get_node(pos)
if mesecon:is_conductor_off(node.name) then
@@ -285,22 +292,21 @@ function mesecon:turnon(pos)
for _, rule in ipairs(rules) do
local np = mesecon:addPosRule(pos, rule)
+ local link, rulename = mesecon:rules_link(pos, np)
- if mesecon:rules_link(pos, np) then
- mesecon:turnon(np)
+ if link then
+ mesecon:turnon(np, rulename)
end
end
- end
-
- if mesecon:is_effector(node.name) then
- mesecon:changesignal(pos, node)
+ elseif mesecon:is_effector(node.name) then
+ mesecon:changesignal(pos, node, rulename)
if mesecon:is_effector_off(node.name) then
- mesecon:activate(pos, node)
+ mesecon:activate(pos, node, rulename)
end
end
end
-function mesecon:turnoff(pos)
+function mesecon:turnoff(pos, rulename)
local node = minetest.env:get_node(pos)
if mesecon:is_conductor_on(node.name) then
@@ -309,153 +315,110 @@ function mesecon:turnoff(pos)
for _, rule in ipairs(rules) do
local np = mesecon:addPosRule(pos, rule)
+ local link, rulename = mesecon:rules_link(pos, np)
- if mesecon:rules_link(pos, np) then
- mesecon:turnoff(np)
+ if link then
+ mesecon:turnoff(np, rulename)
end
end
- end
-
- if mesecon:is_effector(node.name) then
- mesecon:changesignal(pos, node)
+ elseif mesecon:is_effector(node.name) then
+ mesecon:changesignal(pos, node, rulename)
if mesecon:is_effector_on(node.name)
and not mesecon:is_powered(pos) then
- mesecon:deactivate(pos, node)
+ mesecon:deactivate(pos, node, rulename)
end
end
end
-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 mesecon:cmpPos(checked[c], pos) then
- return false, checked
- end
- c = c + 1
- end
- checked[c] = {x=pos.x, y=pos.y, z=pos.z} --add current node to checked
-
- local node = minetest.env:get_node_or_nil(pos)
- if node == nil then return false, checked end
- if not mesecon:is_conductor(node.name) then return false, checked end
- if mesecon:is_powered_by_receptor(pos) then --return if conductor is powered
- return true, checked
- end
+function mesecon:connected_to_receptor(pos)
+ local node = minetest.env:get_node(pos)
- --Check if conductors around are connected
- local connected
- local rules = mesecon:conductor_get_rules(node)
+ -- 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
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
+ if mesecon:rules_link(np, pos) then
+ if mesecon:find_receptor_on(np, {}) then
return true
end
end
end
- return false, checked
+
+ return false
end
-function mesecon:rules_link(output, input, dug_outputrules) --output/input are positions (outputrules optional, used if node has been dug)
- local outputnode = minetest.env:get_node(output)
- local inputnode = minetest.env:get_node(input)
- local outputrules = dug_outputrules
- local inputrules
-
- if outputrules == nil then
- if mesecon:is_conductor(outputnode.name) then
- outputrules = mesecon:conductor_get_rules(outputnode)
- elseif mesecon:is_receptor_node(outputnode.name) or mesecon:is_receptor_node_off(outputnode.name) then
- outputrules = mesecon:receptor_get_rules(outputnode)
- else
- return false
+function mesecon:find_receptor_on(pos, checked)
+ -- 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
+ return false, checked
end
end
- if mesecon:is_conductor(inputnode.name) then
- inputrules = mesecon:conductor_get_rules(inputnode)
- elseif mesecon:is_effector(inputnode.name) then
- inputrules = mesecon:effector_get_input_rules(inputnode)
- else
- return false
- end
+ -- add current position to checked
+ table.insert(checked, {x=pos.x, y=pos.y, z=pos.z})
+ local node = minetest.env:get_node(pos)
+ if mesecon:is_receptor_on(node.name) then
+ return true
+ end
- 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
+ if mesecon:is_conductor(node.name) then
+ local rules = mesecon:conductor_get_rules(node)
+ for _, rule in ipairs(rules) do
+ local np = mesecon:addPosRule(pos, rule)
+ if mesecon:rules_link(np, pos) then
+ if mesecon:find_receptor_on(np, checked) then
return true
end
end
end
end
- return false
-end
-function mesecon:rules_link_bothdir(pos1, pos2)
- return mesecon:rules_link(pos1, pos2) or mesecon:rules_link(pos2, pos1)
+ return false
end
-function mesecon:is_powered_by_conductor(pos)
- local j = 1
- local k = 1
-
- local rules
- local con_pos = {}
- local con_rules = {}
- local con_node
-
- local node = minetest.env:get_node(pos)
- if mesecon:is_conductor(node.name) then
- rules = mesecon:conductor_get_rules(node)
- elseif mesecon:is_effector(node.name) then
- rules = mesecon:effector_get_input_rules(node)
- else
- return false
+function mesecon:rules_link(output, input, dug_outputrules) --output/input are positions (outputrules optional, used if node has been dug), second return value: the name of the affected input rule
+ local outputnode = minetest.env:get_node(output)
+ local inputnode = minetest.env:get_node(input)
+ local outputrules = dug_outputrules or mesecon:get_any_outputrules (outputnode)
+ local inputrules = mesecon:get_any_inputrules (inputnode)
+ if not outputrules or not inputrules then
+ return
end
- for _, rule in ipairs(rules) do
- local con_pos = mesecon:addPosRule(pos, rule)
-
- con_node = minetest.env:get_node(con_pos)
-
- if mesecon:is_conductor_on(con_node.name) and mesecon:rules_link(con_pos, pos) then
- return true
+ for _, outputrule in ipairs(outputrules) do
+ -- Check if output sends to input
+ if mesecon:cmpPos(mesecon:addPosRule(output, outputrule), input) then
+ for _, inputrule in ipairs(inputrules) do
+ -- Check if input accepts from output
+ if mesecon:cmpPos(mesecon:addPosRule(input, inputrule), output) then
+ return true, inputrule.name
+ end
+ end
end
end
-
return false
end
-function mesecon:is_powered_by_receptor(pos)
- local j = 1
- local k = 1
-
- local rules
- local rcpt_pos = {}
- local rcpt_rules = {}
- local rcpt_node
+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)
local node = minetest.env:get_node(pos)
- if mesecon:is_conductor(node.name) then
- rules = mesecon:conductor_get_rules(node)
- elseif mesecon:is_effector(node.name) then
- rules = mesecon:effector_get_input_rules(node)
- else
- return false
- end
+ local rules = mesecon:get_any_inputrules(node)
+ if not rules then return false end
for _, rule in ipairs(rules) do
- local rcpt_pos = mesecon:addPosRule(pos, rule)
-
- rcpt_node = minetest.env:get_node(rcpt_pos)
+ local np = mesecon:addPosRule(pos, rule)
+ local nn = minetest.env:get_node(np)
- if mesecon:is_receptor_node(rcpt_node.name) and mesecon:rules_link(rcpt_pos, pos) then
+ if (mesecon:is_conductor_on (nn.name) or mesecon:is_receptor_on (nn.name))
+ and mesecon:rules_link(np, pos) then
return true
end
end
@@ -463,59 +426,47 @@ function mesecon:is_powered_by_receptor(pos)
return false
end
-function mesecon:is_powered(pos)
- return mesecon:is_powered_by_conductor(pos) or mesecon:is_powered_by_receptor(pos)
-end
-
-function mesecon:updatenode(pos)
- if mesecon:connected_to_pw_src(pos) then
- mesecon:turnon(pos)
- else
- mesecon:turnoff(pos)
- end
-end
-
--Rules rotation Functions:
function mesecon:rotate_rules_right(rules)
- local nr={};
+ local nr = {}
for i, rule in ipairs(rules) do
- nr[i]={}
- nr[i].z=rule.x
- nr[i].x=-rule.z
- nr[i].y=rule.y
+ table.insert(nr, {
+ x = -rule.z,
+ y = rule.y,
+ z = rule.x})
end
return nr
end
function mesecon:rotate_rules_left(rules)
- local nr={};
+ local nr = {}
for i, rule in ipairs(rules) do
- nr[i]={}
- nr[i].z=-rules[i].x
- nr[i].x=rules[i].z
- nr[i].y=rules[i].y
+ table.insert(nr, {
+ x = rule.z,
+ y = rule.y,
+ z = -rule.x})
end
return nr
end
function mesecon:rotate_rules_down(rules)
- local nr={};
+ local nr = {}
for i, rule in ipairs(rules) do
- nr[i]={}
- nr[i].y=rule.x
- nr[i].x=-rule.y
- nr[i].z=rule.z
+ table.insert(nr, {
+ x = -rule.y,
+ y = rule.x,
+ z = rule.z})
end
return nr
end
function mesecon:rotate_rules_up(rules)
- local nr={};
+ local nr = {}
for i, rule in ipairs(rules) do
- nr[i]={}
- nr[i].y=-rule.x
- nr[i].x=rule.y
- nr[i].z=rule.z
+ table.insert(nr, {
+ x = rule.y,
+ y = -rule.x,
+ z = rule.z})
end
return nr
end
diff --git a/mesecons/legacy.lua b/mesecons/legacy.lua
index 947c100..e69de29 100644
--- a/mesecons/legacy.lua
+++ b/mesecons/legacy.lua
@@ -1,60 +0,0 @@
---very old:
-
-function mesecon:add_receptor_node(name, rules, get_rules)
- if get_rules==nil and rules==nil then
- rules=mesecon:get_rules("default")
- end
- table.insert(mesecon.receptors, {onstate = name, rules = rules, get_rules = get_rules})
-end
-
-function mesecon:add_receptor_node_off(name, rules, get_rules)
- if get_rules==nil and rules==nil then
- rules=mesecon:get_rules("default")
- 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/oldwires.lua b/mesecons/oldwires.lua
new file mode 100644
index 0000000..e9960d3
--- /dev/null
+++ b/mesecons/oldwires.lua
@@ -0,0 +1,38 @@
+minetest.register_node("mesecons:mesecon_off", {
+ drawtype = "raillike",
+ tiles = {"jeija_mesecon_off.png", "jeija_mesecon_curved_off.png", "jeija_mesecon_t_junction_off.png", "jeija_mesecon_crossing_off.png"},
+ inventory_image = "jeija_mesecon_off.png",
+ wield_image = "jeija_mesecon_off.png",
+ paramtype = "light",
+ is_ground_content = true,
+ walkable = false,
+ selection_box = {
+ type = "fixed",
+ fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
+ },
+ groups = {dig_immediate=3, mesecon=1, mesecon_conductor_craftable=1},
+ description="Mesecons",
+ mesecons = {conductor={
+ state = mesecon.state.off,
+ onstate = "mesecons:mesecon_on"
+ }}
+})
+
+minetest.register_node("mesecons:mesecon_on", {
+ drawtype = "raillike",
+ tiles = {"jeija_mesecon_on.png", "jeija_mesecon_curved_on.png", "jeija_mesecon_t_junction_on.png", "jeija_mesecon_crossing_on.png"},
+ paramtype = "light",
+ is_ground_content = true,
+ walkable = false,
+ selection_box = {
+ type = "fixed",
+ fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
+ },
+ groups = {dig_immediate=3, not_in_creaive_inventory=1, mesecon=1},
+ drop = '"mesecons:mesecon_off" 1',
+ light_source = LIGHT_MAX-11,
+ mesecons = {conductor={
+ state = mesecon.state.on,
+ offstate = "mesecons:mesecon_off"
+ }}
+})
diff --git a/mesecons/services.lua b/mesecons/services.lua
index 27900b1..a3aab43 100644
--- a/mesecons/services.lua
+++ b/mesecons/services.lua
@@ -1,28 +1,28 @@
-minetest.register_on_dignode(
- function(pos, oldnode, digger)
- if mesecon:is_conductor_on(oldnode.name) then
- mesecon:receptor_off(pos)
- end
-
- if mesecon:is_receptor_node(oldnode.name) then
- mesecon:receptor_off(pos, mesecon:receptor_get_rules(oldnode))
+mesecon.on_placenode = function (pos, node)
+ if mesecon:is_receptor_on(node.name) then
+ mesecon:receptor_on(pos, mesecon:receptor_get_rules(node))
+ 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))
+ else
+ mesecon:changesignal(pos, node)
+ mesecon:activate(pos, node)
end
+ elseif mesecon:is_conductor_on(node.name) then
+ mesecon:swap_node(pos, mesecon:get_conductor_off(node.name))
+ elseif mesecon:is_effector_on (node.name) then
+ mesecon:deactivate(pos, node)
end
-)
-
-minetest.register_on_placenode(
- function (pos, node)
- if mesecon:is_receptor_node(node.name) then
- mesecon:receptor_on(pos, mesecon:receptor_get_rules(node))
- end
+end
- if mesecon:is_powered(pos) then
- if mesecon:is_conductor_off(node.name) then
- mesecon:turnon(pos, node)
- else
- mesecon:changesignal(pos, node)
- mesecon:activate(pos, node)
- end
- end
+mesecon.on_dignode = function (pos, node)
+ if mesecon:is_conductor_on(node.name) then
+ mesecon:receptor_off(pos, mesecon:conductor_get_rules(node))
+ elseif mesecon:is_receptor_on(node.name) then
+ mesecon:receptor_off(pos, mesecon:receptor_get_rules(node))
end
-)
+end
+
+minetest.register_on_placenode(mesecon.on_placenode)
+minetest.register_on_dignode(mesecon.on_dignode)
diff --git a/mesecons/settings.lua b/mesecons/settings.lua
index 398ee6d..20776ee 100644
--- a/mesecons/settings.lua
+++ b/mesecons/settings.lua
@@ -3,3 +3,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
+PISTON_MAXIMUM_PUSH = 15
diff --git a/mesecons/util.lua b/mesecons/util.lua
index b95cf6e..2871c0a 100644
--- a/mesecons/util.lua
+++ b/mesecons/util.lua
@@ -6,6 +6,15 @@ function mesecon:swap_node(pos, name)
minetest.env:get_meta(pos):from_table(data)
end
+function mesecon:move_node(pos, newpos)
+ local node = minetest.env:get_node(pos)
+ local meta = minetest.env:get_meta(pos):to_table()
+ minetest.env:remove_node(pos)
+ minetest.env:add_node(newpos, node)
+ minetest.env:get_meta(pos):from_table(meta)
+end
+
+
function mesecon:addPosRule(p, r)
return {x = p.x + r.x, y = p.y + r.y, z = p.z + r.z}
end
diff --git a/mesecons/wires.lua b/mesecons/wires.lua
index a513645..d74cdb2 100644
--- a/mesecons/wires.lua
+++ b/mesecons/wires.lua
@@ -1,39 +1,3 @@
--- Oldstyle wires:
-
-if NEW_STYLE_WIRES == false then --old wires
-minetest.register_node("mesecons:mesecon_off", {
- drawtype = "raillike",
- tiles = {"jeija_mesecon_off.png", "jeija_mesecon_curved_off.png", "jeija_mesecon_t_junction_off.png", "jeija_mesecon_crossing_off.png"},
- inventory_image = "jeija_mesecon_off.png",
- wield_image = "jeija_mesecon_off.png",
- paramtype = "light",
- is_ground_content = true,
- walkable = false,
- selection_box = {
- type = "fixed",
- fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
- },
- groups = {dig_immediate=3, mesecon=1, mesecon_conductor_craftable=1},
- description="Mesecons",
-})
-
-minetest.register_node("mesecons:mesecon_on", {
- drawtype = "raillike",
- tiles = {"jeija_mesecon_on.png", "jeija_mesecon_curved_on.png", "jeija_mesecon_t_junction_on.png", "jeija_mesecon_crossing_on.png"},
- paramtype = "light",
- is_ground_content = true,
- walkable = false,
- selection_box = {
- type = "fixed",
- fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
- },
- groups = {dig_immediate=3, not_in_creaive_inventory=1, mesecon=1},
- drop = '"mesecons:mesecon_off" 1',
- light_source = LIGHT_MAX-11,
-})
-mesecon:register_conductor("mesecons:mesecon_on", "mesecons:mesecon_off")
-else -- NEW STYLE WIRES
-
-- naming scheme: wire:(xp)(zp)(xm)(zm)_on/off
-- The conditions in brackets define whether there is a mesecon at that place or not
-- 1 = there is one; 0 = there is none
@@ -52,6 +16,8 @@ box_zpy = {-1/16, -.5+1/16, .5-1/16, 1/16, .4999+1/16, .5}
box_xmy = {-.5, -.5+1/16, -1/16, -.5+1/16, .4999+1/16, 1/16}
box_zmy = {-1/16, -.5+1/16, -.5, 1/16, .4999+1/16, -.5+1/16}
+-- Registering the wires
+
for xp=0, 1 do
for zp=0, 1 do
for xm=0, 1 do
@@ -191,6 +157,9 @@ end
end
end
+-- Updating the wires:
+-- Place the right connection wire
+
local update_on_place_dig = function (pos, node)
if minetest.registered_nodes[node.name]
and minetest.registered_nodes[node.name].mesecons then
@@ -237,37 +206,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 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
- xp = (xp == 1 or (string.find(minetest.env:get_node(xppos ).name, "mesecons:mesecon_") ~= nil or
- string.find(minetest.env:get_node(xpympos).name, "mesecons:mesecon_") ~= nil)) and 1 or 0
- zp = (zp == 1 or (string.find(minetest.env:get_node(zppos ).name, "mesecons:mesecon_") ~= nil or
- string.find(minetest.env:get_node(zpympos).name, "mesecons:mesecon_") ~= nil)) and 1 or 0
- xm = (xm == 1 or (string.find(minetest.env:get_node(xmpos ).name, "mesecons:mesecon_") ~= nil or
- string.find(minetest.env:get_node(xmympos).name, "mesecons:mesecon_") ~= nil)) and 1 or 0
- zm = (zm == 1 or (string.find(minetest.env:get_node(zmpos ).name, "mesecons:mesecon_") ~= nil or
- string.find(minetest.env:get_node(zmympos).name, "mesecons:mesecon_") ~= nil)) and 1 or 0
-
- xpy = (xpy == 1 or string.find(minetest.env:get_node(xpypos).name, "mesecons:mesecon_") ~=nil) and 1 or 0
- zpy = (zpy == 1 or string.find(minetest.env:get_node(zpypos).name, "mesecons:mesecon_") ~=nil) and 1 or 0
- xmy = (xmy == 1 or string.find(minetest.env:get_node(xmypos).name, "mesecons:mesecon_") ~=nil) and 1 or 0
- zmy = (zmy == 1 or string.find(minetest.env:get_node(zmypos).name, "mesecons:mesecon_") ~=nil) and 1 or 0
- end
+ if mesecon:rules_link_anydir(pos, xppos) then xp = 1 else xp = 0 end
+ if mesecon:rules_link_anydir(pos, xmpos) then xm = 1 else xm = 0 end
+ if mesecon:rules_link_anydir(pos, zppos) then zp = 1 else zp = 0 end
+ if mesecon:rules_link_anydir(pos, zmpos) then zm = 1 else zm = 0 end
+
+ if mesecon:rules_link_anydir(pos, xpympos) then xp = 1 end
+ if mesecon:rules_link_anydir(pos, xmympos) then xm = 1 end
+ if mesecon:rules_link_anydir(pos, zpympos) then zp = 1 end
+ if mesecon:rules_link_anydir(pos, zmympos) then zm = 1 end
+
+ if mesecon:rules_link_anydir(pos, xpypos) then xpy = 1 else xpy = 0 end
+ if mesecon:rules_link_anydir(pos, zpypos) then zpy = 1 else zpy = 0 end
+ if mesecon:rules_link_anydir(pos, xmypos) then xmy = 1 else xmy = 0 end
+ if mesecon:rules_link_anydir(pos, zmypos) then zmy = 1 else zmy = 0 end
if xpy == 1 then xp = 1 end
if zpy == 1 then zp = 1 end
@@ -318,13 +270,8 @@ else
end
-
-minetest.register_abm(
- {nodenames = {"mesecons:mesecon_off", "mesecons:mesecon_on"},
- interval = 2,
- chance = 1,
- action = function(pos, node, active_object_count, active_object_count_wider)
- mesecon:update_autoconnect(pos, false, true)
- end,
+minetest.register_craft({
+ type = "cooking",
+ output = '"mesecons:wire_00000000_off" 16',
+ recipe = "default:mese_crystal",
})
-end
diff --git a/mesecons_alias/init.lua b/mesecons_alias/init.lua
index eaebbc6..395c368 100644
--- a/mesecons_alias/init.lua
+++ b/mesecons_alias/init.lua
@@ -11,7 +11,7 @@ minetest.register_alias("mesecons:wireless_receiver", "mesecons_wireless:wireles
minetest.register_alias("mesecons:wireless_transmitter", "mesecons_wireless:wireless_transmitter_off")
minetest.register_alias("mesecons:switch", "mesecons_switch:mesecon_switch_off")
minetest.register_alias("mesecons:button", "mesecons_button:button_off")
-minetest.register_alias("mesecons:piston", "mesecons_pistons:piston_normal")
+minetest.register_alias("mesecons:piston", "mesecons_pistons:piston_normal_off")
minetest.register_alias("mesecons:blinky_plant", "mesecons_blinkyplant:blinky_plant_off")
minetest.register_alias("mesecons:mesecon_torch", "mesecons_torch:mesecon_torch_on")
minetest.register_alias("mesecons:torch", "mesecons_torch:mesecon_torch_on")
@@ -30,3 +30,9 @@ minetest.register_alias("mesecons:solarpanel", "mesecons_solarpanel:solar_panel_
--Backwards compatibility
minetest.register_alias("mesecons:mesecon_off", "mesecons:wire_00000000_off")
+minetest.register_alias("mesecons_pistons:piston_sticky", "mesecons_pistons:piston_sticky_on")
+minetest.register_alias("mesecons_pistons:piston_normal", "mesecons_pistons:piston_normal_on")
+minetest.register_alias("mesecons_pistons:piston_up_normal", "mesecons_pistons:piston_up_normal_on")
+minetest.register_alias("mesecons_pistons:piston_down_normal", "mesecons_pistons:piston_down_normal_on")
+minetest.register_alias("mesecons_pistons:piston_up_sticky", "mesecons_pistons:piston_up_sticky_on")
+minetest.register_alias("mesecons_pistons:piston_down_sticky", "mesecons_pistons:piston_down_sticky_on")
diff --git a/mesecons_delayer/init.lua b/mesecons_delayer/init.lua
index 6bdb72d..f70629a 100644
--- a/mesecons_delayer/init.lua
+++ b/mesecons_delayer/init.lua
@@ -1,28 +1,16 @@
-- Function that get the input/output rules of the delayer
local delayer_get_output_rules = function(node)
- local rules = {}
- if node.param2 == 0 then
- table.insert(rules, {x = 1, y = 0, z = 0})
- elseif node.param2 == 2 then
- table.insert(rules, {x =-1, y = 0, z = 0})
- elseif node.param2 == 1 then
- table.insert(rules, {x = 0, y = 0, z =-1})
- elseif node.param2 == 3 then
- table.insert(rules, {x = 0, y = 0, z = 1})
+ local rules = {{x = 0, y = 0, z = 1}}
+ for i = 0, node.param2 do
+ rules = mesecon:rotate_rules_left(rules)
end
return rules
end
local delayer_get_input_rules = function(node)
- local rules = {}
- if node.param2 == 0 then
- table.insert(rules, {x =-1, y = 0, z = 0})
- elseif node.param2 == 2 then
- table.insert(rules, {x = 1, y = 0, z = 0})
- elseif node.param2 == 1 then
- table.insert(rules, {x = 0, y = 0, z = 1})
- elseif node.param2 == 3 then
- table.insert(rules, {x = 0, y = 0, z =-1})
+ local rules = {{x = 0, y = 0, z = -1}}
+ for i = 0, node.param2 do
+ rules = mesecon:rotate_rules_left(rules)
end
return rules
end
@@ -30,54 +18,30 @@ end
-- Functions that are called after the delay time
local delayer_turnon = function(params)
- local rules = delayer_get_output_rules(params)
+ local rules = delayer_get_output_rules(params.node)
mesecon:receptor_on(params.pos, rules)
end
local delayer_turnoff = function(params)
- local rules = delayer_get_output_rules(params)
+ local rules = delayer_get_output_rules(params.node)
mesecon:receptor_off(params.pos, rules)
end
-local delayer_update = function(pos, node)
- if string.find(node.name, "mesecons_delayer:delayer_off")~=nil then
- local time = 0
- if node.name=="mesecons_delayer:delayer_off_1" then
- mesecon:swap_node(pos, "mesecons_delayer:delayer_on_1")
- time=0.1
- elseif node.name=="mesecons_delayer:delayer_off_2" then
- mesecon:swap_node(pos, "mesecons_delayer:delayer_on_2")
- time=0.3
- elseif node.name=="mesecons_delayer:delayer_off_3" then
- mesecon:swap_node(pos, "mesecons_delayer:delayer_on_3")
- time=0.5
- elseif node.name=="mesecons_delayer:delayer_off_4" then
- mesecon:swap_node(pos, "mesecons_delayer:delayer_on_4")
- time=1
- end
- minetest.after(time, delayer_turnon, {pos=pos, param2=node.param2})
- end
+local delayer_activate = function(pos, node)
+ local def = minetest.registered_nodes[node.name]
+ local time = def.delayer_time
+ mesecon:swap_node(pos, def.delayer_onstate)
+ minetest.after(time, delayer_turnon , {pos = pos, node = node})
+end
- if string.find(node.name, "mesecons_delayer:delayer_on")~=nil then
- local time = 0
- if node.name=="mesecons_delayer:delayer_on_1" then
- mesecon:swap_node(pos, "mesecons_delayer:delayer_off_1")
- time=0.1
- elseif node.name=="mesecons_delayer:delayer_on_2" then
- mesecon:swap_node(pos, "mesecons_delayer:delayer_off_2")
- time=0.3
- elseif node.name=="mesecons_delayer:delayer_on_3" then
- mesecon:swap_node(pos, "mesecons_delayer:delayer_off_3")
- time=0.5
- elseif node.name=="mesecons_delayer:delayer_on_4" then
- mesecon:swap_node(pos, "mesecons_delayer:delayer_off_4")
- time=1
- end
- minetest.after(time, delayer_turnoff, {pos=pos, param2=node.param2})
- end
+local delayer_deactivate = function(pos, node)
+ local def = minetest.registered_nodes[node.name]
+ local time = def.delayer_time
+ mesecon:swap_node(pos, def.delayer_offstate)
+ minetest.after(time, delayer_turnoff, {pos = pos, node = node})
end
---Actually register the 2 (states) x 4 (delay times) delayers
+-- Register the 2 (states) x 4 (delay times) delayers
for i = 1, 4 do
local groups = {}
@@ -87,6 +51,12 @@ else
groups = {bendy=2,snappy=1,dig_immediate=2, not_in_creative_inventory=1}
end
+local delaytime
+if i == 1 then delaytime = 0.1
+elseif i == 2 then delaytime = 0.3
+elseif i == 3 then delaytime = 0.5
+elseif i == 4 then delaytime = 1.0 end
+
boxes = {{ -6/16, -8/16, -6/16, 6/16, -7/16, 6/16 }, -- the main slab
{ -2/16, -7/16, -4/16, 2/16, -26/64, -3/16 }, -- the jeweled "on" indicator
@@ -138,6 +108,8 @@ minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), {
mesecon:swap_node(pos,"mesecons_delayer:delayer_off_1")
end
end,
+ delayer_time = delaytime,
+ delayer_onstate = "mesecons_delayer:delayer_on_"..tostring(i),
mesecons = {
receptor =
{
@@ -147,7 +119,7 @@ minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), {
effector =
{
rules = delayer_get_input_rules,
- action_change = delayer_update
+ action_on = delayer_activate
}
}
})
@@ -190,6 +162,8 @@ minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), {
mesecon:swap_node(pos,"mesecons_delayer:delayer_on_1")
end
end,
+ delayer_time = delaytime,
+ delayer_offstate = "mesecons_delayer:delayer_off_"..tostring(i),
mesecons = {
receptor =
{
@@ -199,8 +173,16 @@ minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), {
effector =
{
rules = delayer_get_input_rules,
- action_change = delayer_update
+ action_off = delayer_deactivate
}
}
})
end
+
+minetest.register_craft({
+ output = "mesecons_delayer:delayer_off_1",
+ recipe = {
+ {"mesecons_torch:mesecon_torch_on", "group:mesecon_conductor_craftable", "mesecons_torch:mesecon_torch_on"},
+ {"default:cobble","default:cobble", "default:cobble"},
+ }
+})
diff --git a/mesecons_extrawires/corner.lua b/mesecons_extrawires/corner.lua
new file mode 100644
index 0000000..df45d41
--- /dev/null
+++ b/mesecons_extrawires/corner.lua
@@ -0,0 +1,83 @@
+local corner_nodebox = {
+ type = "fixed",
+ fixed = {{ -16/32-0.001, -17/32, -3/32, 0, -13/32, 3/32 },
+ { -3/32, -17/32, -16/32+0.001, 3/32, -13/32, 3/32}}
+}
+
+local corner_selectionbox = {
+ type = "fixed",
+ fixed = { -16/32-0.001, -18/32, -16/32, 5/32, -12/32, 5/32 },
+}
+
+local corner_get_rules = function (node)
+ local rules =
+ {{x = 1, y = 0, z = 0},
+ {x = 0, y = 0, z = -1}}
+
+ for i = 0, node.param2 do
+ rules = mesecon:rotate_rules_left(rules)
+ end
+
+ return rules
+end
+
+minetest.register_node("mesecons_extrawires:corner_on", {
+ drawtype = "nodebox",
+ tiles = {
+ "jeija_insulated_wire_curved_tb_on.png",
+ "jeija_insulated_wire_curved_tb_on.png^[transformR270",
+ "jeija_insulated_wire_sides_on.png",
+ "jeija_insulated_wire_ends_on.png",
+ "jeija_insulated_wire_sides_on.png",
+ "jeija_insulated_wire_ends_on.png"
+ },
+ paramtype = "light",
+ paramtype2 = "facedir",
+ walkable = false,
+ sunlight_propagates = true,
+ selection_box = corner_selectionbox,
+ node_box = corner_nodebox,
+ groups = {dig_immediate = 3, not_in_creative_inventory = 1},
+ drop = "mesecons_extrawires:insulated_off",
+ mesecons = {conductor =
+ {
+ state = mesecon.state.on,
+ rules = corner_get_rules,
+ offstate = "mesecons_extrawires:corner_off"
+ }}
+})
+
+minetest.register_node("mesecons_extrawires:corner_off", {
+ drawtype = "nodebox",
+ description = "Mesecon Corner",
+ tiles = {
+ "jeija_insulated_wire_curved_tb_off.png",
+ "jeija_insulated_wire_curved_tb_off.png^[transformR270",
+ "jeija_insulated_wire_sides_off.png",
+ "jeija_insulated_wire_ends_off.png",
+ "jeija_insulated_wire_sides_off.png",
+ "jeija_insulated_wire_ends_off.png"
+ },
+ paramtype = "light",
+ paramtype2 = "facedir",
+ walkable = false,
+ sunlight_propagates = true,
+ selection_box = corner_selectionbox,
+ node_box = corner_nodebox,
+ groups = {dig_immediate = 3},
+ mesecons = {conductor =
+ {
+ state = mesecon.state.off,
+ rules = corner_get_rules,
+ onstate = "mesecons_extrawires:corner_on"
+ }}
+})
+
+minetest.register_craft({
+ output = '"mesecons_extrawires:corner_off" 3',
+ recipe = {
+ {"", "", ""},
+ {"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off", ""},
+ {"", "mesecons_insulated:insulated_off", ""},
+ }
+})
diff --git a/mesecons_extrawires/crossing.lua b/mesecons_extrawires/crossing.lua
index 2b35af1..9b381bf 100644
--- a/mesecons_extrawires/crossing.lua
+++ b/mesecons_extrawires/crossing.lua
@@ -6,7 +6,7 @@ end
minetest.register_node("mesecons_extrawires:crossing_on", {
drawtype = "nodebox",
- tiles = {"jeija_insulated_wire_sides.png"},
+ tiles = {"jeija_insulated_wire_sides_on.png"},
paramtype = "light",
walkable = false,
stack_max = 99,
diff --git a/mesecons_extrawires/init.lua b/mesecons_extrawires/init.lua
index 31dfcd2..ec51a93 100644
--- a/mesecons_extrawires/init.lua
+++ b/mesecons_extrawires/init.lua
@@ -1,4 +1,5 @@
-- 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").."/tjunction.lua");
+dofile(minetest.get_modpath("mesecons_extrawires").."/corner.lua");
dofile(minetest.get_modpath("mesecons_extrawires").."/vertical.lua");
diff --git a/mesecons_extrawires/tjunction.lua b/mesecons_extrawires/tjunction.lua
index cb16cfb..5146b0c 100644
--- a/mesecons_extrawires/tjunction.lua
+++ b/mesecons_extrawires/tjunction.lua
@@ -11,28 +11,25 @@ local tjunction_selectionbox = {
local tjunction_get_rules = function (node)
local rules =
- {{x = 1, y = 0, z = 0},
- {x =-1, y = 0, z = 0},
- {x = 0, y = 0, z = -1}}
+ {{x = 0, y = 0, z = 1},
+ {x = 1, y = 0, z = 0},
+ {x = 0, y = 0, z = -1}}
- if node.param2 == 1 then
+ for i = 0, node.param2 do
rules = mesecon:rotate_rules_left(rules)
- elseif node.param2 == 2 then
- rules = mesecon:rotate_rules_right(mesecon:rotate_rules_right(rules))
- elseif node.param2 == 3 then
- rules = mesecon:rotate_rules_right(rules)
end
+
return rules
end
minetest.register_node("mesecons_extrawires:tjunction_on", {
drawtype = "nodebox",
tiles = {
- "jeija_insulated_wire_sides.png",
- "jeija_insulated_wire_sides.png",
+ "jeija_insulated_wire_tjunction_tb_on.png",
+ "jeija_insulated_wire_tjunction_tb_on.png^[transformR180",
"jeija_insulated_wire_ends_on.png",
"jeija_insulated_wire_ends_on.png",
- "jeija_insulated_wire_sides.png",
+ "jeija_insulated_wire_sides_on.png",
"jeija_insulated_wire_ends_on.png"
},
paramtype = "light",
@@ -42,7 +39,7 @@ minetest.register_node("mesecons_extrawires:tjunction_on", {
selection_box = tjunction_selectionbox,
node_box = tjunction_nodebox,
groups = {dig_immediate = 3, mesecon_conductor_craftable=1, not_in_creative_inventory = 1},
- drop = "mesecons_insulated:insulated_off",
+ drop = "mesecons_extrawires:tjunction_off",
mesecons = {conductor =
{
state = mesecon.state.on,
@@ -55,11 +52,11 @@ minetest.register_node("mesecons_extrawires:tjunction_off", {
drawtype = "nodebox",
description = "T-junction",
tiles = {
- "jeija_insulated_wire_sides.png",
- "jeija_insulated_wire_sides.png",
+ "jeija_insulated_wire_tjunction_tb_off.png",
+ "jeija_insulated_wire_tjunction_tb_off.png^[transformR180",
"jeija_insulated_wire_ends_off.png",
"jeija_insulated_wire_ends_off.png",
- "jeija_insulated_wire_sides.png",
+ "jeija_insulated_wire_sides_off.png",
"jeija_insulated_wire_ends_off.png"
},
paramtype = "light",
diff --git a/mesecons_extrawires/vertical.lua b/mesecons_extrawires/vertical.lua
index 9aaa163..b21ccb7 100644
--- a/mesecons_extrawires/vertical.lua
+++ b/mesecons_extrawires/vertical.lua
@@ -77,7 +77,7 @@ minetest.register_node("mesecons_extrawires:vertical_on", {
walkable = false,
paramtype = "light",
sunlight_propagates = true,
- groups = {dig_immediate = 3},
+ groups = {dig_immediate = 3, not_in_creative_inventory = 1},
selection_box = vbox,
node_box = vbox,
is_vertical_conductor = true,
@@ -117,11 +117,11 @@ minetest.register_node("mesecons_extrawires:vertical_off", {
minetest.register_node("mesecons_extrawires:vertical_top_on", {
description = "Vertical mesecon",
drawtype = "nodebox",
- tiles = {"wires_vertical_on.png"},
+ tiles = {"wires_full_on.png"},
walkable = false,
paramtype = "light",
sunlight_propagates = true,
- groups = {dig_immediate = 3},
+ groups = {dig_immediate = 3, not_in_creative_inventory = 1},
selection_box = tbox,
node_box = tbox,
is_vertical_conductor = true,
@@ -139,11 +139,11 @@ minetest.register_node("mesecons_extrawires:vertical_top_on", {
minetest.register_node("mesecons_extrawires:vertical_top_off", {
description = "Vertical mesecon",
drawtype = "nodebox",
- tiles = {"wires_vertical_off.png"},
+ tiles = {"wires_full_off.png"},
walkable = false,
paramtype = "light",
sunlight_propagates = true,
- groups = {dig_immediate = 3},
+ groups = {dig_immediate = 3, not_in_creative_inventory = 1},
selection_box = tbox,
node_box = tbox,
is_vertical_conductor = true,
@@ -162,12 +162,12 @@ minetest.register_node("mesecons_extrawires:vertical_top_off", {
minetest.register_node("mesecons_extrawires:vertical_bottom_on", {
description = "Vertical mesecon",
drawtype = "nodebox",
- tiles = {"wires_vertical_on.png"},
+ tiles = {"wires_full_on.png"},
walkable = false,
paramtype = "light",
sunlight_propagates = true,
vertical_conductor_state = "on",
- groups = {dig_immediate = 3},
+ groups = {dig_immediate = 3, not_in_creative_inventory = 1},
selection_box = bbox,
node_box = bbox,
mesecons = {conductor = {
@@ -183,11 +183,11 @@ minetest.register_node("mesecons_extrawires:vertical_bottom_on", {
minetest.register_node("mesecons_extrawires:vertical_bottom_off", {
description = "Vertical mesecon",
drawtype = "nodebox",
- tiles = {"wires_vertical_off.png"},
+ tiles = {"wires_full_off.png"},
walkable = false,
paramtype = "light",
sunlight_propagates = true,
- groups = {dig_immediate = 3},
+ groups = {dig_immediate = 3, not_in_creative_inventory = 1},
selection_box = bbox,
node_box = bbox,
is_vertical_conductor = true,
diff --git a/mesecons_insulated/init.lua b/mesecons_insulated/init.lua
index 8bf75c7..77bfd24 100644
--- a/mesecons_insulated/init.lua
+++ b/mesecons_insulated/init.lua
@@ -9,14 +9,14 @@ end
minetest.register_node("mesecons_insulated:insulated_on", {
drawtype = "nodebox",
- description = "insulated mesecons",
+ description = "Insulated Mesecon",
tiles = {
- "jeija_insulated_wire_sides.png",
- "jeija_insulated_wire_sides.png",
+ "jeija_insulated_wire_sides_on.png",
+ "jeija_insulated_wire_sides_on.png",
"jeija_insulated_wire_ends_on.png",
"jeija_insulated_wire_ends_on.png",
- "jeija_insulated_wire_sides.png",
- "jeija_insulated_wire_sides.png"
+ "jeija_insulated_wire_sides_on.png",
+ "jeija_insulated_wire_sides_on.png"
},
paramtype = "light",
paramtype2 = "facedir",
@@ -43,12 +43,12 @@ minetest.register_node("mesecons_insulated:insulated_off", {
drawtype = "nodebox",
description = "insulated mesecons",
tiles = {
- "jeija_insulated_wire_sides.png",
- "jeija_insulated_wire_sides.png",
+ "jeija_insulated_wire_sides_off.png",
+ "jeija_insulated_wire_sides_off.png",
"jeija_insulated_wire_ends_off.png",
"jeija_insulated_wire_ends_off.png",
- "jeija_insulated_wire_sides.png",
- "jeija_insulated_wire_sides.png"
+ "jeija_insulated_wire_sides_off.png",
+ "jeija_insulated_wire_sides_off.png"
},
paramtype = "light",
paramtype2 = "facedir",
diff --git a/mesecons_lamp/init.lua b/mesecons_lamp/init.lua
index d20236b..175a22b 100644
--- a/mesecons_lamp/init.lua
+++ b/mesecons_lamp/init.lua
@@ -2,6 +2,13 @@
-- A lamp is "is an electrical device used to create artificial light" (wikipedia)
-- guess what?
+mesecon_lamp_box = {
+ type = "wallmounted",
+ wall_top = {-0.3125,0.375,-0.3125,0.3125,0.5,0.3125},
+ wall_bottom = {-0.3125,-0.5,-0.3125,0.3125,-0.375,0.3125},
+ wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125},
+}
+
minetest.register_node("mesecons_lamp:lamp_on", {
drawtype = "nodebox",
tiles = {"jeija_meselamp_on.png"},
@@ -11,18 +18,8 @@ minetest.register_node("mesecons_lamp:lamp_on", {
sunlight_propagates = true,
walkable = true,
light_source = LIGHT_MAX,
- node_box = {
- type = "wallmounted",
- wall_top = {-0.3125,0.375,-0.3125,0.3125,0.5,0.3125},
- wall_bottom = {-0.3125,-0.5,-0.3125,0.3125,-0.375,0.3125},
- wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125},
- },
- selection_box = {
- type = "wallmounted",
- wall_top = {-0.3125,0.375,-0.3125,0.3125,0.5,0.3125},
- wall_bottom = {-0.3125,-0.5,-0.3125,0.3125,-0.375,0.3125},
- wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125},
- },
+ node_box = mesecon_lamp_box,
+ selection_box = mesecon_lamp_box,
groups = {dig_immediate=3,not_in_creative_inventory=1, mesecon_effector_on = 1},
drop='"mesecons_lamp:lamp_off" 1',
mesecons = {effector = {
@@ -41,18 +38,8 @@ minetest.register_node("mesecons_lamp:lamp_off", {
paramtype2 = "wallmounted",
sunlight_propagates = true,
walkable = true,
- node_box = {
- type = "wallmounted",
- wall_top = {-0.3125,0.375,-0.3125,0.3125,0.5,0.3125},
- wall_bottom = {-0.3125,-0.5,-0.3125,0.3125,-0.375,0.3125},
- wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125},
- },
- selection_box = {
- type = "wallmounted",
- wall_top = {-0.3125,0.375,-0.3125,0.3125,0.5,0.3125},
- wall_bottom = {-0.3125,-0.5,-0.3125,0.3125,-0.375,0.3125},
- wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125},
- },
+ node_box = mesecon_lamp_box,
+ selection_box = mesecon_lamp_box,
groups = {dig_immediate=3, mesecon_receptor_off = 1, mesecon_effector_off = 1},
description="Meselamp",
mesecons = {effector = {
diff --git a/mesecons_microcontroller/init.lua b/mesecons_microcontroller/init.lua
index 3117880..6120ade 100644
--- a/mesecons_microcontroller/init.lua
+++ b/mesecons_microcontroller/init.lua
@@ -30,16 +30,16 @@ if (c == 1) then table.insert(rules, {x = 1, y = 0, z = 0}) end
if (d == 1) then table.insert(rules, {x = 0, y = 0, z = -1}) end
local input_rules={}
-if (a == 0) then table.insert(input_rules, {x = -1, y = 0, z = 0}) end
-if (b == 0) then table.insert(input_rules, {x = 0, y = 0, z = 1}) end
-if (c == 0) then table.insert(input_rules, {x = 1, y = 0, z = 0}) end
-if (d == 0) then table.insert(input_rules, {x = 0, y = 0, z = -1}) end
+if (a == 0) then table.insert(input_rules, {x = -1, y = 0, z = 0, name = "A"}) end
+if (b == 0) then table.insert(input_rules, {x = 0, y = 0, z = 1, name = "B"}) end
+if (c == 0) then table.insert(input_rules, {x = 1, y = 0, z = 0, name = "C"}) end
+if (d == 0) then table.insert(input_rules, {x = 0, y = 0, z = -1, name = "D"}) end
mesecon:add_rules(nodename, rules)
local mesecons = {effector =
{
rules = input_rules,
- action_change = function (pos, node)
+ action_change = function (pos, node, rulename)
update_yc(pos)
end
}}
diff --git a/mesecons_movestones/init.lua b/mesecons_movestones/init.lua
index a7e5f2c..91b57c7 100644
--- a/mesecons_movestones/init.lua
+++ b/mesecons_movestones/init.lua
@@ -70,7 +70,7 @@ minetest.register_node("mesecons_movestones:movestone", {
repeat -- Check if it collides with a stopper
collpos = mesecon:addPosRule(collpos, direction)
checknode=minetest.env:get_node(collpos)
- if mesecon:is_mvps_stopper(checknode.name) then
+ if mesecon:is_mvps_stopper(checknode.name, direction) then
return
end
until checknode.name=="air"
@@ -97,7 +97,7 @@ minetest.register_entity("mesecons_movestones:movestone_entity", {
on_step = function(self, dtime)
local pos = self.object:getpos()
- local direction=mesecon:get_movestone_direction(pos)
+ local direction = mesecon:get_movestone_direction(pos)
if not direction then
minetest.env:add_node(pos, {name="mesecons_movestones:movestone"})
@@ -105,9 +105,9 @@ minetest.register_entity("mesecons_movestones:movestone_entity", {
return
end
- self.object:setvelocity({x=direction.x*3, y=direction.y*3, z=direction.z*3})
+ self.object:setvelocity({x=direction.x*2, y=direction.y*2, z=direction.z*2})
- mesecon:mvps_push(pos, direction)
+ mesecon:mvps_push(pos, direction, 100)
end,
})
@@ -140,7 +140,7 @@ minetest.register_node("mesecons_movestones:sticky_movestone", {
repeat -- Check if it collides with a stopper
collpos = mesecon:addPosRule(collpos, direction)
checknode=minetest.env:get_node(collpos)
- if mesecon:is_mvps_stopper(checknode.name) then
+ if mesecon:is_mvps_stopper(checknode.name, direction) then
return
end
until checknode.name=="air"
@@ -149,7 +149,7 @@ minetest.register_node("mesecons_movestones:sticky_movestone", {
repeat -- Check if it collides with a stopper (pull direction)
collpos={x=collpos.x-direction.x, y=collpos.y-direction.y, z=collpos.z-direction.z}
checknode=minetest.env:get_node(collpos)
- if mesecon:is_mvps_stopper(checknode.name) then
+ if mesecon:is_mvps_stopper(checknode.name, direction) then
return
end
until checknode.name=="air"
@@ -192,9 +192,9 @@ minetest.register_entity("mesecons_movestones:sticky_movestone_entity", {
return
end
- self.object:setvelocity({x=direction.x*3, y=direction.y*3, z=direction.z*3})
+ self.object:setvelocity({x=direction.x*2, y=direction.y*2, z=direction.z*2})
- mesecon:mvps_push(pos, direction)
+ mesecon:mvps_push(pos, direction, 100)
--STICKY
mesecon:mvps_pull_all(pos, direction)
diff --git a/mesecons_mvps/init.lua b/mesecons_mvps/init.lua
index 3903910..9f8242b 100644
--- a/mesecons_mvps/init.lua
+++ b/mesecons_mvps/init.lua
@@ -2,42 +2,99 @@
mesecon.mvps_stoppers={}
-function mesecon:is_mvps_stopper(nodename)
- local i=1
- repeat
- i=i+1
- if mesecon.mvps_stoppers[i]==nodename then return true end
- until mesecon.mvps_stoppers[i]==nil
- return false
+function mesecon:is_mvps_stopper(node, pushdir, stack, stackid)
+ local get_stopper = mesecon.mvps_stoppers[node.name]
+ if type (get_stopper) == "function" then
+ get_stopper = get_stopper(node, pushdir, stack, stackid)
+ end
+ return get_stopper
end
-function mesecon:register_mvps_stopper(nodename)
- local i=1
- repeat
- i=i+1
- if mesecon.mvps_stoppers[i]==nil then break end
- until false
- mesecon.mvps_stoppers[i]=nodename
+function mesecon:register_mvps_stopper(nodename, get_stopper)
+ if get_stopper == nil then
+ get_stopper = true
+ end
+ mesecon.mvps_stoppers[nodename] = get_stopper
end
-function mesecon:mvps_push(pos, direction) -- pos: pos of mvps; direction: direction of push
- pos.x=pos.x+direction.x
- pos.y=pos.y+direction.y
- pos.z=pos.z+direction.z
+function mesecon:mvps_process_stack(stack)
+ -- update mesecons for placed nodes ( has to be done after all nodes have been added )
+ for _, n in ipairs(stack) do
+ mesecon.on_placenode(n.pos, minetest.env:get_node(n.pos))
+ mesecon:update_autoconnect(n.pos)
+ end
+end
- local lpos = {x=pos.x, y=pos.y, z=pos.z}
- local lnode = minetest.env:get_node(lpos)
- local newnode
- minetest.env:remove_node(lpos)
- while not(lnode.name == "ignore" or lnode.name == "air" or not(minetest.registered_nodes[lnode.name].liquidtype == "none")) do
- lpos.x=lpos.x+direction.x
- lpos.y=lpos.y+direction.y
- lpos.z=lpos.z+direction.z
- newnode = lnode
- lnode = minetest.env:get_node(lpos)
- minetest.env:add_node(lpos, newnode)
- nodeupdate(lpos)
+function mesecon:mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: direction of push; maximum: maximum nodes to be pushed
+ np = {x = pos.x, y = pos.y, z = pos.z}
+
+ -- determine the number of nodes to be pushed
+ local nodes = {}
+ while true do
+ nn = minetest.env:get_node_or_nil(np)
+ if not nn or #nodes > maximum then
+ -- don't push at all, something is in the way (unloaded map or too many nodes)
+ return
+ end
+
+ if nn.name == "air"
+ or minetest.registered_nodes[nn.name].liquidtype ~= "none" then --is liquid
+ break
+ end
+
+ table.insert (nodes, {node = nn, pos = np})
+
+ np = mesecon:addPosRule(np, dir)
+ end
+
+ -- determine if one of the nodes blocks the push
+ for id, n in ipairs(nodes) do
+ if mesecon:is_mvps_stopper(n.node, dir, nodes, id) then
+ return
end
+ end
+
+ -- remove all nodes
+ for _, n in ipairs(nodes) do
+ minetest.env:remove_node(n.pos)
+ nodeupdate(n.pos)
+ end
+
+ -- update mesecons for removed nodes ( has to be done after all nodes have been removed )
+ for _, n in ipairs(nodes) do
+ mesecon.on_dignode(n.pos, n.node)
+ mesecon:update_autoconnect(n.pos)
+ end
+
+ -- add nodes
+ for _, n in ipairs(nodes) do
+ np = mesecon:addPosRule(n.pos, dir)
+ minetest.env:add_node(np, n.node)
+ nodeupdate(np)
+ end
+
+ for i in ipairs(nodes) do
+ nodes[i].pos = mesecon:addPosRule(nodes[i].pos, dir)
+ end
+
+ return true, nodes
+end
+
+function mesecon:mvps_pull_single(pos, dir) -- pos: pos of mvps; direction: direction of pull (matches push direction for sticky pistons)
+ np = mesecon:addPosRule(pos, dir)
+ nn = minetest.env:get_node(np)
+
+ if minetest.registered_nodes[nn.name].liquidtype == "none"
+ and not mesecon:is_mvps_stopper(nn, {x = -dir.x, y = -dir.y, z = -dir.z}, {{pos = np, node = nn}}, 1) then
+ minetest.env:remove_node(np)
+ minetest.env:add_node(pos, nn)
+
+ nodeupdate(np)
+ nodeupdate(pos)
+ mesecon.on_dignode(np, nn)
+ mesecon:update_autoconnect(np)
+ end
+ return {{pos = np, node = {param2 = 0, name = "air"}}, {pos = pos, node = nn}}
end
function mesecon:mvps_pull_all(pos, direction) -- pos: pos of mvps; direction: direction of pull
diff --git a/mesecons_pistons/depends.txt b/mesecons_pistons/depends.txt
index a596cf8..01f085b 100644
--- a/mesecons_pistons/depends.txt
+++ b/mesecons_pistons/depends.txt
@@ -1,3 +1,2 @@
mesecons
-mesecons_materials
mesecons_mvps
diff --git a/mesecons_pistons/init.lua b/mesecons_pistons/init.lua
index 44b9095..a51e16e 100644
--- a/mesecons_pistons/init.lua
+++ b/mesecons_pistons/init.lua
@@ -1,431 +1,672 @@
---PISTONS
-
---starts the timer to make the piston update to its new state
-local update = function(pos, node)
- local timer = minetest.env:get_node_timer(pos)
- timer:stop()
- timer:start(0)
+-- Get mesecon rules of pistons
+piston_rules =
+{{x=0, y=0, z=1}, --everything apart from z- (pusher side)
+ {x=1, y=0, z=0},
+ {x=-1, y=0, z=0},
+ {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}}
+
+local piston_get_rules = function (node)
+ local rules = piston_rules
+ for i = 1, node.param2 do
+ rules = mesecon:rotate_rules_left(rules)
+ end
+ return rules
end
---on_destruct callback, removes the piston pusher if it is present
-local destruct = function(pos, oldnode)
- local dir = mesecon:piston_get_direction(oldnode)
- pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node to check
-
- --ensure piston is extended
- local checknode = minetest.env:get_node(pos)
- if checknode.name == "mesecons_pistons:piston_pusher_normal"
- or checknode.name == "mesecons_pistons:piston_pusher_sticky" then
- if checknode.param2 == oldnode.param2 then --pusher is facing the same direction as the piston
- minetest.env:remove_node(pos) --remove the pusher
- end
- elseif oldnode.name == "mesecons_pistons:piston_up_normal" or oldnode.name == "mesecons_pistons:piston_up_sticky" then
- if checknode.name == "mesecons_pistons:piston_up_pusher_normal" or checknode.name == "mesecons_pistons:piston_up_pusher_sticky" then
- minetest.env:remove_node(pos) --remove the pusher
- end
- elseif oldnode.name == "mesecons_pistons:piston_down_normal" or oldnode.name == "mesecons_pistons:piston_down_sticky" then
- if checknode.name == "mesecons_pistons:piston_down_pusher_normal" or checknode.name == "mesecons_pistons:piston_down_pusher_sticky" then
- minetest.env:remove_node(pos) --remove the pusher
- end
+piston_facedir_direction = function (node)
+ local rules = {{x = 0, y = 0, z = -1}}
+ for i = 1, node.param2 do
+ rules = mesecon:rotate_rules_left(rules)
end
+ return rules[1]
end
---node timer callback, pushes/pulls the piston depending on whether it is powered
-local timer = function(pos, elapsed)
- if mesecon:is_powered(pos) then
- mesecon:piston_push(pos)
+piston_get_direction = function (dir, node)
+ if type(dir) == "function" then
+ return dir(node)
else
- mesecon:piston_pull(pos)
+ return dir
end
- return false
end
---piston push action
-function mesecon:piston_push(pos)
- local node = minetest.env:get_node(pos)
- local dir = mesecon:piston_get_direction(node)
- pos = {x=pos.x + dir.x, y=pos.y + dir.y, z=pos.z + dir.z} --move to first node being pushed
-
- --determine the number of nodes that need to be pushed
- local count = 0
- local checkpos = {x=pos.x, y=pos.y, z=pos.z} --first node being pushed
- while true do
- local checknode = minetest.env:get_node(checkpos)
-
- --check for collision with stopper or bounds
- if mesecon:is_mvps_stopper(checknode.name) or checknode.name == "ignore" then
- return
- end
+local piston_remove_pusher = function (pos, node)
+ pistonspec = minetest.registered_nodes[node.name].mesecons_piston
- --check for column end
- if checknode.name == "air"
- or not(minetest.registered_nodes[checknode.name].liquidtype == "none") then
- break
- end
+ dir = piston_get_direction(pistonspec.dir, node)
+ local pusherpos = mesecon:addPosRule(pos, dir)
+ local pushername = minetest.env:get_node(pusherpos).name
- --limit piston pushing capacity
- count = count + 1
- if count > 15 then
- return
- end
-
- checkpos.x, checkpos.y, checkpos.z = checkpos.x + dir.x, checkpos.y + dir.y, checkpos.z + dir.z
- end
-
- local checknode = minetest.env:get_node(pos)
-
- --add pusher
- if node.name == "mesecons_pistons:piston_normal" then
- minetest.env:add_node(pos, {name="mesecons_pistons:piston_pusher_normal", param2=node.param2})
- elseif node.name == "mesecons_pistons:piston_sticky" then
- minetest.env:add_node(pos, {name="mesecons_pistons:piston_pusher_sticky", param2=node.param2})
- elseif node.name == "mesecons_pistons:piston_up_normal" then
- minetest.env:add_node(pos, {name="mesecons_pistons:piston_up_pusher_normal"})
- elseif node.name == "mesecons_pistons:piston_up_sticky" then
- minetest.env:add_node(pos, {name="mesecons_pistons:piston_up_pusher_sticky"})
- elseif node.name == "mesecons_pistons:piston_down_normal" then
- minetest.env:add_node(pos, {name="mesecons_pistons:piston_down_pusher_normal"})
- elseif node.name == "mesecons_pistons:piston_down_sticky" then
- minetest.env:add_node(pos, {name="mesecons_pistons:piston_down_pusher_sticky"})
+ if pushername == pistonspec.pusher then --make sure there actually is a pusher (for compatibility reasons mainly)
+ minetest.env:remove_node(pusherpos)
+ nodeupdate(pusherpos)
end
+end
- --move nodes forward
- for i = 1, count do
- pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to the next node
+local piston_on = function (pos, node)
+ local pistonspec = minetest.registered_nodes[node.name].mesecons_piston
- --check for conductor --wip: not sure if still needed
- if mesecon:is_conductor_on(checknode.name) then
- checknode.name = mesecon:get_conductor_off(checknode.name)
- end
-
- --move the node forward
- local nextnode = minetest.env:get_node(pos)
- minetest.env:add_node(pos, checknode)
- checknode = nextnode
+ dir = piston_get_direction(pistonspec.dir, node)
+ local np = mesecon:addPosRule(pos, dir)
+ success, stack = mesecon:mvps_push(np, dir, PISTON_MAXIMUM_PUSH)
+ if success then
+ minetest.env:add_node(pos, {param2 = node.param2, name = pistonspec.onname})
+ minetest.env:add_node(np, {param2 = node.param2, name = pistonspec.pusher})
+ mesecon:mvps_process_stack(stack)
end
+end
- --update nodes
- for i = 1, count do
- mesecon:updatenode(pos)
- nodeupdate(pos)
+local piston_off = function (pos, node)
+ local pistonspec = minetest.registered_nodes[node.name].mesecons_piston
+ minetest.env:add_node(pos, {param2 = node.param2, name = pistonspec.offname})
+ piston_remove_pusher (pos, node)
- pos.x, pos.y, pos.z = pos.x - dir.x, pos.y - dir.y, pos.z - dir.z --move to the previous node
+ if pistonspec.sticky then
+ dir = piston_get_direction(pistonspec.dir, node)
+ pullpos = mesecon:addPosRule(pos, dir)
+ stack = mesecon:mvps_pull_single(pullpos, dir)
+ mesecon:mvps_process_stack(stack)
end
end
---piston pull action
-function mesecon:piston_pull(pos)
- local node = minetest.env:get_node(pos)
- local dir = mesecon:piston_get_direction(node)
- pos = {x=pos.x + dir.x, y=pos.y + dir.y, z=pos.z + dir.z} --move to first node being replaced
-
- --ensure piston is extended
- local checknode = minetest.env:get_node(pos)
- if node.name == "mesecons_pistons:piston_up_normal" or node.name == "mesecons_pistons:piston_up_sticky" then --up piston
- if checknode.name ~= "mesecons_pistons:piston_up_pusher_normal" and checknode.name ~= "mesecons_pistons:piston_up_pusher_sticky" then
- return --piston is not extended
- end
- elseif node.name == "mesecons_pistons:piston_down_normal" or node.name == "mesecons_pistons:piston_down_sticky" then --down piston
- if checknode.name ~= "mesecons_pistons:piston_down_pusher_normal" and checknode.name ~= "mesecons_pistons:piston_down_pusher_sticky" then
- return --piston is not extended
- end
- else --horizontal piston
- if checknode.name ~= "mesecons_pistons:piston_pusher_normal" and checknode.name ~= "mesecons_pistons:piston_pusher_sticky" then
- return --piston is not extended
- end
- if checknode.param2 ~= node.param2 then --pusher is not facing the same direction as the piston
- return --piston is not extended
- end
- end
+local piston_orientate = function (pos, placer)
+ -- not placed by player
+ if not placer then return end
- --retract piston
- minetest.env:remove_node(pos) --remove pusher
- if node.name == "mesecons_pistons:piston_sticky"
- or node.name == "mesecons_pistons:piston_up_sticky"
- or node.name == "mesecons_pistons:piston_down_sticky" then --retract block if piston is sticky
- local checkpos = {x=pos.x + dir.x, y=pos.y + dir.y, z=pos.z + dir.z} --move to the node to be retracted
- checknode = minetest.env:get_node(checkpos)
- if checknode.name ~= "air"
- and checknode.name ~= "ignore"
- and minetest.registered_nodes[checknode.name].liquidtype == "none"
- and not mesecon:is_mvps_stopper(checknode.name) then
- minetest.env:add_node(pos, checknode)
- minetest.env:remove_node(checkpos)
- mesecon:updatenode(checkpos)
- nodeupdate(checkpos)
- end
- end
- mesecon:updatenode(pos)
- nodeupdate(pos)
-end
+ -- placer pitch in degrees
+ local pitch = placer:get_look_pitch() * (180 / math.pi)
---push direction of a piston
-function mesecon:piston_get_direction(node)
- if node.name == "mesecons_pistons:piston_up_normal" or node.name == "mesecons_pistons:piston_up_sticky" then
- return {x=0, y=1, z=0}
- elseif node.name == "mesecons_pistons:piston_down_normal" or node.name == "mesecons_pistons:piston_down_sticky" then
- return {x=0, y=-1, z=0}
- elseif node.param2 == 3 then
- return {x=1, y=0, z=0}
- elseif node.param2 == 2 then
- return {x=0, y=0, z=1}
- elseif node.param2 == 1 then
- return {x=-1, y=0, z=0}
- else --node.param2 == 0
- return {x=0, y=0, z=-1}
+ local node = minetest.env:get_node(pos)
+ local pistonspec = minetest.registered_nodes[node.name].mesecons_piston
+ if pitch > 55 then --looking upwards
+ minetest.env:add_node(pos, {name=pistonspec.piston_down})
+ elseif pitch < -55 then --looking downwards
+ minetest.env:add_node(pos, {name=pistonspec.piston_up})
end
end
---horizontal pistons
-minetest.register_node("mesecons_pistons:piston_normal", {
+
+-- Horizontal pistons
+
+local pt = 3/16 -- pusher thickness
+
+local piston_pusher_box = {
+ type = "fixed",
+ fixed = {
+ {-2/16, -2/16, -.5 + pt, 2/16, 2/16, .5 + pt},
+ {-.5 , -.5 , -.5 , .5 , .5 , -.5 + pt},
+ }
+}
+
+local piston_on_box = {
+ type = "fixed",
+ fixed = {
+ {-.5, -.5, -.5 + pt, .5, .5, .5}
+ }
+}
+
+
+-- Normal (non-sticky) ones:
+
+local pistonspec_normal = {
+ offname = "mesecons_pistons:piston_normal_off",
+ onname = "mesecons_pistons:piston_normal_on",
+ dir = piston_facedir_direction,
+ pusher = "mesecons_pistons:piston_pusher_normal",
+ piston_down = "mesecons_pistons:piston_down_normal_off",
+ piston_up = "mesecons_pistons:piston_up_normal_off",
+}
+
+-- offstate
+minetest.register_node("mesecons_pistons:piston_normal_off", {
description = "Piston",
- tiles = {"jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_side.png"},
- groups = {cracky=3, mesecon=2},
+ tiles = {
+ "mesecons_piston_top.png",
+ "mesecons_piston_bottom.png",
+ "mesecons_piston_left.png",
+ "mesecons_piston_right.png",
+ "mesecons_piston_back.png",
+ "mesecons_piston_pusher_front.png"
+ },
+ groups = {cracky = 3},
paramtype2 = "facedir",
- after_destruct = destruct,
- on_timer = timer,
- after_place_node = function(pos, placer)
- if not placer then --not placed by player
- return
- end
- local pitch = placer:get_look_pitch() * (180 / math.pi) --placer pitch in degrees
- if pitch > 45 then --looking upwards
- minetest.env:add_node(pos, {name="mesecons_pistons:piston_down_normal"})
- elseif pitch < -45 then --looking downwards
- minetest.env:add_node(pos, {name="mesecons_pistons:piston_up_normal"})
- end
- end,
+ after_place_node = piston_orientate,
+ mesecons_piston = pistonspec_normal,
mesecons = {effector={
- action_change = update
+ action_on = piston_on,
+ rules = piston_get_rules
}}
})
-minetest.register_node("mesecons_pistons:piston_sticky", {
- description = "Sticky Piston",
- tiles = {"jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_sticky_side.png"},
- groups = {cracky=3, mesecon=2},
+-- onstate
+minetest.register_node("mesecons_pistons:piston_normal_on", {
+ drawtype = "nodebox",
+ tiles = {
+ "mesecons_piston_top.png",
+ "mesecons_piston_bottom.png",
+ "mesecons_piston_left.png",
+ "mesecons_piston_right.png",
+ "mesecons_piston_back.png",
+ "mesecons_piston_on_front.png"
+ },
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ paramtype = "light",
paramtype2 = "facedir",
- after_destruct = destruct,
- on_timer = timer,
- after_place_node = function(pos, placer)
- if not placer then --not placed by player
- return
- end
- local pitch = placer:get_look_pitch() * (180 / math.pi) --placer pitch in degrees
- if pitch > 45 then --looking upwards
- minetest.env:add_node(pos, {name="mesecons_pistons:piston_down_sticky"})
- elseif pitch < -45 then --looking downwards
- minetest.env:add_node(pos, {name="mesecons_pistons:piston_up_sticky"})
- end
- end,
+ drop = {"mesecons_pistons:piston_normal_off"},
+ after_dig_node = piston_remove_pusher,
+ node_box = piston_on_box,
+ selection_box = piston_on_box,
+ mesecons_piston = pistonspec_normal,
mesecons = {effector={
- action_change = update
+ action_off = piston_off,
+ rules = piston_get_rules
}}
})
+-- pusher
minetest.register_node("mesecons_pistons:piston_pusher_normal", {
drawtype = "nodebox",
- tiles = {"jeija_piston_pusher_normal.png"},
+ tiles = {
+ "mesecons_piston_pusher_top.png",
+ "mesecons_piston_pusher_bottom.png",
+ "mesecons_piston_pusher_left.png",
+ "mesecons_piston_pusher_right.png",
+ "mesecons_piston_pusher_back.png",
+ "mesecons_piston_pusher_front.png"
+ },
paramtype = "light",
paramtype2 = "facedir",
diggable = false,
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.2, -0.2, -0.3, 0.2, 0.2, 0.5},
- {-0.5, -0.5, -0.5, 0.5, 0.5, -0.3},
+ corresponding_piston = "mesecons_pistons:piston_normal_on",
+ selection_box = piston_pusher_box,
+ node_box = piston_pusher_box,
+})
+
+-- Sticky ones
+
+local pistonspec_sticky = {
+ offname = "mesecons_pistons:piston_sticky_off",
+ onname = "mesecons_pistons:piston_sticky_on",
+ dir = piston_facedir_direction,
+ pusher = "mesecons_pistons:piston_pusher_sticky",
+ sticky = true,
+ piston_down = "mesecons_pistons:piston_down_sticky_off",
+ piston_up = "mesecons_pistons:piston_up_sticky_off",
+}
+
+-- offstate
+minetest.register_node("mesecons_pistons:piston_sticky_off", {
+ description = "Sticky Piston",
+ tiles = {
+ "mesecons_piston_top.png",
+ "mesecons_piston_bottom.png",
+ "mesecons_piston_left.png",
+ "mesecons_piston_right.png",
+ "mesecons_piston_back.png",
+ "mesecons_piston_pusher_front_sticky.png"
},
- },
- node_box = {
- type = "fixed",
- fixed = {
- {-0.2, -0.2, -0.3, 0.2, 0.2, 0.5},
- {-0.5, -0.5, -0.5, 0.5, 0.5, -0.3},
+ groups = {cracky = 3},
+ paramtype2 = "facedir",
+ after_place_node = piston_orientate,
+ mesecons_piston = pistonspec_sticky,
+ mesecons = {effector={
+ action_on = piston_on,
+ rules = piston_get_rules
+ }}
+})
+
+-- onstate
+minetest.register_node("mesecons_pistons:piston_sticky_on", {
+ drawtype = "nodebox",
+ tiles = {
+ "mesecons_piston_top.png",
+ "mesecons_piston_bottom.png",
+ "mesecons_piston_left.png",
+ "mesecons_piston_right.png",
+ "mesecons_piston_back.png",
+ "mesecons_piston_on_front.png"
},
- },
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ paramtype = "light",
+ paramtype2 = "facedir",
+ drop = {"mesecons_pistons:piston_normal_off"},
+ after_dig_node = piston_remove_pusher,
+ node_box = piston_on_box,
+ selection_box = piston_on_box,
+ mesecons_piston = pistonspec_sticky,
+ mesecons = {effector={
+ action_off = piston_off,
+ rules = piston_get_rules
+ }}
})
+-- pusher
minetest.register_node("mesecons_pistons:piston_pusher_sticky", {
drawtype = "nodebox",
tiles = {
- "jeija_piston_pusher_normal.png",
- "jeija_piston_pusher_normal.png",
- "jeija_piston_pusher_normal.png",
- "jeija_piston_pusher_normal.png",
- "jeija_piston_pusher_normal.png",
- "jeija_piston_pusher_sticky.png"
+ "mesecons_piston_pusher_top.png",
+ "mesecons_piston_pusher_bottom.png",
+ "mesecons_piston_pusher_left.png",
+ "mesecons_piston_pusher_right.png",
+ "mesecons_piston_pusher_back.png",
+ "mesecons_piston_pusher_front_sticky.png"
},
paramtype = "light",
paramtype2 = "facedir",
diggable = false,
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.2, -0.2, -0.3, 0.2, 0.2, 0.5},
- {-0.5, -0.5, -0.5, 0.5, 0.5, -0.3},
- },
- },
- node_box = {
- type = "fixed",
- fixed = {
- {-0.2, -0.2, -0.3, 0.2, 0.2, 0.5},
- {-0.5, -0.5, -0.5, 0.5, 0.5, -0.3},
- },
- },
+ corresponding_piston = "mesecons_pistons:piston_sticky_on",
+ selection_box = piston_pusher_box,
+ node_box = piston_pusher_box,
})
-mesecon:register_mvps_stopper("mesecons_pistons:piston_pusher_normal")
-mesecon:register_mvps_stopper("mesecons_pistons:piston_pusher_sticky")
+--
+--
+-- UP
+--
+--
+
+local piston_up_pusher_box = {
+ type = "fixed",
+ fixed = {
+ {-2/16, -.5 - pt, -2/16, 2/16, .5, 2/16},
+ {-.5 , .5 - pt, -.5 , .5 , .5, .5},
+ }
+}
---up pistons
-minetest.register_node("mesecons_pistons:piston_up_normal", {
- tiles = {"jeija_piston_side.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png"},
- groups = {cracky=3, mesecon=2},
- after_destruct = destruct,
- on_timer = timer,
+local piston_up_on_box = {
+ type = "fixed",
+ fixed = {
+ {-.5, -.5, -.5 , .5, .5-pt, .5}
+ }
+}
+
+-- Normal
+
+local pistonspec_normal_up = {
+ offname = "mesecons_pistons:piston_up_normal_off",
+ onname = "mesecons_pistons:piston_up_normal_on",
+ dir = {x = 0, y = 1, z = 0},
+ pusher = "mesecons_pistons:piston_up_pusher_normal"
+}
+
+-- offstate
+minetest.register_node("mesecons_pistons:piston_up_normal_off", {
+ tiles = {
+ "mesecons_piston_pusher_front.png",
+ "mesecons_piston_back.png",
+ "mesecons_piston_left.png^[transformR270",
+ "mesecons_piston_right.png^[transformR90",
+ "mesecons_piston_bottom.png",
+ "mesecons_piston_top.png^[transformR180",
+ },
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ paramtype2 = "facedir",
+ drop = {"mesecons_pistons:piston_normal_off"},
+ mesecons_piston = pistonspec_normal_up,
mesecons = {effector={
- action_change = update
- }},
- drop = "mesecons_pistons:piston_normal",
+ action_on = piston_on,
+ }}
})
-minetest.register_node("mesecons_pistons:piston_up_sticky", {
- tiles = {"jeija_piston_sticky_side.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png"},
- groups = {cracky=3, mesecon=2},
- after_destruct = destruct,
- on_timer = timer,
+-- onstate
+minetest.register_node("mesecons_pistons:piston_up_normal_on", {
+ drawtype = "nodebox",
+ tiles = {
+ "mesecons_piston_on_front.png",
+ "mesecons_piston_back.png",
+ "mesecons_piston_left.png^[transformR270",
+ "mesecons_piston_right.png^[transformR90",
+ "mesecons_piston_bottom.png",
+ "mesecons_piston_top.png^[transformR180",
+ },
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ paramtype = "light",
+ paramtype2 = "facedir",
+ drop = {"mesecons_pistons:piston_normal_off"},
+ after_dig_node = piston_remove_pusher,
+ node_box = piston_up_on_box,
+ selection_box = piston_up_on_box,
+ mesecons_piston = pistonspec_normal_up,
mesecons = {effector={
- action_change = update
- }},
- drop = "mesecons_pistons:piston_sticky",
+ action_off = piston_off,
+ }}
})
+-- pusher
minetest.register_node("mesecons_pistons:piston_up_pusher_normal", {
drawtype = "nodebox",
- tiles = {"jeija_piston_pusher_normal.png"},
+ tiles = {
+ "mesecons_piston_pusher_front.png",
+ "mesecons_piston_pusher_back.png",
+ "mesecons_piston_pusher_left.png^[transformR270",
+ "mesecons_piston_pusher_right.png^[transformR90",
+ "mesecons_piston_pusher_bottom.png",
+ "mesecons_piston_pusher_top.png^[transformR180",
+ },
paramtype = "light",
+ paramtype2 = "facedir",
diggable = false,
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.2, -0.5, -0.2, 0.2, 0.3, 0.2},
- {-0.5, 0.3, -0.5, 0.5, 0.5, 0.5},
+ corresponding_piston = "mesecons_pistons:piston_up_normal_on",
+ selection_box = piston_up_pusher_box,
+ node_box = piston_up_pusher_box,
+})
+
+
+
+-- Sticky
+
+
+local pistonspec_sticky_up = {
+ offname = "mesecons_pistons:piston_up_sticky_off",
+ onname = "mesecons_pistons:piston_up_sticky_on",
+ dir = {x = 0, y = 1, z = 0},
+ pusher = "mesecons_pistons:piston_up_pusher_sticky",
+ sticky = true
+}
+
+-- offstate
+minetest.register_node("mesecons_pistons:piston_up_sticky_off", {
+ tiles = {
+ "mesecons_piston_pusher_front_sticky.png",
+ "mesecons_piston_back.png",
+ "mesecons_piston_left.png^[transformR270",
+ "mesecons_piston_right.png^[transformR90",
+ "mesecons_piston_bottom.png",
+ "mesecons_piston_top.png^[transformR180",
+ "mesecons_piston_tb.png"
},
- },
- node_box = {
- type = "fixed",
- fixed = {
- {-0.2, -0.5, -0.2, 0.2, 0.3, 0.2},
- {-0.5, 0.3, -0.5, 0.5, 0.5, 0.5},
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ paramtype2 = "facedir",
+ drop = {"mesecons_pistons:piston_sticky_off"},
+ mesecons_piston = pistonspec_sticky_up,
+ mesecons = {effector={
+ action_on = piston_on,
+ }}
+})
+
+-- onstate
+minetest.register_node("mesecons_pistons:piston_up_sticky_on", {
+ drawtype = "nodebox",
+ tiles = {
+ "mesecons_piston_on_front.png",
+ "mesecons_piston_back.png",
+ "mesecons_piston_left.png^[transformR270",
+ "mesecons_piston_right.png^[transformR90",
+ "mesecons_piston_bottom.png",
+ "mesecons_piston_top.png^[transformR180",
},
- },
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ paramtype = "light",
+ paramtype2 = "facedir",
+ drop = {"mesecons_pistons:piston_normal_off"},
+ after_dig_node = piston_remove_pusher,
+ node_box = piston_up_on_box,
+ selection_box = piston_up_on_box,
+ mesecons_piston = pistonspec_sticky_up,
+ mesecons = {effector={
+ action_off = piston_off,
+ }}
})
+-- pusher
minetest.register_node("mesecons_pistons:piston_up_pusher_sticky", {
drawtype = "nodebox",
tiles = {
- "jeija_piston_pusher_sticky.png",
- "jeija_piston_pusher_normal.png",
- "jeija_piston_pusher_normal.png",
- "jeija_piston_pusher_normal.png",
- "jeija_piston_pusher_normal.png",
- "jeija_piston_pusher_normal.png"
+ "mesecons_piston_pusher_front_sticky.png",
+ "mesecons_piston_pusher_back.png",
+ "mesecons_piston_pusher_left.png^[transformR270",
+ "mesecons_piston_pusher_right.png^[transformR90",
+ "mesecons_piston_pusher_bottom.png",
+ "mesecons_piston_pusher_top.png^[transformR180",
},
paramtype = "light",
+ paramtype2 = "facedir",
diggable = false,
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.2, -0.5, -0.2, 0.2, 0.3, 0.2},
- {-0.5, 0.3, -0.5, 0.5, 0.5, 0.5},
- },
- },
- node_box = {
- type = "fixed",
- fixed = {
- {-0.2, -0.5, -0.2, 0.2, 0.3, 0.2},
- {-0.5, 0.3, -0.5, 0.5, 0.5, 0.5},
- },
- },
+ corresponding_piston = "mesecons_pistons:piston_up_sticky_on",
+ selection_box = piston_up_pusher_box,
+ node_box = piston_up_pusher_box,
})
-mesecon:register_mvps_stopper("mesecons_pistons:piston_up_pusher_normal")
-mesecon:register_mvps_stopper("mesecons_pistons:piston_up_pusher_sticky")
+--
+--
+-- DOWN
+--
+--
+
+local piston_down_pusher_box = {
+ type = "fixed",
+ fixed = {
+ {-2/16, -.5, -2/16, 2/16, .5 + pt, 2/16},
+ {-.5 , -.5, -.5 , .5 , -.5 + pt, .5},
+ }
+}
+
+local piston_down_on_box = {
+ type = "fixed",
+ fixed = {
+ {-.5, -.5+pt, -.5 , .5, .5, .5}
+ }
+}
---down pistons
-minetest.register_node("mesecons_pistons:piston_down_normal", {
- tiles = {"jeija_piston_tb.png", "jeija_piston_side.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png"},
- groups = {cracky=3, mesecon=2},
- after_destruct = destruct,
- on_timer = timer,
+
+
+-- Normal
+
+local pistonspec_normal_down = {
+ offname = "mesecons_pistons:piston_down_normal_off",
+ onname = "mesecons_pistons:piston_down_normal_on",
+ dir = {x = 0, y = -1, z = 0},
+ pusher = "mesecons_pistons:piston_down_pusher_normal",
+}
+
+-- offstate
+minetest.register_node("mesecons_pistons:piston_down_normal_off", {
+ tiles = {
+ "mesecons_piston_back.png",
+ "mesecons_piston_pusher_front.png",
+ "mesecons_piston_left.png^[transformR90",
+ "mesecons_piston_right.png^[transformR270",
+ "mesecons_piston_bottom.png^[transformR180",
+ "mesecons_piston_top.png",
+ },
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ paramtype2 = "facedir",
+ drop = {"mesecons_pistons:piston_normal_off"},
+ mesecons_piston = pistonspec_normal_down,
mesecons = {effector={
- action_change = update
- }},
- drop = "mesecons_pistons:piston_normal",
+ action_on = piston_on,
+ }}
})
-minetest.register_node("mesecons_pistons:piston_down_sticky", {
- tiles = {"jeija_piston_tb.png", "jeija_piston_sticky_side.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png"},
- groups = {cracky=3, mesecon=2},
- after_destruct = destruct,
- on_timer = timer,
+-- onstate
+minetest.register_node("mesecons_pistons:piston_down_normal_on", {
+ drawtype = "nodebox",
+ tiles = {
+ "mesecons_piston_back.png",
+ "mesecons_piston_on_front.png",
+ "mesecons_piston_left.png^[transformR90",
+ "mesecons_piston_right.png^[transformR270",
+ "mesecons_piston_bottom.png^[transformR180",
+ "mesecons_piston_top.png",
+ },
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ paramtype = "light",
+ paramtype2 = "facedir",
+ drop = {"mesecons_pistons:piston_normal_off"},
+ after_dig_node = piston_remove_pusher,
+ node_box = piston_down_on_box,
+ selection_box = piston_down_on_box,
+ mesecons_piston = pistonspec_normal_down,
mesecons = {effector={
- action_change = update
- }},
- drop = "mesecons_pistons:piston_sticky",
+ action_off = piston_off,
+ }}
})
+-- pusher
minetest.register_node("mesecons_pistons:piston_down_pusher_normal", {
drawtype = "nodebox",
- tiles = {"jeija_piston_pusher_normal.png"},
+ tiles = {
+ "mesecons_piston_pusher_back.png",
+ "mesecons_piston_pusher_front.png",
+ "mesecons_piston_pusher_left.png^[transformR90",
+ "mesecons_piston_pusher_right.png^[transformR270",
+ "mesecons_piston_pusher_bottom.png^[transformR180",
+ "mesecons_piston_pusher_top.png",
+ },
paramtype = "light",
+ paramtype2 = "facedir",
diggable = false,
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.2, -0.3, -0.2, 0.2, 0.5, 0.2},
- {-0.5, -0.5, -0.5, 0.5, -0.3, 0.5},
+ corresponding_piston = "mesecons_pistons:piston_down_normal_on",
+ selection_box = piston_down_pusher_box,
+ node_box = piston_down_pusher_box,
+})
+
+-- Sticky
+
+local pistonspec_sticky_down = {
+ onname = "mesecons_pistons:piston_down_sticky_on",
+ offname = "mesecons_pistons:piston_down_sticky_off",
+ dir = {x = 0, y = -1, z = 0},
+ pusher = "mesecons_pistons:piston_down_pusher_sticky",
+ sticky = true
+}
+
+-- offstate
+minetest.register_node("mesecons_pistons:piston_down_sticky_off", {
+ tiles = {
+ "mesecons_piston_back.png",
+ "mesecons_piston_pusher_front_sticky.png",
+ "mesecons_piston_left.png^[transformR90",
+ "mesecons_piston_right.png^[transformR270",
+ "mesecons_piston_bottom.png^[transformR180",
+ "mesecons_piston_top.png",
},
- },
- node_box = {
- type = "fixed",
- fixed = {
- {-0.2, -0.3, -0.2, 0.2, 0.5, 0.2},
- {-0.5, -0.5, -0.5, 0.5, -0.3, 0.5},
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ paramtype2 = "facedir",
+ drop = {"mesecons_pistons:piston_sticky_off"},
+ mesecons_piston = pistonspec_sticky_down,
+ mesecons = {effector={
+ action_on = piston_on,
+ }}
+})
+
+-- onstate
+minetest.register_node("mesecons_pistons:piston_down_sticky_on", {
+ drawtype = "nodebox",
+ tiles = {
+ "mesecons_piston_back.png",
+ "mesecons_piston_on_front.png",
+ "mesecons_piston_left.png^[transformR90",
+ "mesecons_piston_right.png^[transformR270",
+ "mesecons_piston_bottom.png^[transformR180",
+ "mesecons_piston_top.png",
},
- },
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ paramtype = "light",
+ paramtype2 = "facedir",
+ drop = {"mesecons_pistons:piston_sticky_off"},
+ after_dig_node = piston_remove_pusher,
+ node_box = piston_down_on_box,
+ selection_box = piston_down_on_box,
+ mesecons_piston = pistonspec_sticky_down,
+ mesecons = {effector={
+ action_off = piston_off,
+ }}
})
+-- pusher
minetest.register_node("mesecons_pistons:piston_down_pusher_sticky", {
drawtype = "nodebox",
tiles = {
- "jeija_piston_pusher_normal.png",
- "jeija_piston_pusher_sticky.png",
- "jeija_piston_pusher_normal.png",
- "jeija_piston_pusher_normal.png",
- "jeija_piston_pusher_normal.png",
- "jeija_piston_pusher_normal.png"
+ "mesecons_piston_pusher_back.png",
+ "mesecons_piston_pusher_front_sticky.png",
+ "mesecons_piston_pusher_left.png^[transformR90",
+ "mesecons_piston_pusher_right.png^[transformR270",
+ "mesecons_piston_pusher_bottom.png^[transformR180",
+ "mesecons_piston_pusher_top.png",
},
paramtype = "light",
+ paramtype2 = "facedir",
diggable = false,
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.2, -0.3, -0.2, 0.2, 0.5, 0.2},
- {-0.5, -0.5, -0.5, 0.5, -0.3, 0.5},
- },
- },
- node_box = {
- type = "fixed",
- fixed = {
- {-0.2, -0.3, -0.2, 0.2, 0.5, 0.2},
- {-0.5, -0.5, -0.5, 0.5, -0.3, 0.5},
- },
- },
+ corresponding_piston = "mesecons_pistons:piston_down_sticky_on",
+ selection_box = piston_down_pusher_box,
+ node_box = piston_down_pusher_box,
})
-mesecon:register_mvps_stopper("mesecons_pistons:piston_down_pusher_normal")
-mesecon:register_mvps_stopper("mesecons_pistons:piston_down_pusher_sticky")
+
+-- Register pushers as stoppers if they would be seperated from the piston
+local piston_pusher_get_stopper = function (node, dir, stack, stackid)
+ if (stack[stackid + 1]
+ and stack[stackid + 1].node.name == minetest.registered_nodes[node.name].corresponding_piston
+ and stack[stackid + 1].node.param2 == node.param2)
+ or (stack[stackid - 1]
+ and stack[stackid - 1].node.name == minetest.registered_nodes[node.name].corresponding_piston
+ and stack[stackid - 1].node.param2 == node.param2) then
+ return false
+ end
+ return true
+end
+
+local piston_pusher_up_down_get_stopper = function (node, dir, stack, stackid)
+ if (stack[stackid + 1]
+ and stack[stackid + 1].node.name == minetest.registered_nodes[node.name].corresponding_piston)
+ or (stack[stackid - 1]
+ and stack[stackid - 1].node.name == minetest.registered_nodes[node.name].corresponding_piston) then
+ return false
+ end
+ return true
+end
+
+mesecon:register_mvps_stopper("mesecons_pistons:piston_pusher_normal", piston_pusher_get_stopper)
+mesecon:register_mvps_stopper("mesecons_pistons:piston_pusher_sticky", piston_pusher_get_stopper)
+
+mesecon:register_mvps_stopper("mesecons_pistons:piston_up_pusher_normal", piston_pusher_up_down_get_stopper)
+mesecon:register_mvps_stopper("mesecons_pistons:piston_up_pusher_sticky", piston_pusher_up_down_get_stopper)
+
+mesecon:register_mvps_stopper("mesecons_pistons:piston_down_pusher_normal", piston_pusher_up_down_get_stopper)
+mesecon:register_mvps_stopper("mesecons_pistons:piston_down_pusher_sticky", piston_pusher_up_down_get_stopper)
+
+
+-- Register pistons as stoppers if they would be seperated from the stopper
+local piston_up_down_get_stopper = function (node, dir, stack, stackid)
+ if (stack[stackid + 1]
+ and stack[stackid + 1].node.name == minetest.registered_nodes[node.name].mesecons_piston.pusher)
+ or (stack[stackid - 1]
+ and stack[stackid - 1].node.name == minetest.registered_nodes[node.name].mesecons_piston.pusher) then
+ return false
+ end
+ return true
+end
+
+local piston_get_stopper = function (node, dir, stack, stackid)
+ pistonspec = minetest.registered_nodes[node.name].mesecons_piston
+ dir = piston_get_direction(pistonspec.dir, node)
+ local pusherpos = mesecon:addPosRule(stack[stackid].pos, dir)
+ local pushernode = minetest.env:get_node(pusherpos)
+
+ if minetest.registered_nodes[node.name].mesecons_piston.pusher == pushernode.name then
+ for _, s in ipairs(stack) do
+ if mesecon:cmpPos(s.pos, pusherpos) -- pusher is also to be pushed
+ and s.node.param2 == node.param2 then
+ return false
+ end
+ end
+ end
+ return true
+end
+
+mesecon:register_mvps_stopper("mesecons_pistons:piston_normal_on", piston_get_stopper)
+mesecon:register_mvps_stopper("mesecons_pistons:piston_sticky_on", piston_get_stopper)
+
+mesecon:register_mvps_stopper("mesecons_pistons:piston_up_normal_on", piston_up_down_get_stopper)
+mesecon:register_mvps_stopper("mesecons_pistons:piston_up_sticky_on", piston_up_down_get_stopper)
+
+mesecon:register_mvps_stopper("mesecons_pistons:piston_down_normal_on", piston_up_down_get_stopper)
+mesecon:register_mvps_stopper("mesecons_pistons:piston_down_sticky_on", piston_up_down_get_stopper)
--craft recipes
minetest.register_craft({
diff --git a/mesecons_pressureplates/init.lua b/mesecons_pressureplates/init.lua
index 2e88d2f..2e80edb 100644
--- a/mesecons_pressureplates/init.lua
+++ b/mesecons_pressureplates/init.lua
@@ -1,159 +1,113 @@
--- PRESSURE PLATE WOOD
+local pp_box_off = {
+ type = "fixed",
+ fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
+}
-minetest.register_node("mesecons_pressureplates:pressure_plate_wood_off", {
- drawtype = "nodebox",
- tiles = {"jeija_pressure_plate_wood_off.png"},
- inventory_image = "jeija_pressure_plate_wood_off.png",
- wield_image = "jeija_pressure_plate_wood_off.png",
- paramtype = "light",
- is_ground_content = true,
- walkable = true,
- selection_box = {
- type = "fixed",
- fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
- },
- node_box = {
- type = "fixed",
- fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
- },
- groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3, mesecon = 2},
- description="Wood Pressure Plate",
-
- on_timer = function(pos, elapsed)
- local objs = minetest.env:get_objects_inside_radius(pos, 1)
- for k, obj in pairs(objs) do
- local objpos=obj:getpos()
- if objpos.y>pos.y-1 and objpos.y<pos.y then
- minetest.env:add_node(pos, {name="mesecons_pressureplates:pressure_plate_wood_on"})
- mesecon:receptor_on(pos)
- end
- end
- return true
- end,
-
- on_construct = function(pos)
- minetest.env:get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL)
- end,
-})
+local pp_box_on = {
+ type = "fixed",
+ fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
+}
-minetest.register_node("mesecons_pressureplates:pressure_plate_wood_on", {
- drawtype = "nodebox",
- tiles = {"jeija_pressure_plate_wood_on.png"},
- paramtype = "light",
- is_ground_content = true,
- walkable = true,
- selection_box = {
- type = "fixed",
- fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
- },
- node_box = {
- type = "fixed",
- fixed = { -7/16, -8/16, -7/16, 7/16, -31/64, 7/16 },
- },
- groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3,not_in_creative_inventory=1, mesecon = 2},
- drop='"mesecons_pressureplates:pressure_plate_wood_off" 1',
-
- on_timer = function(pos, elapsed)
- local objs = minetest.env:get_objects_inside_radius(pos, 1)
- if objs[1]==nil then
- minetest.env:add_node(pos, {name="mesecons_pressureplates:pressure_plate_wood_off"})
- mesecon:receptor_off(pos)
- end
- return true
- end,
-
- on_construct = function(pos)
- minetest.env:get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL)
- end,
-})
+pp_on_timer = function (pos, elapsed)
+ local node = minetest.env:get_node(pos)
+ local ppspec = minetest.registered_nodes[node.name].pressureplate
-minetest.register_craft({
- output = '"mesecons_pressureplates:pressure_plate_wood_off" 1',
- recipe = {
- {'"default:wood"', '"default:wood"'},
- }
-})
+ -- This is a workaround for a strange bug that occurs when the server is started
+ -- For some reason the first time on_timer is called, the pos is wrong
+ if not ppspec then return end
--- PRESSURE PLATE STONE
+ local objs = minetest.env:get_objects_inside_radius(pos, 1)
-minetest.register_node("mesecons_pressureplates:pressure_plate_stone_off", {
- drawtype = "nodebox",
- tiles = {"jeija_pressure_plate_stone_off.png"},
- inventory_image = "jeija_pressure_plate_stone_off.png",
- wield_image = "jeija_pressure_plate_stone_off.png",
- paramtype = "light",
- is_ground_content = true,
- walkable = true,
- selection_box = {
- type = "fixed",
- fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
- },
- node_box = {
- type = "fixed",
- fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
- },
- groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3},
- description="Stone Pressure Plate",
-
- on_timer = function(pos, elapsed)
- local objs = minetest.env:get_objects_inside_radius(pos, 1)
+ if objs[1] == nil and node.name == ppspec.onstate then
+ minetest.env:add_node(pos, {name = ppspec.offstate})
+ mesecon:receptor_off(pos)
+ -- force deactivation of mesecon two blocks below (hacky)
+ mesecon:turnoff(mesecon:addPosRule(pos, {x = 0, y = -2, z = 0}))
+ else
for k, obj in pairs(objs) do
- local objpos=obj:getpos()
- if objpos.y>pos.y-1 and objpos.y<pos.y then
- minetest.env:add_node(pos, {name="mesecons_pressureplates:pressure_plate_stone_on"})
+ local objpos = obj:getpos()
+ if objpos.y > pos.y-1 and objpos.y < pos.y then
+ minetest.env:add_node(pos, {name=ppspec.onstate})
mesecon:receptor_on(pos)
+ -- force activation of mesecon two blocks below (hacky)
+ mesecon:turnon(mesecon:addPosRule(pos, {x = 0, y = -2, z = 0}))
end
end
- return true
- end,
-
- on_construct = function(pos)
- minetest.env:get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL)
- end,
+ end
+ return true
+end
- mesecons = {receptor = {
- state = mesecon.state.off
- }}
-})
+-- Register a Pressure Plate
+-- offstate: name of the pressure plate when inactive
+-- onstate: name of the pressure plate when active
+-- description: description displayed in the player's inventory
+-- tiles_off: textures of the pressure plate when inactive
+-- tiles_on: textures of the pressure plate when active
+-- image: inventory and wield image of the pressure plate
+-- recipe: crafting recipe of the pressure plate
-minetest.register_node("mesecons_pressureplates:pressure_plate_stone_on", {
- drawtype = "nodebox",
- tiles = {"jeija_pressure_plate_stone_on.png"},
- paramtype = "light",
- is_ground_content = true,
- walkable = true,
- selection_box = {
- type = "fixed",
- fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
- },
- node_box = {
- type = "fixed",
- fixed = { -7/16, -8/16, -7/16, 7/16, -31/64, 7/16 },
- },
- groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3,not_in_creative_inventory=1},
- drop='"mesecons_pressureplates:pressure_plate_stone_off" 1',
-
- on_timer = function(pos, elapsed)
- local objs = minetest.env:get_objects_inside_radius(pos, 1)
- if objs[1]==nil then
- minetest.env:add_node(pos, {name="mesecons_pressureplates:pressure_plate_stone_off"})
- mesecon:receptor_off(pos)
- end
- return true
- end,
-
- on_construct = function(pos)
- minetest.env:get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL)
- end,
+function mesecon:register_pressure_plate(offstate, onstate, description, texture_off, texture_on, recipe)
+ local ppspec = {
+ offstate = offstate,
+ onstate = onstate
+ }
- mesecons = {receptor = {
- state = mesecon.state.off
- }}
-})
+ minetest.register_node(offstate, {
+ drawtype = "nodebox",
+ tiles = {texture_off},
+ inventory_image = texture_off,
+ wield_image = image,
+ paramtype = "light",
+ selection_box = pp_box_off,
+ node_box = pp_box_off,
+ groups = {snappy = 2, oddly_breakable_by_hand = 3},
+ description = description,
+ pressureplate = ppspec,
+ on_timer = pp_on_timer,
+ mesecons = {receptor = {
+ state = mesecon.state.off
+ }},
+ on_construct = function(pos)
+ minetest.env:get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL)
+ end,
+ })
-minetest.register_craft({
- output = '"mesecons_pressureplates:pressure_plate_stone_off" 1',
- recipe = {
- {'"default:cobble"', '"default:cobble"'},
- }
-})
+ minetest.register_node(onstate, {
+ drawtype = "nodebox",
+ tiles = {texture_on},
+ paramtype = "light",
+ selection_box = pp_box_on,
+ node_box = pp_box_on,
+ groups = {snappy = 2, oddly_breakable_by_hand = 3, not_in_creative_inventory = 1},
+ drop = offstate,
+ pressureplate = ppspec,
+ on_timer = pp_on_timer,
+ mesecons = {receptor = {
+ state = mesecon.state.on
+ }},
+ on_construct = function(pos)
+ minetest.env:get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL)
+ end,
+ })
+
+ minetest.register_craft({
+ output = offstate,
+ recipe = recipe,
+ })
+end
+
+mesecon:register_pressure_plate(
+ "mesecons_pressureplates:pressure_plate_wood_off",
+ "mesecons_pressureplates:pressure_plate_wood_on",
+ "Wooden Pressure Plate",
+ "jeija_pressure_plate_wood_off.png",
+ "jeija_pressure_plate_wood_on.png",
+ {{"default:wood", "default:wood"}})
+
+mesecon:register_pressure_plate(
+ "mesecons_pressureplates:pressure_plate_stone_off",
+ "mesecons_pressureplates:pressure_plate_stone_on",
+ "Stone Pressure Plate",
+ "jeija_pressure_plate_stone_off.png",
+ "jeija_pressure_plate_stone_on.png",
+ {{"default:cobble", "default:cobble"}})
diff --git a/mesecons_textures/textures/jeija_insulated_wire_curved_tb_off.png b/mesecons_textures/textures/jeija_insulated_wire_curved_tb_off.png
new file mode 100644
index 0000000..85ca90b
--- /dev/null
+++ b/mesecons_textures/textures/jeija_insulated_wire_curved_tb_off.png
Binary files differ
diff --git a/mesecons_textures/textures/jeija_insulated_wire_curved_tb_on.png b/mesecons_textures/textures/jeija_insulated_wire_curved_tb_on.png
new file mode 100644
index 0000000..772d9a6
--- /dev/null
+++ b/mesecons_textures/textures/jeija_insulated_wire_curved_tb_on.png
Binary files differ
diff --git a/mesecons_textures/textures/jeija_insulated_wire_ends_off.png b/mesecons_textures/textures/jeija_insulated_wire_ends_off.png
index accb72a..1fb4782 100644
--- a/mesecons_textures/textures/jeija_insulated_wire_ends_off.png
+++ b/mesecons_textures/textures/jeija_insulated_wire_ends_off.png
Binary files differ
diff --git a/mesecons_textures/textures/jeija_insulated_wire_ends_on.png b/mesecons_textures/textures/jeija_insulated_wire_ends_on.png
index 8148edd..91736ed 100644
--- a/mesecons_textures/textures/jeija_insulated_wire_ends_on.png
+++ b/mesecons_textures/textures/jeija_insulated_wire_ends_on.png
Binary files differ
diff --git a/mesecons_textures/textures/jeija_insulated_wire_sides.png b/mesecons_textures/textures/jeija_insulated_wire_sides_off.png
index db33f14..db33f14 100644
--- a/mesecons_textures/textures/jeija_insulated_wire_sides.png
+++ b/mesecons_textures/textures/jeija_insulated_wire_sides_off.png
Binary files differ
diff --git a/mesecons_textures/textures/jeija_insulated_wire_sides_on.png b/mesecons_textures/textures/jeija_insulated_wire_sides_on.png
new file mode 100644
index 0000000..f76e9a8
--- /dev/null
+++ b/mesecons_textures/textures/jeija_insulated_wire_sides_on.png
Binary files differ
diff --git a/mesecons_textures/textures/jeija_insulated_wire_tjunction_tb_off.png b/mesecons_textures/textures/jeija_insulated_wire_tjunction_tb_off.png
new file mode 100644
index 0000000..a897b29
--- /dev/null
+++ b/mesecons_textures/textures/jeija_insulated_wire_tjunction_tb_off.png
Binary files differ
diff --git a/mesecons_textures/textures/jeija_insulated_wire_tjunction_tb_on.png b/mesecons_textures/textures/jeija_insulated_wire_tjunction_tb_on.png
new file mode 100644
index 0000000..8fc312b
--- /dev/null
+++ b/mesecons_textures/textures/jeija_insulated_wire_tjunction_tb_on.png
Binary files differ
diff --git a/mesecons_textures/textures/jeija_piston_pusher_normal.png b/mesecons_textures/textures/jeija_piston_pusher_normal.png
deleted file mode 100644
index d4a3525..0000000
--- a/mesecons_textures/textures/jeija_piston_pusher_normal.png
+++ /dev/null
Binary files differ
diff --git a/mesecons_textures/textures/jeija_piston_pusher_sticky.png b/mesecons_textures/textures/jeija_piston_pusher_sticky.png
deleted file mode 100644
index 971150c..0000000
--- a/mesecons_textures/textures/jeija_piston_pusher_sticky.png
+++ /dev/null
Binary files differ
diff --git a/mesecons_textures/textures/jeija_piston_side.png b/mesecons_textures/textures/jeija_piston_side.png
deleted file mode 100644
index 7ae047c..0000000
--- a/mesecons_textures/textures/jeija_piston_side.png
+++ /dev/null
Binary files differ
diff --git a/mesecons_textures/textures/jeija_piston_sticky_side.png b/mesecons_textures/textures/jeija_piston_sticky_side.png
deleted file mode 100644
index 544da97..0000000
--- a/mesecons_textures/textures/jeija_piston_sticky_side.png
+++ /dev/null
Binary files differ
diff --git a/mesecons_textures/textures/jeija_piston_tb.png b/mesecons_textures/textures/jeija_piston_tb.png
deleted file mode 100644
index 43751e0..0000000
--- a/mesecons_textures/textures/jeija_piston_tb.png
+++ /dev/null
Binary files differ
diff --git a/mesecons_textures/textures/mesecons_piston_back.png b/mesecons_textures/textures/mesecons_piston_back.png
new file mode 100644
index 0000000..6a57dce
--- /dev/null
+++ b/mesecons_textures/textures/mesecons_piston_back.png
Binary files differ
diff --git a/mesecons_textures/textures/mesecons_piston_bottom.png b/mesecons_textures/textures/mesecons_piston_bottom.png
new file mode 100644
index 0000000..5a3af9b
--- /dev/null
+++ b/mesecons_textures/textures/mesecons_piston_bottom.png
Binary files differ
diff --git a/mesecons_textures/textures/mesecons_piston_left.png b/mesecons_textures/textures/mesecons_piston_left.png
new file mode 100644
index 0000000..215dd73
--- /dev/null
+++ b/mesecons_textures/textures/mesecons_piston_left.png
Binary files differ
diff --git a/mesecons_textures/textures/mesecons_piston_on_front.png b/mesecons_textures/textures/mesecons_piston_on_front.png
new file mode 100644
index 0000000..0ade67e
--- /dev/null
+++ b/mesecons_textures/textures/mesecons_piston_on_front.png
Binary files differ
diff --git a/mesecons_textures/textures/mesecons_piston_pusher_back.png b/mesecons_textures/textures/mesecons_piston_pusher_back.png
new file mode 100644
index 0000000..fe87943
--- /dev/null
+++ b/mesecons_textures/textures/mesecons_piston_pusher_back.png
Binary files differ
diff --git a/mesecons_textures/textures/mesecons_piston_pusher_bottom.png b/mesecons_textures/textures/mesecons_piston_pusher_bottom.png
new file mode 100644
index 0000000..87c4e81
--- /dev/null
+++ b/mesecons_textures/textures/mesecons_piston_pusher_bottom.png
Binary files differ
diff --git a/mesecons_textures/textures/mesecons_piston_pusher_front.png b/mesecons_textures/textures/mesecons_piston_pusher_front.png
new file mode 100644
index 0000000..8ec9dc6
--- /dev/null
+++ b/mesecons_textures/textures/mesecons_piston_pusher_front.png
Binary files differ
diff --git a/mesecons_textures/textures/mesecons_piston_pusher_front_sticky.png b/mesecons_textures/textures/mesecons_piston_pusher_front_sticky.png
new file mode 100644
index 0000000..e38b4e6
--- /dev/null
+++ b/mesecons_textures/textures/mesecons_piston_pusher_front_sticky.png
Binary files differ
diff --git a/mesecons_textures/textures/mesecons_piston_pusher_left.png b/mesecons_textures/textures/mesecons_piston_pusher_left.png
new file mode 100644
index 0000000..bc5495b
--- /dev/null
+++ b/mesecons_textures/textures/mesecons_piston_pusher_left.png
Binary files differ
diff --git a/mesecons_textures/textures/mesecons_piston_pusher_right.png b/mesecons_textures/textures/mesecons_piston_pusher_right.png
new file mode 100644
index 0000000..32ee32f
--- /dev/null
+++ b/mesecons_textures/textures/mesecons_piston_pusher_right.png
Binary files differ
diff --git a/mesecons_textures/textures/mesecons_piston_pusher_top.png b/mesecons_textures/textures/mesecons_piston_pusher_top.png
new file mode 100644
index 0000000..72f04e9
--- /dev/null
+++ b/mesecons_textures/textures/mesecons_piston_pusher_top.png
Binary files differ
diff --git a/mesecons_textures/textures/mesecons_piston_right.png b/mesecons_textures/textures/mesecons_piston_right.png
new file mode 100644
index 0000000..176463c
--- /dev/null
+++ b/mesecons_textures/textures/mesecons_piston_right.png
Binary files differ
diff --git a/mesecons_textures/textures/mesecons_piston_top.png b/mesecons_textures/textures/mesecons_piston_top.png
new file mode 100644
index 0000000..5c8bace
--- /dev/null
+++ b/mesecons_textures/textures/mesecons_piston_top.png
Binary files differ
diff --git a/mesecons_textures/textures/wires_full_off.png b/mesecons_textures/textures/wires_full_off.png
new file mode 100644
index 0000000..58164fa
--- /dev/null
+++ b/mesecons_textures/textures/wires_full_off.png
Binary files differ
diff --git a/mesecons_textures/textures/wires_full_on.png b/mesecons_textures/textures/wires_full_on.png
new file mode 100644
index 0000000..98a86c8
--- /dev/null
+++ b/mesecons_textures/textures/wires_full_on.png
Binary files differ
diff --git a/mesecons_torch/init.lua b/mesecons_torch/init.lua
index 8b9a59b..801220e 100644
--- a/mesecons_torch/init.lua
+++ b/mesecons_torch/init.lua
@@ -1,53 +1,54 @@
--MESECON TORCHES
-local torch_get_rules = function(node)
- local rules = {
- {x=1, y=0, z=0},
- {x=0, y=0, z=1},
- {x=0, y=0, z=-1},
- {x=0, y=1, z=0},
- {x=0, y=-1, z=0}}
- if node.param2 == 5 then
- rules=mesecon:rotate_rules_right(rules)
- elseif node.param2 == 2 then
- rules=mesecon:rotate_rules_right(mesecon:rotate_rules_right(rules)) --180 degrees
- elseif node.param2 == 4 then
- rules=mesecon:rotate_rules_left(rules)
- elseif node.param2 == 1 then
- rules=mesecon:rotate_rules_down(rules)
- elseif node.param2 == 0 then
- rules=mesecon:rotate_rules_up(rules)
+local rotate_torch_rules = function (rules, param2)
+ if param2 == 5 then
+ return mesecon:rotate_rules_right(rules)
+ elseif param2 == 2 then
+ return mesecon:rotate_rules_right(mesecon:rotate_rules_right(rules)) --180 degrees
+ elseif param2 == 4 then
+ return mesecon:rotate_rules_left(rules)
+ elseif param2 == 1 then
+ return mesecon:rotate_rules_down(rules)
+ elseif param2 == 0 then
+ return mesecon:rotate_rules_up(rules)
+ else
+ return rules
end
- return rules
+end
+
+local torch_get_output_rules = function(node)
+ local rules = {
+ {x = 1, y = 0, z = 0},
+ {x = 0, y = 0, z = 1},
+ {x = 0, y = 0, z =-1},
+ {x = 0, y = 1, z = 0},
+ {x = 0, y =-1, z = 0}}
+
+ return rotate_torch_rules(rules, node.param2)
end
local torch_get_input_rules = function(node)
- local rules = {x=0, y=0, z=0}
+ local rules = {{x = -2, y = 0, z = 0},
+ {x = -1, y = 1, z = 0}}
- if node.param2 == 4 then
- rules.z = -2
- elseif node.param2 == 2 then
- rules.x = -2
- elseif node.param2 == 5 then
- rules.z = 2
- elseif node.param2 == 3 then
- rules.x = 2
- elseif node.param2 == 1 then
- rules.y = 2
- elseif node.param2 == 0 then
- rules.y = -2
- end
- return rules
+ return rotate_torch_rules(rules, node.param2)
end
minetest.register_craft({
output = '"mesecons_torch:mesecon_torch_on" 4',
recipe = {
- {"group:mesecon_conductor_craftable"},
- {"default:stick"},
- }
+ {"group:mesecon_conductor_craftable"},
+ {"default:stick"},}
})
+local torch_selectionbox =
+{
+ type = "wallmounted",
+ wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1},
+ wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
+ wall_side = {-0.5, -0.1, -0.1, -0.5+0.6, 0.1, 0.1},
+}
+
minetest.register_node("mesecons_torch:mesecon_torch_off", {
drawtype = "torchlike",
tiles = {"jeija_torches_off.png", "jeija_torches_off_ceiling.png", "jeija_torches_off_side.png"},
@@ -55,19 +56,12 @@ minetest.register_node("mesecons_torch:mesecon_torch_off", {
paramtype = "light",
walkable = false,
paramtype2 = "wallmounted",
- selection_box = {
- type = "wallmounted",
- wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1},
- wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
- wall_side = {-0.5, -0.1, -0.1, -0.5+0.6, 0.1, 0.1},
- },
- legacy_wallmounted = true,
- groups = {dig_immediate=3,not_in_creative_inventory=1},
- drop = '"mesecons_torch:mesecon_torch_on" 1',
- description="Mesecon Torch",
+ selection_box = torch_selectionbox,
+ groups = {dig_immediate = 3, not_in_creative_inventory = 1},
+ drop = "mesecons_torch:mesecon_torch_on",
mesecons = {receptor = {
state = mesecon.state.off,
- rules = torch_get_rules
+ rules = torch_get_output_rules
}}
})
@@ -80,43 +74,39 @@ minetest.register_node("mesecons_torch:mesecon_torch_on", {
sunlight_propagates = true,
walkable = false,
paramtype2 = "wallmounted",
- selection_box = {
- type = "wallmounted",
- wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1},
- wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
- wall_side = {-0.5, -0.1, -0.1, -0.5+0.6, 0.1, 0.1},
- },
- legacy_wallmounted = true,
+ selection_box = torch_selectionbox,
groups = {dig_immediate=3},
light_source = LIGHT_MAX-5,
description="Mesecon Torch",
mesecons = {receptor = {
state = mesecon.state.on,
- rules = torch_get_rules
- }}
+ rules = torch_get_output_rules
+ }},
})
minetest.register_abm({
- nodenames = {"mesecons_torch:mesecon_torch_off","mesecons_torch:mesecon_torch_on"},
- interval = 1,
- chance = 1,
- action = function(pos, node, active_object_count, active_object_count_wider)
- local node = minetest.env:get_node(pos)
- local pa = torch_get_input_rules(node)
+ nodenames = {"mesecons_torch:mesecon_torch_off","mesecons_torch:mesecon_torch_on"},
+ interval = 1,
+ chance = 1,
+ action = function(pos, node)
+ local is_powered = false
+ for _, rule in ipairs(torch_get_input_rules(node)) do
+ local src = mesecon:addPosRule(pos, rule)
+ if mesecon:is_power_on(src) then
+ is_powered = true
+ end
+ end
- local postc = {x=pos.x-pa.x, y=pos.y-pa.y, z=pos.z-pa.z}
- if mesecon:is_power_on(postc) then
- if node.name ~= "mesecons_torch:mesecon_torch_off" then
- minetest.env:add_node(pos, {name="mesecons_torch:mesecon_torch_off",param2=node.param2})
- mesecon:receptor_off(pos, torch_get_rules(node))
- end
- else
- if node.name ~= "mesecons_torch:mesecon_torch_on" then
- minetest.env:add_node(pos, {name="mesecons_torch:mesecon_torch_on",param2=node.param2})
- mesecon:receptor_on(pos, torch_get_rules(node))
- end
- end
- end
+ if is_powered then
+ if node.name == "mesecons_torch:mesecon_torch_on" then
+ mesecon:swap_node(pos, "mesecons_torch:mesecon_torch_off")
+ mesecon:receptor_off(pos, torch_get_output_rules(node))
+ end
+ elseif node.name == "mesecons_torch:mesecon_torch_off" then
+ mesecon:swap_node(pos, "mesecons_torch:mesecon_torch_on")
+ mesecon:receptor_on(pos, torch_get_output_rules(node))
+ end
+ end
})
-- Param2 Table (Block Attached To)