-- generating of forest soils local RaDiuS = { -- WE1 NS1 WE2 NS2 WE3 NS3 {-1,-2, -2,-2, -2,-3}, { 0,-2, -3,-1, -3,-2}, { 1,-2, -3, 0, -4,-1}, {-2,-1, -3, 1, -4, 0}, {-1,-1, -2, 2, -4, 1}, { 0,-1, -1, 3, -3, 2}, { 1,-1, 0, 3, -2, 3}, { 2,-1, 1, 3, -1, 4}, {-2, 0, 2, 2, 0, 4}, {-1, 0, 3, 1, 1, 4}, { 0, 0, 3, 0, 2, 3}, { 1, 0, 3,-1, 3, 2}, { 2, 0, 2,-2, 4, 1}, {-2, 1, 1,-3, 4, 0}, {-1, 1, 0,-3, 4,-1}, { 0, 1, -1,-3, 3,-2}, { 1, 1, 0, 0, 2,-3}, { 2, 1, 0, 0, 1,-4}, {-1, 2, 0, 0, 0,-4}, { 0, 2, 0, 0, -1,-4}, { 1, 2, 0, 0, 0, 0}, } -- e = + , n = + abstract_woodsoils.place_soil = function(pos) if minetest.get_item_group(minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}).name, "soil") > 0 or minetest.get_item_group(minetest.get_node({x=pos.x,y=pos.y-2,z=pos.z}).name, "soil") > 0 then for i in pairs(RaDiuS) do local WE1 = RaDiuS[i][1] local NS1 = RaDiuS[i][2] local WE2 = RaDiuS[i][3] local NS2 = RaDiuS[i][4] local WE3 = RaDiuS[i][5] local NS3 = RaDiuS[i][6] local radius_1a = {x=pos.x+WE1,y=pos.y-1,z=pos.z+NS1} local radius_1b = {x=pos.x+WE1,y=pos.y-2,z=pos.z+NS1} local radius_2a = {x=pos.x+WE2,y=pos.y-1,z=pos.z+NS2} local radius_2b = {x=pos.x+WE2,y=pos.y-2,z=pos.z+NS2} local radius_3a = {x=pos.x+WE3,y=pos.y-1,z=pos.z+NS3} local radius_3b = {x=pos.x+WE3,y=pos.y-2,z=pos.z+NS3} local node_2a = minetest.get_node(radius_2a) local node_2b = minetest.get_node(radius_2b) local node_3a = minetest.get_node(radius_3a) local node_3b = minetest.get_node(radius_3b) -- Dirt with Leaves 1 if minetest.get_item_group(minetest.get_node(radius_1a).name, "soil") > 0 then minetest.swap_node(radius_1a, {name="woodsoils:dirt_with_leaves_1"}) end if minetest.get_item_group(minetest.get_node(radius_1b).name, "soil") > 0 then minetest.swap_node(radius_1b, {name="woodsoils:dirt_with_leaves_1"}) end -- Grass with Leaves 2 if string.find(node_2a.name, "dirt_with_grass") then minetest.swap_node(radius_2a, {name="woodsoils:grass_with_leaves_2"}) end if string.find(node_2b.name, "dirt_with_grass") then minetest.swap_node(radius_2b, {name="woodsoils:grass_with_leaves_2"}) end -- Grass with Leaves 1 if string.find(node_3a.name, "dirt_with_grass") then minetest.swap_node(radius_3a, {name="woodsoils:grass_with_leaves_1"}) end if string.find(node_3b.name, "dirt_with_grass") then minetest.swap_node(radius_3b, {name="woodsoils:grass_with_leaves_1"}) end end end end minetest.register_decoration({ name = "woodsoils:trees", decoration = {"air"}, fill_ratio = 1, y_min = 1, y_max = 40, place_on = { "group:tree", "ferns:fern_03", "ferns:fern_02", "ferns:fern_01" }, deco_type = "simple", flags = "all_floors", place_offset_y = -1, check_offset = -1, }) minetest.register_decoration({ name = "woodsoils:moretrees", decoration = {"air"}, fill_ratio = 1, y_min = 1, y_max = 40, place_on = { "moretrees:apple_tree_sapling_ongen", "moretrees:beech_sapling_ongen", "moretrees:birch_sapling_ongen", "moretrees:fir_sapling_ongen", "moretrees:jungletree_sapling_ongen", "moretrees:oak_sapling_ongen", "moretrees:palm_sapling_ongen", "moretrees:rubber_tree_sapling_ongen", "moretrees:sequoia_sapling_ongen", "moretrees:spruce_sapling_ongen", "moretrees:willow_sapling_ongen" }, deco_type = "simple", flags = "all_floors", place_offset_y = -1, check_offset = -1, }) local did, did2 minetest.register_on_mods_loaded(function() did = minetest.get_decoration_id("woodsoils:trees") did2 = minetest.get_decoration_id("woodsoils:moretrees") minetest.set_gen_notify("decoration", {did, did2}) end) minetest.register_on_generated(function(minp, maxp, blockseed) local g = minetest.get_mapgen_object("gennotify") local deco_locations_1 = g["decoration#" .. did] or {} local deco_locations_2 = g["decoration#" .. did2] or {} for _, pos in pairs(deco_locations_1) do abstract_woodsoils.place_soil(pos) end for _, pos in pairs(deco_locations_2) do abstract_woodsoils.place_soil(pos) end end) minetest.register_abm({ nodenames = {"default:papyrus"}, neighbors = { "woodsoils:dirt_with_leaves_1", "woodsoils:dirt_with_leaves_2", "woodsoils:grass_with_leaves_1", "woodsoils:grass_with_leaves_2" }, interval = 50, chance = 20, action = function(pos, node) pos.y = pos.y-1 local name = minetest.get_node(pos).name if string.find(name, "_with_leaves_") then if minetest.find_node_near(pos, 3, {"group:water"}) == nil then return end pos.y = pos.y+1 local height = 0 while minetest.get_node(pos).name == "default:papyrus" and height < 4 do height = height+1 pos.y = pos.y+1 end if height < 4 then if minetest.get_node(pos).name == "air" then minetest.swap_node(pos, {name="default:papyrus"}) end end end end, })