1
0
mirror of https://github.com/mt-mods/biome_lib.git synced 2025-06-29 14:50:49 +02:00

6 Commits

Author SHA1 Message Date
bf2ac2ea57 don't nil-out the recheck list, just empty it. 2021-04-16 13:06:24 -04:00
6342a16b0a Reign-in the default on-generated limit from +/- 31k to -16/+48m
since nothing much is normally found outside that range anyway

only enqueue blocks that are within that range, or within
the range specfied by all of the mods that make generate_plant() calls,
whichever covers more volume.
2021-04-16 13:02:54 -04:00
c6cd524f62 fix reporting of log sizes during shutdown 2021-04-16 12:06:52 -04:00
2dbacae561 remove mapblocks from the queue early if they have no surfaces to work on
(sadly can't be done for blocks in the deferred queue until
they come out of "idle")
2021-04-16 12:02:13 -04:00
f165434a84 change the queue ratio config setting
to avoid breaking old configs
also increase the default amount of work done per tick.
2021-04-16 10:41:38 -04:00
d6cba18844 add a mention in the readme about the mod's config settings 2021-04-16 10:39:17 -04:00
5 changed files with 50 additions and 25 deletions

10
API.txt
View File

@ -112,9 +112,9 @@ biome = {
depth_max = num, -- If the object spawns on top of a water source, the depth_max = num, -- If the object spawns on top of a water source, the
-- water must be at most this deep. Defaults to 1. -- water must be at most this deep. Defaults to 1.
min_elevation = num, -- Surface must be at this altitude or higher to min_elevation = num, -- Surface must be at this altitude or higher to
-- spawn at all. Defaults to -31000... -- spawn at all. Defaults to -16 meters.
max_elevation = num, -- ...but must be no higher than this altitude. max_elevation = num, -- Surface must be no higher than this altitude.
-- Defaults to +31000. -- Defaults to +48.
near_nodes = {table}, -- List of nodes that must be somewhere in the near_nodes = {table}, -- List of nodes that must be somewhere in the
-- vicinity in order for the plant to spawn. Can also -- vicinity in order for the plant to spawn. Can also
-- be a string with a single node name. If not -- be a string with a single node name. If not
@ -270,8 +270,8 @@ biome = {
depth = num, -- How deep/thick of a layer the spawned-on node must depth = num, -- How deep/thick of a layer the spawned-on node must
-- be. Typically used for water. -- be. Typically used for water.
min_elevation = num, -- Minimum elevation in meters/nodes. Defaults to min_elevation = num, -- Minimum elevation in meters/nodes. Defaults to
-- -31000 (unlimited). -- -16 meters.
max_elevation = num, -- Max elevation. Defaults to +31000 (unlimited). max_elevation = num, -- Max elevation. Defaults to +48m.
near_nodes = {table}, -- what nodes must be in the general vicinity of the near_nodes = {table}, -- what nodes must be in the general vicinity of the
-- object being spawned. -- object being spawned.
near_nodes_size = num, -- how wide of a search area to look for the nodes near_nodes_size = num, -- how wide of a search area to look for the nodes

View File

@ -25,4 +25,6 @@ It is primarily intended for mapgen v6, but it should work fine when used with m
* biome_lib:find_valid_wall() * biome_lib:find_valid_wall()
* biome_lib:is_node_loaded() * biome_lib:is_node_loaded()
For a complete description of these functions as well as several of the internal variables within the mod, [read the API.txt document](https://raw.githubusercontent.com/minetest-mods/biome_lib/master/API.txt) included in this package. For a complete description of these functions as well as several of the internal variables within the mod, see `API.txt`.
**Configuration:** This mod has several variables you can set in your `minetest.conf` to change things a bit, from the default nodes it uses, to the debug log level and the block queue behavior. For a list with complete descriptions, see `settingtypes.txt`.

View File

@ -33,6 +33,10 @@ biome_lib.actionslist_no_aircheck = {}
biome_lib.surfaceslist_aircheck = {} biome_lib.surfaceslist_aircheck = {}
biome_lib.surfaceslist_no_aircheck = {} biome_lib.surfaceslist_no_aircheck = {}
-- the mapgen rarely creates useful surfaces outside this range, but mods can
-- still specify a wider range if needed.
biome_lib.mapgen_elevation_limit = { ["min"] = -16, ["max"] = 48 }
biome_lib.modpath = minetest.get_modpath("biome_lib") biome_lib.modpath = minetest.get_modpath("biome_lib")
local function tableize(s) local function tableize(s)
@ -72,8 +76,8 @@ biome_lib.default_grow_nodes = c5 and tableize(c5) or {"default:dirt_with_gras
biome_lib.debug_log_level = tonumber(minetest.settings:get("biome_lib_debug_log_level")) or 0 biome_lib.debug_log_level = tonumber(minetest.settings:get("biome_lib_debug_log_level")) or 0
local rr = tonumber(minetest.settings:get("biome_lib_queue_run_ratio")) or -100 local rr = tonumber(minetest.settings:get("biome_lib_queue_ratio")) or -200
biome_lib.queue_run_ratio = 100 - rr biome_lib.queue_ratio = 100 - rr
biome_lib.entries_per_step = math.max(-rr, 1) biome_lib.entries_per_step = math.max(-rr, 1)
-- the timer that manages the block timeout is in microseconds, but the timer -- the timer that manages the block timeout is in microseconds, but the timer
@ -153,8 +157,8 @@ end
function biome_lib:set_defaults(biome) function biome_lib:set_defaults(biome)
biome.seed_diff = biome.seed_diff or 0 biome.seed_diff = biome.seed_diff or 0
biome.min_elevation = biome.min_elevation or -31000 biome.min_elevation = biome.min_elevation or biome_lib.mapgen_elevation_limit.min
biome.max_elevation = biome.max_elevation or 31000 biome.max_elevation = biome.max_elevation or biome_lib.mapgen_elevation_limit.max
biome.temp_min = biome.temp_min or 1 biome.temp_min = biome.temp_min or 1
biome.temp_max = biome.temp_max or -1 biome.temp_max = biome.temp_max or -1
biome.humidity_min = biome.humidity_min or 1 biome.humidity_min = biome.humidity_min or 1
@ -206,6 +210,9 @@ function biome_lib:register_generate_plant(biomedef, nodes_or_function_or_model)
biome_lib.dbg("Warning: Registered function call using deprecated string method: "..dump(nodes_or_function_or_model), 2) biome_lib.dbg("Warning: Registered function call using deprecated string method: "..dump(nodes_or_function_or_model), 2)
end end
biome_lib.mapgen_elevation_limit.min = math.min(biomedef.min_elevation or 0, biome_lib.mapgen_elevation_limit.min)
biome_lib.mapgen_elevation_limit.max = math.max(biomedef.max_elevation or 0, biome_lib.mapgen_elevation_limit.max)
if biomedef.check_air == false then if biomedef.check_air == false then
biome_lib.dbg("Register no-air-check mapgen hook: "..dump(nodes_or_function_or_model), 3) biome_lib.dbg("Register no-air-check mapgen hook: "..dump(nodes_or_function_or_model), 3)
biome_lib.actionslist_no_aircheck[#biome_lib.actionslist_no_aircheck + 1] = { biomedef, nodes_or_function_or_model } biome_lib.actionslist_no_aircheck[#biome_lib.actionslist_no_aircheck + 1] = { biomedef, nodes_or_function_or_model }
@ -511,8 +518,13 @@ function biome_lib.generate_block(shutting_down)
biome_lib.pos_hash.surface_node_list = airflag biome_lib.pos_hash.surface_node_list = airflag
and minetest.find_nodes_in_area_under_air(minp, maxp, biome_lib.surfaceslist_aircheck) and minetest.find_nodes_in_area_under_air(minp, maxp, biome_lib.surfaceslist_aircheck)
or minetest.find_nodes_in_area(minp, maxp, biome_lib.surfaceslist_no_aircheck) or minetest.find_nodes_in_area(minp, maxp, biome_lib.surfaceslist_no_aircheck)
biome_lib.pos_hash.action_index = 1 if #biome_lib.pos_hash.surface_node_list == 0 then
if #biome_lib.pos_hash.surface_node_list > 0 then biome_lib.dbg("Mapblock at "..minetest.pos_to_string(minp).." dequeued: no detected surfaces.", 4)
table.remove(blocklog, 1)
biome_lib.pos_hash = nil
return
else
biome_lib.pos_hash.action_index = 1
biome_lib.dbg("Mapblock at "..minetest.pos_to_string(minp).. biome_lib.dbg("Mapblock at "..minetest.pos_to_string(minp)..
" has "..#biome_lib.pos_hash.surface_node_list.. " has "..#biome_lib.pos_hash.surface_node_list..
" surface nodes to work on (airflag="..dump(airflag)..")", 4) " surface nodes to work on (airflag="..dump(airflag)..")", 4)
@ -559,7 +571,7 @@ end
minetest.register_globalstep(function(dtime) minetest.register_globalstep(function(dtime)
if not biome_lib.block_log[1] then return end -- the block log is empty if not biome_lib.block_log[1] then return end -- the block log is empty
if math.random(100) > biome_lib.queue_run_ratio then return end if math.random(100) > biome_lib.queue_ratio then return end
for s = 1, biome_lib.entries_per_step do for s = 1, biome_lib.entries_per_step do
biome_lib.generate_block() biome_lib.generate_block()
end end
@ -617,7 +629,7 @@ minetest.register_on_shutdown(function()
end end
biome_lib.dbg("Stand by, purging the mapblock log ".. biome_lib.dbg("Stand by, purging the mapblock log "..
"(there are "..(#biome_lib.block_log + #biome_lib.block_recheck_list).." entries) ...", 0) "(there are "..biome_lib.starting_count.." entries) ...", 0)
while #biome_lib.block_log > 0 do while #biome_lib.block_log > 0 do
biome_lib.generate_block(true) biome_lib.generate_block(true)
@ -626,6 +638,7 @@ minetest.register_on_shutdown(function()
if #biome_lib.block_recheck_list > 0 then if #biome_lib.block_recheck_list > 0 then
biome_lib.block_log = table.copy(biome_lib.block_recheck_list) biome_lib.block_log = table.copy(biome_lib.block_recheck_list)
biome_lib.block_recheck_list = {}
while #biome_lib.block_log > 0 do while #biome_lib.block_log > 0 do
biome_lib.generate_block(true) biome_lib.generate_block(true)
biome_lib.check_remaining_time() biome_lib.check_remaining_time()
@ -853,6 +866,8 @@ end
minetest.after(0, function() minetest.after(0, function()
biome_lib.dbg("Registered a total of "..(#biome_lib.surfaceslist_aircheck)+(#biome_lib.surfaceslist_no_aircheck).." surface types to be evaluated, spread", 0) biome_lib.dbg("Registered a total of "..(#biome_lib.surfaceslist_aircheck)+(#biome_lib.surfaceslist_no_aircheck).." surface types to be evaluated, spread", 0)
biome_lib.dbg("across "..#biome_lib.actionslist_aircheck.." actions with air-checking and "..#biome_lib.actionslist_no_aircheck.." actions without.", 0) biome_lib.dbg("across "..#biome_lib.actionslist_aircheck.." actions with air-checking and "..#biome_lib.actionslist_no_aircheck.." actions without.", 0)
biome_lib.dbg("within an elevation range of "..biome_lib.mapgen_elevation_limit.min.." and "..biome_lib.mapgen_elevation_limit.max.." meters.", 0)
end) end)
biome_lib.dbg("[Biome Lib] Loaded", 0) biome_lib.dbg("[Biome Lib] Loaded", 0)

View File

@ -57,18 +57,26 @@ end
minetest.register_on_generated(function(minp, maxp, blockseed) minetest.register_on_generated(function(minp, maxp, blockseed)
local timestamp = minetest.get_us_time() local timestamp = minetest.get_us_time()
for x = 0, 4 do for y = 0, 4 do
local minx = minp.x + x*16 local miny = minp.y + y*16
for y = 0, 4 do
local miny = minp.y + y*16
for z = 0, 4 do
local minz = minp.z + z*16
local bmin = {x=minx, y=miny, z=minz} if miny >= biome_lib.mapgen_elevation_limit.min
local bmax = {x=minx + 15, y=miny + 15, z=minz + 15} and (miny + 15) <= biome_lib.mapgen_elevation_limit.max then
biome_lib.block_log[#biome_lib.block_log + 1] = { bmin, bmax, true, timestamp }
biome_lib.block_log[#biome_lib.block_log + 1] = { bmin, bmax, false, timestamp } for x = 0, 4 do
local minx = minp.x + x*16
for z = 0, 4 do
local minz = minp.z + z*16
local bmin = {x=minx, y=miny, z=minz}
local bmax = {x=minx + 15, y=miny + 15, z=minz + 15}
biome_lib.block_log[#biome_lib.block_log + 1] = { bmin, bmax, true, timestamp }
biome_lib.block_log[#biome_lib.block_log + 1] = { bmin, bmax, false, timestamp }
end
end end
else
biome_lib.dbg("Did not enqueue mapblocks at elevation "..miny.."m, they're out of range of any generate_plant() calls.", 4)
end end
end end
biome_lib.run_block_recheck_list = true biome_lib.run_block_recheck_list = true

View File

@ -28,7 +28,7 @@ biome_lib_default_ground_nodes (List of default root nodes) string default:dirt_
# that many actions are executed on every single tick, skipping none. # that many actions are executed on every single tick, skipping none.
# More negative means more throughput, at the expense of lag. On fast PC's, # More negative means more throughput, at the expense of lag. On fast PC's,
# a setting of between -500 and -2000 might be good. # a setting of between -500 and -2000 might be good.
biome_lib_queue_run_ratio (Queue run ratio) int -100 biome_lib_queue_ratio (Queue run ratio) int -200
# Minetest's map generator allows neighboring areas to overflow into one # Minetest's map generator allows neighboring areas to overflow into one
# another, to create smooth terrain, but it often hands the map blocks that # another, to create smooth terrain, but it often hands the map blocks that