mirror of
https://github.com/mt-mods/biome_lib.git
synced 2024-11-14 22:50:20 +01:00
6342a16b0a
since nothing much is normally found outside that range anyway only enqueue blocks that are within that range, or within the range specfied by all of the mods that make generate_plant() calls, whichever covers more volume.
84 lines
3.2 KiB
Lua
84 lines
3.2 KiB
Lua
|
|
-- function to decide if a node has a wall that's in verticals_list{}
|
|
-- returns wall direction of valid node, or nil if invalid.
|
|
|
|
function biome_lib:find_adjacent_wall(pos, verticals, randomflag)
|
|
local verts = dump(verticals)
|
|
if randomflag then
|
|
local walltab = {}
|
|
|
|
if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name) then walltab[#walltab + 1] = 3 end
|
|
if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name) then walltab[#walltab + 1] = 2 end
|
|
if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z-1 }).name) then walltab[#walltab + 1] = 5 end
|
|
if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z+1 }).name) then walltab[#walltab + 1] = 4 end
|
|
|
|
if #walltab > 0 then return walltab[math.random(1, #walltab)] end
|
|
|
|
else
|
|
if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name) then return 3 end
|
|
if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name) then return 2 end
|
|
if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z-1 }).name) then return 5 end
|
|
if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z+1 }).name) then return 4 end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
-- Function to search downward from the given position, looking for the first
|
|
-- node that matches the ground table. Returns the new position, or nil if
|
|
-- height limit is exceeded before finding it.
|
|
|
|
function biome_lib:search_downward(pos, heightlimit, ground)
|
|
for i = 0, heightlimit do
|
|
if string.find(dump(ground), minetest.get_node({x=pos.x, y=pos.y-i, z = pos.z}).name) then
|
|
return {x=pos.x, y=pos.y-i, z = pos.z}
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function biome_lib:find_open_side(pos)
|
|
if minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name == "air" then
|
|
return {newpos = { x=pos.x-1, y=pos.y, z=pos.z }, facedir = 2}
|
|
end
|
|
if minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name == "air" then
|
|
return {newpos = { x=pos.x+1, y=pos.y, z=pos.z }, facedir = 3}
|
|
end
|
|
if minetest.get_node({ x=pos.x, y=pos.y, z=pos.z-1 }).name == "air" then
|
|
return {newpos = { x=pos.x, y=pos.y, z=pos.z-1 }, facedir = 4}
|
|
end
|
|
if minetest.get_node({ x=pos.x, y=pos.y, z=pos.z+1 }).name == "air" then
|
|
return {newpos = { x=pos.x, y=pos.y, z=pos.z+1 }, facedir = 5}
|
|
end
|
|
return nil
|
|
end
|
|
|
|
-- "Record" the map chunks being generated by the core mapgen,
|
|
-- split into individual mapblocks to reduce lag
|
|
|
|
minetest.register_on_generated(function(minp, maxp, blockseed)
|
|
local timestamp = minetest.get_us_time()
|
|
for y = 0, 4 do
|
|
local miny = minp.y + y*16
|
|
|
|
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
|
|
end)
|