floatland_spawn/init.lua

85 lines
2.8 KiB
Lua

local n1 = {
offset = -0.6,
scale = 1.5,
spread = {x = 600, y = 600, z= 600},
seed = 114,
octaves = 5,
persistence = 0.6,
lacunarity = 2.0,
flags = "eased"
}
local n2 = {
offset = 48,
scale = 24,
spread = {x = 300, y = 300, z = 300},
seed = 907,
octaves = 4,
persistence = 0.7,
lacunarity = 2.0,
flags = "eased"
}
local n3 = {
offset = -0.6,
scale = 1,
spread = {x = 250, y = 350, z = 250},
seed = 5333,
octaves = 5,
persistence = 0.63,
lacunarity = 2.0,
flags = ""
}
local noise_b = minetest.get_mapgen_setting_noiseparams("mgv7_np_floatland_base") or n1
local noise_h = minetest.get_mapgen_setting_noiseparams("mgv7_np_float_base_height") or n2
local noise_m = minetest.get_mapgen_setting_noiseparams("mgv7_np_mountain") or n3
local floatland_y = minetest.get_mapgen_setting("mgv7_floatland_level") or 1280
local mount_height = minetest.get_mapgen_setting("mgv7_float_mount_height") or 128
local mount_dens = minetest.get_mapgen_setting("mgv7_float_mount_density") or 0.6
minetest.set_mapgen_setting("mg_name", "v7", true)
minetest.set_mapgen_setting("mgv7_spflags", "floatlands", true)
-- Based on these two funcs:
-- https://github.com/minetest/minetest/blob/28841961ba91b943b7478704181604fa3e24e81e/src/mapgen_v7.cpp#L415
-- https://github.com/minetest/minetest/blob/28841961ba91b943b7478704181604fa3e24e81e/src/mapgen_v7.cpp#L428
local function spawn_point()
local noise_base = minetest.get_perlin(noise_b)
local noise_height = minetest.get_perlin(noise_h)
local noise_mount = minetest.get_perlin(noise_m)
local base_max = floatland_y
local y = floatland_y + 3
for i = 1, 10000 do
local x = math.random(-2000, 2000)
local z = math.random(-2000, 2000)
local n_base = noise_base:get2d({x = x, y = z})
local n_mount = noise_mount:get3d({x = x, y = y, z = z})
local density_gradient = -math.pow((y - floatland_y) / mount_height, 0.75)
local floatn = n_mount + mount_dens + density_gradient >= 0
if n_base > 0 and floatn == false then -- If floatlands and not a mountain
local n_base_height = math.max(noise_height:get2d({x = x, y = z}), 1)
local amp = n_base * n_base_height
local ridge = n_base_height / 3
--if amp > ridge * 2 then -- Lakebed
-- base_max = floatland_y - (amp - ridge * 2) / 2
--else -- Normal terrain
if amp < ridge * 2 then
local diff = math.abs(amp - ridge) / ridge
local smooth_diff = diff * diff * (3 - 2 * diff)
base_max = floatland_y + ridge - smooth_diff * ridge
end
return {x = x, y = base_max + 2, z = z}
end
end
end
minetest.register_on_newplayer(function(player)
player:set_pos(spawn_point())
end)
minetest.register_on_respawnplayer(function(player)
player:set_pos(spawn_point())
return true
end)