2013-01-10 03:33:37 +01:00
|
|
|
-- Plantlife library mod by Vanessa Ezekowitz
|
2014-05-15 12:09:59 +02:00
|
|
|
-- last revision, 2014-05-15
|
2012-12-05 01:29:23 +01:00
|
|
|
--
|
2013-01-10 03:33:37 +01:00
|
|
|
-- License: WTFPL
|
2013-01-12 06:47:50 +01:00
|
|
|
--
|
|
|
|
-- I got the temperature map idea from "hmmmm", values used for it came from
|
2013-01-19 06:45:46 +01:00
|
|
|
-- Splizard's snow mod.
|
2013-01-12 06:47:50 +01:00
|
|
|
--
|
|
|
|
|
2012-12-05 01:29:23 +01:00
|
|
|
-- Various settings - most of these probably won't need to be changed
|
|
|
|
|
2013-01-19 06:45:46 +01:00
|
|
|
plantslib = {}
|
2013-01-05 00:56:09 +01:00
|
|
|
|
2013-10-26 23:29:50 +02:00
|
|
|
plantslib.modpath = minetest.get_modpath("plants_lib")
|
|
|
|
plantslib.intllib_modpath = minetest.get_modpath("intllib")
|
|
|
|
|
|
|
|
local S
|
|
|
|
if plantslib.intllib_modpath then
|
|
|
|
dofile(plantslib.intllib_modpath.."/intllib.lua")
|
|
|
|
S = intllib.Getter(minetest.get_current_modname())
|
|
|
|
else
|
|
|
|
S = function ( s ) return s end
|
|
|
|
end
|
|
|
|
|
2013-03-31 07:07:45 +02:00
|
|
|
local DEBUG = false --... except if you want to spam the console with debugging info :-)
|
2013-01-20 19:51:09 +01:00
|
|
|
|
2013-11-16 02:38:52 +01:00
|
|
|
function plantslib:dbg(msg)
|
|
|
|
if DEBUG then
|
|
|
|
print("[Plantlife] "..msg)
|
|
|
|
minetest.log("verbose", "[Plantlife] "..msg)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-01-19 06:45:46 +01:00
|
|
|
plantslib.plantlife_seed_diff = 329 -- needs to be global so other mods can see it
|
2012-12-05 01:29:23 +01:00
|
|
|
|
|
|
|
local perlin_octaves = 3
|
2013-01-05 00:56:09 +01:00
|
|
|
local perlin_persistence = 0.6
|
|
|
|
local perlin_scale = 100
|
2012-12-05 01:29:23 +01:00
|
|
|
|
2013-01-12 06:47:50 +01:00
|
|
|
local temperature_seeddiff = 112
|
|
|
|
local temperature_octaves = 3
|
|
|
|
local temperature_persistence = 0.5
|
|
|
|
local temperature_scale = 150
|
|
|
|
|
2013-02-03 09:01:44 +01:00
|
|
|
local humidity_seeddiff = 9130
|
|
|
|
local humidity_octaves = 3
|
2013-01-28 21:30:35 +01:00
|
|
|
local humidity_persistence = 0.5
|
2013-02-03 09:01:44 +01:00
|
|
|
local humidity_scale = 250
|
2012-12-05 01:29:23 +01:00
|
|
|
|
2013-11-16 02:38:52 +01:00
|
|
|
local time_scale = 1
|
|
|
|
local time_speed = tonumber(minetest.setting_get("time_speed"))
|
|
|
|
|
|
|
|
if time_speed and time_speed > 0 then
|
|
|
|
time_scale = 72 / time_speed
|
|
|
|
end
|
|
|
|
|
2013-02-23 06:34:03 +01:00
|
|
|
--PerlinNoise(seed, octaves, persistence, scale)
|
|
|
|
|
|
|
|
plantslib.perlin_temperature = PerlinNoise(temperature_seeddiff, temperature_octaves, temperature_persistence, temperature_scale)
|
|
|
|
plantslib.perlin_humidity = PerlinNoise(humidity_seeddiff, humidity_octaves, humidity_persistence, humidity_scale)
|
|
|
|
|
2012-12-05 01:29:23 +01:00
|
|
|
-- Local functions
|
|
|
|
|
2013-01-19 06:45:46 +01:00
|
|
|
function plantslib:is_node_loaded(node_pos)
|
2013-12-15 19:41:07 +01:00
|
|
|
local n = minetest.get_node_or_nil(node_pos)
|
2013-02-23 06:34:03 +01:00
|
|
|
if (not n) or (n.name == "ignore") then
|
2012-12-05 01:29:23 +01:00
|
|
|
return false
|
|
|
|
end
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
|
2013-03-09 22:47:58 +01:00
|
|
|
function plantslib:set_defaults(biome)
|
|
|
|
biome.seed_diff = biome.seed_diff or 0
|
|
|
|
biome.min_elevation = biome.min_elevation or -31000
|
|
|
|
biome.max_elevation = biome.max_elevation or 31000
|
|
|
|
biome.temp_min = biome.temp_min or 1
|
|
|
|
biome.temp_max = biome.temp_max or -1
|
|
|
|
biome.humidity_min = biome.humidity_min or 1
|
|
|
|
biome.humidity_max = biome.humidity_max or -1
|
|
|
|
biome.plantlife_limit = biome.plantlife_limit or 0.1
|
|
|
|
biome.near_nodes_vertical = biome.near_nodes_vertical or 1
|
2013-03-09 23:06:21 +01:00
|
|
|
|
|
|
|
-- specific to on-generate
|
|
|
|
|
|
|
|
biome.neighbors = biome.neighbors or biome.surface
|
|
|
|
biome.near_nodes_size = biome.near_nodes_size or 0
|
|
|
|
biome.near_nodes_count = biome.near_nodes_count or 1
|
|
|
|
biome.rarity = biome.rarity or 50
|
|
|
|
biome.max_count = biome.max_count or 5
|
|
|
|
if biome.check_air ~= false then biome.check_air = true end
|
|
|
|
|
|
|
|
-- specific to abm spawner
|
|
|
|
biome.seed_diff = biome.seed_diff or 0
|
|
|
|
biome.light_min = biome.light_min or 0
|
|
|
|
biome.light_max = biome.light_max or 15
|
|
|
|
biome.depth_max = biome.depth_max or 1
|
|
|
|
biome.facedir = biome.facedir or 0
|
2013-03-09 22:47:58 +01:00
|
|
|
end
|
|
|
|
|
2013-01-19 06:45:46 +01:00
|
|
|
-- Spawn plants using the map generator
|
|
|
|
|
2014-08-13 02:18:23 +02:00
|
|
|
plantslib.surfaces_list = {}
|
|
|
|
plantslib.actions_list = {}
|
|
|
|
plantslib.surface_nodes = {}
|
|
|
|
|
|
|
|
local function search_table(t, s)
|
2014-08-15 05:12:43 +02:00
|
|
|
for i = 1, #t do
|
2014-08-13 02:18:23 +02:00
|
|
|
if t[i] == s then return true end
|
|
|
|
end
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
-- register the list of surfaces to spawn stuff on, filtering out all duplicates.
|
|
|
|
|
2013-01-28 21:30:35 +01:00
|
|
|
function plantslib:register_generate_plant(biomedef, node_or_function_or_model)
|
2014-08-13 02:18:23 +02:00
|
|
|
|
|
|
|
if biomedef.check_air == false then
|
|
|
|
print("==>> Called legacy mapgen code for "..dump(node_or_function_or_model))
|
|
|
|
minetest.register_on_generated(plantslib:generate_block_legacy(minp, maxp, biomedef, node_or_function_or_model))
|
|
|
|
else
|
2014-08-15 05:12:43 +02:00
|
|
|
plantslib.actions_list[#plantslib.actions_list + 1] = { biomedef, node_or_function_or_model }
|
2014-08-13 02:18:23 +02:00
|
|
|
local s = biomedef.surface
|
|
|
|
if type(s) == "string" then
|
|
|
|
if not search_table(plantslib.surfaces_list, s) then
|
2014-08-15 05:12:43 +02:00
|
|
|
plantslib.surfaces_list[#plantslib.surfaces_list + 1] = s
|
2014-08-13 02:18:23 +02:00
|
|
|
end
|
|
|
|
else
|
2014-08-15 05:12:43 +02:00
|
|
|
for i = 1, #biomedef.surface do
|
|
|
|
local s = biomedef.surface[i]
|
2014-08-13 02:18:23 +02:00
|
|
|
if not search_table(plantslib.surfaces_list, s) then
|
2014-08-15 05:12:43 +02:00
|
|
|
plantslib.surfaces_list[#plantslib.surfaces_list + 1] = s
|
2014-08-13 02:18:23 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2013-01-19 06:45:46 +01:00
|
|
|
end
|
|
|
|
|
2014-08-13 02:18:23 +02:00
|
|
|
function plantslib:generate_block(minp, maxp, blockseed)
|
2013-01-19 06:45:46 +01:00
|
|
|
return function(minp, maxp, blockseed)
|
2013-03-09 22:47:58 +01:00
|
|
|
|
2014-08-13 02:18:23 +02:00
|
|
|
-- use the block hash as a unique key into the surface_nodes
|
|
|
|
-- table, so that we can write the table thread-safely.
|
|
|
|
|
|
|
|
local blockhash = minetest.hash_node_position(minp)
|
|
|
|
local search_area = minetest.find_nodes_in_area(minp, maxp, plantslib.surfaces_list)
|
|
|
|
|
|
|
|
-- search the generated block for surfaces
|
|
|
|
|
2014-08-15 05:49:44 +02:00
|
|
|
local surface_nodes = {}
|
|
|
|
surface_nodes.blockhash = {}
|
2014-08-15 05:12:43 +02:00
|
|
|
|
|
|
|
for i = 1, #search_area do
|
|
|
|
local pos = search_area[i]
|
2014-08-13 02:18:23 +02:00
|
|
|
local p_top = { x=pos.x, y=pos.y+1, z=pos.z }
|
|
|
|
if minetest.get_node(p_top).name == "air" then
|
2014-08-15 05:49:44 +02:00
|
|
|
surface_nodes.blockhash[#surface_nodes.blockhash + 1] = pos
|
2013-01-19 08:10:26 +01:00
|
|
|
end
|
|
|
|
end
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
|
2014-08-15 05:12:43 +02:00
|
|
|
for action = 1, #plantslib.actions_list do
|
2014-08-13 02:18:23 +02:00
|
|
|
local biome = plantslib.actions_list[action][1]
|
|
|
|
local node_or_function_or_model = plantslib.actions_list[action][2]
|
2013-09-15 04:44:16 +02:00
|
|
|
|
2014-08-13 02:18:23 +02:00
|
|
|
plantslib:set_defaults(biome)
|
2013-02-23 18:33:46 +01:00
|
|
|
|
2014-08-13 02:18:23 +02:00
|
|
|
-- filter stage 1 - find nodes from the supplied surfaces that are within the current biome.
|
2013-07-01 05:55:07 +02:00
|
|
|
|
2014-08-13 02:18:23 +02:00
|
|
|
local in_biome_nodes = {}
|
2014-08-15 05:47:23 +02:00
|
|
|
local perlin_fertile_area = minetest.get_perlin(biome.seed_diff, perlin_octaves, perlin_persistence, perlin_scale)
|
2014-08-15 05:12:43 +02:00
|
|
|
|
2014-08-15 05:49:44 +02:00
|
|
|
for i = 1, #surface_nodes.blockhash do
|
|
|
|
local pos = surface_nodes.blockhash[i]
|
2014-08-13 02:18:23 +02:00
|
|
|
local p_top = { x = pos.x, y = pos.y + 1, z = pos.z }
|
2014-08-15 05:47:23 +02:00
|
|
|
local noise1 = perlin_fertile_area:get2d({x=pos.x, y=pos.z})
|
2014-08-13 02:18:23 +02:00
|
|
|
local noise2 = plantslib.perlin_temperature:get2d({x=pos.x, y=pos.z})
|
|
|
|
local noise3 = plantslib.perlin_humidity:get2d({x=pos.x+150, y=pos.z+50})
|
|
|
|
local biome_surfaces_string = dump(biome.surface)
|
|
|
|
if ((not biome.depth and string.find(biome_surfaces_string, minetest.get_node(pos).name)) or (biome.depth and not string.find(biome_surfaces_string, minetest.get_node({ x = pos.x, y = pos.y-biome.depth-1, z = pos.z }).name)))
|
|
|
|
and (not biome.check_air or (biome.check_air and minetest.get_node(p_top).name == "air"))
|
|
|
|
and pos.y >= biome.min_elevation
|
|
|
|
and pos.y <= biome.max_elevation
|
|
|
|
and noise1 > biome.plantlife_limit
|
|
|
|
and noise2 <= biome.temp_min
|
|
|
|
and noise2 >= biome.temp_max
|
|
|
|
and noise3 <= biome.humidity_min
|
|
|
|
and noise3 >= biome.humidity_max
|
|
|
|
and (not biome.ncount or #(minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, biome.neighbors)) > biome.ncount)
|
|
|
|
and (not biome.near_nodes or #(minetest.find_nodes_in_area({x=pos.x-biome.near_nodes_size, y=pos.y-biome.near_nodes_vertical, z=pos.z-biome.near_nodes_size}, {x=pos.x+biome.near_nodes_size, y=pos.y+biome.near_nodes_vertical, z=pos.z+biome.near_nodes_size}, biome.near_nodes)) >= biome.near_nodes_count)
|
|
|
|
and math.random(1,100) > biome.rarity
|
|
|
|
and (not biome.below_nodes or string.find(dump(biome.below_nodes), minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name) )
|
|
|
|
then
|
2014-08-15 05:12:43 +02:00
|
|
|
in_biome_nodes[#in_biome_nodes + 1] = pos
|
2014-08-13 02:18:23 +02:00
|
|
|
end
|
|
|
|
end
|
2013-02-23 18:33:46 +01:00
|
|
|
|
2014-08-13 02:18:23 +02:00
|
|
|
-- filter stage 2 - find places within that biome area to place the plants.
|
|
|
|
|
|
|
|
local num_in_biome_nodes = #in_biome_nodes
|
|
|
|
|
|
|
|
if num_in_biome_nodes > 0 then
|
|
|
|
for i = 1, math.min(biome.max_count, num_in_biome_nodes) do
|
|
|
|
local tries = 0
|
|
|
|
local spawned = false
|
|
|
|
while tries < 2 and not spawned do
|
|
|
|
local pos = in_biome_nodes[math.random(1, num_in_biome_nodes)]
|
2013-02-23 18:33:46 +01:00
|
|
|
if biome.spawn_replace_node then
|
2014-08-13 02:18:23 +02:00
|
|
|
pos.y = pos.y-1
|
2013-02-23 18:33:46 +01:00
|
|
|
end
|
2014-08-13 02:18:23 +02:00
|
|
|
local p_top = { x = pos.x, y = pos.y + 1, z = pos.z }
|
2013-02-23 18:33:46 +01:00
|
|
|
|
2014-08-13 02:18:23 +02:00
|
|
|
if not (biome.avoid_nodes and biome.avoid_radius and minetest.find_node_near(p_top, biome.avoid_radius + math.random(-1.5,2), biome.avoid_nodes)) then
|
|
|
|
if biome.delete_above then
|
|
|
|
minetest.remove_node(p_top)
|
|
|
|
minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z})
|
|
|
|
end
|
2014-05-24 22:39:35 +02:00
|
|
|
|
2014-08-13 02:18:23 +02:00
|
|
|
if biome.delete_above_surround then
|
|
|
|
minetest.remove_node({x=p_top.x-1, y=p_top.y, z=p_top.z})
|
|
|
|
minetest.remove_node({x=p_top.x+1, y=p_top.y, z=p_top.z})
|
|
|
|
minetest.remove_node({x=p_top.x, y=p_top.y, z=p_top.z-1})
|
|
|
|
minetest.remove_node({x=p_top.x, y=p_top.y, z=p_top.z+1})
|
|
|
|
|
|
|
|
minetest.remove_node({x=p_top.x-1, y=p_top.y+1, z=p_top.z})
|
|
|
|
minetest.remove_node({x=p_top.x+1, y=p_top.y+1, z=p_top.z})
|
|
|
|
minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z-1})
|
|
|
|
minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z+1})
|
|
|
|
end
|
|
|
|
|
|
|
|
if biome.spawn_replace_node then
|
|
|
|
minetest.remove_node(pos)
|
|
|
|
end
|
|
|
|
|
|
|
|
local objtype = type(node_or_function_or_model)
|
|
|
|
|
|
|
|
if objtype == "table" then
|
|
|
|
plantslib:generate_tree(pos, node_or_function_or_model)
|
|
|
|
spawned = true
|
|
|
|
elseif objtype == "string" and
|
|
|
|
minetest.registered_nodes[node_or_function_or_model] then
|
|
|
|
minetest.add_node(p_top, { name = node_or_function_or_model })
|
|
|
|
spawned = true
|
|
|
|
elseif objtype == "function" then
|
|
|
|
node_or_function_or_model(pos)
|
|
|
|
spawned = trueload
|
|
|
|
elseif objtype == "string" and pcall(loadstring(("return %s(...)"):
|
|
|
|
format(node_or_function_or_model)),pos) then
|
|
|
|
spawned = true
|
|
|
|
else
|
|
|
|
print("Ignored invalid definition for object "..dump(node_or_function_or_model).." that was pointed at {"..dump(pos).."}")
|
|
|
|
end
|
2014-05-15 12:08:25 +02:00
|
|
|
else
|
2014-08-13 02:18:23 +02:00
|
|
|
tries = tries + 1
|
2013-01-22 05:41:02 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2013-01-19 06:45:46 +01:00
|
|
|
end
|
|
|
|
end
|
2014-08-15 05:49:44 +02:00
|
|
|
surface_nodes.blockhash = nil -- nuke the block cache after using it (prevent a mem leak).
|
2013-01-19 06:45:46 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-08-13 02:18:23 +02:00
|
|
|
minetest.register_on_generated(plantslib:generate_block(minp, maxp, blockseed))
|
|
|
|
|
2012-12-05 01:29:23 +01:00
|
|
|
-- The spawning ABM
|
|
|
|
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
function plantslib:spawn_on_surfaces(sd,sp,sr,sc,ss,sa)
|
|
|
|
|
|
|
|
local biome = {}
|
|
|
|
|
|
|
|
if type(sd) ~= "table" then
|
|
|
|
biome.spawn_delay = sd -- old api expects ABM interval param here.
|
|
|
|
biome.spawn_plants = {sp}
|
|
|
|
biome.avoid_radius = sr
|
|
|
|
biome.spawn_chance = sc
|
|
|
|
biome.spawn_surfaces = {ss}
|
|
|
|
biome.avoid_nodes = sa
|
|
|
|
else
|
|
|
|
biome = sd
|
|
|
|
end
|
|
|
|
|
2013-11-16 02:38:52 +01:00
|
|
|
if biome.spawn_delay*time_scale >= 1 then
|
|
|
|
biome.interval = biome.spawn_delay*time_scale
|
|
|
|
else
|
|
|
|
biome.interval = 1
|
|
|
|
end
|
|
|
|
|
2013-03-09 22:47:58 +01:00
|
|
|
plantslib:set_defaults(biome)
|
2014-05-25 15:03:29 +02:00
|
|
|
biome.spawn_plants_count = #(biome.spawn_plants)
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
|
2012-12-05 01:29:23 +01:00
|
|
|
minetest.register_abm({
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
nodenames = biome.spawn_surfaces,
|
2013-11-16 02:38:52 +01:00
|
|
|
interval = biome.interval,
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
chance = biome.spawn_chance,
|
|
|
|
neighbors = biome.neighbors,
|
2012-12-05 01:29:23 +01:00
|
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
|
|
|
local p_top = { x = pos.x, y = pos.y + 1, z = pos.z }
|
2013-07-01 05:55:07 +02:00
|
|
|
local n_top = minetest.get_node(p_top)
|
2014-08-15 05:47:23 +02:00
|
|
|
local perlin_fertile_area = minetest.get_perlin(biome.seed_diff, perlin_octaves, perlin_persistence, perlin_scale)
|
|
|
|
local noise1 = perlin_fertile_area:get2d({x=p_top.x, y=p_top.z})
|
2013-02-23 06:34:03 +01:00
|
|
|
local noise2 = plantslib.perlin_temperature:get2d({x=p_top.x, y=p_top.z})
|
|
|
|
local noise3 = plantslib.perlin_humidity:get2d({x=p_top.x+150, y=p_top.z+50})
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
if noise1 > biome.plantlife_limit
|
|
|
|
and noise2 <= biome.temp_min
|
|
|
|
and noise2 >= biome.temp_max
|
2013-01-28 21:30:35 +01:00
|
|
|
and noise3 <= biome.humidity_min
|
|
|
|
and noise3 >= biome.humidity_max
|
2013-01-19 06:45:46 +01:00
|
|
|
and plantslib:is_node_loaded(p_top) then
|
2013-07-01 05:55:07 +02:00
|
|
|
local n_light = minetest.get_node_light(p_top, nil)
|
2013-09-15 04:44:16 +02:00
|
|
|
if not (biome.avoid_nodes and biome.avoid_radius and minetest.find_node_near(p_top, biome.avoid_radius + math.random(-1.5,2), biome.avoid_nodes))
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
and n_light >= biome.light_min
|
|
|
|
and n_light <= biome.light_max
|
2014-05-25 15:03:29 +02:00
|
|
|
and (not(biome.neighbors and biome.ncount) or #(minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, biome.neighbors)) > biome.ncount )
|
|
|
|
and (not(biome.near_nodes and biome.near_nodes_count and biome.near_nodes_size) or #(minetest.find_nodes_in_area({x=pos.x-biome.near_nodes_size, y=pos.y-biome.near_nodes_vertical, z=pos.z-biome.near_nodes_size}, {x=pos.x+biome.near_nodes_size, y=pos.y+biome.near_nodes_vertical, z=pos.z+biome.near_nodes_size}, biome.near_nodes)) >= biome.near_nodes_count)
|
|
|
|
and (not(biome.air_count and biome.air_size) or #(minetest.find_nodes_in_area({x=p_top.x-biome.air_size, y=p_top.y, z=p_top.z-biome.air_size}, {x=p_top.x+biome.air_size, y=p_top.y, z=p_top.z+biome.air_size}, "air")) >= biome.air_count)
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
and pos.y >= biome.min_elevation
|
|
|
|
and pos.y <= biome.max_elevation
|
|
|
|
then
|
|
|
|
local walldir = plantslib:find_adjacent_wall(p_top, biome.verticals_list)
|
|
|
|
if biome.alt_wallnode and walldir then
|
|
|
|
if n_top.name == "air" then
|
2013-07-01 05:55:07 +02:00
|
|
|
minetest.add_node(p_top, { name = biome.alt_wallnode, param2 = walldir })
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
end
|
|
|
|
else
|
2013-07-01 05:55:07 +02:00
|
|
|
local currentsurface = minetest.get_node(pos).name
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
if currentsurface ~= "default:water_source"
|
2014-05-25 15:03:29 +02:00
|
|
|
or (currentsurface == "default:water_source" and #(minetest.find_nodes_in_area({x=pos.x, y=pos.y-biome.depth_max-1, z=pos.z}, {x=pos.x, y=pos.y, z=pos.z}, {"default:dirt", "default:dirt_with_grass", "default:sand"})) > 0 )
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
then
|
|
|
|
local rnd = math.random(1, biome.spawn_plants_count)
|
|
|
|
local plant_to_spawn = biome.spawn_plants[rnd]
|
2013-03-09 22:47:58 +01:00
|
|
|
local fdir = biome.facedir
|
|
|
|
if biome.random_facedir then
|
|
|
|
fdir = math.random(biome.random_facedir[1],biome.random_facedir[2])
|
|
|
|
end
|
2013-01-29 22:22:33 +01:00
|
|
|
if type(spawn_plants) == "string" then
|
2014-05-25 00:30:12 +02:00
|
|
|
assert(loadstring(spawn_plants.."(...)"))(pos)
|
2013-01-29 22:22:33 +01:00
|
|
|
elseif not biome.spawn_on_side and not biome.spawn_on_bottom and not biome.spawn_replace_node then
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
if n_top.name == "air" then
|
2013-07-01 05:55:07 +02:00
|
|
|
minetest.add_node(p_top, { name = plant_to_spawn, param2 = fdir })
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
end
|
2013-01-28 21:30:35 +01:00
|
|
|
elseif biome.spawn_replace_node then
|
2013-07-01 05:55:07 +02:00
|
|
|
minetest.add_node(pos, { name = plant_to_spawn, param2 = fdir })
|
2013-01-29 22:22:33 +01:00
|
|
|
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
elseif biome.spawn_on_side then
|
|
|
|
local onside = plantslib:find_open_side(pos)
|
|
|
|
if onside then
|
2013-07-01 05:55:07 +02:00
|
|
|
minetest.add_node(onside.newpos, { name = plant_to_spawn, param2 = onside.facedir })
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
end
|
|
|
|
elseif biome.spawn_on_bottom then
|
2013-07-01 05:55:07 +02:00
|
|
|
if minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then
|
|
|
|
minetest.add_node({x=pos.x, y=pos.y-1, z=pos.z}, { name = plant_to_spawn, param2 = fdir} )
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
end
|
2012-12-29 23:24:47 +01:00
|
|
|
end
|
2012-12-05 01:29:23 +01:00
|
|
|
end
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
end
|
2012-12-05 01:29:23 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
|
|
|
-- The growing ABM
|
|
|
|
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
function plantslib:grow_plants(opts)
|
|
|
|
|
|
|
|
local options = opts
|
|
|
|
|
2013-03-09 22:47:58 +01:00
|
|
|
options.height_limit = options.height_limit or 5
|
|
|
|
options.ground_nodes = options.ground_nodes or { "default:dirt_with_grass" }
|
|
|
|
options.grow_nodes = options.grow_nodes or { "default:dirt_with_grass" }
|
|
|
|
options.seed_diff = options.seed_diff or 0
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
|
2013-11-16 02:38:52 +01:00
|
|
|
if options.grow_delay*time_scale >= 1 then
|
|
|
|
options.interval = options.grow_delay*time_scale
|
|
|
|
else
|
|
|
|
options.interval = 1
|
|
|
|
end
|
|
|
|
|
2012-12-05 01:29:23 +01:00
|
|
|
minetest.register_abm({
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
nodenames = { options.grow_plant },
|
2013-11-16 02:38:52 +01:00
|
|
|
interval = options.interval,
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
chance = options.grow_chance,
|
2012-12-05 01:29:23 +01:00
|
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
|
|
|
local p_top = {x=pos.x, y=pos.y+1, z=pos.z}
|
|
|
|
local p_bot = {x=pos.x, y=pos.y-1, z=pos.z}
|
2013-07-01 05:55:07 +02:00
|
|
|
local n_top = minetest.get_node(p_top)
|
|
|
|
local n_bot = minetest.get_node(p_bot)
|
|
|
|
local root_node = minetest.get_node({x=pos.x, y=pos.y-options.height_limit, z=pos.z})
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
local walldir = nil
|
2013-02-23 06:34:03 +01:00
|
|
|
if options.need_wall and options.verticals_list then
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
walldir = plantslib:find_adjacent_wall(p_top, options.verticals_list)
|
|
|
|
end
|
|
|
|
if n_top.name == "air" and (not options.need_wall or (options.need_wall and walldir))
|
|
|
|
then
|
|
|
|
-- corner case for changing short junglegrass
|
|
|
|
-- to dry shrub in desert
|
|
|
|
if n_bot.name == options.dry_early_node and options.grow_plant == "junglegrass:short" then
|
2013-07-01 05:55:07 +02:00
|
|
|
minetest.add_node(pos, { name = "default:dry_shrub" })
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
|
|
|
|
elseif options.grow_vertically and walldir then
|
|
|
|
if plantslib:search_downward(pos, options.height_limit, options.ground_nodes) then
|
2013-07-01 05:55:07 +02:00
|
|
|
minetest.add_node(p_top, { name = options.grow_plant, param2 = walldir})
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
end
|
2013-01-10 03:33:37 +01:00
|
|
|
|
2013-02-23 06:34:03 +01:00
|
|
|
elseif not options.grow_result and not options.grow_function then
|
2013-07-01 05:55:07 +02:00
|
|
|
minetest.remove_node(pos)
|
2013-01-10 03:33:37 +01:00
|
|
|
|
2013-01-20 19:37:58 +01:00
|
|
|
else
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
plantslib:replace_object(pos, options.grow_result, options.grow_function, options.facedir, options.seed_diff)
|
2013-01-20 19:37:58 +01:00
|
|
|
end
|
2012-12-05 01:29:23 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
-- Function to decide how to replace a plant - either grow it, replace it with
|
|
|
|
-- a tree, run a function, or die with an error.
|
|
|
|
|
|
|
|
function plantslib:replace_object(pos, replacement, grow_function, walldir, seeddiff)
|
|
|
|
local growtype = type(grow_function)
|
|
|
|
if growtype == "table" then
|
2013-07-01 05:55:07 +02:00
|
|
|
minetest.remove_node(pos)
|
2013-02-20 03:50:56 +01:00
|
|
|
plantslib:grow_tree(pos, grow_function)
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
return
|
2014-05-25 00:30:12 +02:00
|
|
|
elseif growtype == "function" then
|
2014-08-15 05:47:23 +02:00
|
|
|
local perlin_fertile_area = minetest.get_perlin(seeddiff, perlin_octaves, perlin_persistence, perlin_scale)
|
|
|
|
local noise1 = perlin_fertile_area:get2d({x=pos.x, y=pos.z})
|
2014-05-25 00:30:12 +02:00
|
|
|
local noise2 = plantslib.perlin_temperature:get2d({x=pos.x, y=pos.z})
|
|
|
|
grow_function(pos,noise1,noise2,walldir)
|
|
|
|
return
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
elseif growtype == "string" then
|
2014-08-15 05:47:23 +02:00
|
|
|
local perlin_fertile_area = minetest.get_perlin(seeddiff, perlin_octaves, perlin_persistence, perlin_scale)
|
|
|
|
local noise1 = perlin_fertile_area:get2d({x=pos.x, y=pos.z})
|
2013-02-24 18:13:09 +01:00
|
|
|
local noise2 = plantslib.perlin_temperature:get2d({x=pos.x, y=pos.z})
|
2014-05-25 00:30:12 +02:00
|
|
|
assert(loadstring(grow_function.."(...)"))(pos,noise1,noise2,walldir)
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
return
|
|
|
|
elseif growtype == "nil" then
|
2013-07-01 05:55:07 +02:00
|
|
|
minetest.add_node(pos, { name = replacement, param2 = walldir})
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
return
|
|
|
|
elseif growtype ~= "nil" and growtype ~= "string" and growtype ~= "table" then
|
|
|
|
error("Invalid grow function "..dump(grow_function).." used on object at ("..dump(pos)..")")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-12-05 01:29:23 +01:00
|
|
|
-- function to decide if a node has a wall that's in verticals_list{}
|
|
|
|
-- returns wall direction of valid node, or nil if invalid.
|
|
|
|
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
function plantslib:find_adjacent_wall(pos, verticals)
|
|
|
|
local verts = dump(verticals)
|
2013-07-01 05:55:07 +02:00
|
|
|
if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name) then return 3 end
|
|
|
|
if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name) then return 2 end
|
|
|
|
if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z-1 }).name) then return 5 end
|
|
|
|
if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z+1 }).name) then return 4 end
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
return nil
|
2012-12-05 01:29:23 +01:00
|
|
|
end
|
|
|
|
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
-- Function to search downward from the given position, looking for the first
|
|
|
|
-- node that matches the ground table. Returns the new position, or nil if
|
|
|
|
-- height limit is exceeded before finding it.
|
2012-12-10 04:02:30 +01:00
|
|
|
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
function plantslib:search_downward(pos, heightlimit, ground)
|
|
|
|
for i = 0, heightlimit do
|
2013-07-01 05:55:07 +02:00
|
|
|
if string.find(dump(ground), minetest.get_node({x=pos.x, y=pos.y-i, z = pos.z}).name) then
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
return {x=pos.x, y=pos.y-i, z = pos.z}
|
2012-12-10 04:02:30 +01:00
|
|
|
end
|
|
|
|
end
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
return false
|
2012-12-10 04:02:30 +01:00
|
|
|
end
|
|
|
|
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
function plantslib:find_open_side(pos)
|
2013-07-01 05:55:07 +02:00
|
|
|
if minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name == "air" then
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
return {newpos = { x=pos.x-1, y=pos.y, z=pos.z }, facedir = 2}
|
|
|
|
end
|
2013-07-01 05:55:07 +02:00
|
|
|
if minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name == "air" then
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
return {newpos = { x=pos.x+1, y=pos.y, z=pos.z }, facedir = 3}
|
|
|
|
end
|
2013-07-01 05:55:07 +02:00
|
|
|
if minetest.get_node({ x=pos.x, y=pos.y, z=pos.z-1 }).name == "air" then
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
return {newpos = { x=pos.x, y=pos.y, z=pos.z-1 }, facedir = 4}
|
|
|
|
end
|
2013-07-01 05:55:07 +02:00
|
|
|
if minetest.get_node({ x=pos.x, y=pos.y, z=pos.z+1 }).name == "air" then
|
Changed plants_lib API to require a table argument when not using legacy
calling options. This opens the door for even more features in the future.
Changed flowers, junglegrass, poisonivy to match.
Made plants lib faster in some places, especially the surface-hunting
algorithm, and especially over water. Fixed a few other misc. bugs.
Made growth code properly execute all biome-control code before executing
any string-named function or spawn_tree().
Tuned flowers settings. Made flowers require at least some light to spawn,
made waterlilies require shallower water. Fixed a bug in water depth detection
and made water depth depend on whether the bottom of the water area is dirt,
dirt with grass, or sand, rather than just anything.
Made waterlilies randomly rotate on spawning to break up the patterns (now has
16 orientations with the help of nodeboxes and facedir, requires only 3 new
nodes). Smoothed edges of the regular waterlily texture. Made all flowers and
water- lilies spawn using only 3 ABM calls instead of 8.
Got rid of colon prefix node def overrides on all plants, since this is a
modpack now instead of an integrated mod. Fixed a misspelled folder name for
poisonivy.
Fixed a bug in the wall detection routine - it returned the last wall found,
not the first.
Made the top-side-check for air only apply when spawning on top of the
target rather than its sides/bottom.
Many other features and enhancements have been made. Too many to list here.
Please see API.txt for details.
2013-01-25 05:21:57 +01:00
|
|
|
return {newpos = { x=pos.x, y=pos.y, z=pos.z+1 }, facedir = 5}
|
|
|
|
end
|
|
|
|
return nil
|
|
|
|
end
|
2012-12-10 04:02:30 +01:00
|
|
|
|
2013-02-20 03:50:56 +01:00
|
|
|
-- spawn_tree() on generate is routed through here so that other mods can hook
|
|
|
|
-- into it.
|
|
|
|
|
|
|
|
function plantslib:generate_tree(pos, node_or_function_or_model)
|
2013-07-01 05:55:07 +02:00
|
|
|
minetest.spawn_tree(pos, node_or_function_or_model)
|
2013-02-20 03:50:56 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
-- and this one's for the call used in the growing code
|
|
|
|
|
|
|
|
function plantslib:grow_tree(pos, node_or_function_or_model)
|
2013-07-01 05:55:07 +02:00
|
|
|
minetest.spawn_tree(pos, node_or_function_or_model)
|
2013-02-20 03:50:56 +01:00
|
|
|
end
|
|
|
|
|
2013-08-19 08:08:08 +02:00
|
|
|
-- Check for infinite stacks
|
|
|
|
|
|
|
|
if minetest.get_modpath("unified_inventory") or not minetest.setting_getbool("creative_mode") then
|
|
|
|
plantslib.expect_infinite_stacks = false
|
|
|
|
else
|
|
|
|
plantslib.expect_infinite_stacks = true
|
|
|
|
end
|
|
|
|
|
|
|
|
-- read a field from a node's definition
|
|
|
|
|
|
|
|
function plantslib:get_nodedef_field(nodename, fieldname)
|
|
|
|
if not minetest.registered_nodes[nodename] then
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
return minetest.registered_nodes[nodename][fieldname]
|
|
|
|
end
|
2013-03-09 22:47:58 +01:00
|
|
|
|
2014-08-13 02:18:23 +02:00
|
|
|
-- The old version of the mapgen spawner, for mods that require re-checking
|
|
|
|
-- the map on each call.
|
|
|
|
|
|
|
|
function plantslib:generate_block_legacy(minp, maxp, biomedef, node_or_function_or_model)
|
|
|
|
return function(minp, maxp, blockseed)
|
|
|
|
local biome = biomedef
|
|
|
|
plantslib:set_defaults(biome)
|
|
|
|
|
|
|
|
local searchnodes = minetest.find_nodes_in_area(minp, maxp, biome.surface)
|
|
|
|
local in_biome_nodes = {}
|
2014-08-15 05:47:23 +02:00
|
|
|
local perlin_fertile_area = minetest.get_perlin(biome.seed_diff, perlin_octaves, perlin_persistence, perlin_scale)
|
|
|
|
|
2014-08-15 05:12:43 +02:00
|
|
|
for i = 1, #searchnodes do
|
|
|
|
local pos = searchnodes[i]
|
2014-08-13 02:18:23 +02:00
|
|
|
local p_top = { x = pos.x, y = pos.y + 1, z = pos.z }
|
2014-08-15 05:47:23 +02:00
|
|
|
local noise1 = perlin_fertile_area:get2d({x=p_top.x, y=p_top.z})
|
2014-08-13 02:18:23 +02:00
|
|
|
local noise2 = plantslib.perlin_temperature:get2d({x=p_top.x, y=p_top.z})
|
|
|
|
local noise3 = plantslib.perlin_humidity:get2d({x=p_top.x+150, y=p_top.z+50})
|
|
|
|
if (not biome.depth or minetest.get_node({ x = pos.x, y = pos.y-biome.depth-1, z = pos.z }).name ~= biome.surface)
|
|
|
|
and (not biome.check_air or (biome.check_air and minetest.get_node(p_top).name == "air"))
|
|
|
|
and pos.y >= biome.min_elevation
|
|
|
|
and pos.y <= biome.max_elevation
|
|
|
|
and noise1 > biome.plantlife_limit
|
|
|
|
and noise2 <= biome.temp_min
|
|
|
|
and noise2 >= biome.temp_max
|
|
|
|
and noise3 <= biome.humidity_min
|
|
|
|
and noise3 >= biome.humidity_max
|
|
|
|
and (not biome.ncount or #(minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, biome.neighbors)) > biome.ncount)
|
|
|
|
and (not biome.near_nodes or #(minetest.find_nodes_in_area({x=pos.x-biome.near_nodes_size, y=pos.y-biome.near_nodes_vertical, z=pos.z-biome.near_nodes_size}, {x=pos.x+biome.near_nodes_size, y=pos.y+biome.near_nodes_vertical, z=pos.z+biome.near_nodes_size}, biome.near_nodes)) >= biome.near_nodes_count)
|
|
|
|
and math.random(1,100) > biome.rarity
|
|
|
|
and (not biome.below_nodes or string.find(dump(biome.below_nodes), minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name) )
|
|
|
|
then
|
2014-08-15 05:12:43 +02:00
|
|
|
in_biome_nodes[#in_biome_nodes + 1] = pos
|
2014-08-13 02:18:23 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local num_in_biome_nodes = #in_biome_nodes
|
|
|
|
|
|
|
|
if num_in_biome_nodes > 0 then
|
|
|
|
for i = 1, math.min(biome.max_count, num_in_biome_nodes) do
|
|
|
|
local tries = 0
|
|
|
|
local spawned = false
|
|
|
|
while tries < 2 and not spawned do
|
|
|
|
local pos = in_biome_nodes[math.random(1, num_in_biome_nodes)]
|
|
|
|
if biome.spawn_replace_node then
|
|
|
|
pos.y = pos.y-1
|
|
|
|
end
|
|
|
|
local p_top = { x = pos.x, y = pos.y + 1, z = pos.z }
|
|
|
|
|
|
|
|
if not (biome.avoid_nodes and biome.avoid_radius and minetest.find_node_near(p_top, biome.avoid_radius + math.random(-1.5,2), biome.avoid_nodes)) then
|
|
|
|
if biome.delete_above then
|
|
|
|
minetest.remove_node(p_top)
|
|
|
|
minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z})
|
|
|
|
end
|
|
|
|
|
|
|
|
if biome.delete_above_surround then
|
|
|
|
minetest.remove_node({x=p_top.x-1, y=p_top.y, z=p_top.z})
|
|
|
|
minetest.remove_node({x=p_top.x+1, y=p_top.y, z=p_top.z})
|
|
|
|
minetest.remove_node({x=p_top.x, y=p_top.y, z=p_top.z-1})
|
|
|
|
minetest.remove_node({x=p_top.x, y=p_top.y, z=p_top.z+1})
|
|
|
|
|
|
|
|
minetest.remove_node({x=p_top.x-1, y=p_top.y+1, z=p_top.z})
|
|
|
|
minetest.remove_node({x=p_top.x+1, y=p_top.y+1, z=p_top.z})
|
|
|
|
minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z-1})
|
|
|
|
minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z+1})
|
|
|
|
end
|
|
|
|
|
|
|
|
if biome.spawn_replace_node then
|
|
|
|
minetest.remove_node(pos)
|
|
|
|
end
|
|
|
|
|
|
|
|
local objtype = type(node_or_function_or_model)
|
|
|
|
|
|
|
|
if objtype == "table" then
|
|
|
|
plantslib:generate_tree(pos, node_or_function_or_model)
|
|
|
|
spawned = true
|
|
|
|
elseif objtype == "string" and
|
|
|
|
minetest.registered_nodes[node_or_function_or_model] then
|
|
|
|
minetest.add_node(p_top, { name = node_or_function_or_model })
|
|
|
|
spawned = true
|
|
|
|
elseif objtype == "function" then
|
|
|
|
node_or_function_or_model(pos)
|
|
|
|
spawned = trueload
|
|
|
|
elseif objtype == "string" and pcall(loadstring(("return %s(...)"):
|
|
|
|
format(node_or_function_or_model)),pos) then
|
|
|
|
spawned = true
|
|
|
|
else
|
|
|
|
print("Ignored invalid definition for object "..dump(node_or_function_or_model).." that was pointed at {"..dump(pos).."}")
|
|
|
|
end
|
|
|
|
else
|
|
|
|
tries = tries + 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2013-03-09 22:47:58 +01:00
|
|
|
|
2014-03-20 01:57:17 +01:00
|
|
|
print(S("[Plantlife Library] Loaded"))
|