update biome_lib

This commit is contained in:
Vanessa Dannenberg 2021-04-01 08:24:34 -04:00
parent 6beee41992
commit 6e9c50a816
6 changed files with 126 additions and 28 deletions

View File

@ -588,3 +588,43 @@ And this particular one is mapped slightly differently from the others:
(Note the +150 and +50 offsets) (Note the +150 and +50 offsets)
==================
Default game nodes
==================
Although this project was intended to be used with minetest_game, it can be
configured to work with something else instead. All you need to do is provide
the names of the nodes in your game you want biome_lib's internals to use.
Put these settings in your game's minetest.conf (or your client's own config,
if desired). You'll need to set all of them.
biome_lib_default_grow_through_nodes
Comma-separated list of things that a spawned node is allowed to grow
through. Air is always added to whatever you specify.
Default: air, default:snow
biome_lib_default_water_nodes
Comma-separated list of nodes that should be treated as water for the sake
of looking for neighboring "wet" ground.
Default: default:water_source, default:water_flowing,
default:river_water_source, default:river_water_flowing
biome_lib_default_wet_surfaces
Comma-separated list of nodes that should be considered "wet" if one of
the aforementioned water nodes is nearby.
Default: default:dirt, default:dirt_with_grass, default:sand
biome_lib_default_grow_nodes
Comma-separated list of nodes that something must be sitting on to be
able to actively change from one thing to another (such as a sapling
growing into a tree), to be used for ALL growable nodes, if the calling
mod doesn't provide its own lists.
Default: "default:dirt_with_grass"
biome_lib_default_ground_nodes
Comma-separated list of nodes to use as the "root" of something that can
gradually climb up a wall, to be used for ALL such nodes, if the calling
mod doesn't provide its own lists.
Default: "default:dirt_with_grass"

View File

@ -12,7 +12,7 @@ Both mapgen-based spawning and ABM-based spawning is supported. Growing code is
It is primarily intended for mapgen v6, but it should work fine when used with mapgen v7. It is primarily intended for mapgen v6, but it should work fine when used with mapgen v7.
**Dependencies**: default from minetest_game **Dependencies:** nothing, but if you don't use `minetest_game`, you'll need to supply some settings (see API.txt).
**Recommends**: [Plantlife Modpack](https://github.com/minetest-mods/plantlife_modpack), **Recommends**: [Plantlife Modpack](https://github.com/minetest-mods/plantlife_modpack),
[More Trees](https://github.com/minetest-mods/moretrees) [More Trees](https://github.com/minetest-mods/moretrees)

View File

@ -20,8 +20,8 @@ function biome_lib:grow_plants(opts)
local options = opts local options = opts
options.height_limit = options.height_limit or 5 options.height_limit = options.height_limit or 5
options.ground_nodes = options.ground_nodes or { "default:dirt_with_grass" } options.ground_nodes = options.ground_nodes or biome_lib.default_ground_nodes
options.grow_nodes = options.grow_nodes or { "default:dirt_with_grass" } options.grow_nodes = options.grow_nodes or biome_lib.default_grow_nodes
options.seed_diff = options.seed_diff or 0 options.seed_diff = options.seed_diff or 0
local n local n
@ -55,7 +55,7 @@ function biome_lib:grow_plants(opts)
if options.need_wall and options.verticals_list then if options.need_wall and options.verticals_list then
walldir = biome_lib:find_adjacent_wall(p_top, options.verticals_list, options.choose_random_wall) walldir = biome_lib:find_adjacent_wall(p_top, options.verticals_list, options.choose_random_wall)
end end
if (n_top.name == "air" or n_top.name == "default:snow") if biome_lib.default_grow_through_nodes[n_top.name]
and (not options.need_wall or (options.need_wall and walldir)) then and (not options.need_wall or (options.need_wall and walldir)) then
if options.grow_vertically and walldir then if options.grow_vertically and walldir then
if biome_lib:search_downward(pos, options.height_limit, options.ground_nodes) then if biome_lib:search_downward(pos, options.height_limit, options.ground_nodes) then

View File

@ -9,8 +9,6 @@
biome_lib = {} biome_lib = {}
biome_lib.air = {name = "air"} biome_lib.air = {name = "air"}
plantslib = setmetatable({}, { __index=function(t,k) print("Use of deprecated function:", k) return biome_lib[k] end })
biome_lib.blocklist_aircheck = {} biome_lib.blocklist_aircheck = {}
biome_lib.blocklist_no_aircheck = {} biome_lib.blocklist_no_aircheck = {}
@ -32,6 +30,41 @@ biome_lib.total_no_aircheck_calls = 0
biome_lib.queue_run_ratio = tonumber(minetest.settings:get("biome_lib_queue_run_ratio")) or 100 biome_lib.queue_run_ratio = tonumber(minetest.settings:get("biome_lib_queue_run_ratio")) or 100
local function tableize(s)
return string.split(string.trim(string.gsub(s, " ", "")))
end
local c1 minetest.settings:get("biome_lib_default_grow_through_nodes")
biome_lib.default_grow_through_nodes = {["air"] = true}
if c1 then
for _, i in ipairs(tableize(c1)) do
biome_lib.default_grow_through_nodes[i] = true
end
else
biome_lib.default_grow_through_nodes["default:snow"] = true
end
local c2 minetest.settings:get("biome_lib_default_water_nodes")
biome_lib.default_water_nodes = {}
if c2 then
for _, i in ipairs(tableize(c2)) do
biome_lib.default_water_nodes[i] = true
end
else
biome_lib.default_water_nodes["default:water_source"] = true
biome_lib.default_water_nodes["default:water_flowing"] = true
biome_lib.default_water_nodes["default:river_water_source"] = true
biome_lib.default_water_nodes["default:river_water_flowing"] = true
end
local c3 = minetest.settings:get("biome_lib_default_wet_surfaces")
local c4 = minetest.settings:get("biome_lib_default_ground_nodes")
local c5 = minetest.settings:get("biome_lib_default_grow_nodes")
biome_lib.default_wet_surfaces = c3 and tableize(c3) or {"default:dirt", "default:dirt_with_grass", "default:sand"}
biome_lib.default_ground_nodes = c4 and tableize(c4) or {"default:dirt_with_grass"}
biome_lib.default_grow_nodes = c5 and tableize(c5) or {"default:dirt_with_grass"}
-- Boilerplate to support localized strings if intllib mod is installed. -- Boilerplate to support localized strings if intllib mod is installed.
local S local S
if minetest.global_exists("intllib") then if minetest.global_exists("intllib") then
@ -45,12 +78,12 @@ else
end end
biome_lib.intllib = S biome_lib.intllib = S
local DEBUG = false --... except if you want to spam the console with debugging info :-) local DEBUG = minetest.settings:get_bool("biome_lib_debug", false)
function biome_lib:dbg(msg) function biome_lib:dbg(msg)
if DEBUG then if DEBUG then
print("[Plantlife] "..msg) print("[Biome Lib] "..msg)
minetest.log("verbose", "[Plantlife] "..msg) minetest.log("verbose", "[Biome Lib] "..msg)
end end
end end
@ -296,6 +329,7 @@ local function populate_single_surface(biome, pos, perlin_fertile_area, checkair
end end
function biome_lib:populate_surfaces(biome, nodes_or_function_or_model, snodes, checkair) function biome_lib:populate_surfaces(biome, nodes_or_function_or_model, snodes, checkair)
local items_added = 0
biome_lib:set_defaults(biome) biome_lib:set_defaults(biome)
@ -316,10 +350,10 @@ function biome_lib:populate_surfaces(biome, nodes_or_function_or_model, snodes,
local num_in_biome_nodes = #in_biome_nodes local num_in_biome_nodes = #in_biome_nodes
if num_in_biome_nodes == 0 then if num_in_biome_nodes == 0 then
return return 0
end end
for i = 1, math.min(biome.max_count, num_in_biome_nodes) do for i = 1, math.min(biome.max_count/25, num_in_biome_nodes) do
local tries = 0 local tries = 0
local spawned = false local spawned = false
while tries < 2 and not spawned do while tries < 2 and not spawned do
@ -388,7 +422,9 @@ function biome_lib:populate_surfaces(biome, nodes_or_function_or_model, snodes,
tries = tries + 1 tries = tries + 1
end end
end end
if spawned then items_added = items_added + 1 end
end end
return items_added
end end
-- Primary mapgen spawner, for mods that can work with air checking enabled on -- Primary mapgen spawner, for mods that can work with air checking enabled on
@ -411,14 +447,21 @@ function biome_lib:generate_block_with_air_checking()
biome_lib.surface_nodes_aircheck.blockhash = biome_lib.surface_nodes_aircheck.blockhash =
minetest.find_nodes_in_area_under_air(minp, maxp, biome_lib.surfaceslist_aircheck) minetest.find_nodes_in_area_under_air(minp, maxp, biome_lib.surfaceslist_aircheck)
biome_lib.actioncount_aircheck.blockhash = 1 biome_lib.actioncount_aircheck.blockhash = 1
if #biome_lib.surface_nodes_aircheck.blockhash > 0 then
biome_lib:dbg("Mapblock at "..minetest.pos_to_string(minp).." added, with "..#biome_lib.surface_nodes_aircheck.blockhash.." surface nodes detected.")
end
else else
if biome_lib.actionslist_aircheck[biome_lib.actioncount_aircheck.blockhash] then if biome_lib.actionslist_aircheck[biome_lib.actioncount_aircheck.blockhash] then
-- [1] is biome, [2] is node/function/model -- [1] is biome, [2] is node/function/model
biome_lib:populate_surfaces( local added = biome_lib:populate_surfaces(
biome_lib.actionslist_aircheck[biome_lib.actioncount_aircheck.blockhash][1], biome_lib.actionslist_aircheck[biome_lib.actioncount_aircheck.blockhash][1],
biome_lib.actionslist_aircheck[biome_lib.actioncount_aircheck.blockhash][2], biome_lib.actionslist_aircheck[biome_lib.actioncount_aircheck.blockhash][2],
biome_lib.surface_nodes_aircheck.blockhash, true) biome_lib.surface_nodes_aircheck.blockhash, true)
if added > 0 then
biome_lib:dbg("Ran biome_lib:populate_surfaces for block at "..minetest.pos_to_string(minp)..
". Entry #"..biome_lib.actioncount_aircheck.blockhash.." added "..added.." items.")
end
biome_lib.actioncount_aircheck.blockhash = biome_lib.actioncount_aircheck.blockhash + 1 biome_lib.actioncount_aircheck.blockhash = biome_lib.actioncount_aircheck.blockhash + 1
else else
table.remove(biome_lib.blocklist_aircheck, 1) table.remove(biome_lib.blocklist_aircheck, 1)
@ -617,11 +660,11 @@ function biome_lib:spawn_on_surfaces(sd,sp,sr,sc,ss,sa)
local currentsurface = minetest.get_node(pos).name local currentsurface = minetest.get_node(pos).name
if currentsurface == "default:water_source" and if biome_lib.default_water_nodes[currentsurface] and
#minetest.find_nodes_in_area( #minetest.find_nodes_in_area(
{x=pos.x, y=pos.y-biome.depth_max-1, z=pos.z}, {x=pos.x, y=pos.y-biome.depth_max-1, z=pos.z},
vector.new(pos), vector.new(pos),
{"default:dirt", "default:dirt_with_grass", "default:sand"} biome_lib.default_wet_surfaces
) == 0 then ) == 0 then
return -- On water but no ground nearby return -- On water but no ground nearby
end end
@ -682,12 +725,9 @@ function biome_lib:replace_object(pos, replacement, grow_function, walldir, seed
end end
end end
dofile(biome_lib.modpath .. "/search_functions.lua") dofile(biome_lib.modpath .. "/search_functions.lua")
assert(loadfile(biome_lib.modpath .. "/growth.lua"))(time_scale) assert(loadfile(biome_lib.modpath .. "/growth.lua"))(time_scale)
-- Check for infinite stacks -- Check for infinite stacks
if minetest.get_modpath("unified_inventory") or not minetest.settings:get_bool("creative_mode") then if minetest.get_modpath("unified_inventory") or not minetest.settings:get_bool("creative_mode") then
@ -705,10 +745,29 @@ function biome_lib:get_nodedef_field(nodename, fieldname)
return minetest.registered_nodes[nodename][fieldname] return minetest.registered_nodes[nodename][fieldname]
end end
if DEBUG then
biome_lib.last_count_air = 0
biome_lib.last_count_no_air = 0
function biome_lib.show_pending_block_counts()
if biome_lib.last_count_air ~= #biome_lib.blocklist_aircheck
or biome_lib.last_count_no_air ~= #biome_lib.blocklist_no_aircheck then
biome_lib:dbg(string.format("Pending block counts, air: %-7i no-air: %i",
#biome_lib.blocklist_aircheck, #biome_lib.blocklist_no_aircheck))
biome_lib.last_count_air = #biome_lib.blocklist_aircheck
biome_lib.last_count_no_air = #biome_lib.blocklist_no_aircheck
end
minetest.after(1, biome_lib.show_pending_block_counts)
end
biome_lib.show_pending_block_counts()
minetest.after(0, function()
print("Registered a total of "..(#biome_lib.surfaceslist_aircheck)+(#biome_lib.surfaceslist_no_aircheck).." surface types to be evaluated, spread")
print("across "..#biome_lib.actionslist_aircheck.." actions with air-checking and "..#biome_lib.actionslist_no_aircheck.." actions without.")
end)
end
print("[Biome Lib] Loaded") print("[Biome Lib] Loaded")
minetest.after(0, function()
print("[Biome Lib] Registered a total of "..(#biome_lib.surfaceslist_aircheck)+(#biome_lib.surfaceslist_no_aircheck).." surface types to be evaluated, spread")
print("[Biome Lib] across "..#biome_lib.actionslist_aircheck.." actions with air-checking and "..#biome_lib.actionslist_no_aircheck.." actions without.")
end)

View File

@ -1,4 +1,3 @@
name = biome_lib name = biome_lib
min_minetest_version = 5.2.0 min_minetest_version = 5.2.0
depends = default optional_depends = default, intllib
optional_depends = intllib

View File

@ -56,11 +56,11 @@ end
-- split into individual mapblocks to reduce lag -- split into individual mapblocks to reduce lag
minetest.register_on_generated(function(minp, maxp, blockseed) minetest.register_on_generated(function(minp, maxp, blockseed)
for x = 0, 5 do for x = 0, 4 do
local minx = minp.x + x*16 local minx = minp.x + x*16
for y = 0, 5 do for y = 0, 4 do
local miny = minp.y + y*16 local miny = minp.y + y*16
for z = 0, 5 do for z = 0, 4 do
local minz = minp.z + z*16 local minz = minp.z + z*16
local bmin = {x=minx, y=miny, z=minz} local bmin = {x=minx, y=miny, z=minz}