2021-04-10 03:28:13 -06:00
|
|
|
-- If pos is located inside a cavern volume, returns the list of cavern definitions that
|
|
|
|
-- are responsible for that cavern volume. If not inside a cavern volume returns an empty list.
|
|
|
|
|
|
|
|
-- This is a somewhat expensive function, take care not to use it more than necessary
|
|
|
|
subterrane.is_in_cavern = function(pos)
|
|
|
|
local results = {}
|
2023-09-29 20:15:23 -06:00
|
|
|
|
2021-04-10 03:28:13 -06:00
|
|
|
for _, cave_layer_def in pairs(subterrane.registered_layers) do
|
|
|
|
local YMIN = cave_layer_def.y_min
|
|
|
|
local YMAX = cave_layer_def.y_max
|
|
|
|
local y = pos.y
|
|
|
|
if y <= YMAX and y >= YMIN then
|
|
|
|
local BLEND = math.min(cave_layer_def.boundary_blend_range, (YMAX-YMIN)/2)
|
|
|
|
local TCAVE = cave_layer_def.cave_threshold
|
|
|
|
local np_cave = cave_layer_def.perlin_cave
|
|
|
|
local np_wave = cave_layer_def.perlin_wave
|
|
|
|
local y_blend_min = YMIN + BLEND * 1.5
|
2023-09-29 20:15:23 -06:00
|
|
|
local y_blend_max = YMAX - BLEND * 1.5
|
2021-04-10 03:28:13 -06:00
|
|
|
local nval_cave = minetest.get_perlin(np_cave):get_3d(pos) --cave noise for structure
|
|
|
|
local nval_wave = minetest.get_perlin(np_wave):get_3d(pos) --wavy structure of cavern ceilings and floors
|
|
|
|
nval_cave = (nval_cave + nval_wave)/2
|
|
|
|
local cave_local_threshold
|
|
|
|
if y < y_blend_min then
|
|
|
|
cave_local_threshold = TCAVE + ((y_blend_min - y) / BLEND) ^ 2
|
|
|
|
elseif y > y_blend_max then
|
|
|
|
cave_local_threshold = TCAVE + ((y - y_blend_max) / BLEND) ^ 2
|
|
|
|
else
|
|
|
|
cave_local_threshold = TCAVE
|
|
|
|
end
|
|
|
|
if cave_layer_def.double_frequency and nval_cave < 0 then
|
|
|
|
nval_cave = -nval_cave
|
|
|
|
end
|
|
|
|
if nval_cave > cave_local_threshold then
|
|
|
|
table.insert(results, cave_layer_def)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2023-09-29 20:15:23 -06:00
|
|
|
|
2021-04-10 03:28:13 -06:00
|
|
|
return results
|
2022-07-23 20:44:52 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
-- returns the value of the cavern field at a particular location for a particular cavern definition.
|
|
|
|
subterrane.get_cavern_value = function(name, pos)
|
|
|
|
local cave_layer_def = subterrane.registered_layers[name]
|
2023-09-29 20:15:23 -06:00
|
|
|
|
2022-07-23 20:44:52 -06:00
|
|
|
local YMIN = cave_layer_def.y_min
|
|
|
|
local YMAX = cave_layer_def.y_max
|
|
|
|
local y = pos.y
|
|
|
|
if y > YMAX or y < YMIN then
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
|
|
|
|
local np_cave = cave_layer_def.perlin_cave
|
|
|
|
local np_wave = cave_layer_def.perlin_wave
|
|
|
|
local nval_cave = minetest.get_perlin(np_cave):get_3d(pos) --cave noise for structure
|
|
|
|
local nval_wave = minetest.get_perlin(np_wave):get_3d(pos) --wavy structure of cavern ceilings and floors
|
|
|
|
nval_cave = (nval_cave + nval_wave)/2
|
|
|
|
return nval_cave
|
2021-04-10 03:28:13 -06:00
|
|
|
end
|