From e2794f71f4e83b0276907acb2decb48e07f94adc Mon Sep 17 00:00:00 2001 From: Vanessa Ezekowitz Date: Sat, 29 Dec 2012 17:24:47 -0500 Subject: [PATCH] Added feature to API to allow for limits on spawning altitude also. None of the included plants use this, it's mainly for the conifers mod. --- API.txt | 8 ++++++-- plants_lib/init.lua | 44 ++++++++++++++++++++++++-------------------- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/API.txt b/API.txt index e4da586..5bd9c49 100644 --- a/API.txt +++ b/API.txt @@ -14,11 +14,12 @@ dbg() ----- The first of these, spawn_on_surfaces() is defined with quite a large number -of variables: +of variables. All of the variables below, if specified at all, must be +specified exactly in the order given here. spawn_on_surfaces = function(sdelay, splant, sradius, schance, ssurface, savoid, seed_diff, lightmin, lightmax, nneighbors, - ocount, facedir) + ocount, facedir, depthmax, altitudemin, altitudemax) The first several of these are all required, and are from the last version of the flowers mod, so this part of the API should be the same as before. @@ -68,6 +69,9 @@ 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. +altitudemin: Items must be at this altitude or higher to spawn at all. + Defaults to -31000. +altitudemax: But no higher than this altitude. Defaults to +31000. ----- The second function, grow_plants() is defined like so: diff --git a/plants_lib/init.lua b/plants_lib/init.lua index 0945c3a..529734a 100644 --- a/plants_lib/init.lua +++ b/plants_lib/init.lua @@ -12,7 +12,7 @@ -- Various settings - most of these probably won't need to be changed -local plantlife_debug = false -- ...unless you want the modpack to spam the console ;-) +local plantlife_debug = true -- ...unless you want the modpack to spam the console ;-) local plantlife_seed_diff = 123 local perlin_octaves = 3 @@ -45,13 +45,15 @@ end -- The spawning ABM -spawn_on_surfaces = function(sdelay, splant, sradius, schance, ssurface, savoid, seed_diff, lightmin, lightmax, nneighbors, ocount, facedir, depthmax) +spawn_on_surfaces = function(sdelay, splant, sradius, schance, ssurface, savoid, seed_diff, lightmin, lightmax, nneighbors, ocount, facedir, depthmax, altmin, altmax) 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 if depthmax == nil then depthmax = 1 end + if altmin == nil then altmin = -31000 end + if altmax == nil then altmax = 31000 end minetest.register_abm({ nodenames = { ssurface }, interval = sdelay, @@ -62,26 +64,28 @@ spawn_on_surfaces = function(sdelay, splant, sradius, schance, ssurface, savoid, local n_top = minetest.env:get_node(p_top) 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}) - if ( noise > plantlife_limit ) and (n_top.name == "air") and is_node_loaded(p_top) then + if noise > plantlife_limit and n_top.name == "air" and is_node_loaded(p_top) then 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 ) - and (n_light >= lightmin) - and (n_light <= lightmax) - 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 - then - local walldir = plant_valid_wall(p_top) - if splant == "poisonivy:seedling" and walldir ~= nil then - dbg("Spawn: poisonivy:climbing at "..dump(p_top).." on "..ssurface) - minetest.env:add_node(p_top, { name = "poisonivy:climbing", param2 = walldir }) - else - 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 }) + if minetest.env:find_node_near(p_top, sradius + math.random(-1.5,2), savoid) == nil + and n_light >= lightmin + and n_light <= lightmax + 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 + and pos.y >= altmin + and pos.y <= altmax + then + local walldir = plant_valid_wall(p_top) + if splant == "poisonivy:seedling" and walldir ~= nil then + dbg("Spawn: poisonivy:climbing at "..dump(p_top).." on "..ssurface) + minetest.env:add_node(p_top, { name = "poisonivy:climbing", param2 = walldir }) + else + 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 end end