summaryrefslogtreecommitdiff
path: root/mesecons_pistons
diff options
context:
space:
mode:
Diffstat (limited to 'mesecons_pistons')
-rw-r--r--mesecons_pistons/depends.txt1
-rw-r--r--mesecons_pistons/init.lua897
2 files changed, 569 insertions, 329 deletions
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({