diff --git a/GROUPS.md b/GROUPS.md index 41b0a0d7ae..9a649ddfb3 100644 --- a/GROUPS.md +++ b/GROUPS.md @@ -34,6 +34,7 @@ Please read to learn how digging times * `cultivatable=2`: Block will be turned into Farmland by using a hoe on it * `cultivatable=1`: Block will be turned into Dirt by using a hoe on it * `flammable`: Block helps spreading fire and gets destroyed by nearby fire (rating doesn't matter) +* `spreading_dirt_type=1`: A dirt-type block with a cover (e.g. grass) which may spread to neighbor dirt blocks * `soil=1`: Saplings and other small plants can grow on it * `soil_sapling=2`: Soil for saplings. Intended to be natural soil. All saplings will grow on this * `soil_sapling=1`: Artificial soil (such as farmland) for saplings. Some saplings will not grow on this diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index 26d4222777..dd34d09109 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -379,35 +379,44 @@ function mcl_core.generate_tree(pos, trunk, leaves, typearbre) end ------------------------------ --- Try generate grass dirt --- +-- Spread grass blocks and mycelium on neighbor dirt ------------------------------ --- turn dirt to dirt with grass minetest.register_abm({ nodenames = {"mcl_core:dirt"}, - neighbors = {"air"}, + neighbors = {"air", "mcl_core:dirt_with_grass", "mcl_core:mycelium"}, interval = 30, chance = 20, action = function(pos) - if pos == nil then - return - end - local can_change = 0 - for i=1,4 do - local p = {x=pos.x, y=pos.y+i, z=pos.z} - local n = minetest.get_node(p) - -- On verifie si il y a de l'air - if (n.name=="air") then - can_change = can_change + 1 - end - end - if can_change > 3 then - local light = minetest.get_node_light(pos) - if light or light > 10 then - minetest.add_node(pos, {name="mcl_core:dirt_with_grass"}) - end - + if pos == nil then + return end - end, + local can_change = false + local above = {x=pos.x, y=pos.y+1, z=pos.z} + local abovenode = minetest.get_node(above) + if (abovenode.name=="air") then + can_change = true + end + if can_change then + local light = minetest.get_node_light(above) + local p2 = minetest.find_node_near(pos, 1, "group:spreading_dirt_type") + if not p2 then + return + end + local n2 = minetest.get_node(p2) + + -- Light level for grass block and others + local minlight = 4 + if n2.name == "mcl_core:mycelium" then + -- Light level for mycelium + minlight = 9 + end + + if light >= minlight then + -- Spread the grass/mycelium! + minetest.set_node(pos, {name=n2.name}) + end + end + end }) -------------------------- diff --git a/mods/ITEMS/mcl_core/nodes.lua b/mods/ITEMS/mcl_core/nodes.lua index 6ca8bba35a..2c40044300 100644 --- a/mods/ITEMS/mcl_core/nodes.lua +++ b/mods/ITEMS/mcl_core/nodes.lua @@ -366,7 +366,7 @@ minetest.register_node("mcl_core:dirt_with_grass", { tiles = {"default_grass.png", "default_dirt.png", "default_grass_side.png"}, is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, building_block=1}, + groups = {handy=1,shovely=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, spreading_dirt_type=1, building_block=1}, drop = 'mcl_core:dirt', sounds = mcl_sounds.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.4}, @@ -422,7 +422,7 @@ minetest.register_node("mcl_core:mycelium", { tiles = {"default_mycelium_top.png", "default_dirt.png", "default_mycelium_side.png"}, is_ground_content = true, stack_max = 64, - groups = {handy=1,shovely=1, building_block=1}, + groups = {handy=1,shovely=1, spreading_dirt_type=1, building_block=1}, drop = 'mcl_core:dirt', sounds = mcl_sounds.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.4},