initial commit
subgame + mods
1
mods/plantlife_modpack/.gitignore
vendored
Executable file
@ -0,0 +1 @@
|
||||
*~
|
612
mods/plantlife_modpack/API.txt
Executable file
@ -0,0 +1,612 @@
|
||||
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)
|
||||
|
335
mods/plantlife_modpack/LICENSE
Executable file
@ -0,0 +1,335 @@
|
||||
|
||||
For the code, Ironzorg's textures, and everything else: WTFPL
|
||||
|
||||
For Mossmanikin's mods (Ferns, Dryplans, and the components
|
||||
from the Undergrowth modpack), and all of my own textures:
|
||||
CC-By-SA 3.0
|
||||
|
||||
----------
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
Version 2, December 2004
|
||||
|
||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim or modified
|
||||
copies of this license document, and changing it is allowed as long
|
||||
as the name is changed.
|
||||
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
||||
|
||||
This license is also known as "WTFPL"
|
||||
|
||||
-----------
|
||||
|
||||
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS
|
||||
CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS
|
||||
PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE
|
||||
WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW
|
||||
IS PROHIBITED.
|
||||
|
||||
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND
|
||||
AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS
|
||||
LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS
|
||||
YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE
|
||||
OF SUCH TERMS AND CONDITIONS.
|
||||
|
||||
1. Definitions
|
||||
|
||||
"Collective Work" means a work, such as a periodical issue,
|
||||
anthology or encyclopedia, in which the Work in its entirety in
|
||||
unmodified form, along with one or more other contributions,
|
||||
constituting separate and independent works in themselves, are
|
||||
assembled into a collective whole. A work that constitutes a
|
||||
Collective Work will not be considered a Derivative Work (as
|
||||
defined below) for the purposes of this License.
|
||||
"Creative Commons Compatible License" means a license that is
|
||||
listed at http://creativecommons.org/compatiblelicenses that has
|
||||
been approved by Creative Commons as being essentially equivalent
|
||||
to this License, including, at a minimum, because that license:
|
||||
(i) contains terms that have the same purpose, meaning and effect
|
||||
as the License Elements of this License; and, (ii) explicitly
|
||||
permits the relicensing of derivatives of works made available
|
||||
under that license under this License or either a Creative Commons
|
||||
unported license or a Creative Commons jurisdiction license with
|
||||
the same License Elements as this License.
|
||||
"Derivative Work" means a work based upon the Work or upon the
|
||||
Work and other pre-existing works, such as a translation, musical
|
||||
arrangement, dramatization, fictionalization, motion picture
|
||||
version, sound recording, art reproduction, abridgment,
|
||||
condensation, or any other form in which the Work may be recast,
|
||||
transformed, or adapted, except that a work that constitutes a
|
||||
Collective Work will not be considered a Derivative Work for the
|
||||
purpose of this License. For the avoidance of doubt, where the
|
||||
Work is a musical composition or sound recording, the
|
||||
synchronization of the Work in timed-relation with a moving image
|
||||
("synching") will be considered a Derivative Work for the purpose
|
||||
of this License.
|
||||
"License Elements" means the following high-level license
|
||||
attributes as selected by Licensor and indicated in the title of
|
||||
this License: Attribution, ShareAlike.
|
||||
"Licensor" means the individual, individuals, entity or
|
||||
entities that offers the Work under the terms of this License.
|
||||
"Original Author" means the individual, individuals, entity or
|
||||
entities who created the Work.
|
||||
"Work" means the copyrightable work of authorship offered
|
||||
under the terms of this License.
|
||||
"You" means an individual or entity exercising rights under
|
||||
this License who has not previously violated the terms of this
|
||||
License with respect to the Work, or who has received express
|
||||
permission from the Licensor to exercise rights under this License
|
||||
despite a previous violation.
|
||||
|
||||
2. Fair Use Rights. Nothing in this license is intended to reduce,
|
||||
limit, or restrict any rights arising from fair use, first sale or
|
||||
other limitations on the exclusive rights of the copyright owner
|
||||
under copyright law or other applicable laws.
|
||||
|
||||
3. License Grant. Subject to the terms and conditions of this
|
||||
License, Licensor hereby grants You a worldwide, royalty-free,
|
||||
non-exclusive, perpetual (for the duration of the applicable
|
||||
copyright) license to exercise the rights in the Work as stated
|
||||
below:
|
||||
|
||||
to reproduce the Work, to incorporate the Work into one or
|
||||
more Collective Works, and to reproduce the Work as incorporated
|
||||
in the Collective Works;
|
||||
to create and reproduce Derivative Works provided that any
|
||||
such Derivative Work, including any translation in any medium,
|
||||
takes reasonable steps to clearly label, demarcate or otherwise
|
||||
identify that changes were made to the original Work. For example,
|
||||
a translation could be marked "The original work was translated
|
||||
from English to Spanish," or a modification could indicate "The
|
||||
original work has been modified.";
|
||||
to distribute copies or phonorecords of, display publicly,
|
||||
perform publicly, and perform publicly by means of a digital audio
|
||||
transmission the Work including as incorporated in Collective
|
||||
Works;
|
||||
to distribute copies or phonorecords of, display publicly,
|
||||
perform publicly, and perform publicly by means of a digital audio
|
||||
transmission Derivative Works.
|
||||
|
||||
For the avoidance of doubt, where the Work is a musical
|
||||
composition:
|
||||
Performance Royalties Under Blanket Licenses. Licensor
|
||||
waives the exclusive right to collect, whether individually or, in
|
||||
the event that Licensor is a member of a performance rights
|
||||
society (e.g. ASCAP, BMI, SESAC), via that society, royalties for
|
||||
the public performance or public digital performance (e.g.
|
||||
webcast) of the Work.
|
||||
Mechanical Rights and Statutory Royalties. Licensor waives
|
||||
the exclusive right to collect, whether individually or via a
|
||||
music rights agency or designated agent (e.g. Harry Fox Agency),
|
||||
royalties for any phonorecord You create from the Work ("cover
|
||||
version") and distribute, subject to the compulsory license
|
||||
created by 17 USC Section 115 of the US Copyright Act (or the
|
||||
equivalent in other jurisdictions).
|
||||
Webcasting Rights and Statutory Royalties. For the avoidance
|
||||
of doubt, where the Work is a sound recording, Licensor waives the
|
||||
exclusive right to collect, whether individually or via a
|
||||
performance-rights society (e.g. SoundExchange), royalties for the
|
||||
public digital performance (e.g. webcast) of the Work, subject to
|
||||
the compulsory license created by 17 USC Section 114 of the US
|
||||
Copyright Act (or the equivalent in other jurisdictions).
|
||||
|
||||
The above rights may be exercised in all media and formats whether
|
||||
now known or hereafter devised. The above rights include the right
|
||||
to make such modifications as are technically necessary to
|
||||
exercise the rights in other media and formats. All rights not
|
||||
expressly granted by Licensor are hereby reserved.
|
||||
|
||||
4. Restrictions. The license granted in Section 3 above is
|
||||
expressly made subject to and limited by the following
|
||||
restrictions:
|
||||
|
||||
You may distribute, publicly display, publicly perform, or
|
||||
publicly digitally perform the Work only under the terms of this
|
||||
License, and You must include a copy of, or the Uniform Resource
|
||||
Identifier for, this License with every copy or phonorecord of the
|
||||
Work You distribute, publicly display, publicly perform, or
|
||||
publicly digitally perform. You may not offer or impose any terms
|
||||
on the Work that restrict the terms of this License or the ability
|
||||
of a recipient of the Work to exercise of the rights granted to
|
||||
that recipient under the terms of the License. You may not
|
||||
sublicense the Work. You must keep intact all notices that refer
|
||||
to this License and to the disclaimer of warranties. When You
|
||||
distribute, publicly display, publicly perform, or publicly
|
||||
digitally perform the Work, You may not impose any technological
|
||||
measures on the Work that restrict the ability of a recipient of
|
||||
the Work from You to exercise of the rights granted to that
|
||||
recipient under the terms of the License. This Section 4(a)
|
||||
applies to the Work as incorporated in a Collective Work, but this
|
||||
does not require the Collective Work apart from the Work itself to
|
||||
be made subject to the terms of this License. If You create a
|
||||
Collective Work, upon notice from any Licensor You must, to the
|
||||
extent practicable, remove from the Collective Work any credit as
|
||||
required by Section 4(c), as requested. If You create a Derivative
|
||||
Work, upon notice from any Licensor You must, to the extent
|
||||
practicable, remove from the Derivative Work any credit as
|
||||
required by Section 4(c), as requested.
|
||||
You may distribute, publicly display, publicly perform, or
|
||||
publicly digitally perform a Derivative Work only under: (i) the
|
||||
terms of this License; (ii) a later version of this License with
|
||||
the same License Elements as this License; (iii) either the
|
||||
Creative Commons (Unported) license or a Creative Commons
|
||||
jurisdiction license (either this or a later license version) that
|
||||
contains the same License Elements as this License (e.g.
|
||||
Attribution-ShareAlike 3.0 (Unported)); (iv) a Creative Commons
|
||||
Compatible License. If you license the Derivative Work under one
|
||||
of the licenses mentioned in (iv), you must comply with the terms
|
||||
of that license. If you license the Derivative Work under the
|
||||
terms of any of the licenses mentioned in (i), (ii) or (iii) (the
|
||||
"Applicable License"), you must comply with the terms of the
|
||||
Applicable License generally and with the following provisions:
|
||||
(I) You must include a copy of, or the Uniform Resource Identifier
|
||||
for, the Applicable License with every copy or phonorecord of each
|
||||
Derivative Work You distribute, publicly display, publicly
|
||||
perform, or publicly digitally perform; (II) You may not offer or
|
||||
impose any terms on the Derivative Works that restrict the terms
|
||||
of the Applicable License or the ability of a recipient of the
|
||||
Work to exercise the rights granted to that recipient under the
|
||||
terms of the Applicable License; (III) You must keep intact all
|
||||
notices that refer to the Applicable License and to the disclaimer
|
||||
of warranties; and, (IV) when You distribute, publicly display,
|
||||
publicly perform, or publicly digitally perform the Work, You may
|
||||
not impose any technological measures on the Derivative Work that
|
||||
restrict the ability of a recipient of the Derivative Work from
|
||||
You to exercise the rights granted to that recipient under the
|
||||
terms of the Applicable License. This Section 4(b) applies to the
|
||||
Derivative Work as incorporated in a Collective Work, but this
|
||||
does not require the Collective Work apart from the Derivative
|
||||
Work itself to be made subject to the terms of the Applicable
|
||||
License.
|
||||
If You distribute, publicly display, publicly perform, or
|
||||
publicly digitally perform the Work (as defined in Section 1
|
||||
above) or any Derivative Works (as defined in Section 1 above) or
|
||||
Collective Works (as defined in Section 1 above), You must, unless
|
||||
a request has been made pursuant to Section 4(a), keep intact all
|
||||
copyright notices for the Work and provide, reasonable to the
|
||||
medium or means You are utilizing: (i) the name of the Original
|
||||
Author (or pseudonym, if applicable) if supplied, and/or (ii) if
|
||||
the Original Author and/or Licensor designate another party or
|
||||
parties (e.g. a sponsor institute, publishing entity, journal) for
|
||||
attribution ("Attribution Parties") in Licensor's copyright
|
||||
notice, terms of service or by other reasonable means, the name of
|
||||
such party or parties; the title of the Work if supplied; to the
|
||||
extent reasonably practicable, the Uniform Resource Identifier, if
|
||||
any, that Licensor specifies to be associated with the Work,
|
||||
unless such URI does not refer to the copyright notice or
|
||||
licensing information for the Work; and, consistent with Section
|
||||
3(b) in the case of a Derivative Work, a credit identifying the
|
||||
use of the Work in the Derivative Work (e.g., "French translation
|
||||
of the Work by Original Author," or "Screenplay based on original
|
||||
Work by Original Author"). The credit required by this Section
|
||||
4(c) may be implemented in any reasonable manner; provided,
|
||||
however, that in the case of a Derivative Work or Collective Work,
|
||||
at a minimum such credit will appear, if a credit for all
|
||||
contributing authors of the Derivative Work or Collective Work
|
||||
appears, then as part of these credits and in a manner at least as
|
||||
prominent as the credits for the other contributing authors. For
|
||||
the avoidance of doubt, You may only use the credit required by
|
||||
this Section for the purpose of attribution in the manner set out
|
||||
above and, by exercising Your rights under this License, You may
|
||||
not implicitly or explicitly assert or imply any connection with,
|
||||
sponsorship or endorsement by the Original Author, Licensor and/or
|
||||
Attribution Parties, as appropriate, of You or Your use of the
|
||||
Work, without the separate, express prior written permission of
|
||||
the Original Author, Licensor and/or Attribution Parties.
|
||||
|
||||
5. Representations, Warranties and Disclaimer
|
||||
|
||||
UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING,
|
||||
LICENSOR OFFERS THE WORK AS-IS AND ONLY TO THE EXTENT OF ANY
|
||||
RIGHTS HELD IN THE LICENSED WORK BY THE LICENSOR. THE LICENSOR
|
||||
MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE
|
||||
WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT
|
||||
LIMITATION, WARRANTIES OF TITLE, MARKETABILITY, MERCHANTIBILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE
|
||||
OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE
|
||||
OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT
|
||||
ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY
|
||||
NOT APPLY TO YOU.
|
||||
|
||||
6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY
|
||||
APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY
|
||||
LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE
|
||||
OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE
|
||||
WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
7. Termination
|
||||
|
||||
This License and the rights granted hereunder will terminate
|
||||
automatically upon any breach by You of the terms of this License.
|
||||
Individuals or entities who have received Derivative Works or
|
||||
Collective Works from You under this License, however, will not
|
||||
have their licenses terminated provided such individuals or
|
||||
entities remain in full compliance with those licenses. Sections
|
||||
1, 2, 5, 6, 7, and 8 will survive any termination of this License.
|
||||
Subject to the above terms and conditions, the license granted
|
||||
here is perpetual (for the duration of the applicable copyright in
|
||||
the Work). Notwithstanding the above, Licensor reserves the right
|
||||
to release the Work under different license terms or to stop
|
||||
distributing the Work at any time; provided, however that any such
|
||||
election will not serve to withdraw this License (or any other
|
||||
license that has been, or is required to be, granted under the
|
||||
terms of this License), and this License will continue in full
|
||||
force and effect unless terminated as stated above.
|
||||
|
||||
8. Miscellaneous
|
||||
|
||||
Each time You distribute or publicly digitally perform the
|
||||
Work (as defined in Section 1 above) or a Collective Work (as
|
||||
defined in Section 1 above), the Licensor offers to the recipient
|
||||
a license to the Work on the same terms and conditions as the
|
||||
license granted to You under this License.
|
||||
Each time You distribute or publicly digitally perform a
|
||||
Derivative Work, Licensor offers to the recipient a license to the
|
||||
original Work on the same terms and conditions as the license
|
||||
granted to You under this License.
|
||||
If any provision of this License is invalid or unenforceable
|
||||
under applicable law, it shall not affect the validity or
|
||||
enforceability of the remainder of the terms of this License, and
|
||||
without further action by the parties to this agreement, such
|
||||
provision shall be reformed to the minimum extent necessary to
|
||||
make such provision valid and enforceable.
|
||||
No term or provision of this License shall be deemed waived
|
||||
and no breach consented to unless such waiver or consent shall be
|
||||
in writing and signed by the party to be charged with such waiver
|
||||
or consent.
|
||||
This License constitutes the entire agreement between the
|
||||
parties with respect to the Work licensed here. There are no
|
||||
understandings, agreements or representations with respect to the
|
||||
Work not specified here. Licensor shall not be bound by any
|
||||
additional provisions that may appear in any communication from
|
||||
You. This License may not be modified without the mutual written
|
||||
agreement of the Licensor and You.
|
||||
|
||||
Creative Commons Notice
|
||||
|
||||
Creative Commons is not a party to this License, and makes no
|
||||
warranty whatsoever in connection with the Work. Creative Commons
|
||||
will not be liable to You or any party on any legal theory for any
|
||||
damages whatsoever, including without limitation any general,
|
||||
special, incidental or consequential damages arising in connection
|
||||
to this license. Notwithstanding the foregoing two (2) sentences,
|
||||
if Creative Commons has expressly identified itself as the
|
||||
Licensor hereunder, it shall have all rights and obligations of
|
||||
Licensor.
|
||||
|
||||
Except for the limited purpose of indicating to the public
|
||||
that the Work is licensed under the CCPL, Creative Commons does
|
||||
not authorize the use by either party of the trademark "Creative
|
||||
Commons" or any related trademark or logo of Creative Commons
|
||||
without the prior written consent of Creative Commons. Any
|
||||
permitted use will be in compliance with Creative Commons'
|
||||
then-current trademark usage guidelines, as may be published on
|
||||
its website or otherwise made available upon request from time to
|
||||
time. For the avoidance of doubt, this trademark restriction does
|
||||
not form part of this License.
|
||||
|
||||
Creative Commons may be contacted at
|
||||
http://creativecommons.org/.
|
||||
|
72
mods/plantlife_modpack/README
Executable file
@ -0,0 +1,72 @@
|
||||
README file for Plantlife mod, by Vanessa Ezekowitz
|
||||
---------------------------------------------------
|
||||
|
||||
Plantlife is a combined form of my Flowers and Poison Ivy mods and an expanded
|
||||
version of the old Bushes mod, now called bushes_classic. The entire package
|
||||
has been significantly rewritten and re-organized. This mod supplies all
|
||||
three of these components and should be 100% compatible with mods that used
|
||||
the old versions.
|
||||
|
||||
Its purpose is to add various kinds of flowers, cotton plants, water foliage,
|
||||
poison ivy, and fruit bushes, obviously. :-) All of these are spawned as
|
||||
normal nodes and can be collected and used in any recipes that depend on the
|
||||
old mods.
|
||||
|
||||
Spawning of plants is sensitive to the amount of available light. Flowers,
|
||||
cotton, and waterlilies only spawn when there at least a signficant amount of
|
||||
light. Seaweed will grow only in dimly-lit areas. Poison ivy also grows only
|
||||
in the daytime, but require less light than flowers.
|
||||
|
||||
Growing of poison ivy will only occur for plants that are on the same surface
|
||||
that is necessary for them to spawn on, so they won't grow if placed on e.g.
|
||||
cobble or homedecor flower pot, etc. This doesn't affect wall-climbing poison
|
||||
ivy, since it uses a different growth pattern.
|
||||
|
||||
All plants use multiple controls provided by plants_lib, to keep where they
|
||||
grow under control - no more random spread of plants! In addition, the density
|
||||
of the plants in any region they appear in has been fixed and brought under
|
||||
control.
|
||||
|
||||
Poison ivy is found sparsely among junglegrass, but will not grow near flowers.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
Important details:
|
||||
|
||||
Configuration: Any of the three components of this mod can be disabled
|
||||
by just removing their respective directories.
|
||||
|
||||
Dependencies: Just the game's default stuff.
|
||||
|
||||
Recommends: Nothing in particular.
|
||||
|
||||
Conflicts: This mod should not be installed alongside the original, separate
|
||||
Poison Ivy, or old Bushes mods. If those exist, delete them, as this mod
|
||||
supplies their functionality. If you still use the old Jungle Grass mod
|
||||
either as previously supplied with this modpack, or in its standalone form,
|
||||
you'll want to delete the "junglegrass" directory from this modpack to get rid
|
||||
of the aliases-to-air that it supplies.
|
||||
|
||||
Software Requirements: This mod requires Minetest 0.4.9 or later. It is
|
||||
unlikely to work with old versions.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
Crafting:
|
||||
|
||||
For crafting recipes, please see the forum thread for this modpack:
|
||||
|
||||
https://forum.minetest.net/viewtopic.php?f=11&t=3898
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
Notes:
|
||||
|
||||
Poison Ivy will spawn on grass and in some cases, on vertical surfaces
|
||||
including trees and jungle trees where they meet the dirt or grass. Ivy
|
||||
previously spawned on the ground taller/thicker or start climbing up said
|
||||
vertical surfaces and trees.
|
||||
|
||||
At present, the poison ivy presents little more than an annoyance - they can
|
||||
only be cut down and either re-planted or thrown away. No damage is done by
|
||||
harvesting them, yet. ;-)
|
3
mods/plantlife_modpack/along_shore/depends.txt
Executable file
@ -0,0 +1,3 @@
|
||||
default
|
||||
plants_lib
|
||||
flowers_plus?
|
9
mods/plantlife_modpack/along_shore/init.lua
Executable file
@ -0,0 +1,9 @@
|
||||
-----------------------------------------------------------------------------------------------
|
||||
local title = "Along the Shore"
|
||||
local version = "0.0.4"
|
||||
local mname = "along_shore"
|
||||
-----------------------------------------------------------------------------------------------
|
||||
|
||||
-----------------------------------------------------------------------------------------------
|
||||
print("[Mod] "..title.." ["..version.."] ["..mname.."] Loaded...")
|
||||
-----------------------------------------------------------------------------------------------
|
BIN
mods/plantlife_modpack/along_shore/textures/along_shore_seaweed_1Darker.png
Executable file
After Width: | Height: | Size: 377 B |
30
mods/plantlife_modpack/along_shore/textures/credit_textures.txt
Executable file
@ -0,0 +1,30 @@
|
||||
-------------------------------------------------------------
|
||||
Credit for textures of "along_shore"
|
||||
-------------------------------------------------------------
|
||||
(If more than one author is listed the names are in alphabetical order)
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
FOLDER TEXTURE AUTHORS
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
../along_shore/textures along_shore_seaweed_1Darker.png Neuromancer, VanessaE
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
../along_shore/textures/old (along_shore_empty.png) (Mossmanikin)
|
||||
along_shore_lilypads_1.png Mossmanikin, Neuromancer
|
||||
along_shore_lilypads_2.png Mossmanikin, Neuromancer
|
||||
along_shore_lilypads_3.png Mossmanikin, Neuromancer
|
||||
along_shore_lilypads_4.png Mossmanikin, Neuromancer
|
||||
along_shore_pondscum_1.png Neuromancer
|
||||
along_shore_seaweed_1.png Neuromancer, VanessaE
|
||||
along_shore_seaweed_2.png Mossmanikin, Neuromancer, VanessaE
|
||||
along_shore_seaweed_3.png Mossmanikin, Neuromancer, VanessaE
|
||||
along_shore_seaweed_4.png Mossmanikin, Neuromancer, VanessaE
|
||||
flowers_seaweed.png Neuromancer, VanessaE
|
||||
flowers_waterlily.png Mossmanikin, VanessaE
|
||||
flowers_waterlily_22.5.png Mossmanikin, VanessaE
|
||||
flowers_waterlily_45.png Mossmanikin, VanessaE
|
||||
flowers_waterlily_67.5.png Mossmanikin, VanessaE
|
||||
lillypad3Flower16x.png Neuromancer
|
||||
LillyPad3x16.png Neuromancer
|
||||
lillyPad5x16.png Neuromancer
|
||||
MultiLilly16x.png Neuromancer
|
||||
pondscum16xc.png Neuromancer
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
BIN
mods/plantlife_modpack/along_shore/textures/old/LillyPad3x16.png
Executable file
After Width: | Height: | Size: 589 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/MultiLilly16x.png
Executable file
After Width: | Height: | Size: 462 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/along_shore_empty.png
Executable file
After Width: | Height: | Size: 153 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/along_shore_lilypads_1.png
Executable file
After Width: | Height: | Size: 499 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/along_shore_lilypads_2.png
Executable file
After Width: | Height: | Size: 568 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/along_shore_lilypads_3.png
Executable file
After Width: | Height: | Size: 509 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/along_shore_lilypads_4.png
Executable file
After Width: | Height: | Size: 347 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/along_shore_pondscum_1.png
Executable file
After Width: | Height: | Size: 703 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/along_shore_seaweed_1.png
Executable file
After Width: | Height: | Size: 358 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/along_shore_seaweed_2.png
Executable file
After Width: | Height: | Size: 364 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/along_shore_seaweed_3.png
Executable file
After Width: | Height: | Size: 383 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/along_shore_seaweed_4.png
Executable file
After Width: | Height: | Size: 301 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/flowers_seaweed.png
Executable file
After Width: | Height: | Size: 358 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/flowers_waterlily.png
Executable file
After Width: | Height: | Size: 491 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/flowers_waterlily_22.5.png
Executable file
After Width: | Height: | Size: 519 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/flowers_waterlily_45.png
Executable file
After Width: | Height: | Size: 507 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/flowers_waterlily_67.5.png
Executable file
After Width: | Height: | Size: 512 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/lillyPad5x16.png
Executable file
After Width: | Height: | Size: 460 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/lillypad3Flower16x.png
Executable file
After Width: | Height: | Size: 556 B |
BIN
mods/plantlife_modpack/along_shore/textures/old/pondscum16xc.png
Executable file
After Width: | Height: | Size: 703 B |
2
mods/plantlife_modpack/bushes/depends.txt
Executable file
@ -0,0 +1,2 @@
|
||||
default
|
||||
plants_lib
|
258
mods/plantlife_modpack/bushes/init.lua
Executable file
@ -0,0 +1,258 @@
|
||||
-- Bushes Mod by Mossmanikin, Evergreen, & Neuromancer
|
||||
-- The initial code for this was taken from Mossmanikin's Grasses Mod, then heavilly modified by Neuromancer for this mod.
|
||||
-- Mossmanikin also greatly helped with providing samples for coding.
|
||||
-- bush leaf textures are cc-by-sa 3.0. from VannessaE's moretrees mod. (Leaf texture created by RealBadAngel or VanessaE)
|
||||
-- Branch textures created by Neuromancer.
|
||||
-- Licence for Code and Non-Bush leaf code is WTFPL.
|
||||
|
||||
abstract_bushes = {}
|
||||
|
||||
minetest.register_node("bushes:youngtree2_bottom", {
|
||||
description = "Young Tree 2 (bottom)",
|
||||
drawtype="nodebox",
|
||||
tiles = {"bushes_youngtree2trunk.png"},
|
||||
inventory_image = "bushes_youngtree2trunk_inv.png",
|
||||
wield_image = "bushes_youngtree2trunk_inv.png",
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
is_ground_content = true,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
--{0.375000,-0.500000,-0.500000,0.500000,0.500000,-0.375000}, --NodeBox 1
|
||||
{-0.0612,-0.500000,-0.500000,0.0612,0.500000,-0.375000}, --NodeBox 1
|
||||
}
|
||||
},
|
||||
groups = {snappy=3,flammable=2},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
drop = 'default:stick'
|
||||
})
|
||||
|
||||
local BushBranchCenter = { {1,1}, {3,2} }
|
||||
for i in pairs(BushBranchCenter) do
|
||||
local Num = BushBranchCenter[i][1]
|
||||
local TexNum = BushBranchCenter[i][2]
|
||||
minetest.register_node("bushes:bushbranches"..Num, {
|
||||
description = "Bush Branches "..Num,
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
"bushes_leaves_"..TexNum..".png",
|
||||
"bushes_branches_center_"..TexNum..".png"
|
||||
},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{0, -1/2, -1/2, -1/4, 1/2, 1/2},
|
||||
{0, -1/2, -1/2, 1/4, 1/2, 1/2}
|
||||
},
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2},
|
||||
},
|
||||
inventory_image = "bushes_branches_center_"..TexNum..".png",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
groups = {
|
||||
-- tree=1, -- MM: disabled because some recipes use group:tree for trunks
|
||||
snappy=3,
|
||||
flammable=2,
|
||||
leaves=1
|
||||
},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
drop = 'default:stick 4'
|
||||
})
|
||||
end
|
||||
|
||||
local BushBranchSide = { {2,1}, {4,2} }
|
||||
for i in pairs(BushBranchSide) do
|
||||
local Num = BushBranchSide[i][1]
|
||||
local TexNum = BushBranchSide[i][2]
|
||||
minetest.register_node("bushes:bushbranches"..Num, {
|
||||
description = "Bush Branches "..Num,
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
--[[top]] "bushes_leaves_"..TexNum..".png",
|
||||
--[[bottom]]"bushes_branches_center_"..TexNum..".png",
|
||||
--[[right]] "bushes_branches_left_"..TexNum..".png",
|
||||
--[[left]] "bushes_branches_right_"..TexNum..".png", -- MM: We could also mirror the previous here,
|
||||
--[[back]] "bushes_branches_center_"..TexNum..".png",-- unless U really want 'em 2 B different
|
||||
--[[front]] "bushes_branches_right_"..TexNum..".png"
|
||||
},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
-- { left , bottom , front, right , top , back }
|
||||
{0.137748,-0.491944, 0.5 ,-0.125000,-0.179444,-0.007790}, --NodeBox 1
|
||||
{0.262748,-0.185995, 0.5 ,-0.237252, 0.126505,-0.260269}, --NodeBox 2
|
||||
{0.500000, 0.125000, 0.5 ,-0.500000, 0.500000,-0.500000}, --NodeBox 3
|
||||
},
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2},
|
||||
},
|
||||
inventory_image = "bushes_branches_right_"..TexNum..".png",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
groups = {
|
||||
-- tree=1, -- MM: disabled because some recipes use group:tree for trunks
|
||||
snappy=3,
|
||||
flammable=2,
|
||||
leaves=1
|
||||
},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
drop = 'default:stick 3'
|
||||
})
|
||||
end
|
||||
|
||||
local BushLeafNode = { {1}, {2}}
|
||||
for i in pairs(BushLeafNode) do
|
||||
local Num = BushLeafNode[i][1]
|
||||
minetest.register_node("bushes:BushLeaves"..Num, {
|
||||
description = "Bush Leaves "..Num,
|
||||
drawtype = "allfaces_optional",
|
||||
tiles = {"bushes_leaves_"..Num..".png"},
|
||||
paramtype = "light",
|
||||
groups = { -- MM: Should we add leafdecay?
|
||||
snappy=3,
|
||||
flammable=2,
|
||||
attached_node=1
|
||||
},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
})
|
||||
end
|
||||
|
||||
abstract_bushes.grow_bush = function(pos)
|
||||
local leaf_type = math.random(1,2)
|
||||
local bush_side_height = math.random(0,1)
|
||||
local chance_of_bush_node_right = math.random(1,10)
|
||||
if chance_of_bush_node_right> 5 then
|
||||
local right_pos = {x=pos.x+1, y=pos.y+bush_side_height, z=pos.z}
|
||||
abstract_bushes.grow_bush_node(right_pos,3,leaf_type)
|
||||
end
|
||||
local chance_of_bush_node_left = math.random(1,10)
|
||||
if chance_of_bush_node_left> 5 then
|
||||
bush_side_height = math.random(0,1)
|
||||
local left_pos = {x=pos.x-1, y=pos.y+bush_side_height, z=pos.z}
|
||||
abstract_bushes.grow_bush_node(left_pos,1,leaf_type)
|
||||
end
|
||||
local chance_of_bush_node_front = math.random(1,10)
|
||||
if chance_of_bush_node_front> 5 then
|
||||
bush_side_height = math.random(0,1)
|
||||
local front_pos = {x=pos.x, y=pos.y+bush_side_height, z=pos.z+1}
|
||||
abstract_bushes.grow_bush_node(front_pos,2,leaf_type)
|
||||
end
|
||||
local chance_of_bush_node_back = math.random(1,10)
|
||||
if chance_of_bush_node_back> 5 then
|
||||
bush_side_height = math.random(0,1)
|
||||
local back_pos = {x=pos.x, y=pos.y+bush_side_height, z=pos.z-1}
|
||||
abstract_bushes.grow_bush_node(back_pos,0,leaf_type)
|
||||
end
|
||||
|
||||
abstract_bushes.grow_bush_node(pos,5,leaf_type)
|
||||
end
|
||||
|
||||
abstract_bushes.grow_bush_node = function(pos,dir, leaf_type)
|
||||
|
||||
|
||||
local right_here = {x=pos.x, y=pos.y+1, z=pos.z}
|
||||
local above_right_here = {x=pos.x, y=pos.y+2, z=pos.z}
|
||||
|
||||
--local bush_branch_type = math.random(1,3)
|
||||
--local bush_branch_type = 2
|
||||
|
||||
-- MM: I'm not sure if it's slower now than before...
|
||||
if dir ~= 5 and leaf_type == 1 then
|
||||
bush_branch_type = 2
|
||||
end
|
||||
if dir ~= 5 and leaf_type == 2 then
|
||||
bush_branch_type = 4
|
||||
end
|
||||
if dir == 5 and leaf_type == 1 then
|
||||
bush_branch_type = 1
|
||||
dir = 1
|
||||
end
|
||||
if dir == 5 and leaf_type == 2 then
|
||||
bush_branch_type = 3
|
||||
dir = 1
|
||||
end
|
||||
|
||||
if minetest.get_node(right_here).name == "air" -- instead of check_air = true,
|
||||
or minetest.get_node(right_here).name == "default:junglegrass" then
|
||||
minetest.set_node(right_here, {name="bushes:bushbranches"..bush_branch_type , param2=dir})
|
||||
--minetest.chat_send_all("leaf_type: (" .. leaf_type .. ")")
|
||||
minetest.set_node(above_right_here, {name="bushes:BushLeaves"..leaf_type})
|
||||
local chance_of_high_leaves = math.random(1,10)
|
||||
if chance_of_high_leaves> 5 then
|
||||
local two_above_right_here = {x=pos.x, y=pos.y+3, z=pos.z}
|
||||
--minetest.chat_send_all("leaf_type: (" .. leaf_type .. ")")
|
||||
minetest.set_node(two_above_right_here, {name="bushes:BushLeaves"..leaf_type})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
plantslib:register_generate_plant({
|
||||
surface = {
|
||||
"default:dirt_with_grass",
|
||||
"stoneage:grass_with_silex",
|
||||
"sumpf:peat",
|
||||
"sumpf:sumpf"
|
||||
},
|
||||
max_count = 15, --10,15
|
||||
rarity = 101 - 4, --3,4
|
||||
min_elevation = 1, -- above sea level
|
||||
plantlife_limit = -0.9,
|
||||
},
|
||||
abstract_bushes.grow_bush
|
||||
)
|
||||
|
||||
abstract_bushes.grow_youngtree2 = function(pos)
|
||||
local height = math.random(4,5)
|
||||
abstract_bushes.grow_youngtree_node2(pos,height)
|
||||
end
|
||||
|
||||
abstract_bushes.grow_youngtree_node2 = function(pos, height)
|
||||
|
||||
|
||||
local right_here = {x=pos.x, y=pos.y+1, z=pos.z}
|
||||
local above_right_here = {x=pos.x, y=pos.y+2, z=pos.z}
|
||||
local two_above_right_here = {x=pos.x, y=pos.y+3, z=pos.z}
|
||||
local three_above_right_here = {x=pos.x, y=pos.y+4, z=pos.z}
|
||||
|
||||
if minetest.get_node(right_here).name == "air" -- instead of check_air = true,
|
||||
or minetest.get_node(right_here).name == "default:junglegrass" then
|
||||
if height == 4 then
|
||||
local two_above_right_here_south = {x=pos.x, y=pos.y+3, z=pos.z-1}
|
||||
local three_above_right_here_south = {x=pos.x, y=pos.y+4, z=pos.z-1}
|
||||
minetest.set_node(right_here, {name="bushes:youngtree2_bottom"})
|
||||
minetest.set_node(above_right_here, {name="bushes:youngtree2_bottom"})
|
||||
minetest.set_node(two_above_right_here, {name="bushes:bushbranches2" , param2=2})
|
||||
minetest.set_node(two_above_right_here_south, {name="bushes:bushbranches2" , param2=0})
|
||||
minetest.set_node(three_above_right_here, {name="bushes:BushLeaves1" })
|
||||
minetest.set_node(three_above_right_here_south, {name="bushes:BushLeaves1" })
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
plantslib:register_generate_plant({
|
||||
surface = {
|
||||
"default:dirt_with_grass",
|
||||
"stoneage:grass_with_silex",
|
||||
"sumpf:peat",
|
||||
"sumpf:sumpf"
|
||||
},
|
||||
max_count = 55, --10,15
|
||||
rarity = 101 - 4, --3,4
|
||||
min_elevation = 1, -- above sea level
|
||||
plantlife_limit = -0.9,
|
||||
},
|
||||
abstract_bushes.grow_youngtree2
|
||||
)
|
||||
|
||||
--http://dev.minetest.net/Node_Drawtypes
|
BIN
mods/plantlife_modpack/bushes/textures/bushes_branches_center_1.png
Executable file
After Width: | Height: | Size: 473 B |
BIN
mods/plantlife_modpack/bushes/textures/bushes_branches_center_2.png
Executable file
After Width: | Height: | Size: 487 B |
BIN
mods/plantlife_modpack/bushes/textures/bushes_branches_left_1.png
Executable file
After Width: | Height: | Size: 695 B |
BIN
mods/plantlife_modpack/bushes/textures/bushes_branches_left_2.png
Executable file
After Width: | Height: | Size: 689 B |
BIN
mods/plantlife_modpack/bushes/textures/bushes_branches_right_1.png
Executable file
After Width: | Height: | Size: 712 B |
BIN
mods/plantlife_modpack/bushes/textures/bushes_branches_right_2.png
Executable file
After Width: | Height: | Size: 719 B |
BIN
mods/plantlife_modpack/bushes/textures/bushes_leaves_1.png
Executable file
After Width: | Height: | Size: 225 B |
BIN
mods/plantlife_modpack/bushes/textures/bushes_leaves_2.png
Executable file
After Width: | Height: | Size: 225 B |
BIN
mods/plantlife_modpack/bushes/textures/bushes_youngtree2trunk.png
Executable file
After Width: | Height: | Size: 1.1 KiB |
BIN
mods/plantlife_modpack/bushes/textures/bushes_youngtree2trunk_inv.png
Executable file
After Width: | Height: | Size: 918 B |
BIN
mods/plantlife_modpack/bushes/textures/old & unused/BlockBranch1.png
Executable file
After Width: | Height: | Size: 90 KiB |
BIN
mods/plantlife_modpack/bushes/textures/old & unused/BlockBranch1L.png
Executable file
After Width: | Height: | Size: 42 KiB |
BIN
mods/plantlife_modpack/bushes/textures/old & unused/BlockBranch1R.png
Executable file
After Width: | Height: | Size: 49 KiB |
BIN
mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1.png
Executable file
After Width: | Height: | Size: 60 KiB |
BIN
mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm.png
Executable file
After Width: | Height: | Size: 702 B |
BIN
mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm2.png
Executable file
After Width: | Height: | Size: 714 B |
BIN
mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm3.png
Executable file
After Width: | Height: | Size: 536 B |
BIN
mods/plantlife_modpack/bushes/textures/old & unused/BushBranches1sm4.png
Executable file
After Width: | Height: | Size: 649 B |
BIN
mods/plantlife_modpack/bushes/textures/old & unused/BushBranchesCenter.png
Executable file
After Width: | Height: | Size: 445 B |
BIN
mods/plantlife_modpack/bushes/textures/old & unused/BushBranchesSide1.png
Executable file
After Width: | Height: | Size: 770 B |
BIN
mods/plantlife_modpack/bushes/textures/old & unused/BushBranchesSide2.png
Executable file
After Width: | Height: | Size: 801 B |
BIN
mods/plantlife_modpack/bushes/textures/old & unused/blank.png
Executable file
After Width: | Height: | Size: 199 B |
BIN
mods/plantlife_modpack/bushes/textures/old & unused/moretrees_pine_leaves3.png
Executable file
After Width: | Height: | Size: 647 B |
126
mods/plantlife_modpack/bushes_classic/cooking.lua
Executable file
@ -0,0 +1,126 @@
|
||||
-- Boilerplate to support localized strings if intllib mod is installed.
|
||||
local S
|
||||
if (minetest.get_modpath("intllib")) then
|
||||
dofile(minetest.get_modpath("intllib").."/intllib.lua")
|
||||
S = intllib.Getter(minetest.get_current_modname())
|
||||
else
|
||||
S = function ( s ) return s end
|
||||
end
|
||||
|
||||
|
||||
-- Basket
|
||||
|
||||
minetest.register_craft({
|
||||
output = "bushes:basket_empty",
|
||||
recipe = {
|
||||
{ "default:stick", "default:stick", "default:stick" },
|
||||
{ "", "default:stick", "" },
|
||||
},
|
||||
})
|
||||
|
||||
-- Sugar
|
||||
|
||||
minetest.register_craftitem(":bushes:sugar", {
|
||||
description = S("Sugar"),
|
||||
inventory_image = "bushes_sugar.png",
|
||||
on_use = minetest.item_eat(1),
|
||||
groups = {food_sugar=1}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "bushes:sugar 1",
|
||||
recipe = {
|
||||
{ "default:papyrus", "default:papyrus" },
|
||||
},
|
||||
})
|
||||
|
||||
for i, berry in ipairs(bushes_classic.bushes) do
|
||||
local desc = bushes_classic.bushes_descriptions[i]
|
||||
|
||||
minetest.register_craftitem(":bushes:"..berry.."_pie_raw", {
|
||||
description = S("Raw "..desc.." pie"),
|
||||
inventory_image = "bushes_"..berry.."_pie_raw.png",
|
||||
on_use = minetest.item_eat(4),
|
||||
})
|
||||
|
||||
if berry ~= "mixed_berry" then
|
||||
|
||||
if berry == "strawberry" and minetest.registered_nodes["farming_plus:strawberry"] then
|
||||
-- Special case for strawberries, when farming_plus is in use. Use
|
||||
-- the item from that mod, but redefine it so it has the right
|
||||
-- groups and does't look so ugly!
|
||||
minetest.register_craftitem(":farming_plus:strawberry_item", {
|
||||
description = S("Strawberry"),
|
||||
inventory_image = "bushes_"..berry..".png",
|
||||
on_use = minetest.item_eat(2),
|
||||
groups = {berry=1, strawberry=1}
|
||||
})
|
||||
minetest.register_alias("bushes:strawberry", "farming_plus:strawberry_item")
|
||||
else
|
||||
minetest.register_craftitem(":bushes:"..berry, {
|
||||
description = desc,
|
||||
inventory_image = "bushes_"..berry..".png",
|
||||
groups = {berry = 1, [berry] = 1},
|
||||
on_use = minetest.item_eat(1),
|
||||
})
|
||||
end
|
||||
minetest.register_craft({
|
||||
output = "bushes:"..berry.."_pie_raw 1",
|
||||
recipe = {
|
||||
{ "group:food_sugar", "farming:flour", "group:food_sugar" },
|
||||
{ "group:"..berry, "group:"..berry, "group:"..berry },
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
-- Cooked pie
|
||||
|
||||
minetest.register_craftitem(":bushes:"..berry.."_pie_cooked", {
|
||||
description = S("Cooked "..desc.." pie"),
|
||||
inventory_image = "bushes_"..berry.."_pie_cooked.png",
|
||||
on_use = minetest.item_eat(6),
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type = "cooking",
|
||||
output = "bushes:"..berry.."_pie_cooked",
|
||||
recipe = "bushes:"..berry.."_pie_raw",
|
||||
cooktime = 30,
|
||||
})
|
||||
|
||||
-- slice of pie
|
||||
|
||||
minetest.register_craftitem(":bushes:"..berry.."_pie_slice", {
|
||||
description = S("Slice of "..desc.." pie"),
|
||||
inventory_image = "bushes_"..berry.."_pie_slice.png",
|
||||
on_use = minetest.item_eat(1),
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "bushes:"..berry.."_pie_slice 6",
|
||||
recipe = {
|
||||
{ "bushes:"..berry.."_pie_cooked" },
|
||||
},
|
||||
})
|
||||
|
||||
-- Basket with pies
|
||||
|
||||
minetest.register_craft({
|
||||
output = "bushes:basket_"..berry.." 1",
|
||||
recipe = {
|
||||
{ "bushes:"..berry.."_pie_cooked", "bushes:"..berry.."_pie_cooked", "bushes:"..berry.."_pie_cooked" },
|
||||
{ "", "bushes:basket_empty", "" },
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
minetest.register_craft({
|
||||
output = "bushes:mixed_berry_pie_raw 2",
|
||||
recipe = {
|
||||
{ "group:food_sugar", "farming:flour", "group:food_sugar" },
|
||||
{ "group:berry", "group:berry", "group:berry" },
|
||||
{ "group:berry", "group:berry", "group:berry" },
|
||||
},
|
||||
})
|
||||
|
||||
|
3
mods/plantlife_modpack/bushes_classic/depends.txt
Executable file
@ -0,0 +1,3 @@
|
||||
plants_lib
|
||||
farming?
|
||||
farming_plus?
|
5
mods/plantlife_modpack/bushes_classic/image_credits.txt
Executable file
@ -0,0 +1,5 @@
|
||||
strawberry: http://www.clker.com/clipart-4060.html
|
||||
blueberry: http://www.clker.com/clipart-cerezafiro12.html
|
||||
blackberry: http://www.clker.com/clipart-blackberry-2.html
|
||||
raspberry: http://www.clker.com/clipart-simple-raspberry.html
|
||||
gooseberry: http://www.clker.com/clipart-26281.html
|
64
mods/plantlife_modpack/bushes_classic/init.lua
Executable file
@ -0,0 +1,64 @@
|
||||
-- Bushes classic mod originally by unknown
|
||||
-- now maintained by VanessaE
|
||||
--
|
||||
-- License: WTFPL
|
||||
-- Boilerplate to support localized strings if intllib mod is installed.
|
||||
local S
|
||||
if (minetest.get_modpath("intllib")) then
|
||||
dofile(minetest.get_modpath("intllib").."/intllib.lua")
|
||||
S = intllib.Getter(minetest.get_current_modname())
|
||||
else
|
||||
S = function ( s ) return s end
|
||||
end
|
||||
|
||||
bushes_classic = {}
|
||||
|
||||
bushes_classic.bushes = {
|
||||
"strawberry",
|
||||
"blackberry",
|
||||
"blueberry",
|
||||
"raspberry",
|
||||
"gooseberry",
|
||||
"mixed_berry"
|
||||
}
|
||||
|
||||
bushes_classic.bushes_descriptions = {
|
||||
"Strawberry",
|
||||
"Blackberry",
|
||||
"Blueberry",
|
||||
"Raspberry",
|
||||
"Gooseberry",
|
||||
"Mixed Berry"
|
||||
}
|
||||
|
||||
bushes_classic.spawn_list = {}
|
||||
|
||||
dofile(minetest.get_modpath('bushes_classic') .. '/cooking.lua')
|
||||
dofile(minetest.get_modpath('bushes_classic') .. '/nodes.lua')
|
||||
|
||||
plantslib:spawn_on_surfaces({
|
||||
spawn_delay = 3600,
|
||||
spawn_plants = bushes_classic.spawn_list,
|
||||
avoid_radius = 10,
|
||||
spawn_chance = 100,
|
||||
spawn_surfaces = {
|
||||
"default:dirt_with_grass",
|
||||
"woodsoils:dirt_with_leaves_1",
|
||||
"woodsoils:grass_with_leaves_1",
|
||||
"woodsoils:grass_with_leaves_2",
|
||||
"farming:soil",
|
||||
"farming:soil_wet"
|
||||
},
|
||||
avoid_nodes = {"group:bush"},
|
||||
seed_diff = 545342534, -- chosen by a fair mashing of the keyboard - guaranteed to be random :P
|
||||
plantlife_limit = -0.1,
|
||||
light_min = 10,
|
||||
temp_min = 0.15, -- approx 20C
|
||||
temp_max = -0.15, -- approx 35C
|
||||
humidity_min = 0, -- 50% RH
|
||||
humidity_max = -1, -- 100% RH
|
||||
})
|
||||
|
||||
minetest.register_alias("bushes:basket_pies", "bushes:basket_strawberry")
|
||||
|
||||
print(S("[Bushes] Loaded."))
|
43
mods/plantlife_modpack/bushes_classic/locale/de.txt
Executable file
@ -0,0 +1,43 @@
|
||||
# Translation by Xanthin
|
||||
|
||||
Strawberry = Erdbeere
|
||||
Blackberry = Brombeere
|
||||
Blueberry = Blaubeere
|
||||
Raspberry = Himbeere
|
||||
Gooseberry = Stachelbeere
|
||||
Mixed Berry = Beerenmix
|
||||
Basket with Strawberry Pies = Korb mit Erdbeertorten
|
||||
Basket with Blackberry Pies = Korb mit Brombeertorten
|
||||
Basket with Blueberry Pies = Korb mit Blaubeertorten
|
||||
Basket with Raspberry Pies = Korb mit Himbeertorten
|
||||
Basket with Gooseberry Pies = Korb mit Stachelbeertorten
|
||||
Basket with Mixed Berry Pies = Korb mit Beerenmixtorten
|
||||
currently fruitless = zur Zeit fruechteloser
|
||||
Strawberry Bush = Erdbeerbusch
|
||||
Blackberry Bush = Brombeerbusch
|
||||
Blueberry Bush = Blaubeerbusch
|
||||
Raspberry Bush = Himbeerbusch
|
||||
Gooseberry Bush = Stachelbeerbusch
|
||||
Mixed Berry Bush = Beerenmixbusch
|
||||
Basket = Korb
|
||||
Sugar = Zucker
|
||||
Raw Strawberry pie = Rohe Erdbeertorte
|
||||
Raw Blackberry pie = Rohe Brombeertorte
|
||||
Raw Blueberry pie = Rohe Blaubeertorte
|
||||
Raw Raspberry pie = Rohe Himbeertorte
|
||||
Raw Gooseberry pie = Rohe Stachelbeertorte
|
||||
Raw Mixed Berry pie = Rohe Beerenmixtorte
|
||||
Cooked Strawberry pie = Erdbeertorte
|
||||
Cooked Blackberry pie = Brombeertorte
|
||||
Cooked Blueberry pie = Blaubeertorte
|
||||
Cooked Raspberry pie = Himbeertorte
|
||||
Cooked Gooseberry pie = Stachelbeertorte
|
||||
Cooked Mixed Berry pie = Beerenmixtorte
|
||||
Slice of Strawberry pie = Erdbeertortenstueck
|
||||
Slice of Blackberry pie = Brombeertortenstueck
|
||||
Slice of Blueberry pie = Blaubeertortenstueck
|
||||
Slice of Raspberry pie = Himbeertortenstueck
|
||||
Slice of Gooseberry pie = Stachelbeertortenstueck
|
||||
Slice of Mixed Berry pie = Beerenmixtortenstueck
|
||||
|
||||
[Bushes] Loaded. = [Bushes] Geladen.
|
43
mods/plantlife_modpack/bushes_classic/locale/template.txt
Executable file
@ -0,0 +1,43 @@
|
||||
# Template
|
||||
|
||||
Strawberry =
|
||||
Blackberry =
|
||||
Blueberry =
|
||||
Raspberry =
|
||||
Gooseberry =
|
||||
Mixed Berry =
|
||||
Basket with Strawberry Pies =
|
||||
Basket with Blackberry Pies =
|
||||
Basket with Blueberry Pies =
|
||||
Basket with Raspberry Pies =
|
||||
Basket with Gooseberry Pies =
|
||||
Basket with Mixed Berry Pies =
|
||||
currently fruitless =
|
||||
Strawberry Bush =
|
||||
Blackberry Bush =
|
||||
Blueberry Bush =
|
||||
Raspberry Bush =
|
||||
Gooseberry Bush =
|
||||
Mixed Berry Bush =
|
||||
Basket =
|
||||
Sugar =
|
||||
Raw Strawberry pie =
|
||||
Raw Blackberry pie =
|
||||
Raw Blueberry pie =
|
||||
Raw Raspberry pie =
|
||||
Raw Gooseberry pie =
|
||||
Raw Mixed Berry pie =
|
||||
Cooked Strawberry pie =
|
||||
Cooked Blackberry pie =
|
||||
Cooked Blueberry pie =
|
||||
Cooked Raspberry pie =
|
||||
Cooked Gooseberry pie =
|
||||
Cooked Mixed Berry pie =
|
||||
Slice of Strawberry pie =
|
||||
Slice of Blackberry pie =
|
||||
Slice of Blueberry pie =
|
||||
Slice of Raspberry pie =
|
||||
Slice of Gooseberry pie =
|
||||
Slice of Mixed Berry pie =
|
||||
|
||||
[Bushes] Loaded. =
|
228
mods/plantlife_modpack/bushes_classic/nodes.lua
Executable file
@ -0,0 +1,228 @@
|
||||
-- Boilerplate to support localized strings if intllib mod is installed.
|
||||
local S
|
||||
if (minetest.get_modpath("intllib")) then
|
||||
dofile(minetest.get_modpath("intllib").."/intllib.lua")
|
||||
S = intllib.Getter(minetest.get_current_modname())
|
||||
else
|
||||
S = function ( s ) return s end
|
||||
end
|
||||
|
||||
|
||||
plantlife_bushes = {}
|
||||
|
||||
-- TODO: add support for nodebreakers? those dig like mese picks
|
||||
plantlife_bushes.after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
if( not( digger ) or not( pos ) or not (oldnode )) then
|
||||
return nil;
|
||||
end
|
||||
|
||||
-- find out which bush type we are dealing with
|
||||
local bush_name = "";
|
||||
local can_harvest = false;
|
||||
|
||||
if( oldnode.name == 'bushes:fruitless_bush' ) then
|
||||
-- this bush has not grown fruits yet (but will eventually)
|
||||
bush_name = oldmetadata[ 'fields' ][ 'bush_type' ];
|
||||
-- no fruits to be found, so can_harvest stays false
|
||||
else
|
||||
local name_parts = oldnode.name:split( ":" );
|
||||
if( #name_parts >= 2 and name_parts[2]~=nil ) then
|
||||
|
||||
name_parts = name_parts[2]:split( "_" );
|
||||
|
||||
if( #name_parts >= 2 and name_parts[1]~=nil ) then
|
||||
bush_name = name_parts[1];
|
||||
-- this bush really carries fruits
|
||||
can_harvest = true;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- find out which tool the digger was wielding (if any)
|
||||
local toolstack = digger:get_wielded_item();
|
||||
local capabilities = toolstack:get_tool_capabilities();
|
||||
|
||||
-- what the player will get
|
||||
local harvested = "";
|
||||
local amount = "";
|
||||
|
||||
-- failure to find out what the tool can do: destroy the bush and return nothing
|
||||
if( not( capabilities["groupcaps"] )) then
|
||||
return nil;
|
||||
|
||||
-- digging with the hand or something like that
|
||||
elseif( capabilities["groupcaps"]["snappy"] ) then
|
||||
|
||||
-- plant a new bush without fruits
|
||||
minetest.set_node(pos,{type='node',name='bushes:fruitless_bush'})
|
||||
local meta = minetest.get_meta( pos );
|
||||
meta:set_string( 'bush_type', bush_name );
|
||||
|
||||
-- construct the stack of fruits the player will get
|
||||
-- only bushes that have grown fruits can actually give fruits
|
||||
if( can_harvest == true ) then
|
||||
amount = "4";
|
||||
harvested = "bushes:"..bush_name.." "..amount;
|
||||
end
|
||||
|
||||
-- something like a shovel
|
||||
elseif( capabilities["groupcaps"]["crumbly"] ) then
|
||||
|
||||
-- with a chance of 1/3, return 2 bushes
|
||||
if( math.random(1,3)==1 ) then
|
||||
amount = "2";
|
||||
else
|
||||
amount = "1";
|
||||
end
|
||||
-- return the bush itself
|
||||
harvested = "bushes:" .. bush_name .. "_bush "..amount;
|
||||
|
||||
-- something like an axe
|
||||
elseif( capabilities["groupcaps"]["choppy"] ) then
|
||||
|
||||
-- the amount of sticks may vary
|
||||
amount = math.random( 4, 20 );
|
||||
-- return some sticks
|
||||
harvested = "default:stick "..amount;
|
||||
|
||||
-- nothing known - destroy the plant
|
||||
else
|
||||
return nil;
|
||||
end
|
||||
|
||||
-- give the harvested result to the player
|
||||
if( harvested ~= "" ) then
|
||||
--minetest.chat_send_player("singleplayer","you would now get "..tostring( harvested ) );
|
||||
digger:get_inventory():add_item( "main", harvested );
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
plantlife_bushes.after_place_node = function(pos, placer, itemstack)
|
||||
|
||||
if( not( itemstack ) or not( pos )) then
|
||||
return nil;
|
||||
end
|
||||
|
||||
local name_parts = itemstack:get_name():split( ":" );
|
||||
if( #name_parts <2 or name_parts[2]==nil ) then
|
||||
return nil;
|
||||
end
|
||||
|
||||
name_parts = name_parts[2]:split( "_" );
|
||||
|
||||
if( #name_parts <2 or name_parts[1]==nil ) then
|
||||
return nil;
|
||||
end
|
||||
|
||||
minetest.set_node( pos, {type='node',name='bushes:fruitless_bush'});
|
||||
local meta = minetest.get_meta( pos );
|
||||
meta:set_string( 'bush_type', name_parts[1] );
|
||||
|
||||
return nil;
|
||||
end
|
||||
|
||||
|
||||
|
||||
-- regrow berries (uses a base abm instead of plants_lib because of the use of metadata).
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = { "bushes:fruitless_bush" },
|
||||
interval = 500,
|
||||
chance = 5,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
|
||||
local meta = minetest.get_meta( pos );
|
||||
local bush_name = meta:get_string( 'bush_type' );
|
||||
if( bush_name ~= nil and bush_name ~= '' ) then
|
||||
local dirtpos = { x = pos.x, y = pos.y-1, z = pos.z }
|
||||
local dirt = minetest.get_node(dirtpos)
|
||||
if dirt.name == "farming:soil_wet" or math.random(1,3) == 1 then
|
||||
minetest.set_node( pos, {type='node',name='bushes:'..bush_name..'_bush'})
|
||||
end
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
-- Define the basket and bush nodes
|
||||
|
||||
for i, bush_name in ipairs(bushes_classic.bushes) do
|
||||
|
||||
local desc = bushes_classic.bushes_descriptions[i]
|
||||
|
||||
minetest.register_node(":bushes:basket_"..bush_name, {
|
||||
description = S("Basket with "..desc.." Pies"),
|
||||
tiles = {
|
||||
"bushes_basket_"..bush_name.."_top.png",
|
||||
"bushes_basket_bottom.png",
|
||||
"bushes_basket_side.png"
|
||||
},
|
||||
on_use = minetest.item_eat(18),
|
||||
groups = { dig_immediate = 3 },
|
||||
})
|
||||
|
||||
local texture_top, texture_bottom
|
||||
|
||||
local groups = {snappy = 3, bush = 1, flammable = 2, attached_node=1}
|
||||
if bush_name == "mixed_berry" then
|
||||
bush_name = "fruitless";
|
||||
desc = S("currently fruitless");
|
||||
texture_top = "bushes_fruitless_bush_top.png"
|
||||
texture_bottom = "bushes_fruitless_bush_bottom.png"
|
||||
groups.not_in_creative_inventory = 1
|
||||
else
|
||||
texture_top = "bushes_bush_top.png"
|
||||
texture_bottom = "bushes_bush_bottom.png"
|
||||
end
|
||||
|
||||
minetest.register_node(":bushes:" .. bush_name .. "_bush", {
|
||||
description = S(desc.." Bush"),
|
||||
drawtype = "nodebox",
|
||||
tiles = {texture_top, texture_bottom, "bushes_" .. bush_name .. "_bush.png"},
|
||||
inventory_image = "bushes_" .. bush_name .. "_bush.png",
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
walkable = false,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-1/16, -8/16, -1/16, 1/16, -6/16, 1/16},
|
||||
{-4/16, -6/16, -4/16, 4/16, 5/16, 4/16},
|
||||
{-5/16, -5/16, -5/16, 5/16, 3/16, 5/16},
|
||||
{-6/16, -4/16, -6/16, 6/16, 2/16, 6/16},
|
||||
{-6.5/16, -3/16, -6.5/16, 6.5/16, -2/16, 6.5/16},
|
||||
{-3/16, 5/16, -3/16, 3/16, 6/16, 3/16},
|
||||
{-2/16, 5/16, -2/16, 2/16, 7/16, 2/16}
|
||||
}
|
||||
},
|
||||
|
||||
groups = groups,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
drop = "",
|
||||
after_dig_node = function( pos, oldnode, oldmetadata, digger )
|
||||
return plantlife_bushes.after_dig_node(pos, oldnode, oldmetadata, digger);
|
||||
end,
|
||||
after_place_node = function( pos, placer, itemstack )
|
||||
return plantlife_bushes.after_place_node(pos, placer, itemstack);
|
||||
end,
|
||||
})
|
||||
|
||||
-- do not spawn fruitless bushes
|
||||
if bush_name ~= "fruitless" then
|
||||
table.insert(bushes_classic.spawn_list, "bushes:"..bush_name.."_bush")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
minetest.register_node(":bushes:basket_empty", {
|
||||
description = S("Basket"),
|
||||
tiles = {
|
||||
"bushes_basket_empty_top.png",
|
||||
"bushes_basket_bottom.png",
|
||||
"bushes_basket_side.png"
|
||||
},
|
||||
groups = { dig_immediate = 3 },
|
||||
})
|
||||
|
||||
|
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_basket_blackberry_top.png
Executable file
After Width: | Height: | Size: 1.2 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_basket_blueberry_top.png
Executable file
After Width: | Height: | Size: 1.3 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_basket_bottom.png
Executable file
After Width: | Height: | Size: 248 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_basket_empty_top.png
Executable file
After Width: | Height: | Size: 271 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_basket_gooseberry_top.png
Executable file
After Width: | Height: | Size: 1.2 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_basket_mixed_berry_top.png
Executable file
After Width: | Height: | Size: 1.2 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_basket_raspberry_top.png
Executable file
After Width: | Height: | Size: 1.3 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_basket_side.png
Executable file
After Width: | Height: | Size: 341 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_basket_strawberry_top.png
Executable file
After Width: | Height: | Size: 1.2 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry.png
Executable file
After Width: | Height: | Size: 1.2 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry_bush.png
Executable file
After Width: | Height: | Size: 2.0 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry_pie_cooked.png
Executable file
After Width: | Height: | Size: 725 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry_pie_raw.png
Executable file
After Width: | Height: | Size: 751 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_blackberry_pie_slice.png
Executable file
After Width: | Height: | Size: 391 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry.png
Executable file
After Width: | Height: | Size: 1.6 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry_bush.png
Executable file
After Width: | Height: | Size: 2.0 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry_pie_cooked.png
Executable file
After Width: | Height: | Size: 734 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry_pie_raw.png
Executable file
After Width: | Height: | Size: 771 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_blueberry_pie_slice.png
Executable file
After Width: | Height: | Size: 409 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_bush_bottom.png
Executable file
After Width: | Height: | Size: 9.9 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_bush_top.png
Executable file
After Width: | Height: | Size: 7.4 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_fruitless_bush.png
Executable file
After Width: | Height: | Size: 1.8 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_fruitless_bush_bottom.png
Executable file
After Width: | Height: | Size: 2.2 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_fruitless_bush_top.png
Executable file
After Width: | Height: | Size: 2.1 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry.png
Executable file
After Width: | Height: | Size: 1.0 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry_bush.png
Executable file
After Width: | Height: | Size: 2.0 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry_pie_cooked.png
Executable file
After Width: | Height: | Size: 705 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry_pie_raw.png
Executable file
After Width: | Height: | Size: 739 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_gooseberry_pie_slice.png
Executable file
After Width: | Height: | Size: 426 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_mixed_berry_pie_cooked.png
Executable file
After Width: | Height: | Size: 716 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_mixed_berry_pie_raw.png
Executable file
After Width: | Height: | Size: 781 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_mixed_berry_pie_slice.png
Executable file
After Width: | Height: | Size: 421 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry.png
Executable file
After Width: | Height: | Size: 1.4 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry_bush.png
Executable file
After Width: | Height: | Size: 2.0 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry_pie_cooked.png
Executable file
After Width: | Height: | Size: 708 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry_pie_raw.png
Executable file
After Width: | Height: | Size: 747 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_raspberry_pie_slice.png
Executable file
After Width: | Height: | Size: 411 B |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_strawberry.png
Executable file
After Width: | Height: | Size: 1.9 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_strawberry_bush.png
Executable file
After Width: | Height: | Size: 2.0 KiB |
BIN
mods/plantlife_modpack/bushes_classic/textures/bushes_strawberry_pie_cooked.png
Executable file
After Width: | Height: | Size: 671 B |