From 289c353bb630f8631e8a003098934659ba6985f2 Mon Sep 17 00:00:00 2001 From: FaceDeer Date: Fri, 7 May 2021 22:59:30 -0600 Subject: [PATCH] Pit caves (#20) * A simple pit cave mod, based off of code from the volcano pipes in my magma_conduits mod * option to seal off ocean pits * reuse chasm's ignore list * documentation * rename findpits to prevent confusion with underworld glowing pits --- LICENSE.txt | 2 +- chasms/init.lua | 4 + df_caverns/screenshots/pit_cave.jpg | Bin 0 -> 46246 bytes guide.md | 6 + pit_caves/LICENSE.txt | 22 +++ pit_caves/README.md | 18 +++ pit_caves/init.lua | 221 ++++++++++++++++++++++++++++ pit_caves/locale/template.txt | 11 ++ pit_caves/mod.conf | 4 + pit_caves/settingtypes.txt | 6 + subterrane | 2 +- 11 files changed, 294 insertions(+), 2 deletions(-) create mode 100644 df_caverns/screenshots/pit_cave.jpg create mode 100644 pit_caves/LICENSE.txt create mode 100644 pit_caves/README.md create mode 100644 pit_caves/init.lua create mode 100644 pit_caves/locale/template.txt create mode 100644 pit_caves/mod.conf create mode 100644 pit_caves/settingtypes.txt diff --git a/LICENSE.txt b/LICENSE.txt index 11ce895..f0b5f69 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -5,7 +5,7 @@ Sounds and textures are under various licenses, see the license.txt file in the License for Code ---------------- -Copyright (C) 2018 FaceDeer +Copyright (C) 2021 FaceDeer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/chasms/init.lua b/chasms/init.lua index e0d6ec6..ef59a71 100644 --- a/chasms/init.lua +++ b/chasms/init.lua @@ -9,6 +9,10 @@ chasms.register_ignore = function(node_name) ignore[minetest.get_content_id(node_name)] = true end +chasms.ignore_content_id = function(content_id) + return ignore[content_id] +end + local maxy = tonumber(minetest.settings:get("chasms_maxy")) or -50 local miny = tonumber(minetest.settings:get("chasms_miny")) or -2500 local falloff = tonumber(minetest.settings:get("chasms_falloff")) or 100 diff --git a/df_caverns/screenshots/pit_cave.jpg b/df_caverns/screenshots/pit_cave.jpg new file mode 100644 index 0000000000000000000000000000000000000000..428f6f77687684e3ed034ac7b3dfba8be01f7c8d GIT binary patch literal 46246 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

vv1w> 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 literal 0 HcmV?d00001 diff --git a/guide.md b/guide.md index 4cb6df4..2ad4036 100644 --- a/guide.md +++ b/guide.md @@ -168,6 +168,12 @@ Not all vast open spaces underground are the result of aeons of erosion by water The great extent of chasms makes them hospitable to small flying creatures, and their narrowness makes the hospitable to creatures that feed on them - giant cave spider webs can be found strung across them here and there. A dubious salvation for anyone falling from above. +# Pit caves + +![Looking up from the bottom of a pit](./df_caverns/screenshots/pit_cave.jpg) + +A pit cave is a type of cave which contains one or more significant vertical shafts rather than being predominantly a conventional horizontal cave passage. Pit caves typically form in limestone as a result of long-term erosion by water. Given the vast scope of the flowstone formations found throughout the upper layers of the world's caverns, correspondingly gigantic pits can also be found. They sometimes breach the surface of the world, and at their greatest extent can have a drop over two kilometers deep. Bring plenty of rope when exploring such abysses. + # Sunless Sea ![Sunless river](./df_caverns/screenshots/sunless_river.jpg) diff --git a/pit_caves/LICENSE.txt b/pit_caves/LICENSE.txt new file mode 100644 index 0000000..1b07b15 --- /dev/null +++ b/pit_caves/LICENSE.txt @@ -0,0 +1,22 @@ +License for Code +---------------- + +Copyright (C) 2021 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/pit_caves/README.md b/pit_caves/README.md new file mode 100644 index 0000000..d604410 --- /dev/null +++ b/pit_caves/README.md @@ -0,0 +1,18 @@ +A pit cave, shaft cave or vertical cave—or often simply called a pit (in the US) or pot (in the UK); jama in South Slavic languages scientific and colloquial vocabulary (borrowed since early research in the Western Balkan Dinaric Alpine karst)—is a type of cave which contains one or more significant vertical shafts rather than being predominantly a conventional horizontal cave passage. Pit caves typically form in limestone as a result of long-term erosion by water. + +In the real world, the deepest known vertical drop in a cave is 603m in Vrtoglavica Cave in Slovenia. This mod adds pits of varying depth, with some under the default settings being up to 2500m deep. They are widely scattered and not all of them breach the surface, so they are a rare find, but with the right tools a pit cave can give access to a huge swath of underground terrain. + +## Settings and commands + +The following settings are available for configuring pit cave generation: + + pit_caves_min_bottom (Lower limit of bottoms of pits) int -2500 + pit_caves_max_bottom (Upper limit of bottoms of pits) int -500 + pit_caves_min_top (Lower limit of tops of pits) int -100 + pit_caves_max_top (Upper limit of tops of pits) int 100 + pit_caves_mapblock_spacing (Average number of map blocks between pits) int 16 + pit_caves_seal_ocean (Seal off pits that are under ocean water) bool true + +The pit_caves_seal_ocean setting isn't perfect, some map generation scenarios can result in a gap through which water can flow. But it's better than having drain holes everywhere. + +Users with the "server" privilege can use the ``/find_pit_caves`` command, which will list the locations of nearby pit caves. \ No newline at end of file diff --git a/pit_caves/init.lua b/pit_caves/init.lua new file mode 100644 index 0000000..3e308fb --- /dev/null +++ b/pit_caves/init.lua @@ -0,0 +1,221 @@ +local modpath = minetest.get_modpath(minetest.get_current_modname()) +local S = minetest.get_translator(minetest.get_current_modname()) + +local min_depth = tonumber(minetest.settings:get("pit_caves_min_bottom") or -2500) +local max_depth = tonumber(minetest.settings:get("pit_caves_max_bottom") or -500) +local min_top = tonumber(minetest.settings:get("pit_caves_min_top") or -100) +local max_top = tonumber(minetest.settings:get("pit_caves_max_top") or 100) + +local seal_ocean = minetest.settings:get_bool("pit_caves_seal_ocean", true) + +assert(min_depth < max_depth, "pit_caves_min_bottom is above pit_caves_max_bottom") +assert(min_top < max_top, "pit_caves_min_top is above pit_caves_max_top") +assert(max_depth < min_top, "pit_caves_max_bottom is above pit_caves_min_top") + +local pit_radius = 3 -- approximate minimum radius of pit - noise adds a lot to this + +local region_mapblocks = tonumber(minetest.settings:get("pit_caves_mapblock_spacing") or 16) +local mapgen_chunksize = tonumber(minetest.get_mapgen_setting("chunksize")) +local pit_region_size = region_mapblocks * mapgen_chunksize * 16 + +local c_air = minetest.get_content_id("air") +local c_gravel = c_air +local water_node +if minetest.get_modpath("default") then + c_gravel = minetest.get_content_id("default:gravel") + if seal_ocean then + water_node = "default:water_source" + end +end + +local ignore +if minetest.get_modpath("chasms") then + -- the chasms mod already sets up a method to allow chasms to avoid overwriting stalactites and whatnot, + -- hijack that. + ignore = chasms.ignore_content_id +end + +local water_level = tonumber(minetest.get_mapgen_setting("water_level")) +local mapgen_seed = tonumber(minetest.get_mapgen_setting("seed")) % 2^16 + +local scatter_2d = function(min_xz, gridscale, border_width) + local bordered_scale = gridscale - 2 * border_width + local point = {} + point.x = math.floor(math.random() * bordered_scale + min_xz.x + border_width) + point.y = 0 + point.z = math.floor(math.random() * bordered_scale + min_xz.z + border_width) + return point +end + +-- For some reason, map chunks generate with -32, -32, -32 as the "origin" minp. To make the large-scale grid align with map chunks it needs to be offset like this. +local get_corner = function(pos) + return {x = math.floor((pos.x+32) / pit_region_size) * pit_region_size - 32, z = math.floor((pos.z+32) / pit_region_size) * pit_region_size - 32} +end + +local get_pit = function(pos) + local corner_xz = get_corner(pos) + local next_seed = math.random(1, 1000000000) + math.randomseed(corner_xz.x + corner_xz.z * 2 ^ 8 + mapgen_seed + 1) + + local location = scatter_2d(corner_xz, pit_region_size, 0) + local depth = math.floor(math.random() * (max_depth - min_depth) + min_depth) + local top = math.floor(math.random() * (max_top - min_top) + min_top) + + math.randomseed(next_seed) + return {location = location, depth = depth, top = top} +end + +local perlin_params = { + offset = 0, + scale = 1, + spread = {x=30, y=30, z=30}, + seed = 45011, + octaves = 3, + persist = 0.67 +} +local data = {} + +minetest.register_on_generated(function(minp, maxp, seed) + if minp.y > max_top or maxp.y < min_depth then + return + end + + local pit = get_pit(minp) + + if pit == nil then + return -- no pit in this map region + end + + local location_x = pit.location.x + local location_z = pit.location.z + + -- early out if the pit is too far away to matter + -- The plus 20 is because the noise being added will generally be in the 0-20 range, see the "distance" calculation below + if location_x - 20 > maxp.x or + location_x + 20 < minp.x or + location_z - 20 > maxp.z or + location_z + 20 < minp.z + then + return + end + + local top = pit.top + local depth = pit.depth + + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax} + vm:get_data(data) + + if water_node and minp.y <= water_level and maxp.y >= water_level-240 then + local test_node = minetest.get_node(vector.new(location_x, water_level, location_z)) + if test_node.name == water_node then + top = math.min(-32, top) -- we're coming up under the ocean, abort the pit. + -- note that this does depend on the water-level map block having been generated already, + -- which could lead to a sharp cutoff if that's not the case - if the player's coming + -- up a pit from below into an unexplored ocean, for example. But it should still at least + -- seal the hole before the ocean pours down into it, so that's acceptable. And I expect + -- most of the time the surface world will be explored first before pits are discovered. + end + end + + local nvals_perlin = mapgen_helper.perlin3d("pit_caves:pit", emin, emax, perlin_params) + + for vi, x, y, z in area:iterp_xyz(emin, emax) do + if not (ignore and ignore(data[vi])) then + local distance_perturbation = (nvals_perlin[vi]+1)*10 + local distance = vector.distance({x=x, y=y, z=z}, {x=location_x, y=y, z=location_z}) - distance_perturbation + local taper_min = top - 40 + + if y < top and y > depth then + if y > top - 40 then + -- taper the top end + distance = distance - ((taper_min - y)/2) + end + + if distance < pit_radius then + if y < depth + 20 and data[vi] ~= c_air then + data[vi] = c_gravel + else + data[vi] = c_air + end + end + end + end + end + + --send data back to voxelmanip + vm:set_data(data) + --calc lighting + vm:set_lighting({day = 0, night = 0}) + vm:calc_lighting() + vm:update_liquids() + --write it to world + vm:write_to_map() +end) + +---------------------------------------------------------------------------------------------- +-- Debugging and sightseeing commands + +function round(val, decimal) + if (decimal) then + return math.floor( (val * 10^decimal) + 0.5) / (10^decimal) + else + return math.floor(val+0.5) + end +end + +local send_pit_state = function(pos, name) + local pit = get_pit(pos) + if pit == nil then + return false + end + local location = {x=math.floor(pit.location.x), y=pit.top, z=math.floor(pit.location.z)} + minetest.chat_send_player(name, S("Pit at @1, bottom @2", minetest.pos_to_string(location), pit.depth)) + return true +end + +local send_nearby_states = function(pos, name) + local retval = false + retval = send_pit_state({x=pos.x-pit_region_size, y=0, z=pos.z+pit_region_size}, name) or retval + retval = send_pit_state({x=pos.x, y=0, z=pos.z+pit_region_size}, name) or retval + retval = send_pit_state({x=pos.x+pit_region_size, y=0, z=pos.z+pit_region_size}, name) or retval + retval = send_pit_state({x=pos.x-pit_region_size, y=0, z=pos.z}, name) or retval + retval = send_pit_state(pos, name) or retval + retval = send_pit_state({x=pos.x+pit_region_size, y=0, z=pos.z}, name) or retval + retval = send_pit_state({x=pos.x-pit_region_size, y=0, z=pos.z-pit_region_size}, name) or retval + retval = send_pit_state({x=pos.x, y=0, z=pos.z-pit_region_size}, name) or retval + retval = send_pit_state({x=pos.x+pit_region_size, y=0, z=pos.z-pit_region_size}, name) or retval + return retval +end + +minetest.register_chatcommand("find_pit_caves", { + params = "pos", -- Short parameter description + description = S("find the pits near the player's map region, or in the map region containing pos if provided"), + func = function(name, param) + if minetest.check_player_privs(name, {server = true}) then + local pos = {} + pos.x, pos.y, pos.z = string.match(param, "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$") + pos.x = tonumber(pos.x) + pos.y = tonumber(pos.y) + pos.z = tonumber(pos.z) + if pos.x and pos.y and pos.z then + if not send_nearby_states(pos, name) then + minetest.chat_send_player(name, S("No pits near @1", minetest.pos_to_string(pos))) + end + return true + else + local playerobj = minetest.get_player_by_name(name) + pos = playerobj:get_pos() + if not send_nearby_states(pos, name) then + pos.x = math.floor(pos.x) + pos.y = math.floor(pos.y) + pos.z = math.floor(pos.z) + minetest.chat_send_player(name, S("No pits near @1", minetest.pos_to_string(pos))) + end + return true + end + else + return false, S("You need the server privilege to use this command.") + end + end, +}) diff --git a/pit_caves/locale/template.txt b/pit_caves/locale/template.txt new file mode 100644 index 0000000..654affe --- /dev/null +++ b/pit_caves/locale/template.txt @@ -0,0 +1,11 @@ +# textdomain: pit_caves + + +### init.lua ### + +No pits near @1= +Pit at @1, bottom @2= +You need the server privilege to use this command.= + +find the pits near the player's map region, or in the map region containing pos if provided= + diff --git a/pit_caves/mod.conf b/pit_caves/mod.conf new file mode 100644 index 0000000..cfe309a --- /dev/null +++ b/pit_caves/mod.conf @@ -0,0 +1,4 @@ +name = pit_caves +description = Inserts very tall "pit" caves underground +depends = +optional_depends = mapgen_helper, default, chasms \ No newline at end of file diff --git a/pit_caves/settingtypes.txt b/pit_caves/settingtypes.txt new file mode 100644 index 0000000..63801c1 --- /dev/null +++ b/pit_caves/settingtypes.txt @@ -0,0 +1,6 @@ +pit_caves_min_bottom (Lower limit of bottoms of pits) int -2500 +pit_caves_max_bottom (Upper limit of bottoms of pits) int -500 +pit_caves_min_top (Lower limit of tops of pits) int -100 +pit_caves_max_top (Upper limit of tops of pits) int 100 +pit_caves_mapblock_spacing (Average number of map blocks between pits) int 16 +pit_caves_seal_ocean (Seal off pits that are under ocean water) bool true \ No newline at end of file diff --git a/subterrane b/subterrane index 1f385fc..331d08b 160000 --- a/subterrane +++ b/subterrane @@ -1 +1 @@ -Subproject commit 1f385fc84a72494dd4e09ef40717c5dcef3398ba +Subproject commit 331d08b1567cf023695832e4ab593d33720b9290