mirror of
https://github.com/sys4-fr/server-nalc.git
synced 2024-12-25 10:10:39 +01:00
613 lines
26 KiB
Plaintext
613 lines
26 KiB
Plaintext
|
This document describes the Plantlife mod API.
|
||
|
|
||
|
Last revision: 2014-05-24
|
||
|
|
||
|
|
||
|
=========
|
||
|
Functions
|
||
|
=========
|
||
|
|
||
|
There are three main functions defined by the main "plants_lib" mod:
|
||
|
|
||
|
spawn_on_surfaces()
|
||
|
register_generate_plant()
|
||
|
grow_plants()
|
||
|
|
||
|
There are also several internal, helper functions that can be called if so
|
||
|
desired, but they are not really intended for use by other mods and may change
|
||
|
at any time. They are briefly described below these main functions, but see
|
||
|
init.lua for details.
|
||
|
|
||
|
Most functions in plants lib are declared locally to avoid namespace
|
||
|
collisions with other mods. They are accessible via the "plantslib" method,
|
||
|
e.g. plantslib:spawn_on_surfaces() and so forth.
|
||
|
|
||
|
=====
|
||
|
spawn_on_surfaces(biome)
|
||
|
spawn_on_surfaces(sdelay, splant, sradius, schance, ssurface, savoid)
|
||
|
|
||
|
This first function is an ABM-based spawner function originally created as
|
||
|
part of Ironzorg's flowers mod. It has since been largely extended and
|
||
|
expanded. There are two ways to call this function: You can either pass it
|
||
|
several individual string and number parameters to use the legacy interface,
|
||
|
or you can pass a single biome definition as a table, with all of your options
|
||
|
spelled out nicely. This is the preferred method.
|
||
|
|
||
|
When used with the legacy interface, you must specify the parameters exactly
|
||
|
in order, with the first five being mandatory (even if some are set to nil),
|
||
|
and the last one being optional:
|
||
|
|
||
|
sdelay: The value passed to the ABM's interval parameter, in seconds.
|
||
|
splant: The node name of the item to spawn (e.g.
|
||
|
"flowers:flower_rose"). A plant will of course only be
|
||
|
spawned if the node about to be replaced is air.
|
||
|
sradius: Don't spawn within this many nodes of the avoid items
|
||
|
mentioned below. If set to nil, this check is skipped.
|
||
|
schance: The value passed to the ABM's chance parameter, normally in
|
||
|
the 10-100 range (1-in-X chance of operating on a given node)
|
||
|
ssurface: String with the name of the node on which to spawn the plant
|
||
|
in question, such as "default:sand" or
|
||
|
"default:dirt_with_grass". It is not recommended to put air,
|
||
|
stone, or plain dirt here if you can use some other node, as
|
||
|
doing so will cause the engine to process potentially large
|
||
|
numbers of such nodes when deciding when to execute the ABM
|
||
|
and where it should operate.
|
||
|
savoid: Table with a list of groups and/or node names to avoid when
|
||
|
spawning the plant, such as {"group:flowers", "default:tree"}.
|
||
|
|
||
|
When passed a table as the argument, and thus using the modern calling method,
|
||
|
you must pass a number of arguments in the form of an ordinary keyed-value
|
||
|
table. Below is a list of everything supported by this function:
|
||
|
|
||
|
biome = {
|
||
|
spawn_plants = something, -- [*] String or table; see below.
|
||
|
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.
|
||
|
|
||
|
---- 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
|
||
|
---- where your objects are spawned.
|
||
|
|
||
|
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.
|
||
|
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).
|
||
|
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).
|
||
|
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.
|
||
|
}
|
||
|
|
||
|
[*] spawn_plants must be either a table or a string. If it's a table, the
|
||
|
values therein are treated as a list of nodenames to pick from randomly on
|
||
|
each application of the ABM code. The more nodes you can pack into this
|
||
|
parameter to avoid making too many calls to this function, the lower the CPU
|
||
|
load will likely be.
|
||
|
|
||
|
You can also specify a string containing the name of a function to execute.
|
||
|
In this case, the function will be passed a single position parameter
|
||
|
indicating where the function should place the desired object, and the checks
|
||
|
for spawning on top vs. sides vs. bottom vs. replacing the target node will be
|
||
|
skipped.
|
||
|
|
||
|
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.
|
||
|
|
||
|
|
||
|
=====
|
||
|
plantslib:register_generate_plant(biome, nodes_or_function_or_treedef)
|
||
|
|
||
|
To register an object to be spawned at mapgen time rather than via an ABM,
|
||
|
call this function with two parameters: a table with your object's biome
|
||
|
information, and a string, function, or table describing what to do if the
|
||
|
engine finds a suitable surface node (see below).
|
||
|
|
||
|
The biome table contains quite a number of options, though there are fewer
|
||
|
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.
|
||
|
|
||
|
---- 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 or groups to avoid when
|
||
|
-- spawning.
|
||
|
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.
|
||
|
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.
|
||
|
spawn_replace_node = bool, -- same as with the ABM spawner.
|
||
|
random_facedir = {table}, -- same as with the ABM spawner.
|
||
|
}
|
||
|
|
||
|
Regarding nodes_or_function_or_treedef, this must either be a string naming
|
||
|
a node to spawn, a table with a list of nodes to choose from, a table with an
|
||
|
L-Systems tree definition, or a function.
|
||
|
|
||
|
If you specified a string, the code will attempt to determine whether that
|
||
|
string specifies a valid node name. If it does, that node will be placed on
|
||
|
top of the target position directly (unless one of the other mapgen options
|
||
|
directs the code to do otherwise).
|
||
|
|
||
|
If you specified a table and there is no "axiom" field, the code assumes that
|
||
|
it is a list of nodes. Simply name one node per entry in the list, e.g.
|
||
|
{"default:junglegrass", "default:dry_shrub"} and so on, for as many nodes as
|
||
|
you want to list. A random node from the list will be chosen each time the
|
||
|
code goes to place a node.
|
||
|
|
||
|
If you specified a table, and there *is* an "axiom" field, the code assumes
|
||
|
that this table contains an L-Systems tree definition, which will be passed
|
||
|
directly to the engine's spawn_tree() function along with the position on
|
||
|
which to spawn the tree.
|
||
|
|
||
|
You can also supply a function to be directly executed, which is given the
|
||
|
current node position (the usual "pos" table format) as its sole argument. It
|
||
|
will be called in the form:
|
||
|
|
||
|
somefunction(pos)
|
||
|
|
||
|
|
||
|
=====
|
||
|
plantslib:grow_plants(options)
|
||
|
|
||
|
The third function, grow_plants() is used to turn the spawned nodes above
|
||
|
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_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.
|
||
|
|
||
|
---- 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".
|
||
|
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.
|
||
|
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".
|
||
|
grow_function = something, -- [*] see below.
|
||
|
seed_diff = num, -- [*] see below.
|
||
|
}
|
||
|
|
||
|
[*] grow_function can take one of three possible settings: it can be nil (or
|
||
|
not provided), a string, or a table.
|
||
|
|
||
|
If it is not provided or it's set to nil, all of the regular growing code is
|
||
|
executed normally, the value of seed_diff, if any, is ignored, and the node to
|
||
|
be placed is assumed to be specified in the grow_result variable.
|
||
|
|
||
|
If this value is set to a simple string, this is treated as the name of the
|
||
|
function to use to grow the plant. In this case, all of the usual growing
|
||
|
code is executeed, but then instead of a plant being simply added to the
|
||
|
world, grow_result is ignored and the named function is executed and passed a
|
||
|
few parmeters in the following general form:
|
||
|
|
||
|
somefunction(pos, perlin1, perlin2)
|
||
|
|
||
|
These values represent the current position (the usual table), the Perlin
|
||
|
noise value for that spot in the generic "plants can grow here" map for the
|
||
|
seed_diff value above, the Perlin value for that same spot from the
|
||
|
temperature map, and the detected neighboring wall face, if there was one (or
|
||
|
nil if not). If seed_diff is not provided, it defaults to 0.
|
||
|
|
||
|
If this variable is instead set to a table, it is treated an an L-Systems tree
|
||
|
definition. All of the growing code is executed in the usual manner, then the
|
||
|
tree described by that definition is spawned at the current position instead,
|
||
|
and grow_result is ignored.
|
||
|
|
||
|
|
||
|
=====
|
||
|
find_adjacent_wall(pos, verticals)
|
||
|
|
||
|
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.
|
||
|
|
||
|
|
||
|
=====
|
||
|
is_node_loaded(pos)
|
||
|
|
||
|
This acts as a wrapper for the minetest.get_node_or_nil(node_pos)
|
||
|
function and accepts a single position parameter. Returns true if the node in
|
||
|
question is already loaded, or false if not.
|
||
|
|
||
|
|
||
|
=====
|
||
|
dbg(string)
|
||
|
|
||
|
This is a simple debug output function which takes one string parameter. It
|
||
|
just checks if DEBUG is true and outputs the phrase "[Plantlife] " followed by
|
||
|
the supplied string, via the print() function, if so.
|
||
|
|
||
|
=====
|
||
|
plantslib:generate_tree(pos, treemodel)
|
||
|
plantslib:grow_tree(pos, treemodel)
|
||
|
|
||
|
In the case of the growing code and the mapgen-based tree generator code,
|
||
|
generating a tree is done via the above two calls, which in turn immediately
|
||
|
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: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
|
||
|
sapling into a tree.
|
||
|
|
||
|
|
||
|
=====
|
||
|
There are other, internal helper functions that are not meant for use by other
|
||
|
mods. Don't rely on them, as they are subject to change without notice.
|
||
|
|
||
|
|
||
|
===============
|
||
|
Global Settings
|
||
|
===============
|
||
|
|
||
|
Set this to true if you want the mod to spam your console with debug info :-)
|
||
|
|
||
|
plantlife_debug = false
|
||
|
|
||
|
|
||
|
======================
|
||
|
Fertile Ground Mapping
|
||
|
======================
|
||
|
|
||
|
The mod uses Perlin noise to create "biomes" of the various plants, via the
|
||
|
minetest.get_perlin() function. At present, there are three layers of
|
||
|
Perlin noise used.
|
||
|
|
||
|
The first one is for a "fertile ground" layer, which I tend to refer to as the
|
||
|
generic "stuff can potentially grow here" layer. Its values are hard-coded:
|
||
|
|
||
|
plantslib.plantlife_seed_diff = 329
|
||
|
perlin_octaves = 3
|
||
|
perlin_persistence = 0.6
|
||
|
perlin_scale = 100
|
||
|
|
||
|
For more information on how Perlin noise is generated, you will need to search
|
||
|
the web, as these default values were from that which is used by minetest_game
|
||
|
to spawn jungle grass at mapgen time, and I'm still learning how Perlin noise
|
||
|
works. ;-)
|
||
|
|
||
|
|
||
|
===================
|
||
|
Temperature Mapping
|
||
|
===================
|
||
|
|
||
|
The second Perlin layer is a temperature map, with values taken from
|
||
|
SPlizard's Snow Biomes mod so that the two will be compatible, since that mod
|
||
|
appears to be the standard now. Those values are:
|
||
|
|
||
|
temperature_seeddiff = 112
|
||
|
temperature_octaves = 3
|
||
|
temperature_persistence = 0.5
|
||
|
temperature_scale = 150
|
||
|
|
||
|
The way Perlin values are used by this mod, in keeping with the snow mod's
|
||
|
apparent methods, larger values returned by the Perlin function represent
|
||
|
*colder* temperatures. In this mod, the following table gives a rough
|
||
|
approximation of how temperature maps to these values, normalized to
|
||
|
0.53 = 0 °C and +1.0 = -25 °C.
|
||
|
|
||
|
Perlin Approx. Temperature
|
||
|
-1.0 81 °C ( 178 °F)
|
||
|
-0.75 68 °C ( 155 °F)
|
||
|
-0.56 58 °C ( 136 °F)
|
||
|
-0.5 55 °C ( 131 °F)
|
||
|
-0.25 41 °C ( 107 °F)
|
||
|
-0.18 38 °C ( 100 °F)
|
||
|
0 28 °C ( 83 °F)
|
||
|
0.13 21 °C ( 70 °F)
|
||
|
0.25 15 °C ( 59 °F)
|
||
|
0.5 2 °C ( 35 °F)
|
||
|
0.53 0 °C ( 32 °F)
|
||
|
0.75 -12 °C ( 11 °F)
|
||
|
0.86 -18 °C ( 0 °F)
|
||
|
1.0 -25 °C (- 13 °F)
|
||
|
|
||
|
Included in this table are even 0.25 steps in Perlin values along with some
|
||
|
common temperatures on both the Centigrade and Fahrenheit scales. Note that
|
||
|
unless you're trying to model the Moon or perhaps Mercury in your mods/maps,
|
||
|
you probably won't need to bother with Perlin values of less than -0.56 or so.
|
||
|
|
||
|
|
||
|
================
|
||
|
Humidity Mapping
|
||
|
================
|
||
|
|
||
|
Last but not least is a moisture/humidity map. Like the temperature map
|
||
|
above, Perlin values can be tested to determine the approximate humidity of
|
||
|
the *air* in the area. This humidity map is basically the perlin layer used
|
||
|
for deserts.
|
||
|
|
||
|
A value of +1.0 is very moist (basically a thick fog, if it could be seen), a
|
||
|
value of roughly +0.25 represents the edge of a desert as usually seen in the
|
||
|
game, and a value of -1.0 is as dry as a bone.
|
||
|
|
||
|
This does not check for nearby water, just general air humidity, and that
|
||
|
being the case, nearby ground does not affect the reported humidity of a
|
||
|
region (because this isn't yet possible to calculate yet). Use the near_nodes
|
||
|
and avoid_nodes parameters and their related options to check for water and
|
||
|
such.
|
||
|
|
||
|
The Perlin values use for this layer are:
|
||
|
|
||
|
humidity_seeddiff = 9130
|
||
|
humidity_octaves = 3
|
||
|
humidity_persistence = 0.5
|
||
|
humidity_scale = 250
|
||
|
|
||
|
And this particular one is mapped slightly differently from the others:
|
||
|
|
||
|
noise3 = perlin3:get2d({x=p_top.x+150, y=p_top.z+50})
|
||
|
|
||
|
(Note the +150 and +50 offsets)
|
||
|
|