many worldgen mods and gonna try technic now
@@ -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
|
||||
|
After Width: | Height: | Size: 923 B |
|
After Width: | Height: | Size: 947 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 146 B |
|
After Width: | Height: | Size: 123 B |
|
After Width: | Height: | Size: 106 B |
|
After Width: | Height: | Size: 122 B |
|
After Width: | Height: | Size: 121 B |
|
After Width: | Height: | Size: 324 B |
|
After Width: | Height: | Size: 239 B |
|
After Width: | Height: | Size: 7.9 KiB |
|
After Width: | Height: | Size: 475 B |
|
After Width: | Height: | Size: 485 B |
|
After Width: | Height: | Size: 486 B |
|
After Width: | Height: | Size: 481 B |
|
After Width: | Height: | Size: 104 B |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 733 B |
|
After Width: | Height: | Size: 711 B |
|
After Width: | Height: | Size: 906 B |
|
After Width: | Height: | Size: 377 B |
|
After Width: | Height: | Size: 346 B |
|
After Width: | Height: | Size: 306 B |
|
After Width: | Height: | Size: 317 B |
|
After Width: | Height: | Size: 296 B |
|
After Width: | Height: | Size: 571 B |
|
After Width: | Height: | Size: 171 B |
|
After Width: | Height: | Size: 253 B |
|
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
|
||||