add API function to choose a random wall

(rather than always the first found)

move API.txt into plants_lib dir
moderate re-formatting of API.txt, accounting for tab width = 4 spaces.
This commit is contained in:
Vanessa Ezekowitz 2015-02-16 22:22:51 -05:00
parent 01555c10c1
commit 0c6db75383
2 changed files with 260 additions and 281 deletions

View File

@ -1,6 +1,6 @@
This document describes the Plantlife mod API. This document describes the Plantlife mod API.
Last revision: 2014-05-24 Last revision: 2015-02-16
========= =========
@ -64,9 +64,9 @@ biome = {
spawn_delay = number, -- same as sdelay, above. spawn_delay = number, -- same as sdelay, above.
spawn_chance = number, -- same as schance, above. spawn_chance = number, -- same as schance, above.
spawn_surfaces = {table}, -- List of node names on which the plants spawn_surfaces = {table}, -- List of node names on which the plants
-- should be spawned. As with the single- -- should be spawned. As with the single-node "ssurface"
-- node "ssurface" option in the legacy API, -- option in the legacy API, you should not put stone, air,
-- you should not put stone, air, etc. here. -- etc. here.
---- From here down are a number of optional parameters. You will ---- From here down are a number of optional parameters. You will
---- most likely want to use at least some of these to limit how and ---- most likely want to use at least some of these to limit how and
@ -74,151 +74,132 @@ biome = {
avoid_nodes = {table}, -- same meaning as savoid, above avoid_nodes = {table}, -- same meaning as savoid, above
avoid_radius = num, -- same as sradius avoid_radius = num, -- same as sradius
seed_diff = num, -- The Perlin seed difference value passed to seed_diff = num, -- The Perlin seed difference value passed to the
-- the minetest.get_perlin() function. -- minetest.get_perlin() function. Used along with
-- Used along with the global Perlin controls -- the global Perlin controls below to create the
-- below to create the "biome" in which the -- "biome" in which the plants will spawn. Defaults
-- plants will spawn. Defaults to 0 if not -- to 0 if not provided.
-- provided. light_min = num, -- Minimum amount of light necessary to make a plant
light_min = num, -- Minimum amount of light necessary to make a -- spawn. Defaults to 0.
-- plant spawn. Defaults to 0. light_max = num, -- Maximum amount of light needed to spawn. Defaults
light_max = num, -- Maximum amount of light needed to spawn. -- to the engine's MAX_LIGHT value of 14.
-- Defaults to the engine's MAX_LIGHT value of
-- 14.
neighbors = {table}, -- List of neighboring nodes that need to be neighbors = {table}, -- List of neighboring nodes that need to be
-- immediately next to the node the plant is -- immediately next to the node the plant is about to
-- about to spawn on. Can also be a string -- spawn on. Can also be a string with a single node
-- with a single node name. It is both passed -- name. It is both passed to the ABM as the
-- to the ABM as the "neighbors" parameter, -- "neighbors" parameter, and is used to manually
-- and is used to manually check the -- check the adjacent nodes. It only takes one of
-- adjacent nodes. It only takes one of these -- these for the spawn routine to mark the target as
-- for the spawn routine to mark the target as
-- spawnable. Defaults to nil (ignored). -- spawnable. Defaults to nil (ignored).
ncount = num, -- There must be at least this many of the ncount = num, -- There must be at least this many of the above
-- above neighbors in the eight spaces -- neighbors in the eight spaces immediately
-- immediately surrounding the node the plant -- surrounding the node the plant is about to spawn on
-- is about to spawn on for it to happen. If -- for it to happen. If not provided, this check is
-- not provided, this check is disabled.
facedir = num, -- The value passed to the param2 variable
-- when adding the node to the map. Defaults
-- to 0. Be sure that the value you use here
-- (and the range thereof) is appropriate for
-- the type of node you're spawning.
random_facedir = {table}, -- If set, the table should contain two
-- values. If they're both provided, the
-- spawned plant will be given a random
-- facedir value in the range specified by
-- these two numbers. Overrides the facedir
-- parameter above, if it exists. Use {0,3}
-- if you want the full range for wallmounted
-- nodes, or {2,5} for most everything else,
-- or any other pair of numbers in the 0 to 5
-- range, as appropriate for the node you want
-- to spawn.
verticals_list = {table}, -- List of nodes that should be considered
-- to be natural walls.
alt_wallnode = "string", -- If specified, this node will be
-- substituted in place of the plant(s)
-- defined by spawn_plants above, if the spawn
-- target has one or more adjacent walls. In
-- such a case, the two above facedir
-- parameters will be ignored.
depth_max = num, -- If the object spawns on top of a water
-- source, the water must be at most this
-- deep. Defaults to 1 node.
min_elevation = num, -- Surface must be at this altitude or higher
-- to spawn at all. Defaults to -31000...
max_elevation = num, -- ...but must be no higher than this
-- altitude. Defaults to +31000.
near_nodes = {table}, -- List of nodes that must be somewhere in the
-- vicinity in order for the plant to spawn.
-- Can also be a string with a single node
-- name. If not provided, this check is
-- disabled. -- disabled.
facedir = num, -- The value passed to the param2 variable when adding
-- the node to the map. Defaults to 0. Be sure that
-- the value you use here (and the range thereof) is
-- appropriate for the type of node you're spawning.
random_facedir = {table}, -- If set, the table should contain two values.
-- If they're both provided, the spawned plant will be
-- given a random facedir value in the range specified
-- by these two numbers. Overrides the facedir
-- parameter above, if it exists. Use {0,3} if you
-- want the full range for wallmounted nodes, or {2,5}
-- for most everything else, or any other pair of
-- numbers appropriate for the node you want to spawn.
depth_max = num, -- If the object spawns on top of a water source, the
-- water must be at most this deep. Defaults to 1.
min_elevation = num, -- Surface must be at this altitude or higher to
-- spawn at all. Defaults to -31000...
max_elevation = num, -- ...but must be no higher than this altitude.
-- Defaults to +31000.
near_nodes = {table}, -- List of nodes that must be somewhere in the
-- vicinity in order for the plant to spawn. Can also
-- be a string with a single node name. If not
-- provided, this check is disabled.
near_nodes_size = num, -- How large of an area to check for the above near_nodes_size = num, -- How large of an area to check for the above
-- node. Specifically, this checks a flat -- node. Specifically, this checks a flat, horizontal
-- horizontal area centered on the node to be -- area centered on the node to be spawned on.
-- spawned on. Defaults to 0, but is ignored -- Defaults to 0, but is ignored if the above
-- if the above near_nodes value is not set. -- near_nodes value is not set.
near_nodes_vertical = num, -- Used with the size value above, this near_nodes_vertical = num, -- Used with the size value above, this extends
-- extends the vertical range of the near -- the vertical range of the near nodes search.
-- nodes search. Basically, this turns the -- Basically, this turns the flat region described
-- flat region described above into a cuboid -- above into a cuboid region. The area to be checked
-- region. The area to be checked will extend -- will extend this high and this low above/below the
-- this high AND this low above/below the -- target node, centered thereon. Defaults to 1 (only
-- target node, centered thereon. Defaults to -- check the layer above, the layer at, and the layer
-- 1 (check only the layer above, the layer -- below the target node), but is ignored if
-- at, and the layer below the target node), -- near_nodes is not set.
-- but is ignored if near_nodes is not set. near_nodes_count = num, -- How many of the above nodes must be within that
near_nodes_count = num, -- How many of the above nodes must be within -- radius. Defaults to 1 but is ignored if near_nodes
-- that radius. Defaults to 1 but is ignored -- isn't set. Bear in mind that the total area to be
-- if near_nodes isn't set. Bear in mind that -- checked is equal to:
-- the total area to be checked is equal to -- (near_nodes_size^2)*near_nodes_vertical*2
-- (near_nodes_size^2)*near_nodes_vertical*2. -- For example, if size is 10 and vertical is 4, then
-- so for example, if size is 10 and vertical -- the area is (10^2)*8 = 800 nodes in size, so you'll
-- is 4 then the area is (10^2)*8 = 800 nodes -- want to make sure you specify a value appropriate
-- in size, so you'll want to make sure you -- for the size of the area being tested.
-- specify a value appropriate for the amount air_size = num, -- How large of an area to check for air above and
-- in question. -- around the target. If omitted, only the space
air_size = num, -- How large of an area to check for air -- above the target is checked. This does not check
-- above and around the target. If omitted, -- for air at the sides or below the target.
air_count = num, -- How many of the surrounding nodes need to be air
-- for the above check to return true. If omitted,
-- only the space above the target is checked. -- only the space above the target is checked.
-- This does not check for air at the sides or plantlife_limit = num, -- The value compared against the generic "plants
-- below the target. -- can grow here" Perlin noise layer. Smaller numbers
air_count = num, -- How many of the surrounding nodes need to -- result in more abundant plants. Range of -1 to +1,
-- be air for the above check to return true. -- with values in the range of about 0 to 0.5 being
-- If omitted, only the space above the target -- most useful. Defaults to 0.1.
-- is checked. temp_min = num, -- Minimum temperature needed for the desired object
plantlife_limit = num, -- The value compared against the generic -- to spawn. This is a 2d Perlin value, which has an
-- "plants can grow here" Perlin noise layer. -- inverted range of +1 to -1. Larger values
-- Smaller numbers result in more abundant -- represent *colder* temperatures, so this value is
-- plants. Range of -1 to +1, with values in -- actually the upper end of the desired Perlin range.
-- the range of about 0 to 0.5 being most -- See the temperature map section at the bottom of
-- useful. Defaults to 0.1. -- this document for details on how these values work.
temp_min = num, -- Minimum temperature needed for the desired -- Defaults to +1 (unlimited coldness).
-- object to spawn. This is a 2d Perlin temp_max = num, -- Maximum temperature/lower end of the Perlin range.
-- value, which has an inverted range of +1 to -- Defaults to -1 (unlimited heat).
-- -1. Larger values represent *colder* humidity_min = num, -- Minimum humidity for the plant to spawn in. Like
-- temperatures, so this value is actually the -- the temperature map, this is a Perlin value where
-- upper end of the desired Perlin range. See -- lower numbers mean more humidity in the area.
-- the temperature map section at the bottom -- Defaults to +1 (0% humidity).
-- of this document for details on how these
-- values work. Defaults to +1 (unlimited
-- coldness).
temp_max = num, -- Maximum temperature/lower end of the Perlin
-- range. Defaults to -1 (unlimited heat).
humidity_min = num, -- Minimum humidity for the plant to spawn in.
-- Like the temperature map, this is a Perlin
-- value where lower numbers mean more
-- humidity in the area. Defaults to +1 (0%
-- relative humidity).
humidity_max = num, -- Maximum humidity for the plant to spawn at. humidity_max = num, -- Maximum humidity for the plant to spawn at.
-- Defaults to -1 (100% humidity). -- Defaults to -1 (100% humidity).
spawn_on_side = bool, -- Set this to true to spawn the node on one verticals_list = {table}, -- List of nodes that should be considered to be
-- side of the target node rather than the -- natural walls.
-- top. The code will search for an airspace alt_wallnode = "string", -- If specified, this node will be substituted in
-- to the side of the target, then spawn the -- place of the plant(s) defined by spawn_plants
-- plant at the first one found. The above -- above, if the spawn target has one or more adjacent
-- facedir and random_facedir parameters are -- walls. In such a case, the two above facedir
-- ignored in this case. If the above -- parameters will be ignored.
-- parameters for selecting generic wall nodes spawn_on_side = bool, -- Set this to true to immediately spawn the node on
-- are provided, this option is ignored. -- one side of the target node rather than the top.
-- Important note: the facedir values assigned -- The code will search for an airspace to the side of
-- by this option only make sense with -- the target, then spawn the plant at the first one
-- wallmounted nodes (nodes which don't use -- found. The above facedir and random_facedir
-- facedir won't be affected). -- parameters are ignored in this case. If the above
-- parameters for selecting generic wall nodes are
-- provided, this option is ignored. Important note:
-- the facedir values assigned by this option only
-- make sense with wallmounted nodes (nodes which
-- don't use facedir won't be affected).
choose_random_wall = bool, -- if set to true, and searching for walls is
-- being done, just pick any random wall if there is
-- one, rather than returning the first one.
spawn_on_bottom = bool, -- If set to true, spawn the object below the spawn_on_bottom = bool, -- If set to true, spawn the object below the
-- target node instead of above it. The above -- target node instead of above it. The above
-- spawn_on_side variable takes precedence -- spawn_on_side variable takes precedence over this
-- over this one if both happen to be true. -- one if both happen to be true. When using this
-- When using this option with the random -- option with the random facedir function above, the
-- facedir function above, the values given to -- values given to the facedir parameter are for
-- the facedir parameter are for regular -- regular nodes, not wallmounted.
-- nodes, not wallmounted. spawn_replace_node = bool, -- If set to true, the target node itself is
spawn_replace_node = bool, -- If set to true, the target node itself -- replaced by the spawned object. Overrides the
-- is replaced by the spawned object. -- spawn_on_bottom and spawn_on_side settings.
-- Overrides the spawn_on_bottom and
-- spawn_on_side settings.
} }
[*] spawn_plants must be either a table or a string. If it's a table, the [*] spawn_plants must be either a table or a string. If it's a table, the
@ -259,78 +240,69 @@ biome = {
---- conditions the objects are spawned. ---- conditions the objects are spawned.
below_nodes = {table}, -- List of nodes that must be below the target below_nodes = {table}, -- List of nodes that must be below the target
-- node. Useful in snow biomes to keep -- node. Useful in snow biomes to keep objects from
-- objects from spawning in snow that's on the -- spawning in snow that's on the wrong surface for
-- wrong surface for that object. -- that object.
avoid_nodes = {table}, -- List of nodes to avoid when spawning. avoid_nodes = {table}, -- List of nodes to avoid when spawning. Groups are
-- Groups are not supported here. -- not supported here.
avoid_radius = num, -- how much distance to leave between the avoid_radius = num, -- How much distance to leave between the object to be
-- object to be added and the objects to be -- added and the objects to be avoided. If this or
-- avoided. If this or the avoid_nodes value -- the avoid_nodes value is nil/omitted, this check is
-- is nil or omitted, this check is skipped. -- skipped. Avoid using excessively large radii.
-- Avoid using excessively large radii or you rarity = num, -- How rare should this object be in its biome? Larger
-- will slow down the map generator. -- values make objects more rare, via:
rarity = num, -- how rare should this object be in its -- math.random(1,100) > this
-- biome? Larger values make objects more max_count = num, -- The absolute maximum number of your object that
-- rare, via: math.random(1,100) > this -- should be allowed to spawn in a 5x5x5 mapblock area
max_count = num, -- The absolute maximum number of your object -- (80x80x80 nodes). Defaults to 5, but be sure you
-- that should be allowed to spawn in a 5x5x5 -- set this to some reasonable value depending on your
-- mapblock area (80x80x80 nodes). Defaults -- object and its size if 5 is insufficient.
-- to 5, but be sure you set this to some seed_diff = num, -- Perlin seed-diff value. Defaults to 0, which
-- reasonable value depending on your object -- causes the function to inherit the global value of
-- and its size if 5 is insufficient. -- 329.
seed_diff = num, -- perlin seed-diff value. Defaults to 0, neighbors = {table}, -- What ground nodes must be right next to and at the
-- which causes the function to inherit the -- same elevation as the node to be spawned on.
-- global value of 329. ncount = num, -- At least this many of the above nodes must be next
neighbors = {table}, -- What ground nodes must be right next to and -- to the node to spawn on. Any value greater than 8
-- at the same elevation as the node to be -- will probably cause the code to never spawn
-- spawned on. -- anything. Defaults to 0.
ncount = num, -- at least this many of the above nodes must depth = num, -- How deep/thick of a layer the spawned-on node must
-- be next to the node to spawn on. Any value -- be. Typically used for water.
-- greater than 8 will probably cause the code min_elevation = num, -- Minimum elevation in meters/nodes. Defaults to
-- to never spawn anything. Defaults to 0. -- -31000 (unlimited).
depth = num, -- how deep/thick of a layer the spawned-on max_elevation = num, -- Max elevation. Defaults to +31000 (unlimited).
-- node must be. Typically used for water. near_nodes = {table}, -- what nodes must be in the general vicinity of the
min_elevation = num, -- minimum elevation in meters/nodes. -- object being spawned.
-- Defaults to -31000 (unlimited). near_nodes_size = num, -- how wide of a search area to look for the nodes
max_elevation = num, -- maximum elevation. Defaults to +31000 -- in that list.
-- (unlimited). near_nodes_vertical = num, -- How high/low of an area to search from the
near_nodes = {table}, -- what nodes must be in the general vicinity -- target node.
-- of the object being spawned. near_nodes_count = num, -- at least this many of those nodes must be in
near_nodes_size = num, -- how wide of a search area to look for -- the area.
-- the nodes in that list. plantlife_limit = num, -- The value compared against the generic "plants
near_nodes_vertical = num, -- How high/low of an area to search from -- can grow here" Perlin noise layer. Smaller numbers
-- the target node. -- result in more abundant plants. Range of -1 to +1,
near_nodes_count = num, -- at least this many of those nodes must be -- with values in the range of about 0 to 0.5 being
-- in the area. -- most useful. Defaults to 0.1.
plantlife_limit = num, -- The value compared against the generic temp_min = num, -- Coldest allowable temperature for a plant to spawn
-- "plants can grow here" Perlin noise layer. -- (that is, the largest Perlin value).
-- Smaller numbers result in more abundant temp_max = num, -- warmest allowable temperature to spawn a plant
-- plants. Range of -1 to +1, with values in -- (lowest Perlin value).
-- the range of about 0 to 0.5 being most verticals_list = {table}, -- Same as with the spawn_on_surfaces function.
-- useful. Defaults to 0.1. check_air = bool, -- Flag to tell the mapgen code to check for air above
temp_min = num, -- coldest allowable temperature for a plant -- the spawn target. Defaults to true if not
-- to spawn (that is, the highest Perlin -- explicitly set to false. Set this to false VERY
-- temperature map value). -- SPARINGLY, as it will slow the map generator down.
temp_max = num, -- warmest allowable temperature to spawn a delete_above = bool, -- Flag to tell the mapgen code to delete the two
-- plant (lowest Perlin temperature value). -- nodes directly above the spawn target just before
verticals_list = {table}, -- Same as with the spawn_on_surfaces -- adding the plant or tree. Useful when generating
-- function. -- in snow biomes. Defaults to false.
check_air = bool, -- Flag to tell the mapgen code to check for
-- air above the spawn target. Defaults to
-- true if not explicitly set to false.
delete_above = bool, -- Flag to tell the mapgen code to delete the
-- two nodes directly above the spawn target
-- just before adding the plant or tree.
-- Useful when generating in snow biomes.
-- Defaults to false.
delete_above_surround = bool, -- Flag to tell the mapgen code to also delete_above_surround = bool, -- Flag to tell the mapgen code to also
-- delete the four nodes surrounding the above -- delete the five nodes surrounding the above space,
-- space, and the four nodes above those, -- and the five nodes above those, resulting in a two-
-- resulting in a two-node-deep cross-shaped -- node-deep cross-shaped empty region above/around
-- empty region above the spawn target. -- the spawn target. Useful when adding trees to snow
-- Useful when adding trees to snow biomes. -- biomes. Defaults to false.
-- Defaults to false.
spawn_replace_node = bool, -- same as with the ABM spawner. spawn_replace_node = bool, -- same as with the ABM spawner.
random_facedir = {table}, -- same as with the ABM spawner. random_facedir = {table}, -- same as with the ABM spawner.
} }
@ -371,59 +343,51 @@ a biome definition table as the only parameter. These are defined like so:
options = { options = {
grow_plant = "string", -- Name of the node to be grown into something grow_plant = "string", -- Name of the node to be grown into something
-- else. This value is passed to the ABM as -- else. This value is passed to the ABM as the
-- the "nodenames" parameter, so it is the -- "nodenames" parameter, so it is the plants
-- plants themselves that are the ABM trigger, -- themselves that are the ABM trigger, rather than
-- rather than the ground they spawned on. A -- the ground they spawned on. A plant will only grow
-- plant will only grow if the node above it -- if the node above it is air. Can also be a table,
-- is air. Can also be a table, but note that -- but note that all nodes referenced therein will be
-- all nodes referenced therein will be grown -- grown into the same object.
-- into the same object. grow_delay = num, -- Passed as the ABM "interval" parameter, as with
grow_delay = num, -- Passed as the ABM "interval" parameter, as -- spawning.
-- with spawning.
grow_chance = num, -- Passed as the ABM "chance" parameter. grow_chance = num, -- Passed as the ABM "chance" parameter.
grow_result = "string", -- Name of the node into which the grow_plant grow_result = "string", -- Name of the node into which the grow_plant
-- node(s) should transform when the ABM -- node(s) should transform when the ABM executes.
-- executes.
---- Everything from here down is optional. ---- Everything from here down is optional.
dry_early_node = "string", -- This value is ignored except for jungle dry_early_node = "string", -- This value is ignored except for jungle
-- grass (a corner case needed by that mod), -- grass (a corner case needed by that mod), where it
-- where it indicates which node the grass -- indicates which node the grass must be on in order
-- must be on in order for it to turn from -- for it to turn from the short size to
-- the short size to "default:dry_shrub" -- "default:dry_shrub" instead of the medium size.
-- instead of the medium size. grow_nodes = {table}, -- One of these nodes must be under the plant in
grow_nodes = {table}, -- One of these nodes must be under the plant -- order for it to grow at all. Normally this should
-- in order for it to grow at all. Normally -- be the same as the list of surfaces passed to the
-- this should be the same as the list of -- spawning ABM as the "nodenames" parameter. This is
-- surfaces passed to the spawning ABM as the -- so that the plant can be manually placed on
-- "nodenames" parameter. This is so that the -- something like a flower pot or something without it
-- plant can be manually placed on something -- necessarily growing and perhaps dieing. Defaults
-- like a flower pot or something without it -- to "default:dirt_with_grass".
-- growing and eventually dieing. Defaults to
-- "default:dirt_with_grass".
facedir = num, -- Same as with spawning a plant. facedir = num, -- Same as with spawning a plant.
need_wall = bool, -- Set this to true if you the plant needs to need_wall = bool, -- Set this to true if you the plant needs to grow
-- grow against a wall. Defaults to false. -- against a wall. Defaults to false.
verticals_list = {table}, -- List of nodes that should be considered verticals_list = {table}, -- same as with spawning a plant.
-- to be wall surfaces when growing the plant choose_random_wall = bool, -- same as with spawning a plant.
-- vertically. If not provided, the walls
-- check is skipped.
grow_vertically = bool, -- Set this to true if the plant needs to grow grow_vertically = bool, -- Set this to true if the plant needs to grow
-- vertically, as in climbing poison ivy. -- vertically, as in climbing poison ivy. Defaults to
-- Defaults to false. -- false.
height_limit = num, -- Set this to limit how tall the desired node height_limit = num, -- Set this to limit how tall the desired node can
-- can grow. The mod will search straight -- grow. The mod will search straight down from the
-- down from the position being spawned at to -- position being spawned at to find a ground node,
-- find a ground node, set via the parameter -- set via the field below. Defaults to 5 nodes.
-- below. Defaults to 5 nodes. ground_nodes = {table}, -- What nodes should be treated as "the ground"
ground_nodes = {table}, -- What nodes should be treated as "the -- below a vertically-growing plant. Usually this
-- ground" below a vertically-growing plant. -- should be the same as the grow_nodes table, but
-- Usually this should be the same as the -- might also include, for example, water or some
-- grow_nodes table, but might also include, -- other surrounding material. Defaults to
-- for example, water or some other
-- surrounding material. Defaults to
-- "default:dirt_with_grass". -- "default:dirt_with_grass".
grow_function = something, -- [*] see below. grow_function = something, -- [*] see below.
seed_diff = num, -- [*] see below. seed_diff = num, -- [*] see below.
@ -457,13 +421,16 @@ and grow_result is ignored.
===== =====
find_adjacent_wall(pos, verticals) find_adjacent_wall(pos, verticals, randomflag)
Of the few helper functions, this one expects a position parameter and a table Of the few helper functions, this one expects a position parameter and a table
with the list of nodes that should be considered as walls. The code will with the list of nodes that should be considered as walls. The code will
search around the given position for a neighboring wall, returning the first search around the given position for a neighboring wall, returning the first
one it finds as a facedir value, or nil if there are no adjacent walls. one it finds as a facedir value, or nil if there are no adjacent walls.
If randomflag is set to true, the function will just return the facedir of any
random wall it finds adjacent to the target position. Defaults to false if
not specified.
===== =====
is_node_loaded(pos) is_node_loaded(pos)
@ -490,11 +457,11 @@ call the usual spawn_tree() functions. This rerouting exists as a way for
other mods to hook into plants_lib's tree-growing functions in general, other mods to hook into plants_lib's tree-growing functions in general,
perhaps to execute something extra whenever a tree is spawned. perhaps to execute something extra whenever a tree is spawned.
plantslib:generate_tree(pos, treemodel) is called any time a plantslib:generate_tree(pos, treemodel) is called any time a tree is spawned
tree is spawned at map generation time. 'pos' is the position of the block on at map generation time. 'pos' is the position of the block on which the tree
which the tree is to be placed. 'treemodel' is the standard L-Systems tree is to be placed. 'treemodel' is the standard L-Systems tree definition table
definition table expected by the spawn_tree() function. Refer to the 'trunk' expected by the spawn_tree() function. Refer to the 'trunk' field in that
field in that table to derive the name of the tree being spawned. table to derive the name of the tree being spawned.
plantslib:grow_tree(pos, treemodel) does the same sort of thing whenever a plantslib:grow_tree(pos, treemodel) does the same sort of thing whenever a
tree is spawned within the abm-based growing code, for example when growing a tree is spawned within the abm-based growing code, for example when growing a

View File

@ -483,7 +483,7 @@ function plantslib:spawn_on_surfaces(sd,sp,sr,sc,ss,sa)
and pos.y >= biome.min_elevation and pos.y >= biome.min_elevation
and pos.y <= biome.max_elevation and pos.y <= biome.max_elevation
then then
local walldir = plantslib:find_adjacent_wall(p_top, biome.verticals_list) local walldir = plantslib:find_adjacent_wall(p_top, biome.verticals_list, biome.choose_random_wall)
if biome.alt_wallnode and walldir then if biome.alt_wallnode and walldir then
if n_top.name == "air" then if n_top.name == "air" then
minetest.set_node(p_top, { name = biome.alt_wallnode, param2 = walldir }) minetest.set_node(p_top, { name = biome.alt_wallnode, param2 = walldir })
@ -555,7 +555,7 @@ function plantslib:grow_plants(opts)
local root_node = minetest.get_node({x=pos.x, y=pos.y-options.height_limit, z=pos.z}) local root_node = minetest.get_node({x=pos.x, y=pos.y-options.height_limit, z=pos.z})
local walldir = nil local walldir = nil
if options.need_wall and options.verticals_list then if options.need_wall and options.verticals_list then
walldir = plantslib:find_adjacent_wall(p_top, options.verticals_list) walldir = plantslib:find_adjacent_wall(p_top, options.verticals_list, biome.choose_random_wall)
end end
if n_top.name == "air" and (not options.need_wall or (options.need_wall and walldir)) if n_top.name == "air" and (not options.need_wall or (options.need_wall and walldir))
then then
@ -612,12 +612,24 @@ end
-- function to decide if a node has a wall that's in verticals_list{} -- function to decide if a node has a wall that's in verticals_list{}
-- returns wall direction of valid node, or nil if invalid. -- returns wall direction of valid node, or nil if invalid.
function plantslib:find_adjacent_wall(pos, verticals) function plantslib:find_adjacent_wall(pos, verticals, randomflag)
local verts = dump(verticals) local verts = dump(verticals)
if randomflag then
local walltab = {}
if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name) then walltab[#walltab + 1] = 3 end
if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name) then walltab[#walltab + 1] = 2 end
if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z-1 }).name) then walltab[#walltab + 1] = 5 end
if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z+1 }).name) then walltab[#walltab + 1] = 4 end
if #walltab > 0 then return walltab[math.random(1, #walltab)] end
else
if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name) then return 3 end if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name) then return 3 end
if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name) then return 2 end if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name) then return 2 end
if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z-1 }).name) then return 5 end if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z-1 }).name) then return 5 end
if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z+1 }).name) then return 4 end if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z+1 }).name) then return 4 end
end
return nil return nil
end end