From 7cc67691173f5c6bd08de26aef9462bb37a280bf Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Fri, 16 Apr 2021 13:13:55 -0400 Subject: [PATCH] update biome_lib again --- build-date | 2 +- mods/biome_lib/API.txt | 10 +++++----- mods/biome_lib/init.lua | 25 ++++++++++++++++++++----- mods/biome_lib/search_functions.lua | 28 ++++++++++++++++++---------- 4 files changed, 44 insertions(+), 21 deletions(-) diff --git a/build-date b/build-date index 08a660e9..fd9c6b16 100644 --- a/build-date +++ b/build-date @@ -1 +1 @@ -20210416-1045 +20210416-1313 diff --git a/mods/biome_lib/API.txt b/mods/biome_lib/API.txt index a7a5f62d..fd234edf 100644 --- a/mods/biome_lib/API.txt +++ b/mods/biome_lib/API.txt @@ -112,9 +112,9 @@ biome = { depth_max = num, -- If the object spawns on top of a water source, the -- water must be at most this deep. Defaults to 1. min_elevation = num, -- Surface must be at this altitude or higher to - -- spawn at all. Defaults to -31000... - max_elevation = num, -- ...but must be no higher than this altitude. - -- Defaults to +31000. + -- spawn at all. Defaults to -16 meters. + max_elevation = num, -- Surface must be no higher than this altitude. + -- Defaults to +48. near_nodes = {table}, -- List of nodes that must be somewhere in the -- vicinity in order for the plant to spawn. Can also -- 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 -- be. Typically used for water. min_elevation = num, -- Minimum elevation in meters/nodes. Defaults to - -- -31000 (unlimited). - max_elevation = num, -- Max elevation. Defaults to +31000 (unlimited). + -- -16 meters. + max_elevation = num, -- Max elevation. Defaults to +48m. near_nodes = {table}, -- what nodes must be in the general vicinity of the -- object being spawned. near_nodes_size = num, -- how wide of a search area to look for the nodes diff --git a/mods/biome_lib/init.lua b/mods/biome_lib/init.lua index 27639267..bf8ad627 100644 --- a/mods/biome_lib/init.lua +++ b/mods/biome_lib/init.lua @@ -33,6 +33,10 @@ biome_lib.actionslist_no_aircheck = {} biome_lib.surfaceslist_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") local function tableize(s) @@ -153,8 +157,8 @@ end function biome_lib:set_defaults(biome) biome.seed_diff = biome.seed_diff or 0 - biome.min_elevation = biome.min_elevation or -31000 - biome.max_elevation = biome.max_elevation or 31000 + biome.min_elevation = biome.min_elevation or biome_lib.mapgen_elevation_limit.min + biome.max_elevation = biome.max_elevation or biome_lib.mapgen_elevation_limit.max biome.temp_min = biome.temp_min or 1 biome.temp_max = biome.temp_max 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) 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 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 } @@ -511,8 +518,13 @@ function biome_lib.generate_block(shutting_down) biome_lib.pos_hash.surface_node_list = airflag 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) - 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).. " has "..#biome_lib.pos_hash.surface_node_list.. " surface nodes to work on (airflag="..dump(airflag)..")", 4) @@ -617,7 +629,7 @@ minetest.register_on_shutdown(function() end 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 biome_lib.generate_block(true) @@ -626,6 +638,7 @@ minetest.register_on_shutdown(function() if #biome_lib.block_recheck_list > 0 then biome_lib.block_log = table.copy(biome_lib.block_recheck_list) + biome_lib.block_recheck_list = {} while #biome_lib.block_log > 0 do biome_lib.generate_block(true) biome_lib.check_remaining_time() @@ -853,6 +866,8 @@ end 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("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) biome_lib.dbg("[Biome Lib] Loaded", 0) diff --git a/mods/biome_lib/search_functions.lua b/mods/biome_lib/search_functions.lua index 118e121d..85772fc0 100644 --- a/mods/biome_lib/search_functions.lua +++ b/mods/biome_lib/search_functions.lua @@ -57,18 +57,26 @@ end minetest.register_on_generated(function(minp, maxp, blockseed) local timestamp = minetest.get_us_time() - for x = 0, 4 do - local minx = minp.x + x*16 - for y = 0, 4 do - local miny = minp.y + y*16 - for z = 0, 4 do - local minz = minp.z + z*16 + for y = 0, 4 do + local miny = minp.y + y*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 } + if miny >= biome_lib.mapgen_elevation_limit.min + and (miny + 15) <= biome_lib.mapgen_elevation_limit.max then + + 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 + 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 biome_lib.run_block_recheck_list = true