diff options
Diffstat (limited to 'mesecons_pistons')
-rw-r--r-- | mesecons_pistons/init.lua | 89 |
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 }}, |