From 1bd936ad8c9e326f9466af66d78c8bda75bfd1c6 Mon Sep 17 00:00:00 2001 From: Carter Kolwey Date: Sun, 25 Dec 2016 23:50:09 -0600 Subject: [PATCH] Properly handle rotation of buttons / levers Buttons and levers can now also be pointed upwards / downwards which will make them connect to corresponding up / down receivers. You will need to use the screwdriver for this. Receivers cannot be rotated using the screwdriver anymore. --- mesecons/presets.lua | 13 ++- mesecons_button/init.lua | 2 + mesecons_receiver/init.lua | 169 +++++++++++++++++++++++++++++------- mesecons_walllever/init.lua | 2 + 4 files changed, 152 insertions(+), 34 deletions(-) diff --git a/mesecons/presets.lua b/mesecons/presets.lua index 2f2f6433..8c3ed67b 100644 --- a/mesecons/presets.lua +++ b/mesecons/presets.lua @@ -41,12 +41,19 @@ mesecon.rules.alldirs = mesecon.rules.buttonlike_get = function(node) local rules = mesecon.rules.buttonlike - if node.param2 == 2 then + local dir = minetest.facedir_to_dir(node.param2) + if dir.x == 1 then + -- No action needed + elseif dir.z == -1 then rules=mesecon.rotate_rules_left(rules) - elseif node.param2 == 3 then + elseif dir.x == -1 then rules=mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules)) - elseif node.param2 == 0 then + elseif dir.z == 1 then rules=mesecon.rotate_rules_right(rules) + elseif dir.y == -1 then + rules=mesecon.rotate_rules_up(rules) + elseif dir.y == 1 then + rules=mesecon.rotate_rules_down(rules) end return rules end diff --git a/mesecons_button/init.lua b/mesecons_button/init.lua index f287d52b..11c328c2 100644 --- a/mesecons_button/init.lua +++ b/mesecons_button/init.lua @@ -26,6 +26,7 @@ minetest.register_node("mesecons_button:button_off", { paramtype2 = "facedir", legacy_wallmounted = true, walkable = false, + on_rotate = mesecon.buttonlike_onrotate, sunlight_propagates = true, selection_box = { type = "fixed", @@ -67,6 +68,7 @@ minetest.register_node("mesecons_button:button_on", { paramtype2 = "facedir", legacy_wallmounted = true, walkable = false, + on_rotate = false, light_source = default.LIGHT_MAX-7, sunlight_propagates = true, selection_box = { diff --git a/mesecons_receiver/init.lua b/mesecons_receiver/init.lua index 9284e57e..a5cf7d54 100644 --- a/mesecons_receiver/init.lua +++ b/mesecons_receiver/init.lua @@ -1,10 +1,30 @@ -rcvboxes = { +local rcvboxes = { { -3/16, -3/16, -8/16 , 3/16, 3/16 , -13/32 }, -- the smaller bump { -1/32, -1/32, -3/2 , 1/32, 1/32 , -1/2 }, -- the wire through the block { -2/32, -1/2 , -.5 , 2/32, 0 , -.5002+3/32 }, -- the vertical wire bit { -2/32, -1/2 , -7/16+0.002 , 2/32, -14/32, 16/32+0.001 } -- the horizontal wire } +local down_rcvboxes = { + {-6/16, -8/16, -6/16, 6/16, -7/16, 6/16}, -- Top plate + {-2/16, -6/16, -2/16, 2/16, -7/16, 2/16}, -- Bump + {-1/16, -8/16, -1/16, 1/16, -24/16, 1/16}, -- Wire through the block + {-1/16, -8/16, 6/16, 1/16, -7/16, 8/16}, -- Plate extension (North) + {-1/16, -8/16, -6/16, 1/16, -7/16, -8/16}, -- Plate extension (South) + {-8/16, -8/16, 1/16, -6/16, -7/16, -1/16}, -- Plate extension (West) + {6/16, -8/16, 1/16, 8/16, -7/16, -1/16}, -- Plate extension (East) +} + +local up_rcvboxes = { + {-6/16, -8/16, -6/16, 6/16, -7/16, 6/16}, -- Top plate + {-2/16, -6/16, -2/16, 2/16, -7/16, 2/16}, -- Bump + {-1/16, -6/16, -1/16, 1/16, 24/16, 1/16}, -- Wire through the block + {-1/16, -8/16, 6/16, 1/16, -7/16, 8/16}, -- Plate extension (North) + {-1/16, -8/16, -6/16, 1/16, -7/16, -8/16}, -- Plate extension (South) + {-8/16, -8/16, 1/16, -6/16, -7/16, -1/16}, -- Plate extension (West) + {6/16, -8/16, 1/16, 8/16, -7/16, -1/16}, -- Plate extension (East) +} + local receiver_get_rules = function (node) local rules = { {x = 1, y = 0, z = 0}, {x = -2, y = 0, z = 0}} @@ -18,8 +38,38 @@ local receiver_get_rules = function (node) return rules end -minetest.register_node("mesecons_receiver:receiver_on", { +mesecon.register_node("mesecons_receiver:receiver", { drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + walkable = false, + on_rotate = false, + selection_box = { + type = "fixed", + fixed = { -3/16, -8/16, -8/16, 3/16, 3/16, 8/16 } + }, + node_box = { + type = "fixed", + fixed = rcvboxes + }, + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "mesecons:wire_00000000_off", +}, { + tiles = { + "receiver_top_off.png", + "receiver_bottom_off.png", + "receiver_lr_off.png", + "receiver_lr_off.png", + "receiver_fb_off.png", + "receiver_fb_off.png", + }, + mesecons = {conductor = { + state = mesecon.state.off, + rules = receiver_get_rules, + onstate = "mesecons_receiver:receiver_on" + }} +}, { tiles = { "receiver_top_on.png", "receiver_bottom_on.png", @@ -28,83 +78,133 @@ minetest.register_node("mesecons_receiver:receiver_on", { "receiver_fb_on.png", "receiver_fb_on.png", }, + mesecons = {conductor = { + state = mesecon.state.on, + rules = receiver_get_rules, + offstate = "mesecons_receiver:receiver_off" + }} +}) + +mesecon.register_node("mesecons_receiver:receiver_up", { + drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, walkable = false, + on_rotate = false, selection_box = { type = "fixed", - fixed = { -3/16, -8/16, -8/16, 3/16, 3/16, 8/16 } + fixed = up_rcvboxes }, node_box = { type = "fixed", - fixed = rcvboxes + fixed = up_rcvboxes }, groups = {dig_immediate = 3, not_in_creative_inventory = 1}, drop = "mesecons:wire_00000000_off", +}, { + tiles = {"mesecons_wire_off.png"}, + mesecons = {conductor = { + state = mesecon.state.off, + 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=0, y=1, z=0}, + {x=0, y=2, z=0}}, + onstate = "mesecons_receiver:receiver_up_on" + }} +}, { + tiles = {"mesecons_wire_on.png"}, mesecons = {conductor = { state = mesecon.state.on, - rules = receiver_get_rules, - offstate = "mesecons_receiver:receiver_off" + 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=0, y=1, z=0}, + {x=0, y=2, z=0}}, + offstate = "mesecons_receiver:receiver_up_off" }} }) -minetest.register_node("mesecons_receiver:receiver_off", { +mesecon.register_node("mesecons_receiver:receiver_down", { drawtype = "nodebox", - description = "You hacker you", - tiles = { - "receiver_top_off.png", - "receiver_bottom_off.png", - "receiver_lr_off.png", - "receiver_lr_off.png", - "receiver_fb_off.png", - "receiver_fb_off.png", - }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, walkable = false, + on_rotate = false, selection_box = { type = "fixed", - fixed = { -3/16, -8/16, -8/16, 3/16, 3/16, 8/16 } + fixed = down_rcvboxes }, node_box = { type = "fixed", - fixed = rcvboxes + fixed = down_rcvboxes }, groups = {dig_immediate = 3, not_in_creative_inventory = 1}, drop = "mesecons:wire_00000000_off", +}, { + tiles = {"mesecons_wire_off.png"}, mesecons = {conductor = { state = mesecon.state.off, - rules = receiver_get_rules, - onstate = "mesecons_receiver:receiver_on" + 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=0, y=-2,z=0}}, + onstate = "mesecons_receiver:receiver_down_on" + }} +}, { + tiles = {"mesecons_wire_on.png"}, + mesecons = {conductor = { + state = mesecon.state.on, + 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=0, y=-2,z=0}}, + offstate = "mesecons_receiver:receiver_down_off" }} }) function mesecon.receiver_get_pos_from_rcpt(pos, param2) local rules = {{x = 2, y = 0, z = 0}} if param2 == nil then param2 = minetest.get_node(pos).param2 end - if param2 == 2 then + local rcvtype = "mesecons_receiver:receiver_off" + local dir = minetest.facedir_to_dir(param2) + + if dir.x == 1 then + -- No action needed + elseif dir.z == -1 then rules = mesecon.rotate_rules_left(rules) - elseif param2 == 3 then + elseif dir.x == -1 then rules = mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules)) - elseif param2 == 0 then + elseif dir.z == 1 then rules = mesecon.rotate_rules_right(rules) + elseif dir.y == -1 then + rules = mesecon.rotate_rules_up(rules) + rcvtype = "mesecons_receiver:receiver_up_off" + elseif dir.y == 1 then + rules = mesecon.rotate_rules_down(rules) + rcvtype = "mesecons_receiver:receiver_down_off" end local np = { x = pos.x + rules[1].x, y = pos.y + rules[1].y, z = pos.z + rules[1].z} - return np + return np, rcvtype end function mesecon.receiver_place(rcpt_pos) local node = minetest.get_node(rcpt_pos) - local pos = mesecon.receiver_get_pos_from_rcpt(rcpt_pos, node.param2) + local pos, rcvtype = mesecon.receiver_get_pos_from_rcpt(rcpt_pos, node.param2) local nn = minetest.get_node(pos) + local param2 = minetest.dir_to_facedir(minetest.facedir_to_dir(node.param2)) if string.find(nn.name, "mesecons:wire_") ~= nil then minetest.dig_node(pos) - minetest.set_node(pos, {name = "mesecons_receiver:receiver_off", param2 = node.param2}) + minetest.set_node(pos, {name = rcvtype, param2 = param2}) mesecon.on_placenode(pos, nn) end end @@ -133,11 +233,13 @@ minetest.register_on_dignode(function(pos, node) end) minetest.register_on_placenode(function (pos, node) - if string.find(node.name, "mesecons:wire_") ~=nil then - local rules = { {x = 2, y = 0, z = 0}, - {x =-2, y = 0, z = 0}, - {x = 0, y = 0, z = 2}, - {x = 0, y = 0, z =-2}} + if string.find(node.name, "mesecons:wire_") ~= nil then + local rules = { {x = 2, y = 0, z = 0}, + {x =-2, y = 0, z = 0}, + {x = 0, y = 0, z = 2}, + {x = 0, y = 0, z =-2}, + {x = 0, y = 2, z = 0}, + {x = 0, y = -2, z = 0}} local i = 1 while rules[i] ~= nil do local np = { x = pos.x + rules[i].x, @@ -150,3 +252,8 @@ minetest.register_on_placenode(function (pos, node) end end end) + +function mesecon.buttonlike_onrotate(pos, node) + minetest.after(0, mesecon.receiver_remove, pos, node) + minetest.after(0, mesecon.receiver_place, pos) +end diff --git a/mesecons_walllever/init.lua b/mesecons_walllever/init.lua index 9ae06555..e9454cd4 100644 --- a/mesecons_walllever/init.lua +++ b/mesecons_walllever/init.lua @@ -31,6 +31,7 @@ mesecon.register_node("mesecons_walllever:wall_lever", { "jeija_wall_lever_back_edges.png" }, mesh="jeija_wall_lever_off.obj", + on_rotate = mesecon.buttonlike_onrotate, mesecons = {receptor = { rules = mesecon.rules.buttonlike_get, state = mesecon.state.off @@ -44,6 +45,7 @@ mesecon.register_node("mesecons_walllever:wall_lever", { "jeija_wall_lever_back_edges.png" }, mesh="jeija_wall_lever_on.obj", + on_rotate = false, mesecons = {receptor = { rules = mesecon.rules.buttonlike_get, state = mesecon.state.on