mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-12-23 08:29:34 +01:00
Merge pull request 'Fix mapgen issue for mcl5 to mcl2 conversion' (#3349) from fix_villages_crash_mcl5 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3349 Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
This commit is contained in:
commit
db3483a6cb
2 changed files with 48 additions and 11 deletions
|
@ -80,20 +80,29 @@ end
|
|||
local mg_name = minetest.get_mapgen_setting("mg_name")
|
||||
if mg_name ~= "singlenode" then
|
||||
mcl_mapgen_core.register_generator("villages", nil, function(minp, maxp, blockseed)
|
||||
-- don't build settlement underground
|
||||
if maxp.y < 0 then return end
|
||||
|
||||
-- randomly try to build settlements
|
||||
if blockseed % 77 ~= 17 then return end
|
||||
--minetest.log("Rng good. Generate attempt")
|
||||
|
||||
-- needed for manual and automated settlement building
|
||||
-- don't build settlements on (too) uneven terrain
|
||||
local n=minetest.get_node_or_nil(minp)
|
||||
if n and n.name == "mcl_villages:structblock" then return end
|
||||
--minetest.log("No existing village attempt here")
|
||||
|
||||
if villagegen[minetest.pos_to_string(minp)] ~= nil then return end
|
||||
|
||||
--minetest.log("Not in village gen. Put down placeholder: " .. minetest.pos_to_string(minp) .. " || " .. minetest.pos_to_string(maxp))
|
||||
minetest.set_node(minp,{name="mcl_villages:structblock"})
|
||||
|
||||
local height_difference = settlements.evaluate_heightmap()
|
||||
if height_difference > max_height_difference then return end
|
||||
|
||||
if not height_difference or height_difference > max_height_difference then
|
||||
minetest.log("action", "Do not spawn village here as heightmap not good")
|
||||
return
|
||||
end
|
||||
--minetest.log("Build me a village: " .. minetest.pos_to_string(minp) .. " || " .. minetest.pos_to_string(maxp))
|
||||
villagegen[minetest.pos_to_string(minp)]={minp=vector.new(minp), maxp=vector.new(maxp), blockseed=blockseed}
|
||||
end)
|
||||
end
|
||||
|
|
|
@ -198,6 +198,14 @@ end
|
|||
-------------------------------------------------------------------------------
|
||||
function settlements.evaluate_heightmap()
|
||||
local heightmap = minetest.get_mapgen_object("heightmap")
|
||||
|
||||
if not heightmap then
|
||||
minetest.log("action", "No heightmap. That should not happen")
|
||||
return max_height_difference + 1
|
||||
end
|
||||
|
||||
--minetest.log("action", "heightmap size: " .. tostring(#heightmap))
|
||||
|
||||
-- max height and min height, initialize with impossible values for easier first time setting
|
||||
local max_y = -50000
|
||||
local min_y = 50000
|
||||
|
@ -205,16 +213,32 @@ function settlements.evaluate_heightmap()
|
|||
local square_start = 1621
|
||||
local square_end = 1661
|
||||
for j = 1 , 40, 1 do
|
||||
if square_start >= #heightmap then
|
||||
--minetest.log("action", "Heightmap size reached. Go no further outside")
|
||||
break
|
||||
end
|
||||
for i = square_start, square_end, 1 do
|
||||
-- skip buggy heightmaps, return high value
|
||||
if heightmap[i] == -31000 or heightmap[i] == 31000 then
|
||||
return max_height_difference + 1
|
||||
--minetest.log("action", "current hm index: " .. tostring(i) .. "current hm entry: " .. tostring(heightmap[i]))
|
||||
|
||||
if i >= #heightmap then
|
||||
--minetest.log("action", "Heightmap size reached. Go no further")
|
||||
break
|
||||
end
|
||||
if heightmap[i] < min_y then
|
||||
min_y = heightmap[i]
|
||||
end
|
||||
if heightmap[i] > max_y then
|
||||
max_y = heightmap[i]
|
||||
local current_hm_entry = heightmap[i]
|
||||
if current_hm_entry then
|
||||
-- skip buggy heightmaps, return high value. Converted mcl5 maps can be -31007
|
||||
if current_hm_entry == -31000 or heightmap[i] == 31000 then
|
||||
--minetest.log("action", "incorrect heighmap values. abandon")
|
||||
return max_height_difference + 1
|
||||
end
|
||||
if current_hm_entry < min_y then
|
||||
min_y = current_hm_entry
|
||||
end
|
||||
if current_hm_entry > max_y then
|
||||
max_y = current_hm_entry
|
||||
end
|
||||
else
|
||||
--minetest.log("action", "Failed to get hm index: " .. tostring(i) .. "and ... " .. tostring(#heightmap))
|
||||
end
|
||||
end
|
||||
-- set next line
|
||||
|
@ -223,10 +247,14 @@ function settlements.evaluate_heightmap()
|
|||
end
|
||||
-- return the difference between highest and lowest pos in chunk
|
||||
local height_diff = max_y - min_y
|
||||
|
||||
--minetest.log("action", "height_diff = " .. tostring(height_diff))
|
||||
|
||||
-- filter buggy heightmaps
|
||||
if height_diff <= 1 then
|
||||
return max_height_difference + 1
|
||||
end
|
||||
--minetest.log("action", "return heigh diff = " .. tostring(height_diff))
|
||||
-- debug info
|
||||
settlements.debug("heightdiff ".. height_diff)
|
||||
return height_diff
|
||||
|
|
Loading…
Reference in a new issue