naturalslopes_minetest_game/functions.lua

51 lines
1.5 KiB
Lua

--
-- Convert default:dirt to something that fits the environment
--
minetest.register_abm({
label = "Grass spread",
nodenames = {"group:family:default:dirt"},
neighbors = {
"air",
"group:grass",
"group:dry_grass",
"default:snow",
},
interval = 6,
chance = 50,
catch_up = false,
action = function(pos, node)
-- Check for darkness: night, shadow or under a light-blocking node
-- Returns if ignore above
local above = {x = pos.x, y = pos.y + 1, z = pos.z}
if (minetest.get_node_light(above) or 0) < 13 then
return
end
-- Look for spreading dirt-type neighbours
local p2 = minetest.find_node_near(pos, 1, "group:spreading_dirt_type")
if p2 then
local n3 = minetest.get_node(p2)
local shape = minetest.get_item_group(node.name, "natural_slope")
local all_shapes = naturalslopeslib.get_all_shapes(n3.name)
if #all_shapes > 1 then
minetest.set_node(pos, {name = all_shapes[shape + 1], param2 = node.param2})
else
minetest.set_node(pos, {name = n3.name})
end
return
end
-- Else, any seeding nodes on top?
local name = minetest.get_node(above).name
-- Snow check is cheapest, so comes first
if name == "default:snow" then
minetest.set_node(pos, {name = "default:dirt_with_snow"})
elseif minetest.get_item_group(name, "grass") ~= 0 then
minetest.set_node(pos, {name = "default:dirt_with_grass"})
elseif minetest.get_item_group(name, "dry_grass") ~= 0 then
minetest.set_node(pos, {name = "default:dirt_with_dry_grass"})
end
end
})