Use 'flat' mapgen for new worlds

Reset the noise values to really avoid other biomes
master
SmallJoker 2018-11-11 13:25:03 +01:00
parent 28f08723b1
commit fbda7e30ee
4 changed files with 199 additions and 134 deletions

View File

@ -0,0 +1 @@
default

186
init.lua
View File

@ -1,142 +1,60 @@
-- flatgen mod for 100% flat maps - created by Krock
-- License: WTFPL
-- License: CC0
local terrain_file = minetest.get_worldpath() .."/flatgen_terrain.txt"
-- Y position where the terrain starts to generate
local generator_start_y = 1
-- Default settings: grass, dirt, dirt, dirt with stone ground
local layers = {
{ "default:dirt_with_grass", 1 },
{ "default:dirt", 3 },
{ "default:stone", nil } -- nil = no limit
-- Fake ignore to generate whenever you want: { "ignore_me", 1 }
}
-- Backwards compatiblity
local file = io.open(terrain_file, "r")
if file then
minetest.log("warning", "[flatgen] Found an existing terrain file. "
.. "Falling back to legacy code")
local legacy_file = minetest.get_modpath("flatgen") .. "/init_legacy.lua"
assert(loadfile(legacy_file))(terrain_file, generator_start_y)
return
end
minetest.set_mapgen_params({
mgname = "singlenode",
water_level = -31000,
flags = "nolight"
if not minetest.set_mapgen_setting then
error("[flatgen] Your Minetest version is no longer supported."
.. " (Version < 0.4.16)")
end
minetest.set_mapgen_setting("mg_name", "flat", true)
minetest.set_mapgen_setting("water_level", "-31000", true)
minetest.set_mapgen_setting("mg_flags",
"light,nocaves,nodungeons,nolight,nodecorations,nobiomes", true)
minetest.set_mapgen_setting("mgflat_spflags", "nolakes,nohills", true)
minetest.set_mapgen_setting("mgflat_ground_level", tostring(generator_start_y), true)
-- Biomes still occur without this stuff
local set_mgparam = minetest.set_mapgen_setting_noiseparams
local function get_noiseparams(_offset)
return {
flags = "defaults",
lacunarity = 0,
offset = _offset,
scale = 0,
spread = {x=1,y=1,z=1},
seed = 0,
octaves = 0,
persistence = 0
}
end
set_mgparam("mg_biome_np_heat", get_noiseparams(60), true)
set_mgparam("mg_biome_np_heat_blend", get_noiseparams(0), true)
set_mgparam("mg_biome_np_humidity", get_noiseparams(67), true)
set_mgparam("mg_biome_np_humidity_blend", get_noiseparams(0), true)
-- Extend the depth of the grassland biome (y_min)
minetest.register_biome({
name = "deep_grassy_deciduous_forest",
node_top = "default:dirt_with_grass",
depth_top = 1,
node_filler = "default:dirt",
depth_filler = 3,
y_max = 31000,
y_min = -1000,
heat_point = 60,
humidity_point = 67,
})
local function readOrCreateTerrainSettings()
local file = io.open(terrain_file, "r")
if file then
-- Load existing world file
local data = minetest.deserialize(file:read("*all"))
file:close()
assert(data, "[flatgen] Can not deserialize the terrain file")
layers = data
return
end
-- Copy default params to the world file
file = io.open(terrain_file, "w")
file:write(minetest.serialize(layers))
file:close()
end
readOrCreateTerrainSettings()
minetest.after(0, function()
-- Transform node strings to content ID
for i, v in ipairs(layers) do
assert(minetest.registered_nodes[v[1]], "[flatgen] Unknown node: "..v[1])
v[1] = minetest.get_content_id(v[1])
end
end)
minetest.register_chatcommand("regenerate", {
description = "Regenerates a <size>^3 nodes around you",
params = "<size>",
privs = {server=true},
func = function(name, param)
local size = tonumber(param) or 0
if size < 10 then
return false, "Please submit a size number >= 10"
end
size = math.floor(size / 2)
local player = minetest.get_player_by_name(name)
local pos = vector.round(player:getpos())
flatgen_generate(
vector.subtract(pos, size),
vector.add(pos, size),
0, true
)
return true, "Done!"
end
})
local c_air = minetest.get_content_id("air")
function flatgen_getNode(y, regenerate)
if y > generator_start_y then
return c_air
end
local depth = generator_start_y
for i, v in ipairs(layers) do
if not v[2] or depth - v[2] < y then
return v[1]
end
depth = depth - v[2]
end
return regenerate and c_air --or nil
end
function flatgen_generate(minp, maxp, seed, regenerate)
if minp.y > generator_start_y then
return -- Area outside of the generation area
end
if not flatgen_getNode(maxp.y) then
return -- No node defined for that position or below
end
local vm, emin, emax
if regenerate then -- Load regular VManip to regenerate area
vm = minetest.get_voxel_manip()
emin, emax = vm:read_from_map(minp, maxp)
else -- Load VManip from map generator
vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
end
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
local data = vm:get_data()
for z = minp.z, maxp.z do
for y = minp.y, maxp.y do
local vi = area:index(minp.x, y, z)
local node = flatgen_getNode(y, regenerate)
for x = minp.x, maxp.x do
if node then
data[vi] = node
end
vi = vi + 1
end
end
end
vm:set_data(data)
if not regenerate then
vm:set_lighting({day=0, night=0})
end
vm:calc_lighting()
vm:write_to_map(data)
if regenerate then
vm:update_map()
end
end
table.insert(minetest.registered_on_generateds, 1, flatgen_generate)
minetest.register_node(":ignore_me", {
description = "You hacker you!",
tiles = {"default_cloud.png"},
paramtype = "light",
sunlight_propagates = true,
pointable = false,
drop = "",
})

143
init_legacy.lua Normal file
View File

@ -0,0 +1,143 @@
-- Fallback code in case there's already a terrain configuration file existing
-- License: CC0
local params = { ... }
local terrain_file = params[1]
-- Y position where the terrain starts to generate
local generator_start_y = params[2]
-- Default settings: grass, dirt, dirt, dirt with stone ground
local layers = {
{ "default:dirt_with_grass", 1 },
{ "default:dirt", 3 },
{ "default:stone", nil } -- nil = no limit
-- Fake ignore to generate whenever you want: { "ignore_me", 1 }
}
minetest.set_mapgen_params({
mgname = "singlenode",
water_level = -31000,
flags = "light"
})
local function readOrCreateTerrainSettings()
local file = io.open(terrain_file, "r")
if file then
-- Load existing world file
local data = minetest.deserialize(file:read("*all"))
file:close()
assert(data, "[flatgen] Can not deserialize the terrain file")
layers = data
return
end
-- Copy default params to the world file
file = io.open(terrain_file, "w")
file:write(minetest.serialize(layers))
file:close()
end
readOrCreateTerrainSettings()
minetest.after(0, function()
-- Transform node strings to content ID
for i, v in ipairs(layers) do
assert(minetest.registered_nodes[v[1]], "[flatgen] Unknown node: "..v[1])
v[1] = minetest.get_content_id(v[1])
end
end)
minetest.register_chatcommand("regenerate", {
description = "Regenerates a <size>^3 nodes around you",
params = "<size>",
privs = {server=true},
func = function(name, param)
local size = tonumber(param) or 0
if size < 10 then
return false, "Please submit a size number >= 10"
end
size = math.floor(size / 2)
local player = minetest.get_player_by_name(name)
local pos = vector.round(player:getpos())
flatgen_generate(
vector.subtract(pos, size),
vector.add(pos, size),
0, true
)
return true, "Done!"
end
})
local c_air = minetest.get_content_id("air")
function flatgen_getNode(y, regenerate)
if y > generator_start_y then
return c_air
end
local depth = generator_start_y
for i, v in ipairs(layers) do
if not v[2] or depth - v[2] < y then
return v[1]
end
depth = depth - v[2]
end
return regenerate and c_air --or nil
end
function flatgen_generate(minp, maxp, seed, regenerate)
if minp.y > generator_start_y then
return -- Area outside of the generation area
end
if not flatgen_getNode(maxp.y) then
return -- No node defined for that position or below
end
local vm, emin, emax
if regenerate then -- Load regular VManip to regenerate area
vm = minetest.get_voxel_manip()
emin, emax = vm:read_from_map(minp, maxp)
else -- Load VManip from map generator
vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
end
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
local data = vm:get_data()
for z = minp.z, maxp.z do
for y = minp.y, maxp.y do
local vi = area:index(minp.x, y, z)
local node = flatgen_getNode(y, regenerate)
for x = minp.x, maxp.x do
if node then
data[vi] = node
end
vi = vi + 1
end
end
end
vm:set_data(data)
if not regenerate then
vm:set_lighting({day=0, night=0})
end
vm:calc_lighting()
vm:write_to_map(data)
if regenerate then
vm:update_map()
end
end
table.insert(minetest.registered_on_generateds, 1, flatgen_generate)
minetest.register_node(":ignore_me", {
description = "You hacker you!",
tiles = {"default_cloud.png"},
paramtype = "light",
sunlight_propagates = true,
pointable = false,
drop = "",
})

3
mod.conf Normal file
View File

@ -0,0 +1,3 @@
name = flatgen
description = Generates true flat worlds without any decoration
depends = default