Due to the order things get spawned in different mapgens, I often find things growing where there isn't enough light. So I added this hack to woodsoils/nodes.lua - it is far from perfect, it messes up the subtleties around ferns and results in little growth under oak trees. I may modify it to differentiate between conifers and deciduous trees, but for now it has the right sort of effect. Currently it kills off anything in group:flora, which may leave wild veg from farming* untouched.
Code: Select all
-- Die-off ABM
minetest.register_abm({
nodenames = {"default:dirt",
"woodsoils:dirt_with_leaves_1",
"woodsoils:dirt_with_leaves_2",
"woodsoils:grass_with_leaves_1",
"woodsoils:grass_with_leaves_2",
"default:dirt_with_grass"
},
interval = 2,
chance = 200,
action = function(pos, node)
local above = vector.add(pos, {x=0, y=1, z=0})
local name = minetest.get_node(above).name
local nodedef = minetest.registered_nodes[name]
if nodedef and (nodedef.sunlight_propagates or nodedef.paramtype == "light")
and nodedef.liquidtype == "none" then
if (minetest.get_node_light(above, 0.5) or 0) < 13 then
if minetest.find_node_near(above, 9, {"group:tree","group:sapling"})
or minetest.find_node_near(above, 3, {"group:leaves"}) then
if (minetest.get_node_light(above, 0.5) or 0) >= 11 then
minetest.set_node(pos, {name = "woodsoils:grass_with_leaves_1"})
elseif (minetest.get_node_light(above, 0.5) or 0) >= 9 then
minetest.set_node(pos, {name = "woodsoils:grass_with_leaves_2"})
elseif (minetest.get_node_light(above, 0.5) or 0) >= 7 then
minetest.set_node(pos, {name = "woodsoils:dirt_with_leaves_1"})
if minetest.get_node_group(name, "flora") > 0 then
minetest.remove_node(above)
end
else
minetest.set_node(pos, {name = "woodsoils:dirt_with_leaves_2"})
if minetest.get_node_group(name, "flora") > 0 then
minetest.remove_node(above)
end
end
end
elseif minetest.find_node_near(above, 3,
{"ferns:fern_04","ferns:fern_03","ferns:fern_02","ferns:fern_01","group:sapling"}
) == nil then
if(minetest.get_node_light(above, 0.5) or 0) < 7 then
minetest.set_node(pos, {name = "default:dirt"})
elseif (minetest.get_node_light(above, 0.5) or 0) >= 13 then
minetest.set_node(pos, {name = "default:dirt_with_grass"})
end
end
end
end
})