extended the API again - this time adding a function to allow a custom check

for air surrounding the plant spawn location (defaults to 1, just the target
node).  Values of 1 and 9 for the two new variables would check the 3x3 area
around the spawn location.  Don't make these numbers too large or it will
slow the abm down.
This commit is contained in:
Vanessa Ezekowitz 2013-01-11 11:52:34 -05:00
parent b0de25407d
commit 94770d713b
2 changed files with 11 additions and 6 deletions

View File

@ -88,6 +88,10 @@ sbiomesize: How large of an area to check for the above node.
Defaults to 0. Defaults to 0.
sbiomecount: How many of the above nodes must be within that radius. sbiomecount: How many of the above nodes must be within that radius.
Defaults to 1. Defaults to 1.
airradius: How large of an area to check for air around the target.
Defaults to 0 (only check the target).
aircount: How many of the surrounding nodes need to be air for the
above check to return true. Defaults to 1.
By default, if a biome node, size, and count are not defined, the biome By default, if a biome node, size, and count are not defined, the biome
checking is disabled. Same holds true for the nneighbors bit above that. checking is disabled. Same holds true for the nneighbors bit above that.

View File

@ -35,7 +35,7 @@ end
-- The spawning ABM -- The spawning ABM
spawn_on_surfaces = function(sdelay, splant, sradius, schance, ssurface, savoid, seed_diff, lightmin, lightmax, nneighbors, ocount, facedir, depthmax, altmin, altmax, sbiome, sbiomesize, sbiomecount) spawn_on_surfaces = function(sdelay, splant, sradius, schance, ssurface, savoid, seed_diff, lightmin, lightmax, nneighbors, ocount, facedir, depthmax, altmin, altmax, sbiome, sbiomesize, sbiomecount, airsize, aircount)
if seed_diff == nil then seed_diff = 0 end if seed_diff == nil then seed_diff = 0 end
if lightmin == nil then lightmin = 0 end if lightmin == nil then lightmin = 0 end
if lightmax == nil then lightmax = LIGHT_MAX end if lightmax == nil then lightmax = LIGHT_MAX end
@ -47,6 +47,8 @@ spawn_on_surfaces = function(sdelay, splant, sradius, schance, ssurface, savoid,
if sbiome == nil then sbiome = "" end if sbiome == nil then sbiome = "" end
if sbiomesize == nil then sbiomesize = 0 end if sbiomesize == nil then sbiomesize = 0 end
if sbiomecount == nil then sbiomecount = 1 end if sbiomecount == nil then sbiomecount = 1 end
if airsize == nil then airsize = 0 end
if aircount == nil then aircount = 1 end
minetest.register_abm({ minetest.register_abm({
nodenames = { ssurface }, nodenames = { ssurface },
interval = sdelay, interval = sdelay,
@ -57,17 +59,16 @@ spawn_on_surfaces = function(sdelay, splant, sradius, schance, ssurface, savoid,
local n_top = minetest.env:get_node(p_top) local n_top = minetest.env:get_node(p_top)
local perlin = minetest.env:get_perlin(seed_diff, perlin_octaves, perlin_persistence, perlin_scale ) local perlin = minetest.env:get_perlin(seed_diff, perlin_octaves, perlin_persistence, perlin_scale )
local noise = perlin:get2d({x=p_top.x, y=p_top.z}) local noise = perlin:get2d({x=p_top.x, y=p_top.z})
if noise > plantlife_limit and n_top.name == "air" and is_node_loaded(p_top) then if noise > plantlife_limit and is_node_loaded(p_top) then
local n_light = minetest.env:get_node_light(p_top, nil) local n_light = minetest.env:get_node_light(p_top, nil)
if minetest.env:find_node_near(p_top, sradius + math.random(-1.5,2), savoid) == nil if minetest.env:find_node_near(p_top, sradius + math.random(-1.5,2), savoid) == nil
and n_light >= lightmin and n_light >= lightmin
and n_light <= lightmax and n_light <= lightmax
and and (table.getn(minetest.env:find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, nneighbors)) > ocount
(table.getn(minetest.env:find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, nneighbors)) > ocount
or ocount == -1) or ocount == -1)
and and (table.getn(minetest.env:find_nodes_in_area({x=pos.x-sbiomesize, y=pos.y-1, z=pos.z-sbiomesize}, {x=pos.x+sbiomesize, y=pos.y+1, z=pos.z+sbiomesize}, sbiome)) >= sbiomecount
(table.getn(minetest.env:find_nodes_in_area({x=pos.x-sbiomesize, y=pos.y-1, z=pos.z-sbiomesize}, {x=pos.x+sbiomesize, y=pos.y+1, z=pos.z+sbiomesize}, sbiome)) >= sbiomecount
or sbiome == "") or sbiome == "")
and table.getn(minetest.env:find_nodes_in_area({x=p_top.x-airsize, y=p_top.y, z=p_top.z-airsize}, {x=p_top.x+airsize, y=p_top.y, z=p_top.z+airsize}, "air")) >= aircount
and pos.y >= altmin and pos.y >= altmin
and pos.y <= altmax and pos.y <= altmax
then then