diff --git a/API.txt b/plants_lib/API.txt similarity index 53% rename from API.txt rename to plants_lib/API.txt index 8075865..8f6455c 100644 --- a/API.txt +++ b/plants_lib/API.txt @@ -1,6 +1,6 @@ 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_chance = number, -- same as schance, above. spawn_surfaces = {table}, -- List of node names on which the plants - -- should be spawned. As with the single- - -- node "ssurface" option in the legacy API, - -- you should not put stone, air, etc. here. + -- should be spawned. As with the single-node "ssurface" + -- option in the legacy API, you should not put stone, air, + -- etc. here. ---- 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 @@ -74,151 +74,132 @@ biome = { avoid_nodes = {table}, -- same meaning as savoid, above avoid_radius = num, -- same as sradius - seed_diff = num, -- The Perlin seed difference value passed to - -- the minetest.get_perlin() function. - -- Used along with the global Perlin controls - -- below to create the "biome" in which the - -- plants will spawn. Defaults to 0 if not - -- provided. - light_min = num, -- Minimum amount of light necessary to make a - -- plant spawn. Defaults to 0. - light_max = num, -- Maximum amount of light needed to spawn. - -- Defaults to the engine's MAX_LIGHT value of - -- 14. - neighbors = {table}, -- List of neighboring nodes that need to be - -- immediately next to the node the plant is - -- about to spawn on. Can also be a string - -- with a single node name. It is both passed - -- to the ABM as the "neighbors" parameter, - -- and is used to manually check the - -- adjacent nodes. It only takes one of these - -- for the spawn routine to mark the target as - -- spawnable. Defaults to nil (ignored). - ncount = num, -- There must be at least this many of the - -- above neighbors in the eight spaces - -- immediately surrounding the node the plant - -- is about to spawn on for it to happen. If - -- 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. + seed_diff = num, -- The Perlin seed difference value passed to the + -- minetest.get_perlin() function. Used along with + -- the global Perlin controls below to create the + -- "biome" in which the plants will spawn. Defaults + -- to 0 if not provided. + light_min = num, -- Minimum amount of light necessary to make a plant + -- spawn. Defaults to 0. + light_max = num, -- Maximum amount of light needed to spawn. Defaults + -- to the engine's MAX_LIGHT value of 14. + neighbors = {table}, -- List of neighboring nodes that need to be + -- immediately next to the node the plant is about to + -- spawn on. Can also be a string with a single node + -- name. It is both passed to the ABM as the + -- "neighbors" parameter, and is used to manually + -- check the adjacent nodes. It only takes one of + -- these for the spawn routine to mark the target as + -- spawnable. Defaults to nil (ignored). + ncount = num, -- There must be at least this many of the above + -- neighbors in the eight spaces immediately + -- surrounding the node the plant is about to spawn on + -- for it to happen. If 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 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 - -- node. Specifically, this checks a flat - -- horizontal area centered on the node to be - -- spawned on. Defaults to 0, but is ignored - -- if the above near_nodes value is not set. - near_nodes_vertical = num, -- Used with the size value above, this - -- extends the vertical range of the near - -- nodes search. Basically, this turns the - -- flat region described above into a cuboid - -- region. The area to be checked will extend - -- this high AND this low above/below the - -- target node, centered thereon. Defaults to - -- 1 (check only the layer above, the layer - -- at, and the layer below the target node), - -- but is ignored if near_nodes is not set. - near_nodes_count = num, -- How many of the above nodes must be within - -- that radius. Defaults to 1 but is ignored - -- if near_nodes isn't set. Bear in mind that - -- the total area to be checked is equal to - -- (near_nodes_size^2)*near_nodes_vertical*2. - -- so for example, if size is 10 and vertical - -- is 4 then the area is (10^2)*8 = 800 nodes - -- in size, so you'll want to make sure you - -- specify a value appropriate for the amount - -- in question. - air_size = num, -- How large of an area to check for air - -- above and around the target. If omitted, - -- only the space above the target is checked. - -- This does not check 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. - plantlife_limit = num, -- The value compared against the generic - -- "plants can grow here" Perlin noise layer. - -- Smaller numbers result in more abundant - -- plants. Range of -1 to +1, with values in - -- the range of about 0 to 0.5 being most - -- useful. Defaults to 0.1. - temp_min = num, -- Minimum temperature needed for the desired - -- object to spawn. This is a 2d Perlin - -- value, which has an inverted range of +1 to - -- -1. Larger values represent *colder* - -- temperatures, so this value is actually the - -- upper end of the desired Perlin range. See - -- the temperature map section at the bottom - -- 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). + -- node. Specifically, this checks a flat, horizontal + -- area centered on the node to be spawned on. + -- Defaults to 0, but is ignored if the above + -- near_nodes value is not set. + near_nodes_vertical = num, -- Used with the size value above, this extends + -- the vertical range of the near nodes search. + -- Basically, this turns the flat region described + -- above into a cuboid region. The area to be checked + -- will extend this high and this low above/below the + -- target node, centered thereon. Defaults to 1 (only + -- check the layer above, the layer at, and the layer + -- below the target node), but is ignored if + -- near_nodes is not set. + near_nodes_count = num, -- How many of the above nodes must be within that + -- radius. Defaults to 1 but is ignored if near_nodes + -- isn't set. Bear in mind that the total area to be + -- checked is equal to: + -- (near_nodes_size^2)*near_nodes_vertical*2 + -- For example, if size is 10 and vertical is 4, then + -- the area is (10^2)*8 = 800 nodes in size, so you'll + -- want to make sure you specify a value appropriate + -- for the size of the area being tested. + air_size = num, -- How large of an area to check for air above and + -- around the target. If omitted, only the space + -- above the target is checked. This does not check + -- 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. + plantlife_limit = num, -- The value compared against the generic "plants + -- can grow here" Perlin noise layer. Smaller numbers + -- result in more abundant plants. Range of -1 to +1, + -- with values in the range of about 0 to 0.5 being + -- most useful. Defaults to 0.1. + temp_min = num, -- Minimum temperature needed for the desired object + -- to spawn. This is a 2d Perlin value, which has an + -- inverted range of +1 to -1. Larger values + -- represent *colder* temperatures, so this value is + -- actually the upper end of the desired Perlin range. + -- See the temperature map section at the bottom 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% humidity). humidity_max = num, -- Maximum humidity for the plant to spawn at. - -- Defaults to -1 (100% humidity). - spawn_on_side = bool, -- Set this to true to spawn the node on one - -- side of the target node rather than the - -- top. The code will search for an airspace - -- to the side of the target, then spawn the - -- plant at the first one found. The above - -- facedir and random_facedir 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). + -- Defaults to -1 (100% humidity). + 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. + spawn_on_side = bool, -- Set this to true to immediately spawn the node on + -- one side of the target node rather than the top. + -- The code will search for an airspace to the side of + -- the target, then spawn the plant at the first one + -- found. The above facedir and random_facedir + -- 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 - -- target node instead of above it. The above - -- spawn_on_side variable takes precedence - -- over this one if both happen to be true. - -- When using this option with the random - -- facedir function above, the values given to - -- the facedir parameter are for regular - -- nodes, not wallmounted. - spawn_replace_node = bool, -- If set to true, the target node itself - -- is replaced by the spawned object. - -- Overrides the spawn_on_bottom and - -- spawn_on_side settings. + -- target node instead of above it. The above + -- spawn_on_side variable takes precedence over this + -- one if both happen to be true. When using this + -- option with the random facedir function above, the + -- values given to the facedir parameter are for + -- regular nodes, not wallmounted. + spawn_replace_node = bool, -- If set to true, the target node itself is + -- replaced by the spawned object. 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 @@ -250,87 +231,78 @@ here than are available in the ABM-based spawner, as some stuff doesn't make sense at map-generation time. biome = { - surface = something, -- What node(s). May be a string such as - -- "default:dirt_with_grass" or a table with - -- multiple such entries. + surface = something, -- What node(s). May be a string such as + -- "default:dirt_with_grass" or a table with + -- multiple such entries. ---- Everything else is optional, but you'll definitely want to use ---- some of these other fields to limit where and under what ---- conditions the objects are spawned. - below_nodes = {table}, -- List of nodes that must be below the target - -- node. Useful in snow biomes to keep - -- objects from spawning in snow that's on the - -- wrong surface for that object. - avoid_nodes = {table}, -- List of nodes to avoid when spawning. - -- Groups are not supported here. - avoid_radius = num, -- how much distance to leave between the - -- object to be added and the objects to be - -- avoided. If this or the avoid_nodes value - -- is nil or omitted, this check is skipped. - -- Avoid using excessively large radii or you - -- will slow down the map generator. - rarity = num, -- how rare should this object be in its - -- biome? Larger values make objects more - -- rare, via: math.random(1,100) > this - max_count = num, -- The absolute maximum number of your object - -- that should be allowed to spawn in a 5x5x5 - -- mapblock area (80x80x80 nodes). Defaults - -- to 5, but be sure you set this to some - -- reasonable value depending on your object - -- and its size if 5 is insufficient. - seed_diff = num, -- perlin seed-diff value. Defaults to 0, - -- which causes the function to inherit the - -- global value of 329. - neighbors = {table}, -- What ground nodes must be right next to and - -- at the same elevation as the node to be - -- spawned on. - ncount = num, -- at least this many of the above nodes must - -- be next to the node to spawn on. Any value - -- greater than 8 will probably cause the code - -- to never spawn anything. Defaults to 0. - depth = num, -- how deep/thick of a layer the spawned-on - -- node must be. Typically used for water. - min_elevation = num, -- minimum elevation in meters/nodes. - -- Defaults to -31000 (unlimited). - max_elevation = num, -- maximum elevation. Defaults to +31000 - -- (unlimited). - near_nodes = {table}, -- what nodes must be in the general vicinity - -- of the object being spawned. - near_nodes_size = num, -- how wide of a search area to look for - -- the nodes in that list. - near_nodes_vertical = num, -- How high/low of an area to search from - -- the target node. - near_nodes_count = num, -- at least this many of those nodes must be - -- in the area. - plantlife_limit = num, -- The value compared against the generic - -- "plants can grow here" Perlin noise layer. - -- Smaller numbers result in more abundant - -- plants. Range of -1 to +1, with values in - -- the range of about 0 to 0.5 being most - -- useful. Defaults to 0.1. - temp_min = num, -- coldest allowable temperature for a plant - -- to spawn (that is, the highest Perlin - -- temperature map value). - temp_max = num, -- warmest allowable temperature to spawn a - -- plant (lowest Perlin temperature value). - verticals_list = {table}, -- Same as with the spawn_on_surfaces - -- function. - 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. + below_nodes = {table}, -- List of nodes that must be below the target + -- node. Useful in snow biomes to keep objects from + -- spawning in snow that's on the wrong surface for + -- that object. + avoid_nodes = {table}, -- List of nodes to avoid when spawning. Groups are + -- not supported here. + avoid_radius = num, -- How much distance to leave between the object to be + -- added and the objects to be avoided. If this or + -- the avoid_nodes value is nil/omitted, this check is + -- skipped. Avoid using excessively large radii. + rarity = num, -- How rare should this object be in its biome? Larger + -- values make objects more rare, via: + -- math.random(1,100) > this + max_count = num, -- The absolute maximum number of your object that + -- should be allowed to spawn in a 5x5x5 mapblock area + -- (80x80x80 nodes). Defaults to 5, but be sure you + -- set this to some reasonable value depending on your + -- object and its size if 5 is insufficient. + seed_diff = num, -- Perlin seed-diff value. Defaults to 0, which + -- causes the function to inherit the global value of + -- 329. + neighbors = {table}, -- What ground nodes must be right next to and at the + -- same elevation as the node to be spawned on. + ncount = num, -- At least this many of the above nodes must be next + -- to the node to spawn on. Any value greater than 8 + -- will probably cause the code to never spawn + -- anything. Defaults to 0. + depth = num, -- How deep/thick of a layer the spawned-on node must + -- be. Typically used for water. + min_elevation = num, -- Minimum elevation in meters/nodes. Defaults to + -- -31000 (unlimited). + max_elevation = num, -- Max elevation. Defaults to +31000 (unlimited). + near_nodes = {table}, -- what nodes must be in the general vicinity of the + -- object being spawned. + near_nodes_size = num, -- how wide of a search area to look for the nodes + -- in that list. + near_nodes_vertical = num, -- How high/low of an area to search from the + -- target node. + near_nodes_count = num, -- at least this many of those nodes must be in + -- the area. + plantlife_limit = num, -- The value compared against the generic "plants + -- can grow here" Perlin noise layer. Smaller numbers + -- result in more abundant plants. Range of -1 to +1, + -- with values in the range of about 0 to 0.5 being + -- most useful. Defaults to 0.1. + temp_min = num, -- Coldest allowable temperature for a plant to spawn + -- (that is, the largest Perlin value). + temp_max = num, -- warmest allowable temperature to spawn a plant + -- (lowest Perlin value). + verticals_list = {table}, -- Same as with the spawn_on_surfaces function. + 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. Set this to false VERY + -- SPARINGLY, as it will slow the map generator down. + 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 the four nodes surrounding the above - -- space, and the four nodes above those, - -- resulting in a two-node-deep cross-shaped - -- empty region above the spawn target. - -- Useful when adding trees to snow biomes. - -- Defaults to false. + -- delete the five nodes surrounding the above space, + -- and the five nodes above those, resulting in a two- + -- node-deep cross-shaped empty region above/around + -- the spawn target. Useful when adding trees to snow + -- biomes. Defaults to false. spawn_replace_node = bool, -- same as with the ABM spawner. random_facedir = {table}, -- same as with the ABM spawner. } @@ -370,61 +342,53 @@ into something else over time. This function has no return value, and accepts a biome definition table as the only parameter. These are defined like so: options = { - grow_plant = "string", -- Name of the node to be grown into something - -- else. This value is passed to the ABM as - -- the "nodenames" parameter, so it is the - -- plants themselves that are the ABM trigger, - -- rather than the ground they spawned on. A - -- plant will only grow if the node above it - -- is air. Can also be a table, but note that - -- all nodes referenced therein will be grown - -- into the same object. - grow_delay = num, -- Passed as the ABM "interval" parameter, as - -- with spawning. + grow_plant = "string", -- Name of the node to be grown into something + -- else. This value is passed to the ABM as the + -- "nodenames" parameter, so it is the plants + -- themselves that are the ABM trigger, rather than + -- the ground they spawned on. A plant will only grow + -- if the node above it is air. Can also be a table, + -- but note that all nodes referenced therein will be + -- grown into the same object. + grow_delay = num, -- Passed as the ABM "interval" parameter, as with + -- spawning. grow_chance = num, -- Passed as the ABM "chance" parameter. grow_result = "string", -- Name of the node into which the grow_plant - -- node(s) should transform when the ABM - -- executes. + -- node(s) should transform when the ABM executes. ---- Everything from here down is optional. dry_early_node = "string", -- This value is ignored except for jungle - -- grass (a corner case needed by that mod), - -- where it indicates which node the grass - -- must be on in order for it to turn from - -- the short size to "default:dry_shrub" - -- instead of the medium size. - grow_nodes = {table}, -- One of these nodes must be under the plant - -- in order for it to grow at all. Normally - -- this should be the same as the list of - -- surfaces passed to the spawning ABM as the - -- "nodenames" parameter. This is so that the - -- plant can be manually placed on something - -- like a flower pot or something without it - -- growing and eventually dieing. Defaults to - -- "default:dirt_with_grass". + -- grass (a corner case needed by that mod), where it + -- indicates which node the grass must be on in order + -- for it to turn from the short size to + -- "default:dry_shrub" instead of the medium size. + grow_nodes = {table}, -- One of these nodes must be under the plant in + -- order for it to grow at all. Normally this should + -- be the same as the list of surfaces passed to the + -- spawning ABM as the "nodenames" parameter. This is + -- so that the plant can be manually placed on + -- something like a flower pot or something without it + -- necessarily growing and perhaps dieing. Defaults + -- to "default:dirt_with_grass". facedir = num, -- Same as with spawning a plant. - need_wall = bool, -- Set this to true if you the plant needs to - -- grow against a wall. Defaults to false. - verticals_list = {table}, -- List of nodes that should be considered - -- to be wall surfaces when growing the plant - -- vertically. If not provided, the walls - -- check is skipped. + need_wall = bool, -- Set this to true if you the plant needs to grow + -- against a wall. Defaults to false. + verticals_list = {table}, -- same as with spawning a plant. + choose_random_wall = bool, -- same as with spawning a plant. grow_vertically = bool, -- Set this to true if the plant needs to grow - -- vertically, as in climbing poison ivy. - -- Defaults to false. - height_limit = num, -- Set this to limit how tall the desired node - -- can grow. The mod will search straight - -- down from the position being spawned at to - -- find a ground node, set via the parameter - -- below. Defaults to 5 nodes. - ground_nodes = {table}, -- What nodes should be treated as "the - -- ground" below a vertically-growing plant. - -- Usually this should be the same as the - -- grow_nodes table, but might also include, - -- for example, water or some other - -- surrounding material. Defaults to - -- "default:dirt_with_grass". + -- vertically, as in climbing poison ivy. Defaults to + -- false. + height_limit = num, -- Set this to limit how tall the desired node can + -- grow. The mod will search straight down from the + -- position being spawned at to find a ground node, + -- set via the field below. Defaults to 5 nodes. + ground_nodes = {table}, -- What nodes should be treated as "the ground" + -- below a vertically-growing plant. Usually this + -- should be the same as the grow_nodes table, but + -- might also include, for example, water or some + -- other surrounding material. Defaults to + -- "default:dirt_with_grass". grow_function = something, -- [*] 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 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 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) @@ -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, perhaps to execute something extra whenever a tree is spawned. -plantslib:generate_tree(pos, treemodel) is called any time a -tree is spawned at map generation time. 'pos' is the position of the block on -which the tree is to be placed. 'treemodel' is the standard L-Systems tree -definition table expected by the spawn_tree() function. Refer to the 'trunk' -field in that table to derive the name of the tree being spawned. +plantslib:generate_tree(pos, treemodel) is called any time a tree is spawned +at map generation time. 'pos' is the position of the block on which the tree +is to be placed. 'treemodel' is the standard L-Systems tree definition table +expected by the spawn_tree() function. Refer to the 'trunk' field in that +table to derive the name of the tree being spawned. 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 diff --git a/plants_lib/init.lua b/plants_lib/init.lua index dba332b..d41b52b 100644 --- a/plants_lib/init.lua +++ b/plants_lib/init.lua @@ -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.max_elevation 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 n_top.name == "air" then 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 walldir = nil 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 if n_top.name == "air" and (not options.need_wall or (options.need_wall and walldir)) then @@ -612,12 +612,24 @@ end -- function to decide if a node has a wall that's in verticals_list{} -- 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) - 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 , 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 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 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 4 end + end return nil end