Modpack refactor (#4)

Split this mod into a set of sub-mods in a modpack, and in the process did a whole bunch of renovations.

* updated Subterrane's API to allow for more patterned placement of things
* added "warrens"
* clean separation of flooded and non-flooded caverns
* rearranged biomes to make cavern layers more distinct
* added oil layer
* added underworld layer
This commit is contained in:
FaceDeer
2018-12-31 11:46:27 -07:00
committed by GitHub
parent 24c955dbd4
commit 882395ef75
355 changed files with 9514 additions and 5396 deletions

24
oil/LICENSE.txt Normal file
View File

@ -0,0 +1,24 @@
Sounds and textures are under various licenses, see the license.txt file in the /sounds and /textures directories for details.
License for Code
----------------
Copyright (C) 2018 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.

5
oil/depends.txt Normal file
View File

@ -0,0 +1,5 @@
default
dynamic_liquid?
bucket?
tnt?
doc?

182
oil/gas.lua Normal file
View File

@ -0,0 +1,182 @@
local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP.."/intllib.lua")
local gas_desc
local gas_usage
local seep_desc
local seep_usage
if minetest.get_modpath("doc") then
gas_desc = S("Gaseous hydrocarbons formed from the detritus of long dead plants and animals processed by heat and pressure deep within the earth.")
gas_usage = S("Gas is highly hazardous. Heavier than air, it pools in deep caverns and asphyxiates the unwary.")
if minetest.get_modpath("tnt") then
gas_usage = gas_usage .. " " .. S("When exposed to air and an ignition source it can produce a deadly explosion.")
end
seep_desc = S("Some coal deposits have cracks that seep a steady flow of mine gas.")
seep_usage = S("Mining out such a deposit seals the crack.")
end
minetest.register_node("oil:gas", {
description = S("Mine Gas"),
_doc_items_longdesc = gas_desc,
_doc_items_usagehelp = gas_usage,
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
drawtype = "glasslike",
drowning = 1,
post_effect_color = {a = 20, r = 20, g = 20, b = 250},
tiles = {"oil_gas.png^[opacity:28"},
use_texture_alpha = true,
groups = {not_in_creative_inventory=1},
paramtype = "light",
drop = {},
sunlight_propagates = true,
--on_blast = function() end, -- unaffected by explosions
})
minetest.register_node("oil:gas_seep", {
description = S("Gas Seep"),
_doc_items_longdesc = seep_desc,
_doc_items_usagehelp = seep_usage,
tiles = {"default_stone.png^default_mineral_coal.png^[combine:16x80:0,-16=crack_anylength.png"},
groups = {cracky = 3},
drop = 'default:coal_lump',
sounds = default.node_sound_stone_defaults(),
is_ground_content = true,
})
minetest.register_on_dignode(function(pos, oldnode, digger)
if minetest.get_item_group(oldnode.name, "digtron") > 0 then
-- skip digtron moved nodes
return;
end
local np = minetest.find_node_near(pos, 1,{"oil:gas"})
if np ~= nil then
minetest.set_node(pos, {name = "oil:gas"})
return
end
end)
local directions = {
{x=1, y=0, z=0},
{x=-1, y=0, z=0},
{x=0, y=0, z=1},
{x=0, y=0, z=-1},
}
local gas_node = {name="oil:gas"}
minetest.register_abm({
label = "oil:gas movement",
nodenames = {"oil:gas"},
neighbors = {"group:liquid", "air"},
interval = 1.0,
chance = 1,
catch_up = true,
action = function(pos, node)
local next_pos = {x=pos.x, y=pos.y+1, z=pos.z}
local next_node = minetest.get_node(next_pos)
if minetest.get_item_group(next_node.name, "liquid") > 0 then
minetest.swap_node(next_pos, gas_node)
minetest.swap_node(pos, next_node)
else
next_pos.y = pos.y-1
next_node = minetest.get_node(next_pos)
if next_node.name == "air" then
minetest.swap_node(next_pos, gas_node)
minetest.swap_node(pos, next_node)
else
local dir = directions[math.random(1,4)]
local next_pos = vector.add(pos, dir)
local next_node = minetest.get_node(next_pos)
if next_node.name == "air" or minetest.get_item_group(next_node.name, "liquid") > 0 then
if next_node.name == "air" or math.random() < 0.5 then -- gas never "climbs" above air.
minetest.swap_node(next_pos, gas_node)
minetest.swap_node(pos, next_node)
else
-- this can get gas to rise up out of the surface of liquid, preventing it from forming a permanent hole.
next_pos.y = next_pos.y + 1
next_node = minetest.get_node(next_pos)
if next_node.name == "air" then
minetest.swap_node(next_pos, gas_node)
minetest.swap_node(pos, next_node)
end
end
end
end
end
end,
})
minetest.register_abm({
label = "oil:gas snuffing torches",
nodenames = {"group:torch"},
neighbors = {"oil:gas"},
interval = 1.0,
chance = 1,
catch_up = true,
action = function(pos, node)
if not minetest.find_node_near(pos, 1, "air") then
local torch_node = minetest.get_node(pos)
local drops = minetest.get_node_drops(torch_node.name, "")
for _, dropped_item in pairs(drops) do
minetest.add_item(pos, dropped_item)
end
minetest.set_node(pos, {name="oil:gas"})
minetest.sound_play(
"default_cool_lava",
{pos = pos, max_hear_distance = 16, gain = 0.1}
)
end
end,
})
if minetest.get_modpath("tnt") then
minetest.register_abm({
label = "oil:gas ignition",
nodenames = {"group:torch", "group:igniter"},
neighbors = {"oil:gas"},
interval = 1.0,
chance = 1,
catch_up = true,
action = function(pos, node)
if minetest.find_node_near(pos, 1, "air") then
tnt.boom(pos, {radius=1, damage_radius=6})
end
end,
})
end
local orthogonal = {
{x=0,y=0,z=1},
{x=0,y=1,z=0},
{x=1,y=0,z=0},
{x=0,y=0,z=-1},
{x=0,y=-1,z=0},
{x=-1,y=0,z=0},
}
minetest.register_abm({
label = "oil:gas seep",
nodenames = {"oil:gas_seep"},
neighbors = {"air"},
interval = 1.0,
chance = 1,
catch_up = true,
action = function(pos, node)
local target_pos = vector.add(pos,orthogonal[math.random(1,6)])
if minetest.get_node(target_pos).name == "air" then
minetest.swap_node(target_pos, {name="oil:gas"})
if math.random() < 0.5 then
minetest.sound_play(
"oil_gas_seep_hiss",
{pos = pos, max_hear_distance = 8, gain = 0.05}
)
end
end
end,
})

205
oil/init.lua Normal file
View File

@ -0,0 +1,205 @@
local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP.."/intllib.lua")
local oil_desc
local oil_usage
if minetest.get_modpath("doc") then
oil_desc = S("Liquid hydrocarbons formed from the detritus of long dead plants and animals processed by heat and pressure deep within the earth.")
oil_usage = S("Buckets of oil can be used as fuel.")
end
dofile(MP.."/gas.lua")
local oil_sounds = {footstep = {name = "oil_oil_footstep", gain = 0.2}}
minetest.register_node("oil:oil_source", {
description = S("Oil"),
_doc_items_longdesc = oil_desc,
_doc_items_usagehelp = oil_usage,
drawtype = "liquid",
tiles = {
{
name = "oil_oil_source_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 2.0,
},
},
},
special_tiles = {
-- New-style water source material (mostly unused)
{
name = "oil_oil_source_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 2.0,
},
backface_culling = false,
},
},
alpha = 255,
paramtype = "light",
walkable = false,
pointable = false,
diggable = false,
sunlight_propagates = false,
buildable_to = true,
is_ground_content = false,
drop = "",
drowning = 1,
liquidtype = "source",
liquid_range = 3,
liquid_renewable = false,
liquid_alternative_flowing = "oil:oil_flowing",
liquid_alternative_source = "oil:oil_source",
liquid_viscosity = 1,
post_effect_color = {a = 250, r = 0, g = 0, b = 0},
groups = {liquid = 3},
sounds = oil_sounds,
})
minetest.register_node("oil:oil_flowing", {
description = S("Flowing Oil"),
_doc_items_longdesc = oil_desc,
_doc_items_usagehelp = oil_usage,
drawtype = "flowingliquid",
tiles = {"oil_oil.png"},
special_tiles = {
{
name = "oil_oil_flowing_animated.png",
backface_culling = false,
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 4.0,
},
},
{
name = "oil_oil_flowing_animated.png",
backface_culling = true,
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 4.0,
},
},
},
alpha = 255,
paramtype = "light",
paramtype2 = "flowingliquid",
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
is_ground_content = false,
sunlight_propagates = false,
drop = "",
drowning = 1,
liquidtype = "flowing",
liquid_range = 3,
liquid_renewable = false,
liquid_alternative_flowing = "oil:oil_flowing",
liquid_alternative_source = "oil:oil_source",
liquid_viscosity = 1,
post_effect_color = {a = 250, r = 0, g = 0, b = 0},
groups = {liquid = 3, not_in_creative_inventory = 1},
sounds = oil_sounds,
})
minetest.register_craft({
type = "fuel",
recipe = "oil:oil_source",
burntime = 370, -- same as coalblock
})
if minetest.get_modpath("dynamic_liquid") then
dynamic_liquid.liquid_abm("oil:oil_source", "oil:oil_flowing", 2)
-- not using default liquid_abm to prevent oil from churning around once it's on the surface of water - we want slicks to remain cohesive and static
minetest.register_abm({
label = "oil:oil floats",
nodenames = {"oil:oil_source"},
neighbors = {"default:water_source"},
interval = 1.0,
chance = 1,
catch_up = true,
action = function(pos, node)
local next_pos = {x=pos.x, y=pos.y+1, z=pos.z}
local next_node = minetest.get_node(next_pos)
local above_name = next_node.name
if above_name == "default:water_source" then
minetest.swap_node(next_pos, {name="oil:oil_source"})
minetest.swap_node(pos, next_node)
else
next_pos.y = pos.y
local displacement
if math.random() > 0.5 then displacement = 1 else displacement = -1 end
if math.random() > 0.5 then
next_pos.x = next_pos.x + displacement
else
next_pos.z = next_pos.z + displacement
end
next_node = minetest.get_node(next_pos)
if next_node.name == "default:water_source" then
if above_name ~= "air" then
-- we're not on the surface, so try any lateral movement
minetest.swap_node(next_pos, {name="oil:oil_source"})
minetest.swap_node(pos, next_node)
elseif math.random() < 0.1 then -- expensive and not commonly needed, so don't try this often
--Otherwise, count neighboring oil nodes and if we're increasing the number of neighboring oil nodes by moving then do so.
local oil_neighbors_here, here_count = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, {"oil:oil_source"})
local oil_neighbors_there, there_count = minetest.find_nodes_in_area({x=next_pos.x-1, y=next_pos.y, z=next_pos.z-1}, {x=next_pos.x+1, y=next_pos.y, z=next_pos.z+1}, {"oil:oil_source"})
if there_count["oil:oil_source"] >= here_count["oil:oil_source"] then
minetest.swap_node(next_pos, {name="oil:oil_source"})
minetest.swap_node(pos, next_node)
end
end
end
end
end,
})
-- If oil is wandering around on top of a layer of water that isn't full, drop it down
-- into the water layer. This helps drive the system toward a more static state with a flat-looking surface.
minetest.register_abm({
label = "oil:oil settles",
nodenames = {"oil:oil_source"},
neighbors = {"default:water_flowing"},
interval = 1.0,
chance = 1,
catch_up = true,
action = function(pos, node)
local next_pos = {x=pos.x, y=pos.y-1, z=pos.z}
local next_node = minetest.get_node(next_pos)
if next_node.name == "default:water_flowing" then
minetest.swap_node(next_pos, {name="oil:oil_source"})
minetest.swap_node(pos, next_node)
end
end,
})
end
if minetest.get_modpath("bucket") then
bucket.register_liquid(
"oil:oil_source",
"oil:oil_flowing",
"oil:oil_bucket",
"oil_bucket.png",
S("Oil Bucket")
)
minetest.register_craft({
type = "fuel",
recipe = "oil:oil_bucket",
burntime = 370, -- same as coalblock
replacements = {{"oil:oil_bucket", "bucket:bucket_empty"}},
})
end

45
oil/intllib.lua Normal file
View File

@ -0,0 +1,45 @@
-- Fallback functions for when `intllib` is not installed.
-- Code released under Unlicense <http://unlicense.org>.
-- Get the latest version of this file at:
-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua
local function format(str, ...)
local args = { ... }
local function repl(escape, open, num, close)
if escape == "" then
local replacement = tostring(args[tonumber(num)])
if open == "" then
replacement = replacement..close
end
return replacement
else
return "@"..open..num..close
end
end
return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl))
end
local gettext, ngettext
if minetest.get_modpath("intllib") then
if intllib.make_gettext_pair then
-- New method using gettext.
gettext, ngettext = intllib.make_gettext_pair()
else
-- Old method using text files.
gettext = intllib.Getter()
end
end
-- Fill in missing functions.
gettext = gettext or function(msgid, ...)
return format(msgid, ...)
end
ngettext = ngettext or function(msgid, msgid_plural, n, ...)
return format(n==1 and msgid or msgid_plural, ...)
end
return gettext, ngettext

73
oil/locale/template.pot Normal file
View File

@ -0,0 +1,73 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-12-23 00:28-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: oil\gas.lua:11
msgid ""
"Gaseous hydrocarbons formed from the detritus of long dead plants and "
"animals processed by heat and pressure deep within the earth."
msgstr ""
#: oil\gas.lua:12
msgid ""
"Gas is highly hazardous. Heavier than air, it pools in deep caverns and "
"asphyxiates the unwary."
msgstr ""
#: oil\gas.lua:14
msgid ""
"When exposed to air and an ignition source it can produce a deadly explosion."
msgstr ""
#: oil\gas.lua:17
msgid "Some coal deposits have cracks that seep a steady flow of mine gas."
msgstr ""
#: oil\gas.lua:18
msgid "Mining out such a deposit seals the crack."
msgstr ""
#: oil\gas.lua:22
msgid "Mine Gas"
msgstr ""
#: oil\gas.lua:42
msgid "Gas Seep"
msgstr ""
#: oil\init.lua:8
msgid ""
"Liquid hydrocarbons formed from the detritus of long dead plants and animals "
"processed by heat and pressure deep within the earth."
msgstr ""
#: oil\init.lua:9
msgid "Buckets of oil can be used as fuel."
msgstr ""
#: oil\init.lua:17
msgid "Oil"
msgstr ""
#: oil\init.lua:67
msgid "Flowing Oil"
msgstr ""
#: oil\init.lua:196
msgid "Oil Bucket"
msgstr ""

6
oil/locale/update.bat Normal file
View File

@ -0,0 +1,6 @@
@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
cd ..
set LIST=
for /r %%X in (*.lua) do set LIST=!LIST! %%X
..\..\intllib\tools\xgettext.bat %LIST%

1
oil/mod.conf Normal file
View File

@ -0,0 +1 @@
name = oil

9
oil/sounds/license.txt Normal file
View File

@ -0,0 +1,9 @@
oil footstep 1-4 extracted from https://freesound.org/people/VlatkoBlazek/sounds/318592/
Released under the CC BY 3.0 license by:
Vlatko Blažek
Varaždin, Croatia
e-mail: vlatkoblazek@gmail.com
http://www.freesound.org/people/VlatkoBlazek/
oil_gas_seep_hiss.1 is from https://freesound.org/people/wubitog/sounds/234782/ under the public domain (CC0)
oil_gas_seep_hiss.2 is from https://freesound.org/people/kgatto/sounds/240263/ by kgatto under the CC-BY-3.0 license

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

3
oil/textures/license.txt Normal file
View File

@ -0,0 +1,3 @@
All textures not specifically listed here are created by FaceDeer and released under both the MIT license and under the Creative Commons CC0 license.
oil_bucket and oil liquid textures modified from default mod's bucket and water textures

BIN
oil/textures/oil_bucket.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

BIN
oil/textures/oil_gas.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

BIN
oil/textures/oil_oil.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB