From 0850314d746c500580f11f7e9a50fad8614b3677 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 10 Mar 2017 11:48:44 -0800 Subject: [PATCH 1/6] luacheck 0.19.0 complains about `unpack()`. --- .luacheckrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.luacheckrc b/.luacheckrc index 6f4fdd2c..fe87fdce 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -8,6 +8,7 @@ read_globals = { "vector", "VoxelManip", "VoxelArea", "PseudoRandom", "ItemStack", + "unpack", -- Silence "accessing undefined field copy of global table". table = { fields = { "copy" } } } From f14b0a6ff5165d2858bd4e4f2586c7eaa29097fe Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Fri, 24 Feb 2017 22:44:52 -0800 Subject: [PATCH 2/6] Screwdriver: allow simple wallmounted rotation. Allows rotating things like signs and torches. Axis rotation rotates over all 6 faces, face rotation flips upside down to flat on floor only, and of course in the 4 horizontal directions. Made the code a bit more modular to account for different rotation schemes. Should be easier to extend from here on to other needs, and the functions can be reused by other mods for convenience. --- mods/screwdriver/init.lua | 42 +++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 383d29cd..696637a0 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -19,6 +19,31 @@ screwdriver.rotate_simple = function(pos, node, user, mode, new_param2) end end +screwdriver.rotate = {} + +screwdriver.rotate.facedir = function(node, mode) + -- Compute param2 + local rotationPart = node.param2 % 32 -- get first 4 bits + local preservePart = node.param2 - rotationPart + local axisdir = math.floor(rotationPart / 4) + local rotation = rotationPart - axisdir * 4 + if mode == screwdriver.ROTATE_FACE then + rotationPart = axisdir * 4 + nextrange(rotation, 3) + elseif mode == screwdriver.ROTATE_AXIS then + rotationPart = nextrange(axisdir, 5) * 4 + end + + return preservePart + rotationPart +end + +local wallmounted_tbl = { + [screwdriver.ROTATE_FACE] = {[2] = 5, [3] = 4, [4] = 2, [5] = 3, [1] = 0, [0] = 1}, + [screwdriver.ROTATE_AXIS] = {[2] = 5, [3] = 4, [4] = 2, [5] = 1, [1] = 0, [0] = 3} +} +screwdriver.rotate.wallmounted = function(node, mode) + return wallmounted_tbl[mode][node.param2] +end + -- Handles rotation screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) if pointed_thing.type ~= "node" then @@ -34,23 +59,14 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) local node = minetest.get_node(pos) local ndef = minetest.registered_nodes[node.name] - -- verify node is facedir (expected to be rotatable) - if not ndef or ndef.paramtype2 ~= "facedir" then + -- can we rotate this paramtype2? + local fn = screwdriver.rotate[ndef.paramtype2] + if not fn then return end - -- Compute param2 - local rotationPart = node.param2 % 32 -- get first 4 bits - local preservePart = node.param2 - rotationPart - local axisdir = math.floor(rotationPart / 4) - local rotation = rotationPart - axisdir * 4 - if mode == screwdriver.ROTATE_FACE then - rotationPart = axisdir * 4 + nextrange(rotation, 3) - elseif mode == screwdriver.ROTATE_AXIS then - rotationPart = nextrange(axisdir, 5) * 4 - end - local new_param2 = preservePart + rotationPart local should_rotate = true + local new_param2 = fn(node, mode) -- Node provides a handler, so let the handler decide instead if the node can be rotated if ndef and ndef.on_rotate then From 297192dd394f9b6d9413db2ed726dc73b856b385 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 25 Feb 2017 00:27:19 -0800 Subject: [PATCH 3/6] Screwdriver: use table lookup for facedir rotations. The table was generated using the old code. A table lookup should be faster than lots of math and branches. Allows us to drop `nextrange()` as well. --- mods/screwdriver/init.lua | 40 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 696637a0..94964605 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -1,13 +1,5 @@ screwdriver = {} -local function nextrange(x, max) - x = x + 1 - if x > max then - x = 0 - end - return x -end - screwdriver.ROTATE_FACE = 1 screwdriver.ROTATE_AXIS = 2 screwdriver.disallow = function(pos, node, user, mode, new_param2) @@ -21,19 +13,27 @@ end screwdriver.rotate = {} -screwdriver.rotate.facedir = function(node, mode) - -- Compute param2 - local rotationPart = node.param2 % 32 -- get first 4 bits - local preservePart = node.param2 - rotationPart - local axisdir = math.floor(rotationPart / 4) - local rotation = rotationPart - axisdir * 4 - if mode == screwdriver.ROTATE_FACE then - rotationPart = axisdir * 4 + nextrange(rotation, 3) - elseif mode == screwdriver.ROTATE_AXIS then - rotationPart = nextrange(axisdir, 5) * 4 - end +local facedir_tbl = { + [screwdriver.ROTATE_FACE] = { + [0] = 1, [1] = 2, [2] = 3, [3] = 0, + [4] = 5, [5] = 6, [6] = 7, [7] = 4, + [8] = 9, [9] = 10, [10] = 11, [11] = 8, + [12] = 13, [13] = 14, [14] = 15, [15] = 12, + [16] = 17, [17] = 18, [18] = 19, [19] = 16, + [20] = 21, [21] = 22, [22] = 23, [23] = 20, + }, + [screwdriver.ROTATE_AXIS] = { + [0] = 4, [1] = 4, [2] = 4, [3] = 4, + [4] = 8, [5] = 8, [6] = 8, [7] = 8, + [8] = 12, [9] = 12, [10] = 12, [11] = 12, + [12] = 16, [13] = 16, [14] = 16, [15] = 16, + [16] = 20, [17] = 20, [18] = 20, [19] = 20, + [20] = 0, [21] = 0, [22] = 0, [23] = 0, + }, +} - return preservePart + rotationPart +screwdriver.rotate.facedir = function(node, mode) + return facedir_tbl[mode][node.param2] end local wallmounted_tbl = { From efb81d188e8dc9f8c4862baab0b5be5fb53c21ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Juh=C3=A1sz?= Date: Mon, 27 Feb 2017 10:50:54 +0100 Subject: [PATCH 4/6] Correct rotation of attached nodes, and rotate colored nodes --- mods/screwdriver/init.lua | 46 ++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 94964605..95514094 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -11,6 +11,19 @@ screwdriver.rotate_simple = function(pos, node, user, mode, new_param2) end end +-- For attached wallmounted nodes: returns true if rotation is valid +-- simplified version of minetest:builtin/game/falling.lua#L148. +local function check_attached_node(pos, rotation) + local d = minetest.wallmounted_to_dir(rotation) + local p2 = vector.add(pos, d) + local n = minetest.get_node(p2).name + local def2 = minetest.registered_nodes[n] + if def2 and not def2.walkable then + return false + end + return true +end + screwdriver.rotate = {} local facedir_tbl = { @@ -32,18 +45,39 @@ local facedir_tbl = { }, } -screwdriver.rotate.facedir = function(node, mode) - return facedir_tbl[mode][node.param2] +screwdriver.rotate.facedir = function(pos, node, mode) + local rotation = node.param2 % 32 -- get first 5 bits + local other = node.param2 - rotation + rotation = facedir_tbl[mode][rotation] or 0 + return rotation + other end +screwdriver.rotate.colorfacedir = screwdriver.rotate.facedir + local wallmounted_tbl = { [screwdriver.ROTATE_FACE] = {[2] = 5, [3] = 4, [4] = 2, [5] = 3, [1] = 0, [0] = 1}, [screwdriver.ROTATE_AXIS] = {[2] = 5, [3] = 4, [4] = 2, [5] = 1, [1] = 0, [0] = 3} } -screwdriver.rotate.wallmounted = function(node, mode) - return wallmounted_tbl[mode][node.param2] + +screwdriver.rotate.wallmounted = function(pos, node, mode) + local rotation = node.param2 % 8 -- get first 3 bits + local other = node.param2 - rotation + rotation = wallmounted_tbl[mode][rotation] or 0 + if minetest.get_item_group(node.name, "attached_node") ~= 0 then + -- find an acceptable orientation + for i = 1, 5 do + if not check_attached_node(pos, rotation) then + rotation = wallmounted_tbl[mode][rotation] or 0 + else + break + end + end + end + return rotation + other end +screwdriver.rotate.colorwallmounted = screwdriver.rotate.wallmounted + -- Handles rotation screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) if pointed_thing.type ~= "node" then @@ -66,7 +100,7 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) end local should_rotate = true - local new_param2 = fn(node, mode) + local new_param2 = fn(pos, node, mode) -- Node provides a handler, so let the handler decide instead if the node can be rotated if ndef and ndef.on_rotate then @@ -80,7 +114,7 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) should_rotate = false end else - if not ndef or not ndef.paramtype2 == "facedir" or + if not ndef or ndef.on_rotate == false or (ndef.drawtype == "nodebox" and (ndef.node_box and ndef.node_box.type ~= "fixed")) or From d5e19d70c253f299f155e61d1e5f17585ba5112d Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Wed, 8 Mar 2017 21:57:10 -0800 Subject: [PATCH 5/6] Screwdriver: drop nodes if no longer attached. This should be fairly cheap and pops off items if needed. --- mods/screwdriver/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua index 95514094..f2596437 100644 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -130,6 +130,7 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) if should_rotate then node.param2 = new_param2 minetest.swap_node(pos, node) + minetest.check_for_falling(pos) end if not minetest.setting_getbool("creative_mode") then From 07a5fca432747043b3df067d4703b471072dce77 Mon Sep 17 00:00:00 2001 From: paramat Date: Thu, 9 Mar 2017 20:18:58 +0000 Subject: [PATCH 6/6] Leafdecay: Register leafdecay for bush leaves --- mods/default/nodes.lua | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 67790dd6..1eb2f305 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1308,6 +1308,8 @@ minetest.register_node("default:bush_leaves", { paramtype = "light", groups = {snappy = 3, flammable = 2, leaves = 1}, sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, }) minetest.register_node("default:acacia_bush_stem", { @@ -1335,6 +1337,8 @@ minetest.register_node("default:acacia_bush_leaves", { paramtype = "light", groups = {snappy = 3, flammable = 2, leaves = 1}, sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, }) @@ -2200,3 +2204,15 @@ default.register_leafdecay({ leaves = {"default:aspen_leaves"}, radius = 2, }) + +default.register_leafdecay({ + trunks = {"default:bush_stem"}, + leaves = {"default:bush_leaves"}, + radius = 1, +}) + +default.register_leafdecay({ + trunks = {"default:acacia_bush_stem"}, + leaves = {"default:acacia_bush_leaves"}, + radius = 1, +})