1
0
mirror of https://github.com/mt-mods/biome_lib.git synced 2025-07-04 17:20:38 +02:00

1 Commits

Author SHA1 Message Date
53f55cdb4d make sure a listed block is indeed loaded before writing to it
(in case the mapgen takes long enough on a server that players
have wandered off and the server has unloaded blocks)

for each block queued, make sure it and all 6 of its neighbors are
actually loaded before populating, else move the block to the end of the
queue.
2021-04-05 12:46:06 -04:00
3 changed files with 160 additions and 170 deletions

12
API.txt
View File

@ -446,22 +446,12 @@ question is already loaded, or false if not.
===== =====
dbg(string, level) dbg(string)
This is a simple debug output function which takes one string parameter. It This is a simple debug output function which takes one string parameter. It
just checks if DEBUG is true and outputs the phrase "[Plantlife] " followed by just checks if DEBUG is true and outputs the phrase "[Plantlife] " followed by
the supplied string, via the print() function, if so. the supplied string, via the print() function, if so.
'level' is a number that, if supplied, dictates the lowest 'biome_lib_debug'
can be set to in minetest.conf for this message to be displayed. Both the
default log level and the default message level are 0, thus always showing the
supplied message.
Although it's not set in stone, a good practice is to use a level of 0 (or
just omit the value) for anything that generally important enough that it
ought always be shown, 1 for errors, 2 for warnings, 3 for info, 4 for verbose
spammy stuff.
===== =====
biome_lib:generate_tree(pos, treemodel) biome_lib:generate_tree(pos, treemodel)
biome_lib:grow_tree(pos, treemodel) biome_lib:grow_tree(pos, treemodel)

322
init.lua
View File

@ -9,16 +9,27 @@
biome_lib = {} biome_lib = {}
biome_lib.air = {name = "air"} biome_lib.air = {name = "air"}
biome_lib.block_log = {} biome_lib.blocklist_aircheck = {}
biome_lib.blocklist_no_aircheck = {}
biome_lib.actionslist_aircheck = {} biome_lib.surface_nodes_aircheck = {}
biome_lib.actionslist_no_aircheck = {} biome_lib.surface_nodes_no_aircheck = {}
biome_lib.surfaceslist_aircheck = {} biome_lib.surfaceslist_aircheck = {}
biome_lib.surfaceslist_no_aircheck = {} biome_lib.surfaceslist_no_aircheck = {}
biome_lib.actioncount_aircheck = {}
biome_lib.actioncount_no_aircheck = {}
biome_lib.actionslist_aircheck = {}
biome_lib.actionslist_no_aircheck = {}
biome_lib.modpath = minetest.get_modpath("biome_lib") biome_lib.modpath = minetest.get_modpath("biome_lib")
biome_lib.total_no_aircheck_calls = 0
biome_lib.queue_run_ratio = tonumber(minetest.settings:get("biome_lib_queue_run_ratio")) or 100
local function tableize(s) local function tableize(s)
return string.split(string.trim(string.gsub(s, " ", ""))) return string.split(string.trim(string.gsub(s, " ", "")))
end end
@ -67,11 +78,10 @@ else
end end
biome_lib.intllib = S biome_lib.intllib = S
local DEBUG_LEVEL = tonumber(minetest.settings:get("biome_lib_debug")) or 0 local DEBUG = minetest.settings:get_bool("biome_lib_debug", false)
function biome_lib.dbg(msg, level) function biome_lib:dbg(msg)
local l = tonumber(level) or 0 if DEBUG then
if DEBUG_LEVEL >= l then
print("[Biome Lib] "..msg) print("[Biome Lib] "..msg)
minetest.log("verbose", "[Biome Lib] "..msg) minetest.log("verbose", "[Biome Lib] "..msg)
end end
@ -177,17 +187,17 @@ function biome_lib:register_generate_plant(biomedef, nodes_or_function_or_model)
if type(nodes_or_function_or_model) == "string" if type(nodes_or_function_or_model) == "string"
and string.find(nodes_or_function_or_model, ":") and string.find(nodes_or_function_or_model, ":")
and not minetest.registered_nodes[nodes_or_function_or_model] then and not minetest.registered_nodes[nodes_or_function_or_model] then
biome_lib.dbg("Warning: Ignored registration for undefined spawn node: "..dump(nodes_or_function_or_model), 2) biome_lib:dbg("Warning: Ignored registration for undefined spawn node: "..dump(nodes_or_function_or_model))
return return
end end
if type(nodes_or_function_or_model) == "string" if type(nodes_or_function_or_model) == "string"
and not string.find(nodes_or_function_or_model, ":") then and not string.find(nodes_or_function_or_model, ":") then
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))
end end
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))
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 }
local s = biomedef.surface local s = biomedef.surface
if type(s) == "string" then if type(s) == "string" then
@ -196,7 +206,7 @@ function biome_lib:register_generate_plant(biomedef, nodes_or_function_or_model)
biome_lib.surfaceslist_no_aircheck[#biome_lib.surfaceslist_no_aircheck + 1] = s biome_lib.surfaceslist_no_aircheck[#biome_lib.surfaceslist_no_aircheck + 1] = s
end end
else else
biome_lib.dbg("Warning: Ignored no-air-check registration for undefined surface node: "..dump(s), 2) biome_lib:dbg("Warning: Ignored no-air-check registration for undefined surface node: "..dump(s))
end end
else else
for i = 1, #biomedef.surface do for i = 1, #biomedef.surface do
@ -206,12 +216,12 @@ function biome_lib:register_generate_plant(biomedef, nodes_or_function_or_model)
biome_lib.surfaceslist_no_aircheck[#biome_lib.surfaceslist_no_aircheck + 1] = s biome_lib.surfaceslist_no_aircheck[#biome_lib.surfaceslist_no_aircheck + 1] = s
end end
else else
biome_lib.dbg("Warning: Ignored no-air-check registration for undefined surface node: "..dump(s), 2) biome_lib:dbg("Warning: Ignored no-air-check registration for undefined surface node: "..dump(s))
end end
end end
end end
else else
biome_lib.dbg("Register with-air-checking mapgen hook: "..dump(nodes_or_function_or_model), 3) biome_lib:dbg("Register with-air-checking mapgen hook: "..dump(nodes_or_function_or_model))
biome_lib.actionslist_aircheck[#biome_lib.actionslist_aircheck + 1] = { biomedef, nodes_or_function_or_model } biome_lib.actionslist_aircheck[#biome_lib.actionslist_aircheck + 1] = { biomedef, nodes_or_function_or_model }
local s = biomedef.surface local s = biomedef.surface
if type(s) == "string" then if type(s) == "string" then
@ -220,7 +230,7 @@ function biome_lib:register_generate_plant(biomedef, nodes_or_function_or_model)
biome_lib.surfaceslist_aircheck[#biome_lib.surfaceslist_aircheck + 1] = s biome_lib.surfaceslist_aircheck[#biome_lib.surfaceslist_aircheck + 1] = s
end end
else else
biome_lib.dbg("Warning: Ignored with-air-checking registration for undefined surface node: "..dump(s), 2) biome_lib:dbg("Warning: Ignored with-air-checking registration for undefined surface node: "..dump(s))
end end
else else
for i = 1, #biomedef.surface do for i = 1, #biomedef.surface do
@ -230,7 +240,7 @@ function biome_lib:register_generate_plant(biomedef, nodes_or_function_or_model)
biome_lib.surfaceslist_aircheck[#biome_lib.surfaceslist_aircheck + 1] = s biome_lib.surfaceslist_aircheck[#biome_lib.surfaceslist_aircheck + 1] = s
end end
else else
biome_lib.dbg("Warning: Ignored with-air-checking registration for undefined surface node: "..dump(s), 2) biome_lib:dbg("Warning: Ignored with-air-checking registration for undefined surface node: "..dump(s))
end end
end end
end end
@ -318,7 +328,7 @@ local function populate_single_surface(biome, pos, perlin_fertile_area, checkair
return true return true
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 local items_added = 0
biome_lib:set_defaults(biome) biome_lib:set_defaults(biome)
@ -382,16 +392,13 @@ function biome_lib.populate_surfaces(biome, nodes_or_function_or_model, snodes,
if objtype == "table" then if objtype == "table" then
if nodes_or_function_or_model.axiom then if nodes_or_function_or_model.axiom then
biome_lib:generate_tree(p_top, nodes_or_function_or_model) biome_lib:generate_tree(p_top, nodes_or_function_or_model)
biome_lib.dbg("An L-tree was spawned at "..minetest.pos_to_string(p_top), 4)
spawned = true spawned = true
else else
local fdir = nil local fdir = nil
if biome.random_facedir then if biome.random_facedir then
fdir = math.random(biome.random_facedir[1], biome.random_facedir[2]) fdir = math.random(biome.random_facedir[1], biome.random_facedir[2])
end end
local n=nodes_or_function_or_model[math.random(#nodes_or_function_or_model)] minetest.swap_node(p_top, { name = nodes_or_function_or_model[math.random(#nodes_or_function_or_model)], param2 = fdir })
minetest.swap_node(p_top, { name = n, param2 = fdir })
biome_lib.dbg("Node \""..n.."\" was randomly picked from a list and placed at "..minetest.pos_to_string(p_top), 4)
spawned = true spawned = true
end end
elseif objtype == "string" and elseif objtype == "string" and
@ -401,18 +408,15 @@ function biome_lib.populate_surfaces(biome, nodes_or_function_or_model, snodes,
fdir = math.random(biome.random_facedir[1], biome.random_facedir[2]) fdir = math.random(biome.random_facedir[1], biome.random_facedir[2])
end end
minetest.swap_node(p_top, { name = nodes_or_function_or_model, param2 = fdir }) minetest.swap_node(p_top, { name = nodes_or_function_or_model, param2 = fdir })
biome_lib.dbg("Node \""..nodes_or_function_or_model.."\" was placed at "..minetest.pos_to_string(p_top), 4)
spawned = true spawned = true
elseif objtype == "function" then elseif objtype == "function" then
nodes_or_function_or_model(pos) nodes_or_function_or_model(pos)
biome_lib.dbg("A function was run on surface node at "..minetest.pos_to_string(pos), 4)
spawned = true spawned = true
elseif objtype == "string" and pcall(loadstring(("return %s(...)"): elseif objtype == "string" and pcall(loadstring(("return %s(...)"):
format(nodes_or_function_or_model)),pos) then format(nodes_or_function_or_model)),pos) then
spawned = true spawned = true
biome_lib.dbg("An obsolete string-specified function was run on surface node at "..minetest.pos_to_string(p_top), 4)
else else
biome_lib.dbg("Warning: Ignored invalid definition for object "..dump(nodes_or_function_or_model).." that was pointed at {"..dump(pos).."}", 2) biome_lib:dbg("Warning: Ignored invalid definition for object "..dump(nodes_or_function_or_model).." that was pointed at {"..dump(pos).."}")
end end
else else
tries = tries + 1 tries = tries + 1
@ -423,131 +427,121 @@ function biome_lib.populate_surfaces(biome, nodes_or_function_or_model, snodes,
return items_added return items_added
end end
-- Primary log read-out/mapgen spawner -- make sure the target block and all 6 neighbors are actually loaded.
local function confirm_block_surroundings(p) local function confirm_block_surroundings(pos)
local n=minetest.get_node_or_nil(p) return minetest.get_node_or_nil(pos)
if not n or n.name == "ignore" then return false end and minetest.get_node_or_nil({ x=pos.x-16, y=pos.y, z=pos.z })
and minetest.get_node_or_nil({ x=pos.x+16, y=pos.y, z=pos.z })
for x = -32,32,64 do -- step of 64 causes it to only check the 8 corner blocks and minetest.get_node_or_nil({ x=pos.x, y=pos.y-16, z=pos.z })
for y = -32,32,64 do and minetest.get_node_or_nil({ x=pos.x, y=pos.y+16, z=pos.z })
for z = -32,32,64 do and minetest.get_node_or_nil({ x=pos.x, y=pos.y, z=pos.z-16 })
local n=minetest.get_node_or_nil({x=p.x + x, y=p.y + y, z=p.z + z}) and minetest.get_node_or_nil({ x=pos.x, y=pos.y, z=pos.z+16 })
if not n or n.name == "ignore" then return false end
end
end
end
return true
end end
biome_lib.block_recheck_list = {} -- Primary mapgen spawner, for mods that can work with air checking enabled on
biome_lib.run_block_recheck_list = false -- a surface during the initial map read stage.
function biome_lib.generate_block(shutting_down) function biome_lib:generate_block_with_air_checking(shutdown)
if not biome_lib.blocklist_aircheck[1] then
if shutting_down then
if #biome_lib.block_recheck_list > 0 then
for i = 1, #biome_lib.block_recheck_list do
biome_lib.block_log[#biome_lib.block_log + 1] = biome_lib.block_recheck_list[i]
end
biome_lib.block_recheck_list = {}
end
biome_lib.run_block_recheck_list = false
else
if biome_lib.run_block_recheck_list
and not biome_lib.block_recheck_list[1] then
biome_lib.run_block_recheck_list = false
end
end
local blocklog = biome_lib.run_block_recheck_list
and biome_lib.block_recheck_list
or biome_lib.block_log
if not blocklog[1] then return end
local minp = blocklog[1][1]
local maxp = blocklog[1][2]
local airflag = blocklog[1][3]
local pos_hash = minetest.hash_node_position(minp)
if not biome_lib.pos_hash then -- we need to read the maplock and get the surfaces list
biome_lib.pos_hash = {}
minetest.load_area(minp)
if not confirm_block_surroundings(minp)
and not shutting_down then -- if any neighbors appear not to be loaded, skip this block for now
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])
table.remove(biome_lib.block_recheck_list, 1)
else
biome_lib.block_recheck_list[#biome_lib.block_recheck_list + 1] = table.copy(biome_lib.block_log[1])
table.remove(biome_lib.block_log, 1)
end
biome_lib.pos_hash = nil
biome_lib.dbg("Mapblock at "..minetest.pos_to_string(minp)..
" had a neighbor not fully emerged, skipped it for now.", 4)
return return
end
local minp = biome_lib.blocklist_aircheck[1][1]
local maxp = biome_lib.blocklist_aircheck[1][2]
-- use the block hash as a unique key into the surface nodes
-- tables, so that we can write the tables thread-safely.
local blockhash = minetest.hash_node_position(minp)
if not biome_lib.surface_nodes_aircheck.blockhash then -- read it into the block cache
biome_lib.surface_nodes_aircheck.blockhash =
minetest.find_nodes_in_area_under_air(minp, maxp, biome_lib.surfaceslist_aircheck)
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
elseif not shutdown and not confirm_block_surroundings(minp) and #biome_lib.blocklist_aircheck > 1 then
biome_lib.blocklist_aircheck[#biome_lib.blocklist_aircheck+1] = biome_lib.blocklist_aircheck[1]
table.remove(biome_lib.blocklist_aircheck, 1)
biome_lib:dbg("Mapblock at "..minetest.pos_to_string(minp).." had an unloaded neighbor, moved it to the end of the queue.")
else else
biome_lib.pos_hash.surface_node_list = airflag if biome_lib.actionslist_aircheck[biome_lib.actioncount_aircheck.blockhash] then
and minetest.find_nodes_in_area_under_air(minp, maxp, biome_lib.surfaceslist_aircheck) -- [1] is biome, [2] is node/function/model
or minetest.find_nodes_in_area(minp, maxp, biome_lib.surfaceslist_no_aircheck) local added = biome_lib:populate_surfaces(
biome_lib.pos_hash.action_index = 1 biome_lib.actionslist_aircheck[biome_lib.actioncount_aircheck.blockhash][1],
if #biome_lib.pos_hash.surface_node_list > 0 then biome_lib.actionslist_aircheck[biome_lib.actioncount_aircheck.blockhash][2],
biome_lib.dbg("Mapblock at "..minetest.pos_to_string(minp).. biome_lib.surface_nodes_aircheck.blockhash, true)
" has "..#biome_lib.pos_hash.surface_node_list..
" surface nodes to work on (airflag="..dump(airflag)..")", 4)
end
end
elseif not (airflag and biome_lib.actionslist_aircheck[biome_lib.pos_hash.action_index])
and not (not airflag and biome_lib.actionslist_no_aircheck[biome_lib.pos_hash.action_index]) then
-- the block is finished, remove it
if #biome_lib.pos_hash.surface_node_list > 0 then
biome_lib.dbg("Deleted mapblock "..minetest.pos_to_string(minp).." from the block log", 4)
end
table.remove(blocklog, 1)
biome_lib.pos_hash = nil
else
-- below, [1] is biome, [2] is the thing to be added
local added = 0
if airflag then
if biome_lib.actionslist_aircheck[biome_lib.pos_hash.action_index] then
added = biome_lib.populate_surfaces(
biome_lib.actionslist_aircheck[biome_lib.pos_hash.action_index][1],
biome_lib.actionslist_aircheck[biome_lib.pos_hash.action_index][2],
biome_lib.pos_hash.surface_node_list, true)
biome_lib.pos_hash.action_index = biome_lib.pos_hash.action_index + 1
end
else
if biome_lib.actionslist_no_aircheck[biome_lib.pos_hash.action_index] then
added = biome_lib.populate_surfaces(
biome_lib.actionslist_no_aircheck[biome_lib.pos_hash.action_index][1],
biome_lib.actionslist_no_aircheck[biome_lib.pos_hash.action_index][2],
biome_lib.pos_hash.surface_node_list, false)
biome_lib.pos_hash.action_index = biome_lib.pos_hash.action_index + 1
end
end
if added > 0 then if added > 0 then
biome_lib.dbg("biome_lib.populate_surfaces ran on mapblock at ".. biome_lib:dbg("Ran biome_lib:populate_surfaces for block at "..minetest.pos_to_string(minp)..
minetest.pos_to_string(minp)..". Entry #".. ". Entry #"..biome_lib.actioncount_aircheck.blockhash.." added "..added.." items.")
(biome_lib.pos_hash.action_index-1).." added "..added.." items.", 4) end
biome_lib.actioncount_aircheck.blockhash = biome_lib.actioncount_aircheck.blockhash + 1
else
table.remove(biome_lib.blocklist_aircheck, 1)
biome_lib.surface_nodes_aircheck.blockhash = nil
biome_lib.actioncount_aircheck.blockhash = nil
end
end
end
-- Secondary mapgen spawner, for mods that require disabling of
-- checking for air during the initial map read stage.
function biome_lib:generate_block_no_aircheck(shutdown)
if not biome_lib.blocklist_no_aircheck[1] then
return
end
local minp = biome_lib.blocklist_no_aircheck[1][1]
local maxp = biome_lib.blocklist_no_aircheck[1][2]
local blockhash = minetest.hash_node_position(minp)
if not biome_lib.surface_nodes_no_aircheck.blockhash then
biome_lib.surface_nodes_no_aircheck.blockhash =
minetest.find_nodes_in_area(minp, maxp, biome_lib.surfaceslist_no_aircheck)
biome_lib.actioncount_no_aircheck.blockhash = 1
elseif not shutdown and not confirm_block_surroundings(minp) and #biome_lib.blocklist_no_aircheck > 1 then
biome_lib.blocklist_no_aircheck[#biome_lib.blocklist_no_aircheck+1] = biome_lib.blocklist_no_aircheck[1]
table.remove(biome_lib.blocklist_no_aircheck, 1)
else
if biome_lib.actionslist_no_aircheck[biome_lib.actioncount_no_aircheck.blockhash] then
biome_lib:populate_surfaces(
biome_lib.actionslist_no_aircheck[biome_lib.actioncount_no_aircheck.blockhash][1],
biome_lib.actionslist_no_aircheck[biome_lib.actioncount_no_aircheck.blockhash][2],
biome_lib.surface_nodes_no_aircheck.blockhash, false)
biome_lib.actioncount_no_aircheck.blockhash = biome_lib.actioncount_no_aircheck.blockhash + 1
else
table.remove(biome_lib.blocklist_no_aircheck, 1)
biome_lib.surface_nodes_no_aircheck.blockhash = nil
biome_lib.actioncount_no_aircheck.blockhash = nil
end end
end end
end end
-- "Play" them back, populating them with new stuff in the process -- "Play" them back, populating them with new stuff in the process
local rr = tonumber(minetest.settings:get("biome_lib_queue_run_ratio")) or -100 local step_duration = tonumber(minetest.settings:get("dedicated_server_step"))
biome_lib.queue_run_ratio = 100 - rr
biome_lib.entries_per_step = math.max(-rr, 1)
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 dtime >= step_duration + 0.1 -- don't attempt to populate if lag is already too high
or math.random(100) > biome_lib.queue_run_ratio
or (#biome_lib.blocklist_aircheck == 0 and #biome_lib.blocklist_no_aircheck == 0) then
return
end
if math.random(100) > biome_lib.queue_run_ratio then return end biome_lib.globalstep_start_time = minetest.get_us_time()
for s = 1, biome_lib.entries_per_step do biome_lib.globalstep_runtime = 0
biome_lib.generate_block() while (#biome_lib.blocklist_aircheck > 0 or #biome_lib.blocklist_no_aircheck > 0)
and biome_lib.globalstep_runtime < 200000 do -- 0.2 seconds, in uS.
if #biome_lib.blocklist_aircheck > 0 then
biome_lib:generate_block_with_air_checking(false)
end
if #biome_lib.blocklist_no_aircheck > 0 then
biome_lib:generate_block_no_aircheck(false)
end
biome_lib.globalstep_runtime = minetest.get_us_time() - biome_lib.globalstep_start_time
end end
end) end)
@ -555,21 +549,26 @@ end)
-- to prevent unpopulated map areas -- to prevent unpopulated map areas
minetest.register_on_shutdown(function() minetest.register_on_shutdown(function()
if #biome_lib.block_log + #biome_lib.block_recheck_list == 0 then if #biome_lib.blocklist_aircheck == 0 then
return return
end end
biome_lib.dbg("[biome_lib] Stand by, playing out the rest of the mapblock log", 0) print("[biome_lib] Stand by, playing out the rest of the aircheck mapblock log")
biome_lib.dbg("(there are "..(#biome_lib.block_log + #biome_lib.block_recheck_list).." entries)...", 0) print("(there are "..#biome_lib.blocklist_aircheck.." entries)...")
while #biome_lib.block_log > 0 do while #biome_lib.blocklist_aircheck > 0 do
biome_lib.generate_block(true) biome_lib:generate_block_with_air_checking(true)
end
end)
minetest.register_on_shutdown(function()
if #biome_lib.blocklist_aircheck == 0 then
return
end end
if #biome_lib.block_recheck_list > 0 then print("[biome_lib] Stand by, playing out the rest of the no-aircheck mapblock log")
biome_lib.block_log = table.copy(biome_lib.block_recheck_list) print("(there are "..#biome_lib.blocklist_no_aircheck.." entries)...")
while #biome_lib.block_log > 0 do while #biome_lib.blocklist_no_aircheck > 0 do
biome_lib.generate_block(true) biome_lib:generate_block_no_aircheck(true)
end
end end
end) end)
@ -763,28 +762,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_LEVEL >= 3 then if DEBUG then
biome_lib.last_count = 0 biome_lib.last_count_air = 0
biome_lib.last_count_no_air = 0
function biome_lib.show_pending_block_count() function biome_lib.show_pending_block_counts()
if biome_lib.last_count ~= #biome_lib.block_log then if biome_lib.last_count_air ~= #biome_lib.blocklist_aircheck
biome_lib.dbg("Pending block count: "..(#biome_lib.block_log + #biome_lib.block_recheck_list), 3) or biome_lib.last_count_no_air ~= #biome_lib.blocklist_no_aircheck then
biome_lib.last_count = #biome_lib.block_log biome_lib:dbg(string.format("Pending block counts, air: %-7i no-air: %i",
biome_lib.queue_idle_flag = false #biome_lib.blocklist_aircheck, #biome_lib.blocklist_no_aircheck))
elseif not biome_lib.queue_idle_flag then
biome_lib.dbg("Mapblock queue only contains blocks that can't yet be processed.", 3) biome_lib.last_count_air = #biome_lib.blocklist_aircheck
biome_lib.dbg("Idling the queue until new mapblocks show up.", 3) biome_lib.last_count_no_air = #biome_lib.blocklist_no_aircheck
biome_lib.queue_idle_flag = true
end end
minetest.after(1, biome_lib.show_pending_block_count) minetest.after(1, biome_lib.show_pending_block_counts)
end end
biome_lib.show_pending_block_count() biome_lib.show_pending_block_counts()
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) print("Registered a total of "..(#biome_lib.surfaceslist_aircheck)+(#biome_lib.surfaceslist_no_aircheck).." surface types to be evaluated, spread")
biome_lib.dbg("across "..#biome_lib.actionslist_aircheck.." actions with air-checking and "..#biome_lib.actionslist_no_aircheck.." actions without.", 0) print("across "..#biome_lib.actionslist_aircheck.." actions with air-checking and "..#biome_lib.actionslist_no_aircheck.." actions without.")
end) end)
biome_lib.dbg("[Biome Lib] Loaded", 0) end
print("[Biome Lib] Loaded")

View File

@ -65,10 +65,10 @@ minetest.register_on_generated(function(minp, maxp, blockseed)
local bmin = {x=minx, y=miny, z=minz} local bmin = {x=minx, y=miny, z=minz}
local bmax = {x=minx + 15, y=miny + 15, z=minz + 15} local bmax = {x=minx + 15, y=miny + 15, z=minz + 15}
biome_lib.block_log[#biome_lib.block_log + 1] = { bmin, bmax, true }
biome_lib.block_log[#biome_lib.block_log + 1] = { bmin, bmax, false } biome_lib.blocklist_aircheck[#biome_lib.blocklist_aircheck + 1] = { bmin, bmax }
biome_lib.blocklist_no_aircheck[#biome_lib.blocklist_no_aircheck + 1] = { bmin, bmax }
end end
end end
end end
biome_lib.run_block_recheck_list = true
end) end)