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.
This commit is contained in:
Vanessa Dannenberg 2021-04-09 13:04:28 -04:00
parent ba46e6c05e
commit d06ab90e01
1 changed files with 11 additions and 10 deletions

View File

@ -78,12 +78,15 @@ 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)
@ -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)