From fbda7e30ee3b74c1aef3991fdfd04a29bebbf8b5 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 11 Nov 2018 13:25:03 +0100 Subject: [PATCH] Use 'flat' mapgen for new worlds Reset the noise values to really avoid other biomes --- depends.txt | 1 + init.lua | 186 ++++++++++++++---------------------------------- init_legacy.lua | 143 +++++++++++++++++++++++++++++++++++++ mod.conf | 3 + 4 files changed, 199 insertions(+), 134 deletions(-) create mode 100644 init_legacy.lua create mode 100644 mod.conf diff --git a/depends.txt b/depends.txt index e69de29..4ad96d5 100644 --- a/depends.txt +++ b/depends.txt @@ -0,0 +1 @@ +default diff --git a/init.lua b/init.lua index 56ae9d3..ac76860 100644 --- a/init.lua +++ b/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 ^3 nodes around you", - params = "", - 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 = "", -}) \ No newline at end of file diff --git a/init_legacy.lua b/init_legacy.lua new file mode 100644 index 0000000..9897784 --- /dev/null +++ b/init_legacy.lua @@ -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 ^3 nodes around you", + params = "", + 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 = "", +}) \ No newline at end of file diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..8c9a3d3 --- /dev/null +++ b/mod.conf @@ -0,0 +1,3 @@ +name = flatgen +description = Generates true flat worlds without any decoration +depends = default \ No newline at end of file