many worldgen mods and gonna try technic now

This commit is contained in:
2026-09-13 03:30:48 -06:00
parent bac6ac94a3
commit 548749cb1a
4811 changed files with 163271 additions and 1 deletions
@@ -0,0 +1,26 @@
Dwarf Fortress is copyright 2018 by Tarn Adams. This mod uses no assets or other copyrighted materials from Dwarf Fortress.
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.
@@ -0,0 +1,149 @@
local S = minetest.get_translator(minetest.get_current_modname())
local lantern_nodebox = {
{-0.5, -0.5, -0.5, -0.3125, 0.5, -0.3125},
{-0.5, -0.5, 0.3125, -0.3125, 0.5, 0.5},
{0.3125, -0.5, 0.3125, 0.5, 0.5, 0.5},
{0.3125, -0.5, -0.5, 0.5, 0.5, -0.3125},
{-0.3125, 0.3125, -0.5, 0.3125, 0.5, -0.3125},
{-0.3125, 0.3125, 0.3125, 0.3125, 0.5, 0.5},
{0.3125, 0.3125, -0.3125, 0.5, 0.5, 0.3125},
{-0.5, 0.3125, -0.3125, -0.3125, 0.5, 0.3125},
{-0.5, -0.5, -0.3125, -0.3125, -0.3125, 0.3125},
{0.3125, -0.5, -0.3125, 0.5, -0.3125, 0.3125},
{-0.3125, -0.5, 0.3125, 0.3125, -0.3125, 0.5},
{-0.3125, -0.5, -0.5, 0.3125, -0.3125, -0.3125},
{-0.375, -0.375, -0.375, 0.375, 0.375, 0.375},
}
local mese_crystal_node = df_dependencies.node_name_mese_crystal
local brick_texture = "dfcaverns_slade_brick.png"
local lantern_texture = df_dependencies.texture_meselamp
local ancient_lantern_sound = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } })
local invulnerable = df_underworld_items.config.invulnerable_slade and not minetest.settings:get_bool("creative_mode")
local can_dig
if invulnerable then
can_dig = function(pos, player)
return minetest.check_player_privs(player, "server")
end
end
local slade_mcl_blast_resistance = 1200
local slade_mcl_hardness = 50
local slade_groups = {stone=1, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1, cracky = 3, creative_breakable=1, building_block=1, material_stone=1}
if invulnerable then
slade_groups.immortal = 1
slade_mcl_blast_resistance = 3600000
slade_mcl_hardness = -1
end
-- override this to allow achievements to be recorded without requiring a dependency
df_underworld_items.ancient_lantern_fixed = function(pos, player) end
local punch_fix = function(pos, node, puncher, pointed_thing)
local wielded = puncher:get_wielded_item()
if wielded:get_name() == mese_crystal_node then
minetest.set_node(pos, {name="df_underworld_items:ancient_lantern_slade"})
minetest.get_node_timer(pos):stop()
if not minetest.is_creative_enabled(puncher:get_player_name()) then
wielded:take_item()
puncher:set_wielded_item(wielded)
end
df_underworld_items.ancient_lantern_fixed(pos, puncher)
return
end
minetest.node_punch(pos, node, puncher, pointed_thing)
end
minetest.register_node("df_underworld_items:ancient_lantern_slade", {
description = S("Ancient Lantern"),
paramtype2 = "facedir",
place_param2 = 0,
tiles = {brick_texture .. "^(" .. lantern_texture .. "^[mask:dfcaverns_lantern_mask.png)"},
is_ground_content = false,
groups = slade_groups,
sounds = ancient_lantern_sound,
drawtype= "nodebox",
light_source = minetest.LIGHT_MAX,
node_box = {
type = "fixed",
fixed = lantern_nodebox,
},
can_dig = can_dig,
_mcl_blast_resistance = slade_mcl_blast_resistance,
_mcl_hardness = slade_mcl_hardness,
})
minetest.register_node("df_underworld_items:ancient_lantern_slade_worn", {
description = S("Ancient Lantern"),
paramtype2 = "facedir",
place_param2 = 0,
tiles = {brick_texture .. "^(" .. lantern_texture .. "^[multiply:#FF8888^[mask:dfcaverns_lantern_mask.png)"},
is_ground_content = false,
groups = slade_groups,
sounds = ancient_lantern_sound,
drawtype= "nodebox",
light_source = 6,
node_box = {
type = "fixed",
fixed = lantern_nodebox,
},
_mcl_blast_resistance = slade_mcl_blast_resistance,
_mcl_hardness = slade_mcl_hardness,
on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(100, 200))
end,
on_timer = function(pos, elapsed)
minetest.swap_node(pos, {name="df_underworld_items:ancient_lantern_slade_burnt_out"})
if math.random() < 0.1 then
minetest.get_node_timer(pos):start(math.random(30, 60))
else
minetest.get_node_timer(pos):start(0.25)
end
end,
on_punch = punch_fix,
can_dig = can_dig,
})
minetest.register_node("df_underworld_items:ancient_lantern_slade_burnt_out", {
description = S("Ancient Lantern"),
paramtype2 = "facedir",
place_param2 = 0,
tiles = {brick_texture .. "^(" .. lantern_texture .. "^[multiply:#884444^[mask:dfcaverns_lantern_mask.png)"},
is_ground_content = false,
groups = slade_groups,
sounds = ancient_lantern_sound,
drawtype= "nodebox",
light_source = 0,
node_box = {
type = "fixed",
fixed = lantern_nodebox,
},
drops = "df_underworld_items:ancient_lantern_slade_worn",
_mcl_blast_resistance = slade_mcl_blast_resistance,
_mcl_hardness = slade_mcl_hardness,
on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(100, 200))
end,
on_timer = function(pos, elapsed)
minetest.swap_node(pos, {name="df_underworld_items:ancient_lantern_slade_worn"})
if math.random() < 0.1 then
minetest.get_node_timer(pos):start(math.random(300, 600))
else
minetest.get_node_timer(pos):start(0.25)
end
end,
on_punch = punch_fix,
can_dig = can_dig,
})
--minetest.register_craft({
-- output = "df_underworld_items:ancient_lantern_slade",
-- type = "shapeless",
-- recipe = {
-- "group:df_underworld_items_ancient_lantern",
-- mese_crystal_node,
-- }
--})
@@ -0,0 +1,29 @@
local CONFIG_FILE_PREFIX = "dfcaverns_"
df_underworld_items.config = {}
local print_settingtypes = false
local function setting(stype, name, default, description)
local value
if stype == "bool" then
value = minetest.settings:get_bool(CONFIG_FILE_PREFIX..name, default)
elseif stype == "string" then
value = minetest.settings:get(CONFIG_FILE_PREFIX..name)
elseif stype == "int" or stype == "float" then
value = tonumber(minetest.setting:get(CONFIG_FILE_PREFIX..name))
end
if value == nil then
value = default
end
df_underworld_items.config[name] = value
if print_settingtypes then
minetest.debug(CONFIG_FILE_PREFIX..name.." ("..description..") "..stype.." "..tostring(default))
end
end
setting("bool", "invulnerable_slade", true, "Slade is invulnerable to players")
setting("bool", "destructive_pit_plasma", true, "Pit plasma destroys adjacent nodes")
setting("bool", "underworld_hunter_statues", true, "Enable hunter statues in the underworld")
setting("bool", "enable_slade_drill", true, "Enable slade drills")
@@ -0,0 +1,79 @@
local S = minetest.get_translator(minetest.get_current_modname())
minetest.register_node("df_underworld_items:glow_amethyst", {
description = S("Glowing Amethyst Block"),
_doc_items_longdesc = df_underworld_items.doc.glow_amethyst_desc,
_doc_items_usagehelp = df_underworld_items.doc.glow_amethyst_usage,
tiles = {"dfcaverns_glow_amethyst.png"},
is_ground_content = false,
groups = {cracky=3, pit_plasma_resistant=1, pickaxey = 4, building_block = 1,}, -- deliberately not in material_stone group to keep pit plasma ABM efficient
sounds = df_dependencies.sound_glass(),
light_source = 6,
paramtype = "light",
use_texture_alpha = "blend",
drawtype = "glasslike",
sunlight_propagates = true,
_mcl_blast_resistance = 6,
_mcl_hardness = 2,
})
if minetest.get_modpath("radiant_damage") and radiant_damage.override_radiant_damage and radiant_damage.config.enable_mese_damage then
radiant_damage.override_radiant_damage("mese", {emitted_by={["df_underworld_items:glow_amethyst"] = radiant_damage.config.mese_damage*0.25}})
end
local c_amethyst = minetest.get_content_id("df_underworld_items:glow_amethyst")
local safe_write = function(data, area, vi, c_node)
if area:containsi(vi) then data[vi] = c_node end
end
-- x_slant and z_slant can be 1, 0 or -1
-- rotated is true or false
-- length is 1 or more
df_underworld_items.underworld_shard = function(data, area, vi, x_slant, z_slant, rotated, length)
if x_slant == nil then x_slant = math.random(-1,1) end
if z_slant == nil then z_slant = math.random(-1,1) end
if rotated == nil then rotated = math.random() > 0.5 end
if length == nil then length = math.random(4, 12) end
length = math.ceil(length/2) * 2 -- make it an even multiple of 2
local xstride, ystride, zstride
ystride = area.ystride
if rotated then
xstride = area.zstride
zstride = 1
else
xstride = 1
zstride = area.zstride
end
-- bottom end
safe_write(data, area, vi, c_amethyst)
safe_write(data, area, vi+xstride, c_amethyst)
for i = 1, length do
vi = vi + ystride
safe_write(data, area, vi-xstride, c_amethyst)
safe_write(data, area, vi+zstride, c_amethyst)
safe_write(data, area, vi, c_amethyst)
safe_write(data, area, vi-zstride, c_amethyst)
safe_write(data, area, vi+zstride+xstride, c_amethyst)
safe_write(data, area, vi+xstride, c_amethyst)
safe_write(data, area, vi-zstride+xstride, c_amethyst)
safe_write(data, area, vi+2*xstride, c_amethyst)
if i % 2 == 0 and i ~= length then
vi = vi + xstride * x_slant + zstride * z_slant
end
end
vi = vi + ystride
safe_write(data, area, vi, c_amethyst)
safe_write(data, area, vi+xstride, c_amethyst)
end
@@ -0,0 +1,27 @@
df_underworld_items.doc = {}
if not minetest.get_modpath("doc") then
return
end
local S = minetest.get_translator(minetest.get_current_modname())
df_underworld_items.doc.glowstone_desc = S("Bright glowing stones of unknown origin found lodged in the crevices of the underworld's ceiling.")
df_underworld_items.doc.glowstone_usage = S("These stones are highly volatile and should not be disturbed.")
df_underworld_items.doc.slade_desc = S("The very foundation of the world, Slade is a mysterious ultra-dense substance.")
df_underworld_items.doc.slade_usage = S("Slade is extremely hard to work with so it has little use.")
if df_underworld_items.config.invulnerable_slade then
df_underworld_items.doc.slade_usage = df_underworld_items.doc.slade_usage .. " " .. S("In fact, Slade is impervious to conventional mining entirely.")
end
df_underworld_items.doc.slade_seal_desc = S("This block of Slade, carved by an unknown hand, is engraved with mysterious symbols. Most of the engraving's meaning is lost to the mists of time but one frament in the oldest known language can be translated: \"This place is not a place of honor.\"")
df_underworld_items.doc.glow_amethyst_desc = S("Glowing purple crystals that grow through holes in the foundation of the world.")
df_underworld_items.doc.glow_amethyst_usage = S("These crystals have no known use.")
df_underworld_items.doc.pit_plasma_desc = S("The liquid found in the deepest pits in the underworld is highly dangerous and damaging.")
df_underworld_items.doc.pit_plasma_usage = S("The only use for this material is that it destroys whatever is thrown into it. It cannot otherwise be manipulated.")
df_underworld_items.doc.slade_drill_desc = S("This shard of a spent slade breacher doesn't appear to have been intended as a portable tool, but it can be used as one.")
df_underworld_items.doc.slade_drill_usage = S("Use this on a target to unleash the energies used to dig through the foundations of the world.")
@@ -0,0 +1,38 @@
local S = minetest.get_translator(minetest.get_current_modname())
local glowstone_def = {
_doc_items_longdesc = df_underworld_items.doc.glowstone_desc,
_doc_items_usagehelp = df_underworld_items.doc.glowstone_usage,
light_source = minetest.LIGHT_MAX,
description = S("Lightseam"),
tiles = {
{
name = "dfcaverns_glowstone_anim.png",
backface_culling = true,
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 8,
},
},
},
is_ground_content = false,
groups = {cracky=3, pickaxey = 1, building_block = 1, material_stone =1},
sounds = df_dependencies.sound_glass(),
paramtype = "light",
drawtype = "glasslike",
drop = "",
sunlight_propagates = true,
_mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5,
}
local tnt_boom = df_dependencies.tnt_boom
if tnt_boom then
glowstone_def.on_dig = function(pos, node, digger)
if minetest.node_dig(pos, node, digger) then
tnt_boom(pos, {radius=3})
end
end
end
minetest.register_node("df_underworld_items:glowstone", glowstone_def)
@@ -0,0 +1,181 @@
local S = minetest.get_translator(minetest.get_current_modname())
local lava_source = df_dependencies.node_name_lava_source
minetest.register_node("df_underworld_items:pit_plasma", {
description = S("Glowing Pit Plasma"),
_doc_items_longdesc = df_underworld_items.doc.pit_plasma_desc,
_doc_items_usagehelp = df_underworld_items.doc.pit_plasma_usage,
tiles = {
{
name = "dfcaverns_pit_plasma.png",
backface_culling = true,
animation = {
type = "vertical_frames",
aspect_w = 32,
aspect_h = 32,
length = 0.5,
},
},
},
groups={pit_plasma=1, pit_plasma_resistant=1,destroys_items=1, set_on_fire=15, fire_damage=1, liquid=1},
walkable = false,
pointable = false,
diggable = false,
sunlight_propagates = false,
buildable_to = true,
drop = "",
drowning = 1,
liquid_viscosity = 7,
damage_per_second = 4 * 2,
post_effect_color = {a = 200, r = 245, g = 211, b = 251},
drawtype="liquid",
liquidtype="source",
liquid_alternative_flowing = "df_underworld_items:pit_plasma_flowing",
liquid_alternative_source = "df_underworld_items:pit_plasma",
liquid_renewable = false,
is_ground_content = false,
light_source = minetest.LIGHT_MAX,
paramtype = "light",
_mcl_blast_resistance = 3600000,
_mcl_hardness = -1,
})
minetest.register_node("df_underworld_items:pit_plasma_flowing", {
description = S("Glowing Pit Plasma"),
_doc_items_longdesc = df_underworld_items.doc.pit_plasma_desc,
_doc_items_usagehelp = df_underworld_items.doc.pit_plasma_usage,
tiles = {"dfcaverns_pit_plasma_static.png"},
special_tiles = {
{
name = "dfcaverns_pit_plasma.png",
backface_culling = true,
animation = {
type = "vertical_frames",
aspect_w = 32,
aspect_h = 32,
length = 0.5,
},
},
{
name = "dfcaverns_pit_plasma.png",
backface_culling = true,
animation = {
type = "vertical_frames",
aspect_w = 32,
aspect_h = 32,
length = 0.5,
},
},
},
groups={pit_plasma=1, pit_plasma_resistant=1, not_in_creative_inventory=1,destroys_items=1, set_on_fire=15, fire_damage=1, liquid=1},
walkable = false,
pointable = false,
diggable = false,
sunlight_propagates = false,
buildable_to = true,
drop = "",
drowning = 1,
liquid_viscosity = 7,
damage_per_second = 4 * 2,
post_effect_color = {a = 200, r = 245, g = 211, b = 251},
liquidtype = "flowing",
drawtype = "flowingliquid",
paramtype2 = "flowingliquid",
liquid_alternative_flowing = "df_underworld_items:pit_plasma_flowing",
liquid_alternative_source = "df_underworld_items:pit_plasma",
liquid_renewable = false,
is_ground_content = false,
light_source = minetest.LIGHT_MAX,
paramtype = "light",
_mcl_blast_resistance = 3600000,
_mcl_hardness = -1,
})
if minetest.get_modpath("radiant_damage") and radiant_damage.override_radiant_damage then
if radiant_damage.config.enable_mese_damage then
radiant_damage.override_radiant_damage("mese", {emitted_by={["group:pit_plasma"] = radiant_damage.config.mese_damage*2}})
end
if radiant_damage.config.enable_heat_damage then
radiant_damage.override_radiant_damage("heat", {emitted_by={["group:pit_plasma"] = radiant_damage.config.lava_damage}})
end
end
local sparkle = function(sparkle_pos)
minetest.add_particlespawner({
amount = 10,
time = 2,
minpos = {x=sparkle_pos.x-5, y=sparkle_pos.y-0.5, z=sparkle_pos.z-5},
maxpos = {x=sparkle_pos.x+5, y=sparkle_pos.y+0.5, z=sparkle_pos.z+5},
minvel = {x=-0.1, y=2, z=-0.1},
maxvel = {x=0.1, y=2, z=0.1},
minacc = {x=0, y=2, z=0},
maxacc = {x=0, y=2, z=0},
minexptime = 5,
maxexptime = 10,
minsize = 1,
maxsize = 1,
collisiondetection = true,
collision_removal = true,
vertical = false,
glow = minetest.LIGHT_MAX,
texture = "dfcaverns_glowpit_particle.png",
})
minetest.sound_play({name="dfcaverns_arcing"}, {
pos = sparkle_pos,
gain = 1,
max_hear_distance = 32,
})
end
if df_underworld_items.config.destructive_pit_plasma then
minetest.register_abm({
label = "glowing pit matter degradation",
nodenames = {"group:pit_plasma"},
neighbors = df_dependencies.abm_pit_plasma_neighbors,
interval = 2,
chance = 30,
catch_up = false,
action = function(pos)
local sparkle_pos
for x = pos.x-1, pos.x+1 do
for y = pos.y-1, pos.y+1 do
for z = pos.z-1, pos.z+1 do
local test_pos = {x=x, y=y, z=z}
local node_name = minetest.get_node(test_pos).name
if minetest.get_item_group(node_name, "pit_plasma_resistant") == 0 then
sparkle_pos = test_pos
if minetest.get_item_group(node_name, "stone") > 0 then
if math.random() < 0.66 then
minetest.set_node(test_pos, {name="df_underworld_items:glow_amethyst"})
else
minetest.set_node(test_pos, {name=lava_source})
end
else
minetest.set_node(test_pos, {name="air"})
end
end
end
end
end
if sparkle_pos then
sparkle(sparkle_pos)
end
end,
})
end
minetest.register_abm({
label = "glowing pit sparkle",
nodenames = {"group:pit_plasma"},
neighbors = {"air"},
interval = 2,
chance = 30,
catch_up = false,
action = function(pos)
local air_pos = minetest.find_node_near(pos, 1, "air")
if air_pos then
sparkle(air_pos)
end
end,
})
@@ -0,0 +1,29 @@
if minetest.get_modpath("hunter_statue") and df_underworld_items.config.underworld_hunter_statues then
local S = minetest.get_translator(minetest.get_current_modname())
hunter_statue.register_hunter_statue("df_underworld_items:hunter_statue", {
description = S("Guardian Statue"),
chance = 2,
tiles = {
{ name = "dfcaverns_slade.png", backface_culling = true },
{ name = "dfcaverns_slade.png^(dfcaverns_statue_eyes.png^[opacity:128)", backface_culling = true },
{ name = "dfcaverns_slade.png^(dfcaverns_statue_fang_overlay.png^[opacity:128)", backface_culling = true },
},
tnt_vulnerable = true,
tnt_debris = "df_underworld_items:slade_sand",
groups = {hunter_statue = 1, falling_node = 1, immortal = 1},
hunters_allowed_here = function(pos)
return not minetest.find_node_near(pos, 6, "df_underworld_items:ancient_lantern_slade", true)
end,
other_overrides = {
can_dig = function(pos, player)
if player then
return minetest.check_player_privs(player, "server")
end
return false
end,
}
})
end
@@ -0,0 +1,20 @@
df_underworld_items = {}
local modname = minetest.get_current_modname()
local modpath = minetest.get_modpath(modname)
dofile(modpath.."/config.lua")
dofile(modpath.."/doc.lua")
dofile(modpath.."/crystals_amethyst.lua")
dofile(modpath.."/glow_stone.lua")
dofile(modpath.."/slade.lua")
dofile(modpath.."/hunter_statue.lua")
dofile(modpath.."/glowing_pit_plasma.lua")
dofile(modpath.."/puzzle_seal.lua")
dofile(modpath.."/puzzle_chest.lua")
dofile(modpath.."/ancient_lanterns.lua")
if df_underworld_items.config.enable_slade_drill then
dofile(modpath.."/slade_drill.lua")
end
@@ -0,0 +1,103 @@
# textdomain: df_underworld_items
### ancient_lanterns.lua ###
Ancient Lantern=
### crystals_amethyst.lua ###
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Glowing Amethyst Block=Glühender Amethystblock
### doc.lua ###
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Bright glowing stones of unknown origin found lodged in the crevices of the underworld's ceiling.=Hell leuchtende Steine ​​unbekannter Herkunft wurden in den Spalten der Decke der Unterwelt gefunden.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Glowing purple crystals that grow through holes in the foundation of the world.=Glühende lila Kristalle, die durch Löcher im Fundament der Welt wachsen.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
In fact, Slade is impervious to conventional mining entirely.=Tatsächlich ist Slade für den konventionellen Bergbau völlig undurchlässig.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Slade is extremely hard to work with so it has little use.=Slade ist extrem schwer zu bearbeiten, daher hat es wenig Sinn.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
The liquid found in the deepest pits in the underworld is highly dangerous and damaging.=Die Flüssigkeit in den tiefsten Gruben der Unterwelt ist äußerst gefährlich und schädlich.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
The only use for this material is that it destroys whatever is thrown into it. It cannot otherwise be manipulated.=Die einzige Verwendung für dieses Material ist, dass es alles zerstört, was hineingeworfen wird. Es kann nicht anders manipuliert werden.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
The very foundation of the world, Slade is a mysterious ultra-dense substance.=Slade ist das Fundament der Welt und eine mysteriöse, ultradichte Substanz.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
These crystals have no known use.=Diese Kristalle haben keine bekannte Verwendung.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
These stones are highly volatile and should not be disturbed.=Diese Steine ​​sind sehr flüchtig und sollten nicht gestört werden.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
This block of Slade, carved by an unknown hand, is engraved with mysterious symbols. Most of the engraving's meaning is lost to the mists of time but one frament in the oldest known language can be translated: "This place is not a place of honor."=Dieser von einer unbekannten Hand geschnitzte Slade-Block ist mit mysteriösen Symbolen versehen. Der größte Teil der Bedeutung der Gravur geht den Nebeln der Zeit verloren, aber ein Frament in der ältesten bekannten Sprache kann übersetzt werden: "Dieser Ort ist kein Ehrenplatz."
This shard of a spent slade breacher doesn't appear to have been intended as a portable tool, but it can be used as one.=
Use this on a target to unleash the energies used to dig through the foundations of the world.=
### glow_stone.lua ###
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Lightseam=Lichtnaht
### glowing_pit_plasma.lua ###
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Glowing Pit Plasma=Glühendes Grubenplasma
### hunter_statue.lua ###
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Guardian Statue=Wächterstatue
### puzzle_chest.lua ###
Puzzle Chest=
### puzzle_seal.lua ###
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Active Slade Breacher=Aktiver Slade Breacher
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Breach in the Slade=Brich den Slade ein
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Inscribed Slade Block=Beschrifteter Slade-Block
Slade Capstone=
Slade Puzzle Seal=
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Turn=Wende
### slade.lua ###
Slade=
Slade Block=
Slade Brick=
Slade Sand=
Slade Seal=
Slade Wall=
### slade_drill.lua ###
Slade Drill=
##### not used anymore #####
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Slade Block Slab=Slade Block Platte
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Slade Block Stair=Slade Block Treppe
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Slade Slab=Slade-Platte
@@ -0,0 +1,91 @@
# textdomain: df_underworld_items
### ancient_lanterns.lua ###
Ancient Lantern=
### crystals_amethyst.lua ###
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Glowing Amethyst Block=Blocco di ametista incandescente
### doc.lua ###
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Bright glowing stones of unknown origin found lodged in the crevices of the underworld's ceiling.=Pietre luminose e luminose di origine sconosciuta trovate alloggiate nelle fessure del soffitto del mondo sotterraneo.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Glowing purple crystals that grow through holes in the foundation of the world.=Cristalli viola luminosi che crescono attraverso i buchi nelle fondamenta del mondo.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
In fact, Slade is impervious to conventional mining entirely.=In effetti, Slade è completamente impermeabile al mining convenzionale.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Slade is extremely hard to work with so it has little use.=Slade è estremamente difficile da lavorare, quindi è poco utile.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
The liquid found in the deepest pits in the underworld is highly dangerous and damaging.=Il liquido trovato nelle fosse più profonde degli inferi è altamente pericoloso e dannoso.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
The only use for this material is that it destroys whatever is thrown into it. It cannot otherwise be manipulated.=L'unico uso di questo materiale è che distrugge tutto ciò che viene gettato al suo interno. Non può essere altrimenti manipolato.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
The very foundation of the world, Slade is a mysterious ultra-dense substance.=Il fondamento stesso del mondo, Slade è una misteriosa sostanza ultra-densa.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
These crystals have no known use.=Questi cristalli non hanno alcun uso noto.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
These stones are highly volatile and should not be disturbed.=Queste pietre sono altamente volatili e non dovrebbero essere disturbate.
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
This block of Slade, carved by an unknown hand, is engraved with mysterious symbols. Most of the engraving's meaning is lost to the mists of time but one frament in the oldest known language can be translated: "This place is not a place of honor."=Questo blocco di Slade, scolpito da una mano sconosciuta, è inciso con simboli misteriosi. La maggior parte del significato dell'incisione si perde nella notte dei tempi, ma un frammento nella più antica lingua conosciuta può essere tradotto: "Questo posto non è un posto d'onore".
This shard of a spent slade breacher doesn't appear to have been intended as a portable tool, but it can be used as one.=
Use this on a target to unleash the energies used to dig through the foundations of the world.=
### glow_stone.lua ###
Lightseam=
### glowing_pit_plasma.lua ###
Glowing Pit Plasma=
### hunter_statue.lua ###
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Guardian Statue=Statua del guardiano
### puzzle_chest.lua ###
Puzzle Chest=
### puzzle_seal.lua ###
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Active Slade Breacher=Attivo Slade Breacher
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Breach in the Slade=Violazione nello Slade
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Inscribed Slade Block=Inscritto Slade Block
Slade Capstone=
Slade Puzzle Seal=
Turn=
### slade.lua ###
Slade=
Slade Block=
Slade Brick=
Slade Sand=
#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE
Slade Seal=Sigillo Slade
Slade Wall=
### slade_drill.lua ###
Slade Drill=
@@ -0,0 +1,75 @@
# textdomain: df_underworld_items
### ancient_lanterns.lua ###
Ancient Lantern=
### crystals_amethyst.lua ###
Glowing Amethyst Block=
### doc.lua ###
Bright glowing stones of unknown origin found lodged in the crevices of the underworld's ceiling.=
Glowing purple crystals that grow through holes in the foundation of the world.=
In fact, Slade is impervious to conventional mining entirely.=
Slade is extremely hard to work with so it has little use.=
The liquid found in the deepest pits in the underworld is highly dangerous and damaging.=
The only use for this material is that it destroys whatever is thrown into it. It cannot otherwise be manipulated.=
The very foundation of the world, Slade is a mysterious ultra-dense substance.=
These crystals have no known use.=
These stones are highly volatile and should not be disturbed.=
This block of Slade, carved by an unknown hand, is engraved with mysterious symbols. Most of the engraving's meaning is lost to the mists of time but one frament in the oldest known language can be translated: "This place is not a place of honor."=
This shard of a spent slade breacher doesn't appear to have been intended as a portable tool, but it can be used as one.=
Use this on a target to unleash the energies used to dig through the foundations of the world.=
### glow_stone.lua ###
Lightseam=
### glowing_pit_plasma.lua ###
Glowing Pit Plasma=
### hunter_statue.lua ###
Guardian Statue=
### puzzle_chest.lua ###
Puzzle Chest=
### puzzle_seal.lua ###
Active Slade Breacher=
Breach in the Slade=
Inscribed Slade Block=
Slade Capstone=
Slade Puzzle Seal=
Turn=
### slade.lua ###
Slade=
Slade Block=
Slade Brick=
Slade Sand=
Slade Seal=
Slade Wall=
### slade_drill.lua ###
Slade Drill=
@@ -0,0 +1,4 @@
name = df_underworld_items
description = Various node types used by the dfcaverns mapgen mod for its underworld layer.
depends = df_dependencies
optional_depends = doc, radiant_damage, mesecons_mvps, hunter_statue
@@ -0,0 +1,142 @@
dfcaverns_open_chest.obj is copied from minetest_game's default mod, whose media license doesn't specify who in particular created it. The media license for the default mod is as follows:
Licenses of media (textures, models and sounds)
-----------------------------------------------
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
Copyright (C) 2010-2018:
celeron55, Perttu Ahola <celeron55@gmail.com>
Cisoun
G4JC
VanessaE
RealBadAngel
Calinou
MirceaKitsune
Jordach
PilzAdam
jojoa1997
InfinityProject
Splizard
Zeg9
paramat
BlockMen
sofar
Neuromancer
Gambit
asl97
KevDoy
Mito551
GreenXenith
kaeza
kilbith
tobyplowy
CloudyProton
TumeniNodes
Mossmanikin
random-geek
Extex101
An0n3m0us
You are free to:
Share — copy and redistribute the material in any medium or format.
Adapt — remix, transform, and build upon the material for any purpose, even commercially.
The licensor cannot revoke these freedoms as long as you follow the license terms.
Under the following terms:
Attribution — You must give appropriate credit, provide a link to the license, and
indicate if changes were made. You may do so in any reasonable manner, but not in any way
that suggests the licensor endorses you or your use.
ShareAlike — If you remix, transform, or build upon the material, you must distribute
your contributions under the same license as the original.
No additional restrictions — You may not apply legal terms or technological measures that
legally restrict others from doing anything the license permits.
Notices:
You do not have to comply with the license for elements of the material in the public
domain or where your use is permitted by an applicable exception or limitation.
No warranties are given. The license may not give you all of the permissions necessary
for your intended use. For example, other rights such as publicity, privacy, or moral
rights may limit how you use the material.
For more details:
http://creativecommons.org/licenses/by-sa/3.0/
-----------------------
Attribution 3.0 Unported (CC BY 3.0)
Copyright (C) 2009 cmusounddesign
Copyright (C) 2010 Tomlija
Copyright (C) 2010 lsprice
Copyright (C) 2014 sonictechtonic
Copyright (C) 2015 yadronoff
Copyright (C) 2007 HerbertBoland
Copyright (C) 2006 AGFX
You are free to:
Share — copy and redistribute the material in any medium or format.
Adapt — remix, transform, and build upon the material for any purpose, even commercially.
The licensor cannot revoke these freedoms as long as you follow the license terms.
Under the following terms:
Attribution — You must give appropriate credit, provide a link to the license, and
indicate if changes were made. You may do so in any reasonable manner, but not in any way
that suggests the licensor endorses you or your use.
No additional restrictions — You may not apply legal terms or technological measures that
legally restrict others from doing anything the license permits.
Notices:
You do not have to comply with the license for elements of the material in the public
domain or where your use is permitted by an applicable exception or limitation.
No warranties are given. The license may not give you all of the permissions necessary
for your intended use. For example, other rights such as publicity, privacy, or moral
rights may limit how you use the material.
For more details:
http://creativecommons.org/licenses/by/3.0/
-----------------------
CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
Iwan Gabovitch
Ottomaani138
Ogrebane
blukotek
Sevin7
Yoyodaman234
Ryding
No Copyright
The person who associated a work with this deed has dedicated the work to the
public domain by waiving all of his or her rights to the work worldwide under
copyright law, including all related and neighboring rights, to the extent
allowed by law.
You can copy, modify, distribute and perform the work, even for commercial
purposes, all without asking permission. See Other Information below.
Other Information:
In no way are the patent or trademark rights of any person affected by CC0, nor
are the rights that other persons may have in the work or in how the work is
used, such as publicity or privacy rights.
Unless expressly stated otherwise, the person who associated a work with this
deed makes no warranties about the work, and disclaims liability for all uses
of the work, to the fullest extent permitted by applicable law.
When using or citing the work, you should not imply endorsement by the author
or the affirmer.
For more details:
https://creativecommons.org/publicdomain/zero/1.0/
@@ -0,0 +1,79 @@
# Blender v2.78 (sub 0) OBJ File: 'chest-open.blend'
# www.blender.org
o Top_Cube.002_None_Top_Cube.002_None_bottom
v -0.500000 0.408471 0.720970
v -0.500000 1.115578 0.013863
v -0.500000 0.894607 -0.207108
v -0.500000 0.187501 0.499999
v 0.500000 1.115578 0.013863
v 0.500000 0.408471 0.720970
v 0.500000 0.187501 0.499999
v 0.500000 0.894607 -0.207108
v -0.500000 0.187500 -0.500000
v -0.500000 -0.500000 -0.500000
v -0.500000 -0.500000 0.500000
v 0.500000 0.187500 -0.500000
v 0.500000 -0.500000 0.500000
v 0.500000 -0.500000 -0.500000
vt 0.0000 1.0000
vt 0.0000 0.0000
vt 1.0000 0.0000
vt 1.0000 1.0000
vt 1.0000 0.0000
vt 1.0000 1.0000
vt 0.0000 1.0000
vt 0.0000 0.0000
vt 0.0000 1.0000
vt 1.0000 1.0000
vt 1.0000 0.6875
vt 0.0000 0.6875
vt 1.0000 1.0000
vt 0.0000 0.6875
vt 1.0000 0.6875
vt 1.0000 0.6875
vt 1.0000 0.0000
vt 0.0000 0.0000
vt 1.0000 0.6875
vt 1.0000 0.0000
vt 1.0000 1.0000
vt 1.0000 0.6875
vt 1.0000 0.0000
vt 0.0000 1.0000
vt 0.0000 0.6875
vt 0.0000 0.6875
vt 0.0000 0.0000
vt 1.0000 0.5000
vt 1.0000 1.0000
vt 0.0000 1.0000
vt 0.0000 0.5000
vt 0.0000 0.0000
vt 1.0000 0.0000
vn 0.0000 0.7071 0.7071
vn -0.0000 -1.0000 -0.0000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 -0.0000
vn 0.0000 -0.7071 0.7071
vn 0.0000 0.0000 1.0000
vn -0.0000 0.7071 -0.7071
vn -0.0000 0.0000 -1.0000
vn -0.0000 -0.7071 -0.7071
vn -0.0000 1.0000 -0.0000
g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Top
s off
f 6/1/1 5/2/1 2/3/1 1/4/1
g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Bottom
f 11/5/2 10/6/2 14/7/2 13/8/2
g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Right-Left
f 1/9/3 2/10/3 3/11/3 4/12/3
f 5/13/4 6/1/4 7/14/4 8/15/4
f 4/12/3 9/16/3 10/17/3 11/18/3
f 12/19/4 7/14/4 13/8/4 14/20/4
g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Back
f 6/21/5 1/9/5 4/12/5 7/22/5
f 7/22/6 4/12/6 11/18/6 13/23/6
g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Front
f 2/10/7 5/24/7 8/25/7 3/11/7
f 9/16/8 12/26/8 14/27/8 10/17/8
g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Inside
f 4/28/9 3/29/9 8/30/9 7/31/9
f 7/31/10 12/32/10 9/33/10 4/28/10
@@ -0,0 +1,34 @@
# Blender v2.81 (sub 16) OBJ File: 'capstone.blend'
# www.blender.org
mtllib underworld_capstone.mtl
o Cube
v 0.000000 0.500000 0.000000
v 0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 -0.500000 -0.500000
v -0.500000 -0.500000 0.500000
vt 1.000000 1.000000
vt 0.000000 0.000000
vt 0.000000 1.000000
vt 1.000000 0.000000
vt 0.500000 1.000000
vt 1.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vn 0.0000 -1.0000 0.0000
vn 0.0000 0.4472 0.8944
vn -0.8944 0.4472 0.0000
vn 0.8944 0.4472 0.0000
vn 0.0000 0.4472 -0.8944
g Cube_Cube_Material
usemtl Material
s off
f 2/1/1 5/2/1 4/3/1
f 2/1/1 3/4/1 5/2/1
g Cube_Cube_side
usemtl side
f 3/4/2 1/5/2 5/2/2
f 5/2/3 1/5/3 4/6/3
f 2/7/4 1/5/4 3/8/4
f 4/9/5 1/5/5 2/7/5
@@ -0,0 +1,386 @@
# Blender v2.81 (sub 16) OBJ File: 'seal.blend'
# www.blender.org
mtllib underworld_seal.mtl
o Cylinder
v -0.292175 -0.501653 -0.705374
v -0.292175 0.501653 -0.705374
v 0.292175 -0.501653 -0.705374
v 0.292175 0.501653 -0.705374
v 0.705374 -0.501653 -0.292175
v 0.705374 0.501653 -0.292175
v 0.705374 -0.501653 0.292175
v 0.705374 0.501653 0.292175
v 0.292175 -0.501653 0.705374
v 0.292175 0.501653 0.705374
v -0.292175 -0.501653 0.705374
v -0.292175 0.501653 0.705374
v -0.705374 -0.501653 0.292175
v -0.705374 0.501653 0.292175
v -0.705374 -0.501653 -0.292175
v -0.705374 0.501653 -0.292175
v -0.146088 -0.752480 -0.352687
v 0.146088 -0.752480 -0.352687
v 0.146088 0.752480 -0.352687
v -0.146088 0.752480 -0.352687
v 0.352687 -0.752480 -0.146088
v 0.352687 0.752480 -0.146088
v 0.352687 -0.752480 0.146088
v 0.352687 0.752480 0.146088
v 0.146088 -0.752480 0.352687
v 0.146088 0.752480 0.352687
v -0.146088 -0.752480 0.352687
v -0.146088 0.752480 0.352687
v -0.352687 -0.752480 0.146088
v -0.352687 0.752480 0.146088
v -0.352687 -0.752480 -0.146088
v -0.352687 0.752480 -0.146088
v -0.000000 0.501653 -0.705374
v 0.498774 0.501653 -0.498774
v 0.705374 0.501653 0.000000
v 0.498774 0.501653 0.498774
v -0.000000 0.501653 0.705374
v -0.498775 0.501653 0.498775
v -0.705374 0.501653 0.000000
v -0.498775 0.501653 -0.498774
v -0.093326 0.852022 -0.690234
v -0.000000 -0.501653 -0.705374
v 0.498774 -0.501653 -0.498774
v 0.705374 -0.501653 0.000000
v 0.498774 -0.501653 0.498774
v -0.000000 -0.501653 0.705374
v -0.498775 -0.501653 0.498775
v -0.705374 -0.501653 0.000000
v -0.498775 -0.501653 -0.498774
v -0.000000 -0.501653 -0.705374
v 0.292175 -0.501653 -0.705374
v 0.292175 -0.501653 -0.705374
v -0.000000 0.501653 -0.705374
v -0.292175 0.501653 -0.705374
v -0.292175 0.501653 -0.705374
v -0.292175 -0.501653 -0.705374
v -0.292175 -0.501653 -0.705374
v 0.292175 0.501653 -0.705374
v 0.292175 0.501653 -0.705374
v 0.498774 -0.501653 -0.498774
v 0.705374 -0.501653 -0.292175
v 0.705374 -0.501653 -0.292175
v 0.498774 0.501653 -0.498774
v 0.705374 0.501653 -0.292175
v 0.705374 0.501653 -0.292175
v 0.705374 -0.501653 0.000000
v 0.705374 -0.501653 0.292175
v 0.705374 -0.501653 0.292175
v 0.705374 0.501653 0.000000
v 0.705374 0.501653 0.292175
v 0.705374 0.501653 0.292175
v 0.498774 -0.501653 0.498774
v 0.292175 -0.501653 0.705374
v 0.292175 -0.501653 0.705374
v 0.498774 0.501653 0.498774
v 0.292175 0.501653 0.705374
v 0.292175 0.501653 0.705374
v -0.000000 -0.501653 0.705374
v -0.292175 -0.501653 0.705374
v -0.292175 -0.501653 0.705374
v -0.000000 0.501653 0.705374
v -0.292175 0.501653 0.705374
v -0.292175 0.501653 0.705374
v -0.498775 -0.501653 0.498775
v -0.705374 -0.501653 0.292175
v -0.705374 -0.501653 0.292175
v -0.498775 0.501653 0.498775
v -0.705374 0.501653 0.292175
v -0.705374 0.501653 0.292175
v -0.705374 -0.501653 0.000000
v -0.705374 -0.501653 -0.292175
v -0.705374 -0.501653 -0.292175
v -0.705374 0.501653 0.000000
v -0.705374 0.501653 -0.292175
v -0.705374 0.501653 -0.292175
v -0.498775 -0.501653 -0.498774
v -0.498775 0.501653 -0.498774
v -0.146088 -0.752480 -0.352687
v 0.146088 -0.752480 -0.352687
v 0.146088 0.752480 -0.352687
v -0.146088 0.752480 -0.352687
v 0.352687 -0.752480 -0.146088
v 0.352687 0.752480 -0.146088
v 0.352687 -0.752480 0.146088
v 0.352687 0.752480 0.146088
v 0.146088 -0.752480 0.352687
v 0.146088 0.752480 0.352687
v -0.146088 -0.752480 0.352687
v -0.146088 0.752480 0.352687
v -0.352687 -0.752480 0.146088
v -0.352687 0.752480 0.146088
v -0.352687 -0.752480 -0.146088
v -0.352687 0.752480 -0.146088
vt 0.500000 1.000000
vt 0.250000 0.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt 0.750000 0.000000
vt 1.000000 0.000000
vt 0.250000 1.000000
vt 0.250000 0.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt 0.750000 0.000000
vt 1.000000 0.000000
vt 0.500000 1.000000
vt 0.250000 0.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt 0.750000 0.000000
vt 1.000000 0.000000
vt 0.500000 1.000000
vt 0.250000 0.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt 0.750000 0.000000
vt 1.000000 0.000000
vt 0.750000 0.000000
vt 0.750000 1.000000
vt 0.250000 1.000000
vt 1.250000 0.000000
vt 1.250000 1.000000
vt 0.750000 1.000000
vt 0.750000 0.000000
vt 0.500000 1.000000
vt 0.750000 1.000000
vt 1.250000 0.000000
vt 1.250000 1.000000
vt 0.750000 1.000000
vt 0.750000 0.000000
vt 0.750000 1.000000
vt 0.250000 1.000000
vt 1.250000 0.000000
vt 1.250000 1.000000
vt 0.750000 1.000000
vt 0.750000 0.000000
vt 0.750000 1.000000
vt 0.250000 1.000000
vt 1.250000 0.000000
vt 1.250000 1.000000
vt 0.750000 1.000000
vt 0.000000 0.292893
vt 0.707106 0.000000
vt 1.000000 0.707107
vt 1.000000 0.292893
vt 0.292893 0.000000
vt 0.000000 0.707106
vt 0.707107 1.000000
vt 0.292893 1.000000
vt 0.000000 0.707106
vt 0.292893 0.000000
vt 1.000000 0.292893
vt 0.292893 1.000000
vt 0.707107 1.000000
vt 1.000000 0.707107
vt 0.707106 0.000000
vt 0.000000 0.292893
vt 0.500000 0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.500000 0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt 0.000000 -0.000000
vt 1.000000 0.000000
vt 0.000000 -0.000000
vt 1.000000 0.000000
vt 0.000000 -0.000000
vt 1.000000 0.000000
vt 0.000000 -0.000000
vt 1.000000 0.000000
vt 0.000000 -0.000000
vt 1.000000 0.000000
vt 0.000000 -0.000000
vt 1.000000 0.000000
vt 0.000000 -0.000000
vt 1.000000 0.000000
vt 0.000000 -0.000000
vt 1.000000 0.000000
vt 0.000000 -0.000000
vt 1.000000 0.000000
vt 0.000000 -0.000000
vt 1.000000 0.000000
vt 0.000000 -0.000000
vt 1.000000 0.000000
vt 0.000000 -0.000000
vt 1.000000 0.000000
vt 0.000000 -0.000000
vt 1.000000 0.000000
vt 0.000000 -0.000000
vt 1.000000 0.000000
vt 0.000000 -0.000000
vt 1.000000 0.000000
vt 0.000000 -0.000000
vt 1.000000 0.000000
vn 0.0000 0.0000 -1.0000
vn 0.7071 0.0000 -0.7071
vn 1.0000 0.0000 0.0000
vn 0.7071 0.0000 0.7071
vn 0.0000 0.0000 1.0000
vn -0.7071 0.0000 0.7071
vn -1.0000 0.0000 0.0000
vn -0.7071 0.0000 -0.7071
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.4098 -0.8149 -0.4098
vn 0.4098 0.8149 0.4098
vn -0.5796 -0.8149 0.0000
vn 0.4098 0.8149 -0.4098
vn -0.5796 0.8149 0.0000
vn 0.0000 -0.8149 0.5796
vn 0.0000 0.8149 0.5796
vn 0.5796 -0.8149 0.0000
vn -0.4098 -0.8149 -0.4098
vn 0.0000 -0.8149 -0.5796
vn 0.5796 0.8149 0.0000
vn -0.4098 0.8149 -0.4098
vn 0.0000 0.8149 -0.5796
vn -0.4098 -0.8149 0.4098
vn -0.4098 0.8149 0.4098
vn 0.4098 -0.8149 0.4098
g Cylinder_Cylinder_Sides
usemtl Sides
s off
f 53/1/1 51/2/1 50/3/1
f 63/4/2 61/5/2 60/6/2
f 70/7/3 67/8/3 66/9/3
f 75/10/4 73/11/4 72/12/4
f 81/13/5 79/14/5 78/15/5
f 87/16/6 85/17/6 84/18/6
f 93/19/7 91/20/7 90/21/7
f 97/22/8 57/23/8 96/24/8
f 50/3/1 56/25/1 54/26/1
f 53/1/1 58/27/1 51/2/1
f 50/3/1 54/26/1 53/1/1
f 60/6/2 3/28/2 59/29/2
f 63/4/2 64/30/2 61/5/2
f 60/6/2 59/29/2 63/4/2
f 66/9/3 5/31/3 69/32/3
f 5/31/3 65/33/3 69/32/3
f 69/32/3 70/7/3 66/9/3
f 72/12/4 7/34/4 71/35/4
f 75/10/4 76/36/4 73/11/4
f 72/12/4 71/35/4 75/10/4
f 78/15/5 9/37/5 77/38/5
f 81/13/5 82/39/5 79/14/5
f 78/15/5 77/38/5 81/13/5
f 84/18/6 11/40/6 83/41/6
f 87/16/6 88/42/6 85/17/6
f 84/18/6 83/41/6 87/16/6
f 90/21/7 13/43/7 89/44/7
f 93/19/7 94/45/7 91/20/7
f 90/21/7 89/44/7 93/19/7
f 96/24/8 15/46/8 95/47/8
f 97/22/8 2/48/8 57/23/8
f 96/24/8 95/47/8 97/22/8
g Cylinder_Cylinder_Caps
usemtl Caps
f 111/49/9 26/50/9 103/51/9
f 104/52/10 108/53/10 112/54/10
f 103/51/9 100/55/9 111/49/9
f 100/55/9 101/56/9 111/49/9
f 101/56/9 113/57/9 111/49/9
f 111/49/9 109/58/9 26/50/9
f 26/50/9 105/59/9 103/51/9
f 112/54/10 98/60/10 99/61/10
f 99/61/10 21/62/10 104/52/10
f 104/52/10 106/63/10 108/53/10
f 108/53/10 110/64/10 112/54/10
f 112/54/10 99/61/10 104/52/10
g Cylinder_Cylinder_Edges
usemtl Edges
f 43/65/11 102/66/11 18/67/11
f 36/68/12 24/69/12 107/70/12
f 48/71/13 31/72/13 29/73/13
f 34/74/14 19/75/14 22/76/14
f 39/77/15 30/78/15 32/79/15
f 46/80/16 27/81/16 25/82/16
f 37/83/17 107/84/17 28/85/17
f 44/86/18 23/87/18 102/88/18
f 49/89/19 17/90/19 31/91/19
f 42/92/20 18/93/20 17/94/20
f 35/95/21 22/96/21 24/97/21
f 40/98/22 32/99/22 20/100/22
f 33/101/23 20/102/23 19/103/23
f 47/104/24 29/105/24 27/106/24
f 38/107/25 28/108/25 30/109/25
f 45/110/26 25/111/26 23/112/26
f 107/70/12 10/113/12 36/68/12
f 36/68/12 8/114/12 24/69/12
f 22/76/14 6/115/14 34/74/14
f 34/74/14 4/116/14 19/75/14
f 32/79/15 16/117/15 39/77/15
f 39/77/15 14/118/15 30/78/15
f 28/85/17 12/119/17 37/83/17
f 37/83/17 10/120/17 107/84/17
f 24/97/21 8/121/21 35/95/21
f 35/95/21 6/122/21 22/96/21
f 20/100/22 55/123/22 40/98/22
f 40/98/22 16/124/22 32/99/22
f 19/103/23 4/125/23 33/101/23
f 33/101/23 55/126/23 20/102/23
f 30/109/25 14/127/25 38/107/25
f 38/107/25 12/128/25 28/108/25
f 18/67/11 52/129/11 43/65/11
f 43/65/11 62/130/11 102/66/11
f 29/73/13 86/131/13 48/71/13
f 48/71/13 92/132/13 31/72/13
f 25/82/16 74/133/16 46/80/16
f 46/80/16 80/134/16 27/81/16
f 102/88/18 62/135/18 44/86/18
f 44/86/18 68/136/18 23/87/18
f 31/91/19 92/137/19 49/89/19
f 49/89/19 1/138/19 17/90/19
f 17/94/20 1/139/20 42/92/20
f 42/92/20 52/140/20 18/93/20
f 27/106/24 80/141/24 47/104/24
f 47/104/24 86/142/24 29/105/24
f 23/112/26 68/143/26 45/110/26
f 45/110/26 74/144/26 25/111/26
@@ -0,0 +1,172 @@
local S = minetest.get_translator(minetest.get_current_modname())
local sum_square = function(input)
return {input[1] + input[2], input[3] + input[4], input[1] + input[3], input[2] + input[4]}
end
local initialize = function(pos, meta)
if not meta:contains("key") then
local inv = meta:get_inventory()
inv:set_size("main", 8)
local next_seed = math.random() * 2^21
math.randomseed(pos.x + pos.y^8 + pos.z^16)
-- Key is consistent with location
local key = {math.random(0,7), math.random(0,7), math.random(0,7), math.random(0,7)}
math.randomseed(next_seed)
local state = {math.random(0,7), math.random(0,7), math.random(0,7), math.random(0,7)}
local key_sum = sum_square(key)
local state_sum = sum_square(state)
if (key_sum[1] == state_sum[1] and key_sum[2] == state_sum[2] and key_sum[3] == state_sum[3] and key_sum[4] == state_sum[4]) then
-- if we randomly start off solved change one of the states to make it unsolved.
-- lucky player gets an easy one.
state[1] = (state[1] + 1) % 8
end
meta:set_string("key", minetest.serialize(key))
meta:set_string("state", minetest.serialize(state))
meta:mark_as_private("key")
meta:mark_as_private("state") -- not really necessary, but for consistency
end
end
-- 1 2
-- 3 4
local formspec_dial = function(identifier, state)
return "image[0.5,0;2,1;dfcaverns_chest_dial_"..tostring(state)..".png]"
.. "button[0,0.25;0.5,0.5;"..identifier.."+;<]"
.. "button[2.5,0.25;0.5,0.5;"..identifier.."-;>]"
end
local formspec_bar = function(horizontal, state, key)
if horizontal then
return "box[0,0;".. tostring(key/14 * 2 + 0.1) ..",1;#222222ff]box[0.1,0.1;".. tostring(state/14 * 2)..",0.85;#ff00ff44]"
end
return "box[0,0;1,".. tostring(key/14 * 2 + 0.1) ..";#222222ff]box[0.1,0.1;0.85,".. tostring(state/14 * 2)..";#ff00ff44]"
end
local prefix = "df_underworld_items:puzzle_chest"
local prefix_len = string.len("df_underworld_items:puzzle_chest")
local itemslot_bg = df_dependencies.get_itemslot_bg_padded
local show_formspec = function(pos, node, clicker, itemstack, pointed_thing)
local meta = minetest.get_meta(pos)
initialize(pos, meta)
local key = minetest.deserialize(meta:get_string("key"))
local state = minetest.deserialize(meta:get_string("state"))
local key_sum = sum_square(key)
local state_sum = sum_square(state)
local solved = key_sum[1] == state_sum[1] and key_sum[2] == state_sum[2] and key_sum[3] == state_sum[3] and key_sum[4] == state_sum[4]
local playername = clicker:get_player_name()
local formname = prefix .. minetest.pos_to_string(pos)
local formspec = "formspec_version[6]"
.. "size[11,12]"
.. "container[1.5,0.5]"
.. "container[0,0]" .. formspec_dial("dial1", state[1]) .. "container_end[]"
.. "container[3,0]" .. formspec_dial("dial2", state[2]) .. "container_end[]"
.. "container[0,1.5]" .. formspec_dial("dial3", state[3]) .. "container_end[]"
.. "container[3,1.5]" .. formspec_dial("dial4", state[4]) .. "container_end[]"
.. "container[6.1,0]" .. formspec_bar(true, state_sum[1], key_sum[1]) .. "container_end[]"
.. "container[6.1,1.5]" .. formspec_bar(true, state_sum[2], key_sum[2]) .. "container_end[]"
.. "container[1,2.75]" .. formspec_bar(false, state_sum[3], key_sum[3]) .. "container_end[]"
.. "container[4,2.75]" .. formspec_bar(false, state_sum[4], key_sum[4]) .. "container_end[]"
.. "container_end[]"
.. itemslot_bg(0.6,6.7,8,4,0.25)
.. "list[current_player;main;0.6,6.7;8,4;]"
if solved then
local nodemeta = "nodemeta:"..pos.x..","..pos.y..","..pos.z
formspec = formspec
.. itemslot_bg(0.6,5.4,8,1,0.25)
.. "list["..nodemeta..";main;0.6,5.4;8,1;]"
.. "listring[]"
if meta:get_string("solved") ~= "true" then
minetest.sound_play("dfcaverns_puzzle_chest_open", {pos = pos})
meta:set_string("solved", "true")
local old_node = minetest.get_node(pos)
minetest.swap_node(pos, {name="df_underworld_items:puzzle_chest_opened", param2=old_node.param2})
end
elseif meta:get_string("solved") == "true" then
minetest.sound_play("dfcaverns_puzzle_chest_close", {pos = pos})
meta:set_string("solved", "")
local old_node = minetest.get_node(pos)
minetest.swap_node(pos, {name="df_underworld_items:puzzle_chest_closed", param2=old_node.param2})
end
minetest.show_formspec(playername, formname, formspec)
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
if string.sub(formname, 1, prefix_len) ~= prefix then return end
if fields.quit then return end
local pos = minetest.string_to_pos(string.sub(formname, prefix_len+1, -1))
local meta = minetest.get_meta(pos)
local state = minetest.deserialize(meta:get_string("state"))
for i = 1,4 do
if fields["dial"..tostring(i).."+"] then
state[i] = (state[i] + 1) % 8
break
elseif fields["dial"..tostring(i).."-"] then
state[i] = (state[i] - 1) % 8
break
end
end
meta:set_string("state", minetest.serialize(state))
show_formspec(pos, nil, player)
end)
local puzzle_chest_can_dig = function(pos, player)
local meta = minetest.get_meta(pos)
initialize(pos, meta)
local inv = meta:get_inventory()
return inv:is_empty("main")
end
minetest.register_node("df_underworld_items:puzzle_chest_closed", {
description = S("Puzzle Chest"),
_doc_items_longdesc = df_underworld_items.doc.puzzle_chest_desc,
_doc_items_usagehelp = df_underworld_items.doc.puzzle_chest_usage,
tiles = {
"dfcaverns_slade_block.png^dfcaverns_chest_mask_top.png",
"dfcaverns_slade_block.png^dfcaverns_chest_mask_top.png",
"dfcaverns_slade_block.png^dfcaverns_chest_mask_side.png",
"dfcaverns_slade_block.png^dfcaverns_chest_mask_side.png",
"dfcaverns_slade_block.png^dfcaverns_chest_mask_side.png",
"dfcaverns_slade_block.png^dfcaverns_chest_mask_side.png^dfcaverns_chest_lock_plate.png^dfcaverns_chest_lock_colours.png",
},
paramtype2="facedir",
is_ground_content = false,
groups = {stone=1, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1, cracky = 3, building_block=1, material_stone=1},
sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }),
_mcl_blast_resistance = 1200,
_mcl_hardness = 50,
on_rightclick = show_formspec,
can_dig = puzzle_chest_can_dig,
})
minetest.register_node("df_underworld_items:puzzle_chest_opened", {
description = S("Puzzle Chest"),
_doc_items_longdesc = df_underworld_items.doc.puzzle_chest_desc,
_doc_items_usagehelp = df_underworld_items.doc.puzzle_chest_usage,
tiles = {
{name = "dfcaverns_slade_block.png^dfcaverns_chest_mask_top.png", backface_culling = true},
{name = "dfcaverns_slade_block.png^dfcaverns_chest_mask_top.png", backface_culling = true},
{name = "dfcaverns_slade_block.png^dfcaverns_chest_mask_side.png", backface_culling = true},
{name = "dfcaverns_slade_block.png^dfcaverns_chest_mask_side.png", backface_culling = true},
{name = "dfcaverns_slade_block.png^dfcaverns_chest_mask_side.png^dfcaverns_chest_lock_plate.png^dfcaverns_chest_lock_colours.png", backface_culling = true},
{name = "([combine:16x32:0,0=dfcaverns_slade_block.png:0,16=dfcaverns_slade_block.png)^dfcaverns_chest_mask_interior.png", backface_culling = true},
},
is_ground_content = false,
mesh = "dfcaverns_chest_open.obj",
drawtype= "mesh",
visual = "mesh",
paramtype2="facedir",
groups = {stone=1, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1, cracky = 3, building_block=1, material_stone=1, not_in_creative_inventory=1},
drop = "df_underworld_items:puzzle_chest_closed",
sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }),
_mcl_blast_resistance = 1200,
_mcl_hardness = 50,
on_rightclick = show_formspec,
can_dig = puzzle_chest_can_dig,
})
@@ -0,0 +1,585 @@
local S = minetest.get_translator(minetest.get_current_modname())
local named_waypoints_path = minetest.get_modpath("named_waypoints")
-- override these to allow achievements to be recorded without requiring a dependency
df_underworld_items.slade_breacher_triggered = function(pos, player) end
df_underworld_items.puzzle_seal_solved = function(pos, player) end -- player can be nil
local invulnerable = df_underworld_items.config.invulnerable_slade and not minetest.settings:get_bool("creative_mode")
local can_dig
if invulnerable then
can_dig = function(pos, player)
return minetest.check_player_privs(player, "server")
end
end
local slade_mcl_blast_resistance = 1200
local slade_mcl_hardness = 50
local slade_groups = {stone=1, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1, cracky = 3, not_in_creative_inventory=1,creative_breakable=1, building_block=1, material_stone=1}
if invulnerable then
slade_groups.immortal = 1
slade_mcl_blast_resistance = 3600000
slade_mcl_hardness = -1
end
local lava_source = df_dependencies.node_name_lava_source
-- Ensures that the node is functioning correctly
local ensure_meta = function(pos)
local meta = minetest.get_meta(pos)
if not meta:contains("key") then
local inv = meta:get_inventory()
inv:set_size("main", 8)
local next_seed = math.random() * 2^21
math.randomseed(pos.x + pos.z^16)
-- Key is consistent with location
local key = {math.random(0,7), math.random(0,7), math.random(0,7), math.random(0,7), math.random(0,7), math.random(0,7),math.random(0,7), math.random(0,7)}
math.randomseed(next_seed)
meta:set_string("key", minetest.serialize(key))
meta:mark_as_private("key")
end
local timer = minetest.get_node_timer(pos)
if not timer:is_started() then
timer:start(4)
end
end
local colour_groups = {
{"color_black", "basecolor_black", "excolor_black", "excolor_darkgrey", "color_dark_grey"}, -- 0
{"color_red", "basecolor_red", "excolor_red"}, -- 1
{"color_orange", "basecolor_orange", "excolor_orange"}, -- 2
{"color_yellow", "basecolor_yellow", "excolor_yellow"}, -- 3
{"color_green", "basecolor_green", "excolor_green", "excolor_lime", "color_dark_green"}, -- 4
{"color_blue", "basecolor_blue", "excolor_blue", "excolor_sky_blue"}, -- 5
{"color_violet", "excolor_violet",}, -- 6
{"color_white", "basecolor_white", "excolor_white", "excolor_lightgrey", "color_grey"}, -- 7
}
df_underworld_items.colour_items = {}
local cull_colour_groups = function()
local culled_colour_groups = {}
for _, groups in ipairs(colour_groups) do
local new_set = {}
for _, colour_group in pairs(groups) do
for itemname, def in pairs(minetest.registered_items) do
if minetest.get_item_group(itemname, colour_group) ~= 0 then
table.insert(new_set, colour_group)
break
end
end
end
assert(#new_set > 0, "Unsolvable puzzle seals due to lack of any registered items belonging to one of " .. dump(groups))
table.insert(culled_colour_groups, new_set)
end
colour_groups = culled_colour_groups
-- collect a list of all items with useful colour groups
-- to be used for treasure generation
local colour_item_set = {}
for itemname, def in pairs(minetest.registered_items) do
for _, groups in ipairs(colour_groups) do
for _, colour in ipairs(groups) do
if minetest.get_item_group(itemname, colour) ~= 0 then
colour_item_set[itemname] = true
end
end
end
end
for colour_item, _ in pairs(colour_item_set) do
table.insert(df_underworld_items.colour_items, colour_item)
end
end
minetest.after(0, cull_colour_groups)
local item_represents_number = function(itemname, number)
for _, group in pairs(colour_groups[number+1]) do
if minetest.get_item_group(itemname, group) ~= 0 then
return true
end
end
return false
end
local test_key = function(pos, player)
local meta = minetest.get_meta(pos)
if not meta:contains("key") then
return false
end
local keystring = meta:get_string("key")
local key = minetest.deserialize(keystring)
local inv = meta:get_inventory()
for offset = 0, 7 do
local valid
for i = 0, 7 do
valid = true
local keyval = (i + offset) % 8 + 1
local item = inv:get_stack("main", i+1)
if not item_represents_number(item:get_name(), key[keyval]) then
valid = false
break
end
end
if valid then
local unlocked = meta:get_int("unlocked")
if unlocked == 0 then
df_underworld_items.puzzle_seal_solved(pos, player)
meta:set_int("unlocked", 1)
end
return true
end
end
meta:set_int("unlocked", 0)
return false
end
--We were a powerful culture.
--This place is not a place of honor.
--No esteemed deed is commemorated here.
--What is here is dangerous and repulsive.
--This message is a warning about danger.
--The danger is still present.
--The danger is unleashed if you disturb this place.
--This place is best shunned and left uninhabited.
local formspec_prefix = "df_underworld_items_puzzle_seal:"
local itemslot_bg = df_dependencies.get_itemslot_bg
local get_formspec = function(pos, unlocked)
local formspec =
"size[8,8]"
.."image[0,0;2.5,4;dfcaverns_puzzle_inscription_background.png^dfcaverns_puzzle_inscription_1.png]"
.."image[5.8,0;2.5,4;dfcaverns_puzzle_inscription_background.png^[transformR180^dfcaverns_puzzle_inscription_2.png]"
.."container[2.25,0]"
.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0.25,0.25;1,1;0]"
..itemslot_bg(0.25,0.25,1,1)
.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;1.25,0;1,1;1]"
..itemslot_bg(1.25,0,1,1)
.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;2.25,0.25;1,1;2]"
..itemslot_bg(2.25,0.25,1,1)
.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;2.5,1.25;1,1;3]"
..itemslot_bg(2.5,1.25,1,1)
.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;2.25,2.25;1,1;4]"
..itemslot_bg(2.25,2.25,1,1)
.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;1.25,2.5;1,1;5]"
..itemslot_bg(1.25,2.5,1,1)
.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0.25,2.25;1,1;6]"
..itemslot_bg(0.25,2.25,1,1)
.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,1.25;1,1;7]"
..itemslot_bg(0,1.25,1,1)
if unlocked then
formspec = formspec .. "image_button[1.25,1.25;1,1;dfcaverns_seal.png;open;"..S("Turn").."]"
else
formspec = formspec .. "image[1.25,1.25;1,1;dfcaverns_seal.png]"
end
formspec = formspec
.."container_end[]"
-- .."container[5,0.5]"
-- .."box[0,0;1,5;#0A0000]box[0.1,0.1;0.8,4.8;#000000]box[0.1," .. 0.1 + 4.8*completion ..";0.8,".. 4.8*completion ..";#FFCC22]"
-- .."container_end[]"
.."container[0,4]list[current_player;main;0,0;8,1;]listring[]"
..itemslot_bg(0,0,8,1)
.."list[current_player;main;0,1.25;8,3;8]"
..itemslot_bg(0,1.25,8,3)
.."container_end[]"
return formspec
end
local refresh_formspec = function(pos, player)
local player_name = player:get_player_name()
local unlocked = test_key(pos, player)
local formspec = get_formspec(pos, unlocked)
minetest.show_formspec(player_name, formspec_prefix..minetest.pos_to_string(pos), formspec)
end
local show_key = function(pos, index)
minetest.sound_play("dfcaverns_seal_key", {
pos = pos,
gain = 0.125,
max_hear_distance = 32,
})
local meta = minetest.get_meta(pos)
local keystring = meta:get_string("key")
local key = minetest.deserialize(keystring)
--minetest.chat_send_all(keystring)
local minpos = vector.add(pos, {x=-1, y=1, z=-1})
local maxpos = vector.add(pos, {x=1, y=3, z=1})
minetest.add_particlespawner({
amount = key[index+1],
time = 0.5,
minpos = minpos,
maxpos = maxpos,
minvel = {x=-0.25, y=0, z=-0.25},
maxvel = {x=0.25, y=0.25, z=0.25},
minacc = {x=0, y=0, z=0},
maxacc = {x=0, y=0, z=0},
minexptime = 3,
maxexptime = 3,
minsize = 1,
maxsize = 1,
texture = "dfcaverns_puzzle_particle.png",
glow = 8,
})
end
local show_unlocked = function(pos, global)
-- Plays globally. This is deliberate.
if global then
minetest.sound_play("dfcaverns_seal_unlocked", {})
else
minetest.sound_play("dfcaverns_seal_unlocked", {pos = pos, max_hear_distance = 128,})
end
minetest.add_particle({
pos = pos,
velocity = {x=0, y=1, z=0},
expirationtime = 30,
size = 20,
texture = "dfcaverns_seal.png^[invert:rgb^[brighten",
glow = 15,
-- vertical = true,
})
end
local puzzle_seal_def = {
description = S("Slade Puzzle Seal"),
_doc_items_longdesc = nil,
_doc_items_usagehelp = nil,
drawtype = "mesh",
mesh = "underworld_seal.obj",
tiles = {"dfcaverns_slade_block.png", "dfcaverns_slade_block.png^dfcaverns_seal.png", "dfcaverns_slade_block.png^(dfcaverns_inscription_1.png^[opacity:128)"},
paramtype = "light",
paramtype2 = "facedir",
light_source = 8,
groups = slade_groups,
sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }),
selection_box = {
type = "fixed",
fixed = {-0.625, -0.625, -0.625, 0.625, 0.625, 0.625},
},
collision_box = {
type = "fixed",
fixed = {-0.625, -0.625, -0.625, 0.625, 0.625, 0.625},
},
is_ground_content = false,
can_dig = can_dig,
_mcl_blast_resistance = slade_mcl_blast_resistance,
_mcl_hardness = slade_mcl_hardness,
on_blast = function() end,
on_rotate = function() return false end,
on_construct = function(pos)
ensure_meta(pos)
end,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
ensure_meta(pos)
refresh_formspec(pos, clicker)
end,
on_timer = function(pos, elapsed)
local meta = minetest.get_meta(pos)
local unlocked = meta:get_int("unlocked")
if unlocked > 0 then
meta:set_int("unlocked", unlocked + 1)
show_unlocked(pos, unlocked <= 13)
else
local index = meta:get_int("key_index")
show_key(pos, index)
meta:set_int("key_index", (index+1) % 8)
end
minetest.get_node_timer(pos):start(4)
end,
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
refresh_formspec(pos, player)
end,
on_metadata_inventory_put = function(pos, listname, index, stack, player)
refresh_formspec(pos, player)
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
refresh_formspec(pos, player)
end,
}
minetest.register_node("df_underworld_items:puzzle_seal", puzzle_seal_def)
--------------------------------------------------------------------------------
-- Once the seal is opened, it turns into this and digs its way down through the slade.
local tnt_boom = df_dependencies.tnt_boom
local digging_seal_def = {
description = S("Active Slade Breacher"),
_doc_items_longdesc = nil,
_doc_items_usagehelp = nil,
drawtype = "mesh",
mesh = "underworld_seal.obj",
tiles = {"dfcaverns_pit_plasma_static.png", "dfcaverns_pit_plasma_static.png^dfcaverns_seal.png", "dfcaverns_pit_plasma_static.png"},
paramtype = "light",
paramtype2 = "facedir",
light_source = minetest.LIGHT_MAX,
groups = {immortal=1, stone=1, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1, not_in_creative_inventory=1,building_block=1, material_stone=1},
sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }),
selection_box = {
type = "fixed",
fixed = {-0.625, -0.625, -0.625, 0.625, 0.625, 0.625},
},
collision_box = {
type = "fixed",
fixed = {-0.625, -0.625, -0.625, 0.625, 0.625, 0.625},
},
is_ground_content = false,
_mcl_blast_resistance = 3600000,
_mcl_hardness = -1,
can_dig = can_dig,
on_blast = function() end,
on_rotate = function() return false end,
on_construct = function(pos)
minetest.get_node_timer(pos):start(0)
end,
on_timer = function(pos, elapsed)
local node = minetest.get_node(pos)
local below_node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})
if below_node.name == "ignore" then
-- map's not loaded below, try again later
minetest.get_node_timer(pos):start(4)
return
end
minetest.sound_play("dfcaverns_massive_digging", {
pos = pos,
gain = 1.0,
max_hear_distance = 32,
})
local minpos = vector.add(pos, {x=0, y=-1, z=0})
minetest.add_particlespawner({
amount = 100,
time = 4,
minpos = minpos,
maxpos = minpos,
minvel = {x=-5, y=0, z=-5},
maxvel = {x=5, y=20, z=5},
minacc = {x=0, y=-10, z=0},
maxacc = {x=0, y=-10, z=0},
minexptime = 5,
maxexptime = 15,
minsize = 1,
maxsize = 5,
texture = "dfcaverns_glowpit_particle.png",
collisiondetection = true,
collision_removal = true,
glow = 15,
})
if minetest.get_item_group(below_node.name, "slade") == 0 then
if df_underworld_items.config.enable_slade_drill then
minetest.set_node(pos, {name="air"})
if tnt_boom then
tnt_boom({x=pos.x, y=pos.y-2, z=pos.z}, {radius=3})
end
minetest.add_item(pos, "df_underworld_items:slade_drill")
else
minetest.set_node(pos, {name=lava_source})
end
return
end
local rot = node.param2
if rot == 0 then
minetest.place_schematic({x=pos.x-3, y=pos.y-2, z=pos.z-3}, df_underworld_items.seal_stair_schem, 0, {}, true)
node.param2 = 1
elseif rot == 1 then
minetest.place_schematic({x=pos.x-3, y=pos.y-2, z=pos.z-3}, df_underworld_items.seal_stair_schem, 90, {}, true)
node.param2 = 2
elseif rot == 2 then
minetest.place_schematic({x=pos.x-3, y=pos.y-2, z=pos.z-3}, df_underworld_items.seal_stair_schem, 180, {}, true)
node.param2 = 3
elseif rot == 3 then
minetest.place_schematic({x=pos.x-3, y=pos.y-2, z=pos.z-3}, df_underworld_items.seal_stair_schem, 270, {}, true)
node.param2 = 0
else
if tnt_boom then
tnt_boom(pos, {radius=3})
end
minetest.set_node(pos, {name=lava_source})
return
end
minetest.set_node(pos, {name="air"})
local newpos = {x=pos.x, y=pos.y-2, z=pos.z}
minetest.set_node(newpos, node)
minetest.get_node_timer(newpos):start(4)
end,
}
minetest.register_node("df_underworld_items:digging_seal", digging_seal_def)
local prefix_len = string.len(formspec_prefix)
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname:sub(1,prefix_len) ~= formspec_prefix or not fields.open then
return
end
local pos_string = formname:sub(prefix_len+1)
local pos = minetest.string_to_pos(pos_string)
if test_key(pos) then
if named_waypoints_path then
named_waypoints.update_waypoint("puzzle_seals", pos, {name=S("Breach in the Slade"), color=0xFA264F, player=player:get_player_name()})
end
minetest.log("action", "[df_underworld_items] " .. player:get_player_name() .. " triggered a puzzle seal at " .. pos_string)
minetest.set_node(pos, {name="df_underworld_items:digging_seal", param2 = math.random(1,4)-1})
minetest.get_node_timer(pos):start(4)
minetest.close_formspec(player:get_player_name(), formname)
df_underworld_items.slade_breacher_triggered(pos, player)
end
end)
-------------------------------------------------------------------------------------------------
local inscription_block_def = {
description = S("Inscribed Slade Block"),
_doc_items_longdesc = nil,
_doc_items_usagehelp = nil,
tiles = {
"dfcaverns_slade_block.png",
"dfcaverns_slade_block.png",
"dfcaverns_slade_block.png^(dfcaverns_inscription_1.png^[opacity:128)",
"dfcaverns_slade_block.png^(dfcaverns_inscription_2.png^[opacity:128)",
"dfcaverns_slade_block.png^(dfcaverns_inscription_3.png^[opacity:128)",
"dfcaverns_slade_block.png^(dfcaverns_inscription_4.png^[opacity:128)",
},
paramtype2 = "facedir",
groups = slade_groups,
sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }),
is_ground_content = false,
_mcl_blast_resistance = slade_mcl_blast_resistance,
_mcl_hardness = slade_mcl_hardness,
can_dig = can_dig,
on_blast = function() end,
on_rotate = function() return false end,
}
minetest.register_node("df_underworld_items:inscription_block", inscription_block_def)
local capstone_def = {
description = S("Slade Capstone"),
_doc_items_longdesc = nil,
_doc_items_usagehelp = nil,
drawtype = "mesh",
mesh = "underworld_capstone.obj",
tiles = {
"dfcaverns_slade_block.png",
"dfcaverns_slade_block.png"
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
{-0.25, 0, -0.25, 0.25, 0.5, 0.25},
},
},
collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
{-0.25, 0, -0.25, 0.25, 0.5, 0.25},
},
},
paramtype = "light",
paramtype2 = "facedir",
groups = slade_groups,
light_source = 8,
sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }),
is_ground_content = false,
_mcl_blast_resistance = slade_mcl_blast_resistance,
_mcl_hardness = slade_mcl_hardness,
can_dig = can_dig,
on_blast = function() end,
on_rotate = function() return false end,
}
minetest.register_node("df_underworld_items:slade_capstone", capstone_def)
-----------------------------------------------------------------------------------------
-- Schematics
local n1 = { name = "df_underworld_items:slade_block" }
local n6 = { name = "air", prob = 0 } -- ceiling pieces to leave in place
local n8 = { name = "df_underworld_items:puzzle_seal" }
local n3 = { name = "air"}
local n2 = n3
local n4 = n3
local n7 = n3
local n9 = n3
local n10 = n1
local n11 = n3
local n12 = { name = "df_underworld_items:inscription_block", param2 = 0 }
local n13 = { name = "df_underworld_items:inscription_block", param2 = 1 }
local n14 = { name = "df_underworld_items:inscription_block", param2 = 2 }
local n15 = { name = "df_underworld_items:inscription_block", param2 = 3 }
local n16 = { name = "df_underworld_items:slade_capstone"}
df_dependencies.register_stairs("slade_block")
if invulnerable then
for name, def in pairs(minetest.registered_nodes) do
if (name:sub(1,7) == "stairs:" and name:sub(-11) == "slade_block") or
name:sub(1,11) == "mcl_stairs:" and name:sub(-11) == "slade_block" then
minetest.override_item(name, {can_dig = can_dig})
end
end
end
if df_dependencies.node_name_stair_slade_block then
n2 = { name = df_dependencies.node_name_stair_slade_block, param2 = 3 }
n4 = { name = df_dependencies.node_name_stair_slade_block, param2 = 1 }
n7 = { name = df_dependencies.node_name_stair_slade_block, param2 = 2 }
n9 = { name = df_dependencies.node_name_stair_slade_block }
n11 = { name = df_dependencies.node_name_slab_slade_block, param2 = 1 }
n10 = { name = df_dependencies.node_name_slab_slade_block, param2 = 21 }
if df_dependencies.node_name_slab_slade_block_top then
-- Mineclone slabs don't support full rotation, this is how to flip them over
n10.name = df_dependencies.node_name_slab_slade_block_top
n10.param2 = 1
end
end
df_underworld_items.seal_temple_schem = {
size = {y = 6, x = 7, z = 7},
data = {
n15, n2, n3, n3, n3, n4, n14, n14, n3, n3, n3, n3, n3, n15, n13, n3, n3,
n3, n3, n3, n13, n16, n3, n3, n3, n3, n3, n16, n6, n6, n6, n6, n6, n6,
n6, n6, n6, n6, n6, n6, n6, n6, n7, n3, n3, n3, n3, n3, n7, n3, n3,
n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3,
n3, n3, n6, n3, n3, n3, n3, n3, n6, n6, n6, n6, n6, n6, n6, n6, n3,
n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3,
n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n6, n3, n3, n3, n3, n3, n6,
n6, n6, n3, n3, n3, n6, n6, n3, n3, n3, n8, n3, n3, n3, n3, n3, n3,
n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3,
n3, n6, n3, n3, n3, n3, n3, n6, n6, n6, n3, n3, n3, n6, n6, n3, n3,
n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3,
n3, n3, n3, n3, n3, n3, n3, n3, n3, n6, n3, n3, n3, n3, n3, n6, n6,
n6, n3, n3, n3, n6, n6, n9, n3, n3, n3, n3, n3, n9, n3, n3, n3, n3,
n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3, n3,
n6, n3, n3, n3, n3, n3, n6, n6, n6, n6, n6, n6, n6, n6, n12, n2, n3,
n3, n3, n4, n12, n14, n3, n3, n3, n3, n3, n15, n13, n3, n3, n3, n3, n3,
n12, n16, n3, n3, n3, n3, n3, n16, n6, n6, n6, n6, n6, n6, n6, n6, n6,
n6, n6, n6, n6, n6,
}
}
df_underworld_items.seal_stair_schem = {
size = {y = 2, x = 7, z = 7},
data = {
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n10,
n3, n3, n3, n1, n1, n3, n11, n1, n10, n3, n1, n1, n11, n3, n3, n3, n3,
n1, n1, n3, n3, n3, n3, n3, n1, n1, n3, n3, n3, n3, n3, n1, n1, n3,
n3, n3, n3, n3, n1, n1, n3, n3, n3, n3, n3, n1, n1, n3, n3, n3, n3,
n3, n1, n1, n3, n3, n3, n3, n3, n1, n1, n3, n3, n3, n3, n3, n1, n1,
n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1,
}
}
@@ -0,0 +1,4 @@
dfcaverns_invulnerable_slade (Slade cannot be damaged) bool true
dfcaverns_destructive_pit_plasma (Pit plasma destroys adjacent nodes) bool true
dfcaverns_underworld_hunter_statues (Enable hunter statues in the underworld) bool true
dfcaverns_enable_slade_drill (Enable slade drills) bool true
@@ -0,0 +1,184 @@
local S = minetest.get_translator(minetest.get_current_modname())
local invulnerable = df_underworld_items.config.invulnerable_slade and not minetest.settings:get_bool("creative_mode")
local server_diggable_only = function(pos, player)
if player and player:is_player() then
return minetest.check_player_privs(player, "server")
end
return false
end
local add_immortality = function(slade_def)
slade_def.groups.immortal = 1
slade_def.can_dig = server_diggable_only
return slade_def
end
local slade_groups = {cracky=3, stone=1, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1,creative_breakable=1, building_block=1, material_stone=1}
local slade_def = {
description = S("Slade"),
_doc_items_longdesc = df_underworld_items.doc.slade_desc,
_doc_items_usagehelp = df_underworld_items.doc.slade_usage,
tiles = {"dfcaverns_slade.png"},
groups = slade_groups,
sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }),
is_ground_content = false,
_mcl_blast_resistance = 8,
_mcl_hardness = 5,
on_blast = function(pos, intensity)
if intensity >= 1.0 then
minetest.set_node(pos, {name="df_underworld_items:slade_sand"})
minetest.check_for_falling(pos)
end
end,
}
if invulnerable then
add_immortality(slade_def)
slade_def._mcl_blast_resistance = 8
slade_def._mcl_hardness = 5
end
minetest.register_node("df_underworld_items:slade", slade_def)
local slade_brick_def = {
description = S("Slade Brick"),
_doc_items_longdesc = df_underworld_items.doc.slade_desc,
_doc_items_usagehelp = df_underworld_items.doc.slade_usage,
tiles = {"dfcaverns_slade_brick.png"},
groups = slade_groups,
sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }),
is_ground_content = false,
_mcl_blast_resistance = 8,
_mcl_hardness = 5,
}
if invulnerable then
add_immortality(slade_brick_def)
end
minetest.register_node("df_underworld_items:slade_brick", slade_brick_def)
-- can't use "wall=1" because MCL has special handling for nodes in that group that explodes if it tries handling this one.
-- fortunately minetest_game walls also connect to group fence, so this should be fine.
local slade_wall_groups = {fence=1}
for key, val in pairs(slade_groups) do
slade_wall_groups[key]=val
end
local slade_wall_def = {
description = S("Slade Wall"),
drawtype = "nodebox",
node_box = {
type = "connected",
fixed = {{-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}},
-- connect_bottom =
connect_front = {{-3/16, -1/2, -1/2, 3/16, 3/8, -1/4}},
connect_left = {{-1/2, -1/2, -3/16, -1/4, 3/8, 3/16}},
connect_back = {{-3/16, -1/2, 1/4, 3/16, 3/8, 1/2}},
connect_right = {{ 1/4, -1/2, -3/16, 1/2, 3/8, 3/16}},
},
connects_to = { "group:wall", "group:stone", "group:fence" },
paramtype = "light",
tiles = {"dfcaverns_slade_brick.png"},
walkable = true,
is_ground_content = false,
groups = slade_wall_groups,
sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }),
_mcl_blast_resistance = 8,
_mcl_hardness = 5,
}
if invulnerable then
add_immortality(slade_wall_def)
end
minetest.register_node("df_underworld_items:slade_wall", slade_wall_def)
minetest.register_node("df_underworld_items:slade_sand", {
description = S("Slade Sand"),
_doc_items_longdesc = df_underworld_items.doc.slade_desc,
_doc_items_usagehelp = df_underworld_items.doc.slade_usage,
tiles = {"dfcaverns_slade_sand.png"},
is_ground_content = false,
groups = {crumbly = 3, falling_node = 1, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1,handy=1,shovely=3, sand=1, enderman_takable=1, building_block=1, material_sand=1, crush_after_fall=1, falling_node_damage=1},
sounds = df_dependencies.sound_gravel({footstep = {name = df_dependencies.soundfile_gravel_footstep, gain = 0.45},}),
_mcl_blast_resistance = 8,
_mcl_hardness = 3,
})
local slade_block_def = {
description = S("Slade Block"),
_doc_items_longdesc = df_underworld_items.doc.slade_desc,
_doc_items_usagehelp = df_underworld_items.doc.slade_usage,
tiles = {"dfcaverns_slade_block.png"},
groups = slade_groups,
sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }),
is_ground_content = false,
_mcl_blast_resistance = 1200,
_mcl_hardness = 50,
}
if invulnerable then
add_immortality(slade_block_def)
slade_block_def.on_blast = function() end
end
minetest.register_node("df_underworld_items:slade_block", slade_block_def)
local slade_seal_def = {
description = S("Slade Seal"),
_doc_items_longdesc = df_underworld_items.doc.slade_seal_desc,
_doc_items_usagehelp = df_underworld_items.doc.slade_usage,
tiles = {"dfcaverns_slade_block.png^dfcaverns_seal.png", "dfcaverns_slade_block.png"},
groups = slade_groups,
sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }),
is_ground_content = false,
_mcl_blast_resistance = 1200,
_mcl_hardness = 50,
}
if invulnerable then
slade_seal_def.on_blast = function() end
add_immortality(slade_seal_def)
end
minetest.register_node("df_underworld_items:slade_seal", slade_seal_def)
minetest.register_craft({
type = "shapeless",
output = "df_underworld_items:slade_brick",
recipe = {
"df_underworld_items:slade_sand",
df_dependencies.node_name_bucket_lava,
},
replacements = {{df_dependencies.node_name_bucket_lava, df_dependencies.node_name_bucket_empty}},
})
minetest.register_abm{
label = "slade seal scratching",
nodenames = {"df_underworld_items:slade_seal"},
interval = 10,
chance = 20,
catch_up = false,
action = function(pos)
minetest.sound_play({name="dfcaverns_grinding_stone"},
{
pos = pos,
gain = 0.05,
max_hear_distance = 32,
}
)
end,
}
-- Register stair and slab
df_dependencies.register_stairs("slade_brick")
if invulnerable then
for name, def in pairs(minetest.registered_nodes) do
if (name:sub(1,7) == "stairs:" and name:sub(-11) == "slade_block") or
name:sub(1,11) == "mcl_stairs:" and name:sub(-11) == "slade_brick" then
minetest.override_item(name, {can_dig = server_diggable_only})
end
end
end
if minetest.get_modpath("mesecons_mvps") and df_underworld_items.config.invulnerable_slade then
mesecon.register_mvps_stopper("df_underworld_items:slade")
end
@@ -0,0 +1,84 @@
local S = minetest.get_translator(minetest.get_current_modname())
local use_timeout = {}
local check_timeout = function(user)
if not user:is_player() then return false end
local player_name = user:get_player_name()
local curr_time = minetest.get_gametime() -- minetest.get_us_time() for microsecond precision
local last_used = use_timeout[player_name]
if not last_used or curr_time > last_used then
use_timeout[player_name] = curr_time
return true
end
end
local drill_particles = function(pos)
minetest.add_particlespawner({
amount = 25,
time = 0.5,
minpos = pos,
maxpos = pos,
minvel = {x=-5, y=0, z=-5},
maxvel = {x=5, y=10, z=5},
minacc = {x=0, y=-10, z=0},
maxacc = {x=0, y=-10, z=0},
minexptime = 2.5,
maxexptime = 7.5,
minsize = 1,
maxsize = 5,
texture = "dfcaverns_glowpit_particle.png",
collisiondetection = true,
collision_removal = true,
glow = 15,
})
end
local slade_drill_def = {
_doc_items_longdesc = df_underworld_items.doc.slade_drill_desc,
_doc_items_usagehelp = df_underworld_items.doc.slade_drill_usage,
light_source = minetest.LIGHT_MAX,
description = S("Slade Drill"),
inventory_image = "dfcaverns_slade_drill.png",
groups = {cracky=3, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1,creative_breakable=1, material_stone=1},
sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }),
_mcl_blast_resistance = 8,
_mcl_hardness = 5,
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type == "node" then
local pos = pointed_thing.under
local node = minetest.get_node(pos)
if node.name == "df_underworld_items:slade" and check_timeout(user) then
if not minetest.is_creative_enabled(user:get_player_name()) then
itemstack:set_wear(itemstack:get_wear()+1)
end
minetest.sound_play("dfcaverns_slade_drill", {pos = user:get_pos()})
minetest.set_node(pos, {name="df_underworld_items:slade_sand"})
drill_particles(pointed_thing.above)
return itemstack
end
end
end,
}
local tnt_boom = df_dependencies.tnt_boom
if tnt_boom then
slade_drill_def.on_use = function(itemstack, user, pointed_thing)
if not check_timeout(user) then return end
local pos
if pointed_thing.type == "node" then pos = pointed_thing.under
elseif pointed_thing.type == "object" then pos = pointed_thing.ref:get_pos() end
if pos then
tnt_boom(pos, {radius=1})
minetest.sound_play("dfcaverns_slade_drill", {pos = user:get_pos()})
if not minetest.is_creative_enabled(user:get_player_name()) then
itemstack:set_wear(itemstack:get_wear()+1)
end
drill_particles(pos)
minetest.check_for_falling({x=pos.x, y=pos.y+1, z=pos.z})
return itemstack
end
end
end
minetest.register_tool("df_underworld_items:slade_drill", slade_drill_def)
@@ -0,0 +1,23 @@
bedrock2_step.1.ogg - from the Bedrock mod by Wuzzy, https://repo.or.cz/w/minetest_bedrock2.git, under the WTFPL, relicenced to MIT for this mod.
bedrock2_step.2.ogg
bedrock2_step.3.ogg
dfcaverns_grinding_stone.1.ogg - from https://freesound.org/people/FreqMan/sounds/25845/ by FreqMan under Creative Commons BY 3.0
dfcaverns_grinding_stone.2.ogg - from https://freesound.org/people/FreqMan/sounds/25846/ by FreqMan under Creative Commons BY 3.0
dfcaverns_grinding_stone.3.ogg - from https://freesound.org/people/FreqMan/sounds/25847/ by FreqMan under Creative Commons BY 3.0
dfcaverns_arcing.1.ogg - from https://freesound.org/people/unfa/sounds/264827/ by unfa under Creative Commons BY 3.0
dfcaverns_arcing.2.ogg - from https://freesound.org/people/unfa/sounds/264827/ by unfa under Creative Commons BY 3.0
dfcaverns_arcing.3.ogg - from https://freesound.org/people/unfa/sounds/264827/ by unfa under Creative Commons BY 3.0
dfcaverns_arcing.4.ogg - from https://freesound.org/people/unfa/sounds/264827/ by unfa under Creative Commons BY 3.0
dfcaverns_seal_unlocked.ogg - from https://freesound.org/people/juskiddink/sounds/74920/ by juskiddink under Creative Commons BY 3.0
dfcaverns_seal_key.ogg - From https://freesound.org/people/megashroom/sounds/391488/ by megashroom under the CC0 public domain license
dfcaverns_massive_digging.1.ogg - from https://freesound.org/people/OGsoundFX/sounds/423120/ by OGsoundFX under Creative Commons BY 3.0
dfcaverns_massive_digging.2.ogg - from https://freesound.org/people/OGsoundFX/sounds/423120/ by OGsoundFX under Creative Commons BY 3.0
dfcaverns_massive_digging.3.ogg - from https://freesound.org/people/OGsoundFX/sounds/423120/ by OGsoundFX under Creative Commons BY 3.0
dfcaverns_drill - from https://freesound.org/people/Jagadamba/sounds/257021/ by Jagadamba under the CC-BY-A 3.0 license
dfcaverns_puzzle_chest_open - from https://freesound.org/people/Garuda1982/sounds/560304/ by Garuda1982 under CC-BY-A 4.0
dfcaverns_puzzle_chest_close - from https://freesound.org/people/Benboncan/sounds/74441/ by Benboncan under CC-BY-A 4.0
Binary file not shown.

After

Width:  |  Height:  |  Size: 923 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 947 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 475 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 481 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 711 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 906 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 296 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 B

@@ -0,0 +1,7 @@
All textures not specifically listed here are created by FaceDeer and released under both the MIT license and under the Creative Commons CC0 license.
dfcaverns_glow_amethyst, dfcaverns_glow_amethist_ore - from caverealms glow_amethyst
dfcaverns_slade, dfcaverns_slade_sand, dfcaverns_slade_brick, are all from the Nether mod by PilzAdam: Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) http://creativecommons.org/licenses/by-sa/3.0/
dfcaverns_glowstone_anim is derived from an animated gif of the Sun's surface released by the National Science Foundation under the public domain