Skip to content

Commit bcf98df

Browse files
tenplus1paramat
authored andcommitted
Mushroom spread: Optimise and make overridable
Move mushroom spread ABM action into a global and overridable function. Optimise spread code. Reduce spread range to reduce spread through walls.
1 parent 08727bc commit bcf98df

File tree

1 file changed

+24
-28
lines changed

1 file changed

+24
-28
lines changed

mods/flowers/init.lua

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -204,38 +204,34 @@ minetest.register_node("flowers:mushroom_brown", {
204204

205205
-- Mushroom spread and death
206206

207+
function flowers.mushroom_spread(pos, node)
208+
if minetest.get_node_light(pos, nil) == 15 then
209+
minetest.remove_node(pos)
210+
return
211+
end
212+
local positions = minetest.find_nodes_in_area_under_air(
213+
{x = pos.x - 1, y = pos.y - 2, z = pos.z - 1},
214+
{x = pos.x + 1, y = pos.y + 1, z = pos.z + 1},
215+
{"group:soil", "group:tree"})
216+
if #positions == 0 then
217+
return
218+
end
219+
local pos2 = positions[math.random(#positions)]
220+
pos2.y = pos2.y + 1
221+
if minetest.get_node_light(pos, 0.5) <= 3 and
222+
minetest.get_node_light(pos2, 0.5) <= 3 then
223+
minetest.set_node(pos2, {name = node.name})
224+
end
225+
end
226+
207227
minetest.register_abm({
208228
label = "Mushroom spread",
209229
nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"},
210230
interval = 11,
211-
chance = 50,
212-
action = function(pos, node)
213-
if minetest.get_node_light(pos, nil) == 15 then
214-
minetest.remove_node(pos)
215-
return
216-
end
217-
local random = {
218-
x = pos.x + math.random(-2, 2),
219-
y = pos.y + math.random(-1, 1),
220-
z = pos.z + math.random(-2, 2)
221-
}
222-
local random_node = minetest.get_node_or_nil(random)
223-
if not random_node or random_node.name ~= "air" then
224-
return
225-
end
226-
local node_under = minetest.get_node_or_nil({x = random.x,
227-
y = random.y - 1, z = random.z})
228-
if not node_under then
229-
return
230-
end
231-
232-
if (minetest.get_item_group(node_under.name, "soil") ~= 0 or
233-
minetest.get_item_group(node_under.name, "tree") ~= 0) and
234-
minetest.get_node_light(pos, 0.5) <= 3 and
235-
minetest.get_node_light(random, 0.5) <= 3 then
236-
minetest.set_node(random, {name = node.name})
237-
end
238-
end
231+
chance = 150,
232+
action = function(...)
233+
flowers.mushroom_spread(...)
234+
end,
239235
})
240236

241237

0 commit comments

Comments
 (0)