From c25d3e574ad11b5f9cfd1a0d4d055241a7f7606c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 21 Mar 2017 21:21:07 +0100 Subject: [PATCH] Make flat layers configurable --- mods/CORE/mcl_init/init.lua | 39 ++++++++++++--- mods/ENVIRONMENT/weather_pack/skycolor.lua | 6 +-- mods/MAPGEN/mcl_biomes/init.lua | 2 +- mods/MAPGEN/mcl_mapgen_core/init.lua | 58 ++++++++++++++++++++-- mods/PLAYER/playerplus/init.lua | 2 +- 5 files changed, 91 insertions(+), 16 deletions(-) diff --git a/mods/CORE/mcl_init/init.lua b/mods/CORE/mcl_init/init.lua index 54d4e5cd2..83327e8d1 100644 --- a/mods/CORE/mcl_init/init.lua +++ b/mods/CORE/mcl_init/init.lua @@ -24,13 +24,40 @@ else if not ground then ground = 8 end - mcl_vars.mg_overworld_min = ground - 1 - mcl_vars.mg_overworld_max = mcl_vars.mg_overworld_min + minecraft_height_limit + local layer_setting = minetest.get_mapgen_setting("mcl_superflat_layers") + local layers + if layer_setting then + layers = {} + local s_version, s_layers, _, _ = string.split(layer_setting, ";", true, 4) + if tonumber(s_version) == 3 then + local split_layers = string.split(s_layers, ",") + if split_layers then + for s=1, #split_layers do + local node, repetitions = string.match(split_layers[s], "([0-9a-zA-Z:]+)%*([0-9]+)") + if not node then + node = string.match(split_layers[s], "([0-9a-zA-Z:]+)") + repetitions = 1 + end + for r=1, repetitions do + table.insert(layers, node) + end + end + end + end + end + if not layers then + layers = { + "mcl_core:bedrock", + "mcl_core:dirt", + "mcl_core:dirt", + "mcl_core:dirt_with_grass", + } + end - -- 1 perfectly flat bedrock layer - mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min - 2 - mcl_vars.mg_bedrock_overworld_max = mcl_vars.mg_bedrock_overworld_min - mcl_vars.mg_bedrock_is_rough = false + mcl_vars.mg_flat_layers = layers + + mcl_vars.mg_overworld_min = ground - #layers + 1 + mcl_vars.mg_overworld_max = mcl_vars.mg_overworld_min + minecraft_height_limit end -- Set default stack sizes diff --git a/mods/ENVIRONMENT/weather_pack/skycolor.lua b/mods/ENVIRONMENT/weather_pack/skycolor.lua index 7c54dfb04..3c7905688 100644 --- a/mods/ENVIRONMENT/weather_pack/skycolor.lua +++ b/mods/ENVIRONMENT/weather_pack/skycolor.lua @@ -74,7 +74,7 @@ skycolor = { players = skycolor.utils.get_players(players) for _, player in ipairs(players) do local pos = player:getpos() - if pos.y >= mcl_vars.mg_bedrock_overworld_max then + if pos.y >= mcl_vars.mg_overworld_min then player:set_sky(color, "plain", nil) end end @@ -112,7 +112,7 @@ skycolor = { local players = skycolor.utils.get_players(nil) for _, player in ipairs(players) do local pos = player:getpos() - if pos.y >= mcl_vars.mg_bedrock_overworld_max then + if pos.y >= mcl_vars.mg_overworld_min then player:set_sky(color, "plain", nil) end end @@ -125,7 +125,7 @@ skycolor = { local players = skycolor.utils.get_players(players) for _, player in ipairs(players) do local pos = player:getpos() - if pos.y >= mcl_vars.mg_bedrock_overworld_max then + if pos.y >= mcl_vars.mg_overworld_min then player:set_sky(nil, "regular", nil) end end diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 2652880aa..a58ed3841 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -255,5 +255,5 @@ elseif mg_name == "flat" then minetest.clear_registered_biomes() minetest.clear_registered_decorations() minetest.clear_registered_schematics() - register_classic_superflat_biome() +-- register_classic_superflat_biome() end diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 10d7ee55b..d6880b0e4 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -794,7 +794,7 @@ minetest.register_on_generated(function(minp, maxp, seed) num_water_around = num_water_around + 1 end if num_water_around >= 2 then is_shallow = false - end + end if is_shallow then for x1=-divlen,divlen do for z1=-divlen,divlen do @@ -862,7 +862,7 @@ minetest.register_on_generated(function(minp, maxp, seed) break end end - + if ground_y then local p = {x=x,y=ground_y+1,z=z} local nn = minetest.get_node(p).name @@ -880,7 +880,7 @@ minetest.register_on_generated(function(minp, maxp, seed) end end end - + end end end @@ -888,14 +888,63 @@ minetest.register_on_generated(function(minp, maxp, seed) end) +local mg_name = minetest.get_mapgen_setting("mg_name") + -- Generate bedrock layer or layers local BEDROCK_MIN = mcl_vars.mg_bedrock_overworld_min local BEDROCK_MAX = mcl_vars.mg_bedrock_overworld_max -- Below the bedrock, generate air/void + + minetest.register_on_generated(function(minp, maxp) - if minp.y <= BEDROCK_MAX then + if mg_name == "flat" then + if minp.y <= mcl_vars.mg_overworld_max then--and minp.y <= (mcl_vars.mg_overworld_min + mcl_vars.mg_flat_layer_count) then + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + local data = vm:get_data() + local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) + + local c_void = minetest.get_content_id("mcl_core:void") + + local node_ids = {} + local get_content_id = function(nodename) + if not node_ids[nodename] then + node_ids[nodename] = minetest.get_content_id(nodename) + end + return node_ids[nodename] + end + + local layer_counter = 1 + local repeat_counter = 1 + + local max = math.min(maxp.y, mcl_vars.mg_overworld_max) + max = math.min(max, mcl_vars.mg_overworld_min + #mcl_vars.mg_flat_layers) + for y = minp.y, max do + for x = minp.x, maxp.x do + for z = minp.z, maxp.z do + local p_pos = area:index(x, y, z) + + if y < mcl_vars.mg_overworld_min then + data[p_pos] = c_void + else + local layer = mcl_util.y_to_layer(y) + local nodename = mcl_vars.mg_flat_layers[layer+1] + if nodename then + data[p_pos] = get_content_id(nodename) + end + end + end + end + end + + vm:set_data(data) + vm:calc_lighting() + vm:update_liquids() + vm:write_to_map() + + end + elseif minp.y <= BEDROCK_MAX then local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") local data = vm:get_data() local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) @@ -951,7 +1000,6 @@ minetest.register_on_generated(function(minp, maxp) end) -- Apply mapgen-specific mapgen code -local mg_name = minetest.get_mapgen_setting("mg_name") if mg_name == "v6" then register_mgv6_decorations() end diff --git a/mods/PLAYER/playerplus/init.lua b/mods/PLAYER/playerplus/init.lua index 9a5a021b2..307d29271 100644 --- a/mods/PLAYER/playerplus/init.lua +++ b/mods/PLAYER/playerplus/init.lua @@ -121,7 +121,7 @@ minetest.register_globalstep(function(dtime) end -- Apply black sky in the Void and deal Void damage - if pos.y < mcl_vars.mg_bedrock_overworld_max then + if pos.y < mcl_vars.mg_overworld_min then -- Player reached the void, set black sky box player:set_sky("#000000", "plain") -- FIXME: Sky handling in MCL2 is held together with lots of duct tape.