From be96530e20d0a584334b4f876b7b74e13e46122e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D0=B5=D1=80=D1=85=D0=B0=D1=80=D0=B4=20PICCORO=20Len?= =?UTF-8?q?z=20McKAY?= Date: Fri, 10 Dec 2021 15:24:32 -0400 Subject: [PATCH] Mushroom spread: make overridable and reduce spread * Move mushroom spread ABM action into a global and overridable function. but do not optimise spread code * backported bcf98df5fac3eb59b02d9fdb066ab92c6228d787 * Reduce spread range to reduce spread through walls. --- mods/flowers/init.lua | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index 51ade79..00a82ee 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -214,19 +214,28 @@ function flowers.mushroom_spread(pos, node) minetest.remove_node(pos) return end - local positions = minetest.find_nodes_in_area_under_air( - {x = pos.x - 1, y = pos.y - 2, z = pos.z - 1}, - {x = pos.x + 1, y = pos.y + 1, z = pos.z + 1}, - {"group:soil", "group:tree"}) - if #positions == 0 then - return + local random = { + x = pos.x + math.random(-2, 2), + y = pos.y + math.random(-1, 1), + z = pos.z + math.random(-2, 2) + } + local random_node = minetest.get_node_or_nil(random) + if not random_node or random_node.name ~= "air" then + return end - local pos2 = positions[math.random(#positions)] - pos2.y = pos2.y + 1 - if minetest.get_node_light(pos, 0.5) <= 3 and - minetest.get_node_light(pos2, 0.5) <= 3 then - minetest.set_node(pos2, {name = node.name}) + local node_under = minetest.get_node_or_nil({x = random.x, + y = random.y - 1, z = random.z}) + if not node_under then + return end + + if (minetest.get_item_group(node_under.name, "soil") ~= 0 or + minetest.get_item_group(node_under.name, "tree") ~= 0) and + minetest.get_node_light(pos, 0.5) <= 3 and + minetest.get_node_light(random, 0.5) <= 3 then + minetest.set_node(random, {name = node.name}) + end + end minetest.register_abm({