diff options
author | Jeija <norrepli@gmail.com> | 2012-12-31 18:32:46 +0100 |
---|---|---|
committer | Jeija <norrepli@gmail.com> | 2012-12-31 18:32:46 +0100 |
commit | ec07fc27d7ef76114fd977283c36a20afe26f13f (patch) | |
tree | e8eab0fd457abdd33adaebbd46c4cf77e2fefd1c /mesecons_pistons | |
parent | 5921f6d46caa18310435046a22d5aa0f529998f0 (diff) | |
parent | 52ddd4bdc931a1f806ea581002b0f39ba83158bc (diff) | |
download | mesecons-ec07fc27d7ef76114fd977283c36a20afe26f13f.tar mesecons-ec07fc27d7ef76114fd977283c36a20afe26f13f.tar.gz mesecons-ec07fc27d7ef76114fd977283c36a20afe26f13f.tar.bz2 mesecons-ec07fc27d7ef76114fd977283c36a20afe26f13f.tar.xz mesecons-ec07fc27d7ef76114fd977283c36a20afe26f13f.zip |
Merge branch 'nextgen'
Conflicts:
mesecons/wires.lua
Diffstat (limited to 'mesecons_pistons')
-rw-r--r-- | mesecons_pistons/depends.txt | 1 | ||||
-rw-r--r-- | mesecons_pistons/init.lua | 897 |
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({ |