forked from mtcontrib/biome_lib
populated yet, move those blocks to a separate list, and replay that list whenever new mapblocks come in. That way the main block list can run dry and allow the block populate routines to go idle. Thanks to Warr1024 for the idea!
80 lines
3.1 KiB
Lua
80 lines
3.1 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)
|
|
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
|
|
|
|
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 }
|
|
biome_lib.block_log[#biome_lib.block_log + 1] = { bmin, bmax, false }
|
|
end
|
|
end
|
|
end
|
|
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] = table.copy(biome_lib.block_recheck_list[i])
|
|
end
|
|
end
|
|
biome_lib.block_recheck_list = {}
|
|
end)
|