From 4e832ba323e349ba4d13a5fa1f9fa8b217de488f Mon Sep 17 00:00:00 2001 From: kay27 Date: Mon, 17 Jan 2022 20:43:30 +0400 Subject: [PATCH] Use per-chunk probability and 1-octave Perlin noise to simplify spawning temples --- mods/MAPGEN/mcl_structures/desert_temple.lua | 13 ++++++------ mods/MAPGEN/mcl_structures/init.lua | 20 ++++++++++++++++++- mods/MAPGEN/mcl_structures/jungle_temple.lua | 13 ++++++------ .../MAPGEN/mcl_structures/noise_indicator.lua | 10 ++++++---- mods/MAPGEN/mcl_structures/structures.lua | 2 +- 5 files changed, 40 insertions(+), 18 deletions(-) diff --git a/mods/MAPGEN/mcl_structures/desert_temple.lua b/mods/MAPGEN/mcl_structures/desert_temple.lua index fbaa1fe20..ec06d5b81 100644 --- a/mods/MAPGEN/mcl_structures/desert_temple.lua +++ b/mods/MAPGEN/mcl_structures/desert_temple.lua @@ -1,6 +1,9 @@ local modname = minetest.get_current_modname() local modpath = minetest.get_modpath(modname) +local per_chunk_probability = 11 +local mcl_structures_get_perlin_noise_level = mcl_structures.get_perlin_noise_level + local node_list = {"mcl_core:sand", "mcl_core:sandstone", "mcl_core:redsand", "mcl_colorblocks:hardened_clay_orange"} local schematic_file = modpath .. "/schematics/mcl_structures_desert_temple.mts" @@ -144,12 +147,10 @@ mcl_structures.register_structure({ }, }, on_finished_chunk = function(minp, maxp, seed, vm_context, pos_list) - local a = seed % 14 - local b = (math.floor(seed / 39) + 4) % 12 - if a ~= b then return end - mcl_structures.perlin_noise = mcl_structures.perlin_noise or minetest.get_perlin(329, 3, 0.6, 100) - local current_noise_level = mcl_structures.perlin_noise:get_3d(minp) - if current_noise_level > -0.3 then return end + local pr = PseudoRandom(seed + 999) + local random_number = pr:next(1, per_chunk_probability) + local noise = mcl_structures_get_perlin_noise_level(minp) + if (random_number + noise) < (per_chunk_probability - 1) then return end local pos = pos_list[1] if #pos_list > 1 then local count = get_place_rank(pos) diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index ecb2b591e..35aca9346 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -17,7 +17,25 @@ local use_process_mapgen_chunk = false local on_finished_block_callbacks = {} local on_finished_chunk_callbacks = {} -mcl_structures.perlin_noise = minetest.get_perlin(329, 3, 0.6, 100) +local noise_params = { + offset = 0, + scale = 1, + spread = { + x = mcl_mapgen.CS_NODES, + y = mcl_mapgen.CS_NODES, + z = mcl_mapgen.CS_NODES, + }, + seed = 329, + octaves = 1, + persistence = 0.6, +} + +local perlin_noise +local get_perlin_noise_level = function(minp) + perlin_noise = perlin_noise or minetest.get_perlin(noise_params) + return perlin_noise:get_3d(minp) +end +mcl_structures.get_perlin_noise_level = get_perlin_noise_level local spawnstruct_hint = S("Use /help spawnstruct to see a list of avaiable types.") diff --git a/mods/MAPGEN/mcl_structures/jungle_temple.lua b/mods/MAPGEN/mcl_structures/jungle_temple.lua index 1176b7be8..e25aab948 100644 --- a/mods/MAPGEN/mcl_structures/jungle_temple.lua +++ b/mods/MAPGEN/mcl_structures/jungle_temple.lua @@ -1,6 +1,9 @@ local modname = minetest.get_current_modname() local modpath = minetest.get_modpath(modname) +local per_chunk_probability = 8 +local mcl_structures_get_perlin_noise_level = mcl_structures.get_perlin_noise_level + local node_list = {"mcl_core:dirt_with_grass", "mcl_core:dirt", "mcl_core:stone", "mcl_core:granite", "mcl_core:gravel", "mcl_core:diorite"} local schematic_file = modpath .. "/schematics/mcl_structures_jungle_temple.mts" @@ -161,12 +164,10 @@ mcl_structures.register_structure({ }, }, on_finished_chunk = function(minp, maxp, seed, vm_context, pos_list) - local a = seed % 17 - local b = (math.ceil(seed / 123) - 4) % 17 - if a ~= b then return end - mcl_structures.perlin_noise = mcl_structures.perlin_noise or minetest.get_perlin(329, 3, 0.6, 100) - local current_noise_level = mcl_structures.perlin_noise:get_3d(maxp) - if current_noise_level < 0.8 then return end + local pr = PseudoRandom(seed + 132) + local random_number = pr:next(1, per_chunk_probability) + local noise = mcl_structures_get_perlin_noise_level(minp) + if (random_number + noise) < (per_chunk_probability - 1) then return end local pos local count = -1 for i = 1, #pos_list do diff --git a/mods/MAPGEN/mcl_structures/noise_indicator.lua b/mods/MAPGEN/mcl_structures/noise_indicator.lua index f48e4d9b2..7cc130358 100644 --- a/mods/MAPGEN/mcl_structures/noise_indicator.lua +++ b/mods/MAPGEN/mcl_structures/noise_indicator.lua @@ -1,5 +1,5 @@ local step = 1 -local chunk_borders = true +local chunk_borders = false local levels = { [-9] = "black", @@ -26,13 +26,15 @@ local levels = { local math_min, math_max = math.min, math.max local math_floor, math_ceil = math.floor, math.ceil +local mcl_structures_get_perlin_noise_level = mcl_structures.get_perlin_noise_level + +local noise_offset_x_and_z = math_floor(mcl_mapgen.CS_NODES/2) + mcl_mapgen.register_mapgen(function(minp, maxp, seed, vm_context) - mcl_structures.perlin_noise = mcl_structures.perlin_noise or minetest.get_perlin(329, 3, 0.6, 100) - local perlin_noise = mcl_structures.perlin_noise local y0 = minp.y for x0 = minp.x, maxp.x, step do for z0 = minp.z, maxp.z, step do - local current_noise_level = perlin_noise:get_3d({x=x0, y=y0, z=z0}) + local current_noise_level = mcl_structures_get_perlin_noise_level({x = x0 - noise_offset_x_and_z, y = y0, z = z0 - noise_offset_x_and_z}) local amount if current_noise_level < 0 then amount = math_max(math_ceil(current_noise_level * 9), -9) diff --git a/mods/MAPGEN/mcl_structures/structures.lua b/mods/MAPGEN/mcl_structures/structures.lua index 5b7a65a7d..5bbc18774 100644 --- a/mods/MAPGEN/mcl_structures/structures.lua +++ b/mods/MAPGEN/mcl_structures/structures.lua @@ -6,5 +6,5 @@ if not mcl_mapgen.singlenode then dofile(modpath .. "/jungle_temple.lua") dofile(modpath .. "/stronghold.lua") - -- dofile(modpath .. "/noise_indicator.lua") + dofile(modpath .. "/noise_indicator.lua") end