Use 'flat' mapgen for new worlds
Reset the noise values to really avoid other biomesmaster
parent
28f08723b1
commit
fbda7e30ee
|
@ -0,0 +1 @@
|
|||
default
|
186
init.lua
186
init.lua
|
@ -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 = "",
|
||||
})
|
|
@ -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 = "",
|
||||
})
|
Loading…
Reference in New Issue