diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index 3d47336f..b41e7ef5 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -585,6 +585,69 @@ mcl_core.generate_spruce_tree = function(pos) minetest.place_schematic({ x = pos.x - 3, y = pos.y - 1, z = pos.z - 3 }, path, "0", nil, false) end +local vector_distance_xz = function(a, b) + return vector.distance( + { x=a.x, y=0, z=a.z }, + { x=b.x, y=0, z=b.z } + ) +end + +local podzol_spread_randomizer = PseudoRandom(minetest.get_mapgen_setting("seed")) + +local generate_spruce_podzol = function(pos) + local podzol_positions = {} + local podzol_positions_xz = {} + local add_podzol = function(position) + podzol_positions[#podzol_positions+1] = position + local x,z = position.x, position.z + if nil == podzol_positions_xz[x] then + podzol_positions_xz[x] = {} + end + podzol_positions_xz[x][z] = true + end + -- add podzol under tree + add_podzol( { x=pos.x+0, y=pos.y, z=pos.z+0 } ) + add_podzol( { x=pos.x+0, y=pos.y, z=pos.z+1 } ) + add_podzol( { x=pos.x+1, y=pos.y, z=pos.z+0 } ) + add_podzol( { x=pos.x+1, y=pos.y, z=pos.z+1 } ) + local corner_1 = { x=pos.x-5, y=pos.y-3, z=pos.z-5 } + local corner_2 = { x=pos.x+5, y=pos.y+3, z=pos.z+5 } + local dirt_positions = minetest.find_nodes_in_area_under_air( + corner_1, + corner_2, + { "group:dirt" } + ) + -- sort dirt positions according to distance from origin + table.sort( + dirt_positions, + function(a, b) + return vector_distance_xz(pos, a) < vector_distance_xz(pos, b) + end + ) + -- spread podzol + for j=1, #dirt_positions do + local dirt_position = dirt_positions[j] + local distance = math.ceil(vector_distance_xz(pos, dirt_position) + 0.5) + local k = podzol_spread_randomizer:next(0, distance) + local x, z = dirt_position.x, dirt_position.z + if ( + k < (10 - distance) and + not (podzol_positions_xz[x] and podzol_positions_xz[x][z]) and ( + podzol_positions_xz[x] and podzol_positions_xz[x][z-1] or + podzol_positions_xz[x] and podzol_positions_xz[x][z+1] or + podzol_positions_xz[x-1] and podzol_positions_xz[x-1][z] or + podzol_positions_xz[x+1] and podzol_positions_xz[x+1][z] + ) + ) then + add_podzol(dirt_position) + end + end + minetest.bulk_set_node( + podzol_positions, + { name = "mcl_core:podzol" } + ) +end + mcl_core.generate_huge_spruce_tree = function(pos) local r1 = math.random(1, 2) local r2 = math.random(1, 4) @@ -601,6 +664,14 @@ mcl_core.generate_huge_spruce_tree = function(pos) path = minetest.get_modpath("mcl_core") .. "/schematics/mcl_core_spruce_huge_up_"..r2..".mts" end minetest.place_schematic(vector.add(pos, offset), path, "0", nil, false) + generate_spruce_podzol( + -- position under +x/+z sapling + { + x = pos.x + offset.x + 4, + y = pos.y - 1, + z = pos.z + offset.z + 4 + } + ) end -- END of spruce tree functions --