diff --git a/API.txt b/API.txt index 106b9e1..69cf250 100644 --- a/API.txt +++ b/API.txt @@ -66,6 +66,8 @@ ocount: There must be at least this many of the above neighbors around the 0. facedir: The value passed to the param2 variable when adding the plant node to the map. Defaults to 0. +depthmax: If a node spawns on top of a water source, the water must be at + most this deep. Defaults to 1 node. ----- The second function, grow_plants() is defined like so: diff --git a/plants/init.lua b/plants/init.lua index 8f33d19..731a35c 100644 --- a/plants/init.lua +++ b/plants/init.lua @@ -18,7 +18,7 @@ local enable_flowers = true local enable_junglegrass = true local enable_poisonivy = true -local plantlife_debug = false +local plantlife_debug = true local plantlife_seed_diff = 123 local perlin_octaves = 3 @@ -90,13 +90,13 @@ end -- The spawning ABM -spawn_on_surfaces = function(sdelay, splant, sradius, schance, ssurface, savoid, seed_diff, lightmin, lightmax, nneighbors, ocount, facedir) +spawn_on_surfaces = function(sdelay, splant, sradius, schance, ssurface, savoid, seed_diff, lightmin, lightmax, nneighbors, ocount, facedir, depthmax) if seed_diff == nil then seed_diff = 0 end if lightmin == nil then lightmin = 0 end if lightmax == nil then lightmax = LIGHT_MAX end if nneighbors == nil then nneighbors = ssurface end if ocount == nil then ocount = 0 end - dbg(sdelay.." "..splant.." "..sradius.." "..schance.." "..ssurface.." "..dump(savoid).." "..lightmin.." "..lightmax.." "..dump(nneighbors).." "..ocount) + if depthmax == nil then depthmax = 1 end minetest.register_abm({ nodenames = { ssurface }, interval = sdelay, @@ -119,8 +119,13 @@ spawn_on_surfaces = function(sdelay, splant, sradius, schance, ssurface, savoid, dbg("Spawn: poisonivy:climbing at "..dump(p_top).." on "..ssurface) minetest.env:add_node(p_top, { name = "poisonivy:climbing", param2 = walldir }) else - dbg("Spawn: "..splant.." at "..dump(p_top).." on "..ssurface) - minetest.env:add_node(p_top, { name = splant, param2 = facedir }) + local deepnode = minetest.env:get_node({ x = pos.x, y = pos.y-depthmax-1, z = pos.z }).name + if (ssurface ~= "default:water_source") + or (ssurface == "default:water_source" + and deepnode ~= "default:water_source") then + dbg("Spawn: "..splant.." at "..dump(p_top).." on "..ssurface) + minetest.env:add_node(p_top, { name = splant, param2 = facedir }) + end end end end @@ -289,11 +294,11 @@ if enable_flowers then }, }) - spawn_on_surfaces(spawn_delay/2, "flowers:flower_waterlily", 10 , spawn_chance*3, "default:water_source" , {"group:flower"}, flowers_seed_diff, 10, nil, {"default:dirt_with_grass"}, nil, nil,10) + spawn_on_surfaces(spawn_delay/2, "flowers:flower_waterlily", 3, spawn_chance*2, "default:water_source" , {"group:flower"}, flowers_seed_diff, 10, nil, nil, nil, nil, 4) - spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed" , 0.1, spawn_chance*2, "default:water_source" , {"group:flower"}, flowers_seed_diff, 4, 10, {"default:dirt_with_grass"}, 0, 1) - spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed" , 0.1, spawn_chance*2, "default:dirt_with_grass", {"group:flower"}, flowers_seed_diff, 4, 10, {"default:water_source"} , 1, 1) - spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed" , 0.1, spawn_chance*2, "default:stone" , {"group:flower"}, flowers_seed_diff, 4, 10, {"default:water_source"} , 6, 1) + spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed" , 0.1, spawn_chance*2, "default:water_source" , {"group:flower"}, flowers_seed_diff, 4, 10, {"default:dirt_with_grass"}, 0, 1) + spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed" , 0.1, spawn_chance*2, "default:dirt_with_grass", {"group:flower"}, flowers_seed_diff, 4, 10, {"default:water_source"} , 1, 1) + spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed" , 0.1, spawn_chance*2, "default:stone" , {"group:flower"}, flowers_seed_diff, 4, 10, {"default:water_source"} , 6, 1) minetest.register_craftitem(":flowers:flower_pot", { diff --git a/plants/init.lua~ b/plants/init.lua~ index 87fb897..8f33d19 100644 --- a/plants/init.lua~ +++ b/plants/init.lua~ @@ -25,7 +25,7 @@ local perlin_octaves = 3 local perlin_persistence = 0.2 local perlin_scale = 25 -local plantlife_limit = 0.6 -- compared against perlin noise. lower = more abundant +local plantlife_limit = 0.5 -- compared against perlin noise. lower = more abundant local spawn_delay = 2000 -- 2000 local spawn_chance = 100 -- 100 @@ -384,10 +384,10 @@ if enable_junglegrass then }, }) - spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance/50, "default:dirt_with_grass", {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5) - spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance/50, "default:sand" , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5) - spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance/10, "default:desert_sand" , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5) - spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance/10, "default:desert_sand" , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5) + spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance, "default:dirt_with_grass", {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5) + spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance*2, "default:sand" , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5) + spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance*3, "default:desert_sand" , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5) + spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance*3, "default:desert_sand" , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5) for i in ipairs(grasses_list) do grow_plants(grow_delay, grow_chance/2, grasses_list[i][1], grasses_list[i][2], "default:desert_sand", {"default:dirt_with_grass", "default:sand", "default:desert_sand"})