mcl_mapgen_core: Put all mapgen code into single on_generated

This fixes some mapgen race conditions
This commit is contained in:
Wuzzy 2017-09-11 01:59:20 +02:00
parent 06256f068b
commit 24abe81409

View file

@ -969,12 +969,8 @@ end
local perlin_structures local perlin_structures
local perlin_vines, perlin_vines_fine, perlin_vines_upwards, perlin_vines_length, perlin_vines_density local perlin_vines, perlin_vines_fine, perlin_vines_upwards, perlin_vines_length, perlin_vines_density
-- Generate clay and structures -- TODO: Try to use more efficient clay generating code
-- TODO: Try to use more efficient structure generating code local function generate_clay(minp, maxp, seed)
minetest.register_on_generated(function(minp, maxp, seed)
local chunk_has_desert_well = false
local chunk_has_desert_temple = false
local chunk_has_igloo = false
if maxp.y >= 2 and minp.y <= 0 then if maxp.y >= 2 and minp.y <= 0 then
-- Generate clay -- Generate clay
-- Assume X and Z lengths are equal -- Assume X and Z lengths are equal
@ -1012,9 +1008,16 @@ minetest.register_on_generated(function(minp, maxp, seed)
end end
end end
end end
end
-- TODO: Try to use more efficient structure generating code
local function generate_structures(minp, maxp, seed, biomemap)
local chunk_has_desert_well = false
local chunk_has_desert_temple = false
local chunk_has_igloo = false
local struct_min, struct_max = -3, 64 local struct_min, struct_max = -3, 64
if maxp.y >= struct_min and minp.y <= struct_max then if maxp.y >= struct_min and minp.y <= struct_max then
local biomemap = minetest.get_mapgen_object("biomemap")
-- Generate structures -- Generate structures
perlin_structures = perlin_structures or minetest.get_perlin(329, 3, 0.6, 100) perlin_structures = perlin_structures or minetest.get_perlin(329, 3, 0.6, 100)
@ -1243,7 +1246,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
end end
end end
end end
end) end
-- Buffer for LuaVoxelManip -- Buffer for LuaVoxelManip
local lvm_buffer = {} local lvm_buffer = {}
@ -1252,7 +1255,7 @@ local lvm_buffer = {}
-- * Cocoa at jungle trees -- * Cocoa at jungle trees
-- * Jungle tree vines -- * Jungle tree vines
-- * Oak vines in swamplands -- * Oak vines in swamplands
local function generate_tree_decorations(minp, maxp, biomemap) local function generate_tree_decorations(minp, maxp, seed, biomemap)
if maxp.y < 0 then if maxp.y < 0 then
return return
end end
@ -1415,7 +1418,7 @@ end
local pr_shroom = PseudoRandom(os.time()-24359) local pr_shroom = PseudoRandom(os.time()-24359)
-- Generate mushrooms in caves manually. -- Generate mushrooms in caves manually.
-- Minetest's API does not support decorations in caves yet. :-( -- Minetest's API does not support decorations in caves yet. :-(
local generate_underground_mushrooms = function(minp, maxp) local generate_underground_mushrooms = function(minp, maxp, seed)
-- Generate rare underground mushrooms -- Generate rare underground mushrooms
-- TODO: Make them appear in groups, use Perlin noise -- TODO: Make them appear in groups, use Perlin noise
local min, max = mcl_vars.mg_lava_overworld_max + 4, 0 local min, max = mcl_vars.mg_lava_overworld_max + 4, 0
@ -1442,7 +1445,7 @@ end
local pr_nether = PseudoRandom(os.time()+667) local pr_nether = PseudoRandom(os.time()+667)
-- Generate Nether decorations manually: Eternal fire, mushrooms, nether wart -- Generate Nether decorations manually: Eternal fire, mushrooms, nether wart
-- Minetest's API does not support decorations in caves yet. :-( -- Minetest's API does not support decorations in caves yet. :-(
local generate_nether_decorations = function(minp, maxp) local generate_nether_decorations = function(minp, maxp, seed)
if minp.y > mcl_vars.mg_nether_max or maxp.y < mcl_vars.mg_nether_min then if minp.y > mcl_vars.mg_nether_max or maxp.y < mcl_vars.mg_nether_min then
return return
end end
@ -1526,7 +1529,7 @@ local c_snow_block = minetest.get_content_id("mcl_core:snowblock")
local c_air = minetest.get_content_id("air") local c_air = minetest.get_content_id("air")
-- Below the bedrock, generate air/void -- Below the bedrock, generate air/void
minetest.register_on_generated(function(minp, maxp) minetest.register_on_generated(function(minp, maxp, seed)
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
local data = vm:get_data(lvm_buffer) local data = vm:get_data(lvm_buffer)
local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax})
@ -1762,9 +1765,11 @@ minetest.register_on_generated(function(minp, maxp)
local biomemap = minetest.get_mapgen_object("biomemap") local biomemap = minetest.get_mapgen_object("biomemap")
-- Generate special decorations -- Generate special decorations
generate_underground_mushrooms(minp, maxp) generate_clay(minp, maxp, seed)
generate_tree_decorations(minp, maxp, biomemap) generate_underground_mushrooms(minp, maxp, seed)
generate_nether_decorations(minp, maxp) generate_tree_decorations(minp, maxp, seed, biomemap)
generate_nether_decorations(minp, maxp, seed)
generate_structures(minp, maxp, seed, biomemap)
end) end)