mirror of
https://github.com/minetest/minetest_game.git
synced 2024-12-23 07:10:19 +01:00
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.
This commit is contained in:
parent
cc2f75b2f9
commit
6053456af1
@ -204,38 +204,34 @@ minetest.register_node("flowers:mushroom_brown", {
|
|||||||
|
|
||||||
-- Mushroom spread and death
|
-- Mushroom spread and death
|
||||||
|
|
||||||
|
function flowers.mushroom_spread(pos, node)
|
||||||
|
if minetest.get_node_light(pos, nil) == 15 then
|
||||||
|
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
|
||||||
|
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})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_abm({
|
minetest.register_abm({
|
||||||
label = "Mushroom spread",
|
label = "Mushroom spread",
|
||||||
nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"},
|
nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"},
|
||||||
interval = 11,
|
interval = 11,
|
||||||
chance = 50,
|
chance = 150,
|
||||||
action = function(pos, node)
|
action = function(...)
|
||||||
if minetest.get_node_light(pos, nil) == 15 then
|
flowers.mushroom_spread(...)
|
||||||
minetest.remove_node(pos)
|
end,
|
||||||
return
|
|
||||||
end
|
|
||||||
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 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
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user