From 434da635014be08d54340588ef87944495ff9075 Mon Sep 17 00:00:00 2001 From: FaceDeer Date: Mon, 22 Aug 2022 19:58:46 -0600 Subject: [PATCH] Add a little bonus for players who activate a slade breacher - a handheld 'splosion tool --- df_mapitems/castle_coral.lua | 2 +- df_mapitems/cave_coral.lua | 2 +- df_mapitems/cave_pearls.lua | 2 +- df_mapitems/crystals_mese.lua | 2 +- df_mapitems/crystals_ruby.lua | 2 +- df_mapitems/crystals_salt.lua | 2 +- df_mapitems/doc.lua | 2 +- df_mapitems/flowstone.lua | 2 +- df_mapitems/glow_worms.lua | 2 +- df_mapitems/ground_cover.lua | 2 +- df_mapitems/init.lua | 1 - df_mapitems/snareweed.lua | 2 +- df_mapitems/veinstone.lua | 2 +- df_underworld_items/config.lua | 3 +- df_underworld_items/crystals_amethyst.lua | 2 +- df_underworld_items/doc.lua | 7 +- df_underworld_items/glow_stone.lua | 2 +- df_underworld_items/glowing_pit_plasma.lua | 2 +- df_underworld_items/hunter_statue.lua | 2 +- df_underworld_items/init.lua | 7 +- .../locale/df_underworld_items.de.tr | 8 ++ .../locale/df_underworld_items.it.tr | 8 ++ df_underworld_items/locale/template.txt | 8 ++ df_underworld_items/puzzle_seal.lua | 8 +- df_underworld_items/settingtypes.txt | 3 +- df_underworld_items/slade.lua | 2 +- df_underworld_items/slade_drill.lua | 87 ++++++++++++++++++ .../sounds/dfcaverns_slade_drill.ogg | Bin 0 -> 11722 bytes df_underworld_items/sounds/license.txt | 4 +- .../textures/dfcaverns_slade_drill.png | Bin 0 -> 571 bytes 30 files changed, 150 insertions(+), 28 deletions(-) create mode 100644 df_underworld_items/slade_drill.lua create mode 100644 df_underworld_items/sounds/dfcaverns_slade_drill.ogg create mode 100644 df_underworld_items/textures/dfcaverns_slade_drill.png diff --git a/df_mapitems/castle_coral.lua b/df_mapitems/castle_coral.lua index a59d67d..dc2beac 100644 --- a/df_mapitems/castle_coral.lua +++ b/df_mapitems/castle_coral.lua @@ -1,4 +1,4 @@ -local S = df_mapitems.S +local S = minetest.get_translator(minetest.get_current_modname()) minetest.register_node("df_mapitems:castle_coral", { description = S("Castle Coral"), diff --git a/df_mapitems/cave_coral.lua b/df_mapitems/cave_coral.lua index 82e312b..263ce31 100644 --- a/df_mapitems/cave_coral.lua +++ b/df_mapitems/cave_coral.lua @@ -1,4 +1,4 @@ -local S = df_mapitems.S +local S = minetest.get_translator(minetest.get_current_modname()) local water_source = df_dependencies.node_name_water_source local coral_skeleton = df_dependencies.node_name_coral_skeleton diff --git a/df_mapitems/cave_pearls.lua b/df_mapitems/cave_pearls.lua index 5eb58a6..4eaa2ff 100644 --- a/df_mapitems/cave_pearls.lua +++ b/df_mapitems/cave_pearls.lua @@ -1,4 +1,4 @@ -local S = df_mapitems.S +local S = minetest.get_translator(minetest.get_current_modname()) minetest.register_node("df_mapitems:cave_pearls", { description = S("Cave Pearls"), diff --git a/df_mapitems/crystals_mese.lua b/df_mapitems/crystals_mese.lua index d7d53ca..bfe5b8d 100644 --- a/df_mapitems/crystals_mese.lua +++ b/df_mapitems/crystals_mese.lua @@ -1,4 +1,4 @@ -local S = df_mapitems.S +local S = minetest.get_translator(minetest.get_current_modname()) --glowing mese crystal blocks minetest.register_node("df_mapitems:glow_mese", { diff --git a/df_mapitems/crystals_ruby.lua b/df_mapitems/crystals_ruby.lua index e84dbd5..b6fec2f 100644 --- a/df_mapitems/crystals_ruby.lua +++ b/df_mapitems/crystals_ruby.lua @@ -1,4 +1,4 @@ -local S = df_mapitems.S +local S = minetest.get_translator(minetest.get_current_modname()) minetest.register_node("df_mapitems:glow_ruby_ore", { description = S("Red Crystal Vein"), diff --git a/df_mapitems/crystals_salt.lua b/df_mapitems/crystals_salt.lua index 7cf7312..51a0599 100644 --- a/df_mapitems/crystals_salt.lua +++ b/df_mapitems/crystals_salt.lua @@ -1,4 +1,4 @@ -local S = df_mapitems.S +local S = minetest.get_translator(minetest.get_current_modname()) minetest.register_node("df_mapitems:salt_crystal", { description = S("Luminous Salt Crystal"), diff --git a/df_mapitems/doc.lua b/df_mapitems/doc.lua index bc0f0c9..359e090 100644 --- a/df_mapitems/doc.lua +++ b/df_mapitems/doc.lua @@ -4,7 +4,7 @@ if not minetest.get_modpath("doc") then return end -local S = df_mapitems.S +local S = minetest.get_translator(minetest.get_current_modname()) df_mapitems.doc.cave_moss_desc = S("Cave moss is technically a form of mold, but fortunately a relatively benign one given its ubiquity. Its fibers form a tough but springy mat over the surface of any organic-rich soil that accumulates deep underground.") df_mapitems.doc.cave_moss_usage = S("Cave moss has no known uses aside from the faint glow it emits. It dies when exposed to bright light sources such as the Sun.") diff --git a/df_mapitems/flowstone.lua b/df_mapitems/flowstone.lua index 2365fc8..d622697 100644 --- a/df_mapitems/flowstone.lua +++ b/df_mapitems/flowstone.lua @@ -1,4 +1,4 @@ -local S = df_mapitems.S +local S = minetest.get_translator(minetest.get_current_modname()) ----------------------------------------------- diff --git a/df_mapitems/glow_worms.lua b/df_mapitems/glow_worms.lua index 2e95c45..3b28501 100644 --- a/df_mapitems/glow_worms.lua +++ b/df_mapitems/glow_worms.lua @@ -1,4 +1,4 @@ -local S = df_mapitems.S +local S = minetest.get_translator(minetest.get_current_modname()) local growth_multiplier = 1 if minetest.get_modpath("df_farming") then diff --git a/df_mapitems/ground_cover.lua b/df_mapitems/ground_cover.lua index fe7693c..531d8de 100644 --- a/df_mapitems/ground_cover.lua +++ b/df_mapitems/ground_cover.lua @@ -1,4 +1,4 @@ -local S = df_mapitems.S +local S = minetest.get_translator(minetest.get_current_modname()) local function soil_type_spread(label, node_to_spread, target_node) diff --git a/df_mapitems/init.lua b/df_mapitems/init.lua index 9ef8bb6..b2db915 100644 --- a/df_mapitems/init.lua +++ b/df_mapitems/init.lua @@ -1,7 +1,6 @@ df_mapitems = {} local modname = minetest.get_current_modname() -df_mapitems.S = minetest.get_translator(modname) local modpath = minetest.get_modpath(modname) --load companion lua files diff --git a/df_mapitems/snareweed.lua b/df_mapitems/snareweed.lua index ec8167b..1b8dc22 100644 --- a/df_mapitems/snareweed.lua +++ b/df_mapitems/snareweed.lua @@ -1,4 +1,4 @@ -local S = df_mapitems.S +local S = minetest.get_translator(minetest.get_current_modname()) minetest.register_node("df_mapitems:snareweed", { description = S("Snareweed"), diff --git a/df_mapitems/veinstone.lua b/df_mapitems/veinstone.lua index 05babf7..4df71f9 100644 --- a/df_mapitems/veinstone.lua +++ b/df_mapitems/veinstone.lua @@ -1,4 +1,4 @@ -local S = df_mapitems.S +local S = minetest.get_translator(minetest.get_current_modname()) -- overridden to trigger an achievement, without making achievements a dependency of this mod df_mapitems.on_veinstone_punched = function() diff --git a/df_underworld_items/config.lua b/df_underworld_items/config.lua index 110e40b..4129a5c 100644 --- a/df_underworld_items/config.lua +++ b/df_underworld_items/config.lua @@ -25,4 +25,5 @@ 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") \ No newline at end of file +setting("bool", "underworld_hunter_statues", true, "Enable hunter statues in the underworld") +setting("bool", "enable_slade_drill", true, "Enable slade drills") \ No newline at end of file diff --git a/df_underworld_items/crystals_amethyst.lua b/df_underworld_items/crystals_amethyst.lua index dd42fbc..c64898d 100644 --- a/df_underworld_items/crystals_amethyst.lua +++ b/df_underworld_items/crystals_amethyst.lua @@ -1,4 +1,4 @@ -local S = df_underworld_items.S +local S = minetest.get_translator(minetest.get_current_modname()) minetest.register_node("df_underworld_items:glow_amethyst", { description = S("Glowing Amethyst Block"), diff --git a/df_underworld_items/doc.lua b/df_underworld_items/doc.lua index 525a680..720d9d8 100644 --- a/df_underworld_items/doc.lua +++ b/df_underworld_items/doc.lua @@ -4,7 +4,7 @@ if not minetest.get_modpath("doc") then return end -local S = df_underworld_items.S +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.") @@ -21,4 +21,7 @@ df_underworld_items.doc.glow_amethyst_desc = S("Glowing purple crystals that gro 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.") \ No newline at end of file +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.") diff --git a/df_underworld_items/glow_stone.lua b/df_underworld_items/glow_stone.lua index a111926..f3699ea 100644 --- a/df_underworld_items/glow_stone.lua +++ b/df_underworld_items/glow_stone.lua @@ -1,4 +1,4 @@ -local S = df_underworld_items.S +local S = minetest.get_translator(minetest.get_current_modname()) local glowstone_def = { _doc_items_longdesc = df_underworld_items.doc.glowstone_desc, diff --git a/df_underworld_items/glowing_pit_plasma.lua b/df_underworld_items/glowing_pit_plasma.lua index 3162289..f12af38 100644 --- a/df_underworld_items/glowing_pit_plasma.lua +++ b/df_underworld_items/glowing_pit_plasma.lua @@ -1,4 +1,4 @@ -local S = df_underworld_items.S +local S = minetest.get_translator(minetest.get_current_modname()) local lava_source = df_dependencies.node_name_lava_source diff --git a/df_underworld_items/hunter_statue.lua b/df_underworld_items/hunter_statue.lua index ed67e90..6068837 100644 --- a/df_underworld_items/hunter_statue.lua +++ b/df_underworld_items/hunter_statue.lua @@ -1,6 +1,6 @@ if minetest.get_modpath("hunter_statue") and df_underworld_items.config.underworld_hunter_statues then - local S = df_underworld_items.S + local S = minetest.get_translator(minetest.get_current_modname()) hunter_statue.register_hunter_statue("df_underworld_items:hunter_statue", { description = S("Guardian Statue"), diff --git a/df_underworld_items/init.lua b/df_underworld_items/init.lua index 5ff95ae..a8d3b37 100644 --- a/df_underworld_items/init.lua +++ b/df_underworld_items/init.lua @@ -1,7 +1,6 @@ df_underworld_items = {} local modname = minetest.get_current_modname() -df_underworld_items.S = minetest.get_translator(modname) local modpath = minetest.get_modpath(modname) dofile(modpath.."/config.lua") @@ -14,5 +13,7 @@ dofile(modpath.."/hunter_statue.lua") dofile(modpath.."/glowing_pit_plasma.lua") dofile(modpath.."/puzzle_seal.lua") - -dofile(modpath.."/ancient_lanterns.lua") \ No newline at end of file +dofile(modpath.."/ancient_lanterns.lua") +if df_underworld_items.config.enable_slade_drill then + dofile(modpath.."/slade_drill.lua") +end diff --git a/df_underworld_items/locale/df_underworld_items.de.tr b/df_underworld_items/locale/df_underworld_items.de.tr index 99cee6e..90147cf 100644 --- a/df_underworld_items/locale/df_underworld_items.de.tr +++ b/df_underworld_items/locale/df_underworld_items.de.tr @@ -42,6 +42,10 @@ These stones are highly volatile and should not be disturbed.=Diese Steine ​ #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 ### @@ -80,6 +84,10 @@ Slade Sand= Slade Seal= Slade Wall= +### slade_drill.lua ### + +Slade Drill= + ##### not used anymore ##### diff --git a/df_underworld_items/locale/df_underworld_items.it.tr b/df_underworld_items/locale/df_underworld_items.it.tr index 8b5f190..ff01be4 100644 --- a/df_underworld_items/locale/df_underworld_items.it.tr +++ b/df_underworld_items/locale/df_underworld_items.it.tr @@ -42,6 +42,10 @@ These stones are highly volatile and should not be disturbed.=Queste pietre sono #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 ### @@ -77,3 +81,7 @@ Slade Sand= #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE Slade Seal=Sigillo Slade Slade Wall= + +### slade_drill.lua ### + +Slade Drill= diff --git a/df_underworld_items/locale/template.txt b/df_underworld_items/locale/template.txt index ebf055b..089c2e2 100644 --- a/df_underworld_items/locale/template.txt +++ b/df_underworld_items/locale/template.txt @@ -31,6 +31,10 @@ 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 ### @@ -61,3 +65,7 @@ Slade Brick= Slade Sand= Slade Seal= Slade Wall= + +### slade_drill.lua ### + +Slade Drill= diff --git a/df_underworld_items/puzzle_seal.lua b/df_underworld_items/puzzle_seal.lua index 8715a28..90e853a 100644 --- a/df_underworld_items/puzzle_seal.lua +++ b/df_underworld_items/puzzle_seal.lua @@ -1,4 +1,4 @@ -local S = df_underworld_items.S +local S = minetest.get_translator(minetest.get_current_modname()) local named_waypoints_path = minetest.get_modpath("named_waypoints") @@ -357,7 +357,11 @@ local digging_seal_def = { if minetest.get_item_group(below_node.name, "slade") == 0 then tnt_boom({x=pos.x, y=pos.y-2, z=pos.z}, {radius=3}) - minetest.set_node(pos, {name=lava_source}) + if df_underworld_items.config.enable_slade_drill then + minetest.item_drop("df_underworld_items:slade_drill", nil, pos) + else + minetest.set_node(pos, {name=lava_source}) + end return end diff --git a/df_underworld_items/settingtypes.txt b/df_underworld_items/settingtypes.txt index 8d921c5..07da5a9 100644 --- a/df_underworld_items/settingtypes.txt +++ b/df_underworld_items/settingtypes.txt @@ -1,3 +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 \ No newline at end of file +dfcaverns_underworld_hunter_statues (Enable hunter statues in the underworld) bool true +dfcaverns_enable_slade_drill (Enable slade drills) bool true \ No newline at end of file diff --git a/df_underworld_items/slade.lua b/df_underworld_items/slade.lua index 7c419c0..9e44b30 100644 --- a/df_underworld_items/slade.lua +++ b/df_underworld_items/slade.lua @@ -1,4 +1,4 @@ -local S = df_underworld_items.S +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") diff --git a/df_underworld_items/slade_drill.lua b/df_underworld_items/slade_drill.lua new file mode 100644 index 0000000..4dd9c26 --- /dev/null +++ b/df_underworld_items/slade_drill.lua @@ -0,0 +1,87 @@ +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 + 1 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", + is_ground_content = false, + groups = {cracky=3, stone=1, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1,creative_breakable=1, building_block=1, material_stone=1}, + sounds = df_dependencies.sound_stone({ footstep = { name = "bedrock2_step", gain = 1 } }), + paramtype = "light", + sunlight_propagates = true, + _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) \ No newline at end of file diff --git a/df_underworld_items/sounds/dfcaverns_slade_drill.ogg b/df_underworld_items/sounds/dfcaverns_slade_drill.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d81473b5d72b761a01a502666a3d8ce12dad13a4 GIT binary patch literal 11722 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