forked from MineClone5/MineClone5
Use per-chunk probability and 1-octave Perlin noise to simplify spawning temples
This commit is contained in:
parent
30a0eb1d4a
commit
4e832ba323
|
@ -1,6 +1,9 @@
|
||||||
local modname = minetest.get_current_modname()
|
local modname = minetest.get_current_modname()
|
||||||
local modpath = minetest.get_modpath(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 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"
|
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)
|
on_finished_chunk = function(minp, maxp, seed, vm_context, pos_list)
|
||||||
local a = seed % 14
|
local pr = PseudoRandom(seed + 999)
|
||||||
local b = (math.floor(seed / 39) + 4) % 12
|
local random_number = pr:next(1, per_chunk_probability)
|
||||||
if a ~= b then return end
|
local noise = mcl_structures_get_perlin_noise_level(minp)
|
||||||
mcl_structures.perlin_noise = mcl_structures.perlin_noise or minetest.get_perlin(329, 3, 0.6, 100)
|
if (random_number + noise) < (per_chunk_probability - 1) then return end
|
||||||
local current_noise_level = mcl_structures.perlin_noise:get_3d(minp)
|
|
||||||
if current_noise_level > -0.3 then return end
|
|
||||||
local pos = pos_list[1]
|
local pos = pos_list[1]
|
||||||
if #pos_list > 1 then
|
if #pos_list > 1 then
|
||||||
local count = get_place_rank(pos)
|
local count = get_place_rank(pos)
|
||||||
|
|
|
@ -17,7 +17,25 @@ local use_process_mapgen_chunk = false
|
||||||
local on_finished_block_callbacks = {}
|
local on_finished_block_callbacks = {}
|
||||||
local on_finished_chunk_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.")
|
local spawnstruct_hint = S("Use /help spawnstruct to see a list of avaiable types.")
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
local modname = minetest.get_current_modname()
|
local modname = minetest.get_current_modname()
|
||||||
local modpath = minetest.get_modpath(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 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"
|
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)
|
on_finished_chunk = function(minp, maxp, seed, vm_context, pos_list)
|
||||||
local a = seed % 17
|
local pr = PseudoRandom(seed + 132)
|
||||||
local b = (math.ceil(seed / 123) - 4) % 17
|
local random_number = pr:next(1, per_chunk_probability)
|
||||||
if a ~= b then return end
|
local noise = mcl_structures_get_perlin_noise_level(minp)
|
||||||
mcl_structures.perlin_noise = mcl_structures.perlin_noise or minetest.get_perlin(329, 3, 0.6, 100)
|
if (random_number + noise) < (per_chunk_probability - 1) then return end
|
||||||
local current_noise_level = mcl_structures.perlin_noise:get_3d(maxp)
|
|
||||||
if current_noise_level < 0.8 then return end
|
|
||||||
local pos
|
local pos
|
||||||
local count = -1
|
local count = -1
|
||||||
for i = 1, #pos_list do
|
for i = 1, #pos_list do
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
local step = 1
|
local step = 1
|
||||||
local chunk_borders = true
|
local chunk_borders = false
|
||||||
|
|
||||||
local levels = {
|
local levels = {
|
||||||
[-9] = "black",
|
[-9] = "black",
|
||||||
|
@ -26,13 +26,15 @@ local levels = {
|
||||||
local math_min, math_max = math.min, math.max
|
local math_min, math_max = math.min, math.max
|
||||||
local math_floor, math_ceil = math.floor, math.ceil
|
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_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
|
local y0 = minp.y
|
||||||
for x0 = minp.x, maxp.x, step do
|
for x0 = minp.x, maxp.x, step do
|
||||||
for z0 = minp.z, maxp.z, 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
|
local amount
|
||||||
if current_noise_level < 0 then
|
if current_noise_level < 0 then
|
||||||
amount = math_max(math_ceil(current_noise_level * 9), -9)
|
amount = math_max(math_ceil(current_noise_level * 9), -9)
|
||||||
|
|
|
@ -6,5 +6,5 @@ if not mcl_mapgen.singlenode then
|
||||||
dofile(modpath .. "/jungle_temple.lua")
|
dofile(modpath .. "/jungle_temple.lua")
|
||||||
dofile(modpath .. "/stronghold.lua")
|
dofile(modpath .. "/stronghold.lua")
|
||||||
|
|
||||||
-- dofile(modpath .. "/noise_indicator.lua")
|
dofile(modpath .. "/noise_indicator.lua")
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue