summaryrefslogtreecommitdiff
path: root/mesecons_pistons
diff options
context:
space:
mode:
authorJeija <norrepli@gmail.com>2012-12-16 11:58:43 +0100
committerJeija <norrepli@gmail.com>2012-12-16 11:58:43 +0100
commita1852204fbc2bd056f3286f316c94076d5fd7e2b (patch)
treed22f0e97a9100088cc0557360b4662a9498ef192 /mesecons_pistons
parentae4bd1e21c2c79f0925beff6a8952a8a2fb16220 (diff)
downloadmesecons-a1852204fbc2bd056f3286f316c94076d5fd7e2b.tar
mesecons-a1852204fbc2bd056f3286f316c94076d5fd7e2b.tar.gz
mesecons-a1852204fbc2bd056f3286f316c94076d5fd7e2b.tar.bz2
mesecons-a1852204fbc2bd056f3286f316c94076d5fd7e2b.tar.xz
mesecons-a1852204fbc2bd056f3286f316c94076d5fd7e2b.zip
Cleanup and improve piston code
Diffstat (limited to 'mesecons_pistons')
-rw-r--r--mesecons_pistons/init.lua89
1 files changed, 51 insertions, 38 deletions
diff --git a/mesecons_pistons/init.lua b/mesecons_pistons/init.lua
index 0eb2b6e..92dbd32 100644
--- a/mesecons_pistons/init.lua
+++ b/mesecons_pistons/init.lua
@@ -1,5 +1,25 @@
--PISTONS
+-- 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
+
--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)
@@ -44,11 +64,12 @@ end
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
+ pos = addPosRule(pos, dir) --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)
@@ -69,10 +90,13 @@ function mesecon:piston_push(pos)
return
end
- checkpos.x, checkpos.y, checkpos.z = checkpos.x + dir.x, checkpos.y + dir.y, checkpos.z + dir.z
+ checkpos = addPosRule(checkpos, dir)
end
- local checknode = minetest.env:get_node(pos)
+ local thisnode = minetest.env:get_node(pos)
+ minetest.env:remove_node(pos)
+ mesecon.on_dignode(pos, thisnode)
+ local nextnode
--add pusher
if node.name == "mesecons_pistons:piston_normal" then
@@ -91,25 +115,15 @@ function mesecon:piston_push(pos)
--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
-
- --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
- end
-
- --update nodes
- for i = 1, count do
- mesecon:updatenode(pos)
+ pos = addPosRule(pos, dir) --move to the next node
+
+ nextnode = minetest.env:get_node(pos)
+ minetest.env:remove_node(pos)
+ mesecon.on_dignode(pos, thisnode)
+ minetest.env:add_node(pos, thisnode)
+ mesecon.on_placenode(pos, thisnode)
+ thisnode = nextnode
nodeupdate(pos)
-
- pos.x, pos.y, pos.z = pos.x - dir.x, pos.y - dir.y, pos.z - dir.z --move to the previous node
end
end
@@ -140,23 +154,17 @@ function mesecon:piston_pull(pos)
--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)
+ if minetest.registered_nodes[node.name].is_sticky_piston then --retract block if piston is sticky
+ local retractpos = addPosRule(pos, dir) --move to the node to be retracted
+ local retractnode = minetest.env:get_node(retractpos)
+ if minetest.registered_nodes[retractnode.name].liquidtype == "none"
+ and not mesecon:is_mvps_stopper(retractnode.name) then
+ mesecon:move_node(retractpos, pos)
+ mesecon.on_dignode(retractpos, retractnode)
+ mesecon.on_placenode(pos, retractnode)
+ nodeupdate(pos)
end
end
- mesecon:updatenode(pos)
- nodeupdate(pos)
end
--push direction of a piston
@@ -208,7 +216,8 @@ minetest.register_node("mesecons_pistons:piston_normal", {
return minetest.item_place(itemstack, placer, pointed_thing) --place piston normally
end,
mesecons = {effector={
- action_change = update
+ action_change = update,
+ rules = piston_get_rules
}}
})
@@ -219,6 +228,7 @@ minetest.register_node("mesecons_pistons:piston_sticky", {
paramtype2 = "facedir",
after_destruct = destruct,
on_timer = timer,
+ is_sticky_piston = true,
on_place = function(itemstack, placer, pointed_thing)
if pointed_thing.type ~= "node" then --can be placed only on nodes
return itemstack
@@ -243,7 +253,8 @@ minetest.register_node("mesecons_pistons:piston_sticky", {
return minetest.item_place(itemstack, placer, pointed_thing) --place piston normally
end,
mesecons = {effector={
- action_change = update
+ action_change = update,
+ rules = piston_get_rules
}}
})
@@ -307,6 +318,7 @@ minetest.register_node("mesecons_pistons:piston_up_normal", {
groups = {cracky=3, mesecon=2},
after_destruct = destruct,
on_timer = timer,
+ is_sticky_piston = true,
mesecons = {effector={
action_change = update
}},
@@ -393,6 +405,7 @@ minetest.register_node("mesecons_pistons:piston_down_sticky", {
groups = {cracky=3, mesecon=2},
after_destruct = destruct,
on_timer = timer,
+ is_sticky_piston = true,
mesecons = {effector={
action_change = update
}},