diff --git a/API.txt b/API.txt index a7a5f62..fd234ed 100644 --- a/API.txt +++ b/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/init.lua b/init.lua index 2b000ff..684b740 100644 --- a/init.lua +++ b/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 } @@ -859,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/search_functions.lua b/search_functions.lua index 118e121..85772fc 100644 --- a/search_functions.lua +++ b/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