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

5 Commits

Author SHA1 Message Date
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
f003f19998 add a proper settingtypes.txt 2021-04-10 06:01:01 -04:00
d06ab90e01 allow re-check-log entries to time out gradually rather than
having to go all at once.  This purges the log sooner than before,
but without damaging the mapgen results.
2021-04-09 13:26:42 -04:00
ba46e6c05e Report the mod's progress and ETA
while purging the mapblock log at shutdown
2021-04-09 12:38:09 -04:00
4 changed files with 102 additions and 47 deletions

33
API.txt
View File

@ -607,34 +607,7 @@ 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 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. 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, See settingtypes.txt for a list. Any item listed there can be changed either
if desired). You'll need to set all of them. by adding it to your minetest.conf, or by using the "all settings" menu in
Minetest, whatever's appropriate for your particular setup.
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

@ -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

@ -72,18 +72,21 @@ 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
-- that manages the queue wakeup call has to be in seconds, and works best if -- that manages the queue wakeup call has to be in seconds, and works best if
-- it takes a little longer than the block timeout interval. -- it takes a fraction of the block timeout interval.
local t = tonumber(minetest.settings:get("biome_lib_block_timeout")) or 300 local t = tonumber(minetest.settings:get("biome_lib_block_timeout")) or 300
biome_lib.block_timeout = t * 1000000 biome_lib.block_timeout = t * 1000000
biome_lib.block_queue_wakeup_time = t * 1.1
-- we don't want the wakeup function to trigger TOO often,
-- in case the user's block timeout setting is really low
biome_lib.block_queue_wakeup_time = math.min(t/2, math.max(20, t/10))
local time_speed = tonumber(minetest.settings:get("time_speed")) local time_speed = tonumber(minetest.settings:get("time_speed"))
@ -492,7 +495,7 @@ function biome_lib.generate_block(shutting_down)
if not confirm_block_surroundings(minp) if not confirm_block_surroundings(minp)
and not shutting_down and not shutting_down
and (blocklog[1][4] + biome_lib.block_timeout) > now then -- if any neighbors appear not to be loaded and the block hasn't expired yet, defer it and (blocklog[1][4] + biome_lib.block_timeout) > now then -- if any neighbors appear not to be loaded and the block hasn't expired yet, defer it
blocklog[1][4] = now -- reset the timer, give this block more time to "cook"
if biome_lib.run_block_recheck_list then if biome_lib.run_block_recheck_list then
biome_lib.block_log[#biome_lib.block_log + 1] = table.copy(biome_lib.block_recheck_list[1]) biome_lib.block_log[#biome_lib.block_log + 1] = table.copy(biome_lib.block_recheck_list[1])
table.remove(biome_lib.block_recheck_list, 1) table.remove(biome_lib.block_recheck_list, 1)
@ -556,7 +559,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
@ -566,14 +569,12 @@ end)
-- if the player isn't currently exploring (i.e. they're just playing in one area) -- if the player isn't currently exploring (i.e. they're just playing in one area)
function biome_lib.wake_up_queue() function biome_lib.wake_up_queue()
if #biome_lib.block_recheck_list > 0 if #biome_lib.block_recheck_list > 1
and #biome_lib.block_log == 0 then and #biome_lib.block_log == 0 then
-- we move the second element and not the first because we can't be biome_lib.block_log[#biome_lib.block_log + 1] =
-- sure if the recheck list's first item is the one currently acted upon table.copy(biome_lib.block_recheck_list[#biome_lib.block_recheck_list])
-- (else it'd be the first item in the main block log) biome_lib.block_recheck_list[#biome_lib.block_recheck_list] = nil
biome_lib.block_log = table.copy(biome_lib.block_recheck_list) biome_lib.run_block_recheck_list = true
biome_lib.block_recheck_list = {}
biome_lib.queue_idle_flag = false
biome_lib.dbg("Woke-up the map queue to give old blocks a chance to time-out.", 3) biome_lib.dbg("Woke-up the map queue to give old blocks a chance to time-out.", 3)
end end
minetest.after(biome_lib.block_queue_wakeup_time, biome_lib.wake_up_queue) minetest.after(biome_lib.block_queue_wakeup_time, biome_lib.wake_up_queue)
@ -584,23 +585,54 @@ biome_lib.wake_up_queue()
-- Play out the entire log all at once on shutdown -- Play out the entire log all at once on shutdown
-- to prevent unpopulated map areas -- to prevent unpopulated map areas
local function format_time(t)
if t > 59999999 then
return os.date("!%M minutes and %S seconds", math.ceil(t/1000000))
else
return os.date("!%S seconds", math.ceil(t/1000000))
end
end
function biome_lib.check_remaining_time()
if minetest.get_us_time() > (biome_lib.shutdown_last_timestamp + 10000000) then -- report progress every 10s
biome_lib.shutdown_last_timestamp = minetest.get_us_time()
local entries_remaining = #biome_lib.block_log + #biome_lib.block_recheck_list
local total_purged = biome_lib.starting_count - entries_remaining
local elapsed_time = biome_lib.shutdown_last_timestamp - biome_lib.shutdown_start_time
biome_lib.dbg(string.format("%i entries, approximately %s remaining.",
entries_remaining, format_time(elapsed_time/total_purged * entries_remaining)))
end
end
minetest.register_on_shutdown(function() minetest.register_on_shutdown(function()
if #biome_lib.block_log + #biome_lib.block_recheck_list == 0 then biome_lib.shutdown_start_time = minetest.get_us_time()
biome_lib.shutdown_last_timestamp = minetest.get_us_time()+1
biome_lib.starting_count = #biome_lib.block_log + #biome_lib.block_recheck_list
if biome_lib.starting_count == 0 then
return return
end end
biome_lib.dbg("[biome_lib] Stand by, playing out the rest of the mapblock log", 0) biome_lib.dbg("Stand by, purging the mapblock log "..
biome_lib.dbg("(there are "..(#biome_lib.block_log + #biome_lib.block_recheck_list).." entries)...", 0) "(there are "..(#biome_lib.block_log + #biome_lib.block_recheck_list).." 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)
biome_lib.check_remaining_time()
end end
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)
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()
end end
end end
biome_lib.dbg("Log purge completed after "..
format_time(minetest.get_us_time() - biome_lib.shutdown_start_time)..".", 0)
end) end)
-- The spawning ABM -- The spawning ABM

48
settingtypes.txt Normal file
View File

@ -0,0 +1,48 @@
# Comma-separated list of things that a spawned node is allowed to grow
# through. Air is always added to whatever else you specify here.
biome_lib_default_grow_through_nodes (List of things a plant can grow through) string default:snow
# Comma-separated list of nodes that should be treated as water or water-like
# for the sake of looking for neighboring wet ground.
biome_lib_default_water_nodes (List of "water-like" sources) string default:water_source,default:water_flowing,default:river_water_source,default:river_water_flowing
# Comma-separated list of nodes that should be considered "wet" if one of
# the configured "water-like" sources is nearby.
biome_lib_default_wet_surfaces (List of "wet" nodes) string default:dirt,default:dirt_with_grass,default:sand
# 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 if the mod that added that growable
# thing didn't provide its own list of suitable surfaces.
biome_lib_default_grow_nodes (List of default surfaces a plant can thrive on) string default:dirt_with_grass
# Comma-separated list of nodes to use as the "root" of something that can
# gradually climb up a wall (such as ivy), to be used if the mod that added
# the climing thing didn't provide its own list.
biome_lib_default_ground_nodes (List of default root nodes) string default:dirt_with_grass
# biome_lib divides its workload into "actions", as dictated by the sum
# total of all mods that use it, and this sets how much of that work is done
# per globalstep tick. If positive, a single action is executed on that
# percentage of ticks, on average. If negative, it becomes positive, and
# 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,
# a setting of between -500 and -2000 might be good.
biome_lib_queue_ratio (Queue run ratio) int -200
# Minetest's map generator allows neighboring areas to overflow into one
# another, to create smooth terrain, but it often hands the map blocks that
# comprise those areas to Lua (and hence, to biome_lib) before that overflow
# function happens, which causes the mapgen to overwrite whatever Lua does
# to them. This setting (in seconds) makes biome_lib wait before adding its
# normal output to those map blocks, to give the engine plenty of time to
# run that overflow feature first.
biome_lib_block_timeout (Deferred block timeout) int 300
# This does just what it sounds like - it shows all debug output that's sent
# with a level equal to or greater than this value. A setting of 0 shows only
# the bare necessities, such as the startup and shutdown messages, 1 adds
# internal non-fatal errors to what's shown, 2 adds warnings, 3 adds other
# basic info, 4 adds all the verbose debugging spew. 3 is perhaps the most
# useful setting.
biome_lib_debug_log_level (Debug log level) int 0