diff --git a/big_webs/init.lua b/big_webs/init.lua index b4bb79c..a540f6a 100644 --- a/big_webs/init.lua +++ b/big_webs/init.lua @@ -1,7 +1,10 @@ local modname = minetest.get_current_modname() local S = minetest.get_translator(modname) -local default_path = minetest.get_modpath("default") +local sound +if df_dependencies.sound_leaves then + sound = df_dependencies.sound_leaves() +end local get_node_box = function(connector_thickness) return { @@ -17,15 +20,17 @@ local get_node_box = function(connector_thickness) } end +local anchor_groups = {"group:soil", "group:stone", "group:tree", "group:wood", "group:webbing", "group:solid"} + local in_anchor_group = function(name) - return - minetest.get_item_group(name, "soil") > 0 or - minetest.get_item_group(name, "stone") > 0 or - minetest.get_item_group(name, "tree") > 0 or - minetest.get_item_group(name, "leaves") > 0 or - minetest.get_item_group(name, "sand") > 0 or - minetest.get_item_group(name, "wood") > 0 or - name == "ignore" + for _, group in pairs(anchor_groups) do + if minetest.get_item_group(name, string.sub(group, 7)) then + return true + end + end + if name == "ignore" then + return true + end end local cardinal_directions = { @@ -72,12 +77,6 @@ local get_web_nodes = function(pos, webs, anchors) end end -local sound -if default_path then - sound = default.node_sound_leaves_defaults() -end - - local web_line = function(pos, dir, distance) local anchored local web_spine = {} @@ -128,7 +127,7 @@ minetest.register_node("big_webs:webbing", { {name="big_webs.png"}, }, use_texture_alpha = "blend", - connects_to = {"group:soil", "group:stone", "group:tree", "group:leaves", "group:sand", "group:wood", "group:webbing"}, + connects_to = anchor_groups, connect_sides = { "top", "bottom", "front", "left", "back", "right" }, drawtype = "nodebox", node_box = get_node_box(0.0625), @@ -138,8 +137,7 @@ minetest.register_node("big_webs:webbing", { paramtype = "light", is_ground_content = false, climbable = true, - floodable = true, - groups = {snappy = 2, choppy = 2, webbing = 1, flammable=1, fall_damage_add_percent=-100, bouncy=20}, + groups = {snappy = 2, choppy = 2, webbing = 1, shearsy = 1, swordy=1, flammable=1, destroy_by_lava_flow=1, fall_damage_add_percent=-100, bouncy=20}, sounds = sound, on_construct = function(pos) minetest.get_node_timer(pos):start(30) @@ -168,6 +166,8 @@ minetest.register_node("big_webs:webbing", { minetest.get_node_timer(web_pos):stop() -- no need to recheck end end, + _mcl_blast_resistance = 1.0, + _mcl_hardness = 0.5, }) minetest.register_node("big_webs:web_egg", { @@ -176,7 +176,7 @@ minetest.register_node("big_webs:web_egg", { {name="big_webs.png"}, }, use_texture_alpha = "blend", - connects_to = {"group:soil", "group:stone", "group:tree", "group:leaves", "group:sand", "group:wood", "group:webbing"}, + connects_to = anchor_groups, connect_sides = { "top", "bottom", "front", "left", "back", "right" }, drawtype = "nodebox", node_box = get_node_box(0.0625), @@ -196,4 +196,6 @@ minetest.register_node("big_webs:web_egg", { minetest.set_node(pos, {name="air"}) generate_web(pos) end, + _mcl_blast_resistance = 1.0, + _mcl_hardness = 0.5, }) \ No newline at end of file diff --git a/big_webs/mod.conf b/big_webs/mod.conf index bd7de62..cf1a679 100644 --- a/big_webs/mod.conf +++ b/big_webs/mod.conf @@ -1,2 +1,2 @@ name=big_webs -optional_depends=default \ No newline at end of file +optional_depends=df_dependencies \ No newline at end of file diff --git a/bones_loot/init.lua b/bones_loot/init.lua index 55b5975..2989626 100644 --- a/bones_loot/init.lua +++ b/bones_loot/init.lua @@ -4,6 +4,75 @@ local dungeon_loot_path = minetest.get_modpath("dungeon_loot") bones_loot = {} +local bones_formspec = + "size[8,9]" + .."list[current_name;main;0,0.3;8,4;]" + .."list[current_player;main;0,4.85;8,1;]" + .."list[current_player;main;0,6.08;8,3;8]" + .."listring[current_name;main]" + .."listring[current_player;main]" + ..df_dependencies.get_itemslot_bg(0,0.3,8,4) + ..df_dependencies.get_itemslot_bg(0,4.85,8,1) + ..df_dependencies.get_itemslot_bg(0,6.08,8,3) +if minetest.get_modpath("default") then + bones_formspec = bones_formspec .. default.get_hotbar_bg(0,4.85) +end + +if minetest.get_modpath("bones") then + df_dependencies.node_name_bones = "bones:bones" +else + + local function drop_item_stack(pos, stack) + if not stack or stack:is_empty() then return end + local drop_offset = vector.new(math.random() - 0.5, 0, math.random() - 0.5) + minetest.add_item(vector.add(pos, drop_offset), stack) + end + + minetest.register_node("bones_loot:bones", { + description = S("Bones"), + tiles = { + "bones_top.png^[transform2", + "bones_bottom.png", + "bones_side.png", + "bones_side.png", + "bones_rear.png", + "bones_front.png" + }, + paramtype2 = "facedir", + groups = {oddly_diggable_by_hand=1, handy=1, container=2}, + sounds = df_dependencies.sound_gravel(), + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + can_dig = function(pos, player) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("main") + end, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", bones_formspec) + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + + on_blast = function(pos, intensity) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for i = 1, inv:get_size("main") do + drop_item_stack(pos, inv:get_stack("main", i)) + end + meta:from_table() + minetest.remove_node(pos) + if math.random(1, math.floor((intensity or 1) * 2)) ~= 1 then return end + drop_item_stack(pos, "bones_loot:bones") + end + }) + + df_dependencies.node_name_bones = "bones_loot:bones" +end + +local bones_node = df_dependencies.node_name_bones + local local_loot = {} local local_loot_register = function(t) if t.name ~= nil then @@ -104,19 +173,8 @@ bones_loot.get_loot = function(pos, loot_type, max_stacks, exclusive_loot_type) return items end -local bones_formspec = - "size[8,9]" .. - "list[current_name;main;0,0.3;8,4;]" .. - "list[current_player;main;0,4.85;8,1;]" .. - "list[current_player;main;0,6.08;8,3;8]" .. - "listring[current_name;main]" .. - "listring[current_player;main]" -if minetest.get_modpath("default") then - bones_formspec = bones_formspec .. default.get_hotbar_bg(0,4.85) -end - bones_loot.place_bones = function(pos, loot_type, max_stacks, infotext, exclusive_loot_type) - minetest.set_node(pos, {name="bones:bones", param2 = math.random(1,4)-1}) + minetest.set_node(pos, {name=bones_node, param2 = math.random(1,4)-1}) local meta = minetest.get_meta(pos) if infotext == nil then infotext = S("Someone's old bones") @@ -137,7 +195,7 @@ end minetest.register_lbm({ label = "Repair underworld bones formspec", name = "bones_loot:repair_underworld_bones_formspec", - nodenames = {"bones:bones"}, + nodenames = {bones_node}, action = function(pos, node) local meta = minetest.get_meta(pos) if not meta:get("formspec") then diff --git a/bones_loot/locale/bones_loot.de.tr b/bones_loot/locale/bones_loot.de.tr index 421bce3..4ab0196 100644 --- a/bones_loot/locale/bones_loot.de.tr +++ b/bones_loot/locale/bones_loot.de.tr @@ -3,5 +3,17 @@ ### init.lua ### +# textdomain: bones +Bones=Knochen #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE Someone's old bones=Jemandes alte Knochen + + +##### not used anymore ##### + +@1's old bones=Alte Knochen von @1 +@1 died at @2.=@1 starb bei @2. +@1 died at @2, and dropped their inventory.=@1 starb bei @2 und ließ das Inventar fallen. +@1 died at @2, and bones were placed.=@1 starb bei @2 und Knochen wurden platziert. +@1's fresh bones=Frische Knochen von @1 +@1's bones=Knochen von @1 diff --git a/bones_loot/locale/bones_loot.eo.tr b/bones_loot/locale/bones_loot.eo.tr new file mode 100644 index 0000000..442ee78 --- /dev/null +++ b/bones_loot/locale/bones_loot.eo.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Ostoj +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=La malfreŝaj ostoj de @1 +@1 died at @2.=@1 mortis ĉe @2 +@1 died at @2, and dropped their inventory.=@1 mortis ĉe @2, kaj delasis sian stokon. +@1 died at @2, and bones were placed.=@1 mortis ĉe @2, kaj ostoj estas demetitaj. +@1's fresh bones=La freŝaj ostoj de @1 +@1's bones=La ostoj de @1 diff --git a/bones_loot/locale/bones_loot.es.tr b/bones_loot/locale/bones_loot.es.tr new file mode 100644 index 0000000..d652865 --- /dev/null +++ b/bones_loot/locale/bones_loot.es.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Huesos +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=Huesos antiguos de @1 +@1 died at @2.=@1 murió en @2. +@1 died at @2, and dropped their inventory.=@1 murió en @2, y su inventario se desprendió. +@1 died at @2, and bones were placed.=@1 murió en @2, y sus huesos fueron depositados. +@1's fresh bones=Huesos recientes de @1 +@1's bones=Huesos de @1 diff --git a/bones_loot/locale/bones_loot.fr.tr b/bones_loot/locale/bones_loot.fr.tr new file mode 100644 index 0000000..3d0903c --- /dev/null +++ b/bones_loot/locale/bones_loot.fr.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Os +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=Vieux os de @1 +@1 died at @2.=@1 est mort à @2. +@1 died at @2, and dropped their inventory.=@1 est mort à @2 et a laissé tomber son inventaire. +@1 died at @2, and bones were placed.=@1 est mort à @2 et ses os ont été placés. +@1's fresh bones=Os frais de @1 +@1's bones=Os de @1 diff --git a/bones_loot/locale/bones_loot.id.tr b/bones_loot/locale/bones_loot.id.tr new file mode 100644 index 0000000..ab33b9a --- /dev/null +++ b/bones_loot/locale/bones_loot.id.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Tulang +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=Tulang lama @1 +@1 died at @2.=@1 mati di @2. +@1 died at @2, and dropped their inventory.=@1 mati di @2 dan meninggalkan barangnya. +@1 died at @2, and bones were placed.=@1 mati di @2 dan tulangnya diletakkan. +@1's fresh bones=Tulang segar @1 +@1's bones=Tulang @1 diff --git a/bones_loot/locale/bones_loot.it.tr b/bones_loot/locale/bones_loot.it.tr index 4bf356d..161d887 100644 --- a/bones_loot/locale/bones_loot.it.tr +++ b/bones_loot/locale/bones_loot.it.tr @@ -3,5 +3,17 @@ ### init.lua ### +# textdomain: bones +Bones=Ossa #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE Someone's old bones=Le vecchie ossa di qualcuno + + +##### not used anymore ##### + +@1's old bones=Ossa vecchie di @1 +@1 died at @2.=@1 è morto alla posizione @2. +@1 died at @2, and dropped their inventory.=@1 è morto alla posizione @2, e ha lasciato a terra il contenuto del suo inventario. +@1 died at @2, and bones were placed.=@1 è morto alla posizione @2, e vi sono state posizionate delle ossa. +@1's fresh bones=Ossa fresche di @1 +@1's bones=Ossa di @1 diff --git a/bones_loot/locale/bones_loot.ja.tr b/bones_loot/locale/bones_loot.ja.tr new file mode 100644 index 0000000..2355934 --- /dev/null +++ b/bones_loot/locale/bones_loot.ja.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=骨 +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=@1の古い骨 +@1 died at @2.=@1は@2で死亡しました。 +@1 died at @2, and dropped their inventory.=@1は@2で死亡して持ち物を落としました。 +@1 died at @2, and bones were placed.=@1は@2で死亡して骨が残されました。 +@1's fresh bones=@1の新鮮な骨 +@1's bones=@1の骨 diff --git a/bones_loot/locale/bones_loot.jbo.tr b/bones_loot/locale/bones_loot.jbo.tr new file mode 100644 index 0000000..75fabe8 --- /dev/null +++ b/bones_loot/locale/bones_loot.jbo.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=lo bongu gunma +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=.i ti tolci'o ke bongu gunma po'a la'o zo'i.@1.zo'i +@1 died at @2.=.i la'o zo'i.@1.zo'i pu morsi di'o lo me zoi pos.@2.pos. +@1 died at @2, and dropped their inventory.=.i la'o zo'i.@1.zo'i goi ly. pu morsi di'o lo me zoi pos.@2.pos. .ije ly. te farlu lo me le dacti liste po ly. +@1 died at @2, and bones were placed.=.i la'o zo'i.@1.zo'i goi ly. pu morsi di'o lo me zoi pos.@2.pos. .ije lo bongu gunma pu se punji +@1's fresh bones=.i ti cnino ke bongu gunma po'a la'o zo'i.@1.zo'i +@1's bones=.i ti bongu gunma po'a la'o zo'i.@1.zo'i diff --git a/bones_loot/locale/bones_loot.ms.tr b/bones_loot/locale/bones_loot.ms.tr new file mode 100644 index 0000000..931518e --- /dev/null +++ b/bones_loot/locale/bones_loot.ms.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Tulang +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=Tulang lama @1 +@1 died at @2.=@1 mati di @2. +@1 died at @2, and dropped their inventory.=@1 mati di @2, dan menjatuhkan inventorinya. +@1 died at @2, and bones were placed.=@1 mati di @2, dan tulang diletakkan. +@1's fresh bones=Tulang segar @1 +@1's bones=Tulang @1 diff --git a/bones_loot/locale/bones_loot.pl.tr b/bones_loot/locale/bones_loot.pl.tr new file mode 100644 index 0000000..818f0f0 --- /dev/null +++ b/bones_loot/locale/bones_loot.pl.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Kości +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=Stare kości @1 +@1 died at @2.=@1 umarł w @2. +@1 died at @2, and dropped their inventory.=@1 umarł w @2, i upuścił swój ekwipunek. +@1 died at @2, and bones were placed.=@1 umarł w @2, kości zostały położone. +@1's fresh bones=Świeże kości @1 +@1's bones=Kości @1 diff --git a/bones_loot/locale/bones_loot.pt_BR.tr b/bones_loot/locale/bones_loot.pt_BR.tr new file mode 100644 index 0000000..42b81d8 --- /dev/null +++ b/bones_loot/locale/bones_loot.pt_BR.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Ossos +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=Ossos antigos de @1 +@1 died at @2.=@1 morreu em @2. +@1 died at @2, and dropped their inventory.=@1 morreu em @2, e seu inventário foi derrubado. +@1 died at @2, and bones were placed.=@1 morreu em @2, e os ossos foram colocados. +@1's fresh bones=Ossos recentes de @1 +@1's bones=Ossos de @1 diff --git a/bones_loot/locale/bones_loot.ru.tr b/bones_loot/locale/bones_loot.ru.tr new file mode 100644 index 0000000..6aa0c61 --- /dev/null +++ b/bones_loot/locale/bones_loot.ru.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Кости +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=Старые кости @1 +@1 died at @2.=@1 умер в @2. +@1 died at @2, and dropped their inventory.=@1 умер в @2 и потерял содержимое своего инвентаря. +@1 died at @2, and bones were placed.=@1 умер в @2, помещены кости. +@1's fresh bones=новые кости @1 +@1's bones=кости @1 diff --git a/bones_loot/locale/bones_loot.sk.tr b/bones_loot/locale/bones_loot.sk.tr new file mode 100644 index 0000000..c4feb3a --- /dev/null +++ b/bones_loot/locale/bones_loot.sk.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Kosti +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=Staré kosti hráča @1 +@1 died at @2.=@1 zomrel na pozícií @2. +@1 died at @2, and dropped their inventory.=@1 zomrel na pozícií @2 a vysypal svoj inventár. +@1 died at @2, and bones were placed.=@1 zomrel na pozícií @2 a ostali po ňom kosti. +@1's fresh bones=Čerstvé kosti hráča @1 +@1's bones=Kosti hráča @1 diff --git a/bones_loot/locale/bones_loot.sv.tr b/bones_loot/locale/bones_loot.sv.tr new file mode 100644 index 0000000..8be0930 --- /dev/null +++ b/bones_loot/locale/bones_loot.sv.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Ben +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=@1s Gamla ben +@1 died at @2.=@1 dog på @a. +@1 died at @2, and dropped their inventory.=@1 dog på @a, och tappade deras saker. +@1 died at @2, and bones were placed.=@1 dog på @2, och deras ben var placerade. +@1's fresh bones=@1s färska ben +@1's bones=@1s ben diff --git a/bones_loot/locale/bones_loot.uk.tr b/bones_loot/locale/bones_loot.uk.tr new file mode 100644 index 0000000..23b44ac --- /dev/null +++ b/bones_loot/locale/bones_loot.uk.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=Кістки +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=старі кістки @1 +@1 died at @2.=@1 помер в @2. +@1 died at @2, and dropped their inventory.=@1 помер в @2, та загубив вміст свого інвентарю. +@1 died at @2, and bones were placed.=@1 помер в @2, розміщені кістки. +@1's fresh bones=нові кістки @1 +@1's bones=кістки @1 diff --git a/bones_loot/locale/bones_loot.zh_CN.tr b/bones_loot/locale/bones_loot.zh_CN.tr new file mode 100644 index 0000000..73f667f --- /dev/null +++ b/bones_loot/locale/bones_loot.zh_CN.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=骨骸 +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=@1的旧骨骸 +@1 died at @2.=@1在@2死亡。 +@1 died at @2, and dropped their inventory.=@1在@2死亡,丢掉了所有物品。 +@1 died at @2, and bones were placed.=@1在@2死亡,已放置骨骸。 +@1's fresh bones=@1的新鲜骨骸 +@1's bones=@1的骨骸 diff --git a/bones_loot/locale/bones_loot.zh_TW.tr b/bones_loot/locale/bones_loot.zh_TW.tr new file mode 100644 index 0000000..61384c4 --- /dev/null +++ b/bones_loot/locale/bones_loot.zh_TW.tr @@ -0,0 +1,18 @@ +# textdomain: bones_loot + + +### init.lua ### + +# textdomain: bones +Bones=骨骸 +Someone's old bones= + + +##### not used anymore ##### + +@1's old bones=@1的舊骨骸 +@1 died at @2.=@1在@2死亡。 +@1 died at @2, and dropped their inventory.=@1在@2死亡,丟掉了物品欄。 +@1 died at @2, and bones were placed.=@1在@2死亡,骨骸被放置。 +@1's fresh bones=@1的新鮮骨骸 +@1's bones=@1的骨骸 diff --git a/bones_loot/locale/template.txt b/bones_loot/locale/template.txt index 078e9d0..7857136 100644 --- a/bones_loot/locale/template.txt +++ b/bones_loot/locale/template.txt @@ -3,4 +3,6 @@ ### init.lua ### +# textdomain: bones +Bones= Someone's old bones= diff --git a/bones_loot/mod.conf b/bones_loot/mod.conf index 06368e3..7591e25 100644 --- a/bones_loot/mod.conf +++ b/bones_loot/mod.conf @@ -1,4 +1,4 @@ name = bones_loot description = An API that allows bones to be placed procedurally with randomly generated loot -depends = bones -optional_depends = dungeon_loot, default \ No newline at end of file +depends = df_dependencies +optional_depends = dungeon_loot, bones \ No newline at end of file diff --git a/bones_loot/textures/bones_bottom.png b/bones_loot/textures/bones_bottom.png new file mode 100644 index 0000000..d3d5d32 Binary files /dev/null and b/bones_loot/textures/bones_bottom.png differ diff --git a/bones_loot/textures/bones_front.png b/bones_loot/textures/bones_front.png new file mode 100644 index 0000000..1617d8f Binary files /dev/null and b/bones_loot/textures/bones_front.png differ diff --git a/bones_loot/textures/bones_license.txt b/bones_loot/textures/bones_license.txt new file mode 100644 index 0000000..fe52584 --- /dev/null +++ b/bones_loot/textures/bones_license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2012-2016 Various Minetest developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2016 paramat + +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. + diff --git a/bones_loot/textures/bones_rear.png b/bones_loot/textures/bones_rear.png new file mode 100644 index 0000000..05ee2a1 Binary files /dev/null and b/bones_loot/textures/bones_rear.png differ diff --git a/bones_loot/textures/bones_side.png b/bones_loot/textures/bones_side.png new file mode 100644 index 0000000..c8ac505 Binary files /dev/null and b/bones_loot/textures/bones_side.png differ diff --git a/bones_loot/textures/bones_top.png b/bones_loot/textures/bones_top.png new file mode 100644 index 0000000..63786da Binary files /dev/null and b/bones_loot/textures/bones_top.png differ diff --git a/chasms/init.lua b/chasms/init.lua index ef59a71..1429926 100644 --- a/chasms/init.lua +++ b/chasms/init.lua @@ -78,6 +78,11 @@ end local c_air = minetest.get_content_id("air") local c_web +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + local big_webs_path = minetest.get_modpath("big_webs") if big_webs_path then c_web = minetest.get_content_id("big_webs:webbing") @@ -145,13 +150,16 @@ minetest.register_on_generated(function(minp, maxp, seed) webs = webs or calculate_web_array(minp, maxp) -- only calculate webs when we know we're in a chasm if webs[y + z*z_displace] and math.random() < 0.85 then -- random holes in the web data[i] = c_web - minetest.get_node_timer({x=x,y=y,z=z}):start(1) -- this timer will check for unsupported webs + local web_pos = vector.new(x,y,z) + minetest.get_node_timer(web_pos):start(1) -- this timer will check for unsupported webs + if log_location then log_location("chasm_web", web_pos) end else data[i] = c_air end else data[i] = c_air end + if log_location then log_location("chasm", vector.new(x,y,z)) end end end end diff --git a/df_achievements/dig.lua b/df_achievements/dig.lua new file mode 100644 index 0000000..4e9a9d9 --- /dev/null +++ b/df_achievements/dig.lua @@ -0,0 +1,164 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local steel_pick = df_dependencies.texture_tool_steelpick +local steel_shovel = df_dependencies.texture_tool_steelshovel + +local crossed_pick_and_shovel = "((("..steel_shovel.."^[transformFX)^"..steel_pick..")^[resize:32x32)" + +local gas_seep = "(("..df_dependencies.texture_stone.."^"..df_dependencies.texture_mineral_coal.."^[combine:16x80:0,-16=crack_anylength.png)^[resize:32x32)" + +awards.register_achievement("dfcaverns_destroyed_gas_seep", { + title = S("Destroy a Gas Seep"), + description = S("Plug a crack that mine gas is seeping out of to make the caves just a little bit safer."), + icon = "dfcaverns_awards_backgroundx32.png^" .. gas_seep .."^dfcaverns_awards_foregroundx32.png", + difficulty = 2, + trigger = { + type = "dig", + node = "mine_gas:gas_seep", + target = 1 + }, +}) + +awards.register_achievement("dfcaverns_giant_web", { + title = S("Collect Giant Webbing"), + description = S("Collect a piece of giant webbing found in a cave."), + icon ="dfcaverns_awards_backgroundx32.png^big_webs_item.png^dfcaverns_awards_foregroundx32.png", + difficulty = 1, + trigger = { + type = "dig", + node = "big_webs:webbing", + target = 1 + }, +}) + +-- too common +--awards.register_achievement("dfcaverns_glow_worms", { +-- title = S("Collect Glow Worms"), +-- description = S(""), +-- icon =, +-- trigger = { +-- type = "dig", +-- node = "df_mapitems:glow_worm", +-- target = 1 +-- }, +--}) + +--------------------------------------------------------------- + +awards.register_achievement("dfcaverns_cave_pearls", { + title = S("Collect Cave Pearls"), + description = S("Collect some cave pearls from the wall of a cave."), + icon = "dfcaverns_awards_backgroundx32.png^dfcaverns_cave_pearls_achievement.png^dfcaverns_awards_foregroundx32.png", + difficulty = 1, + trigger = { + type = "dig", + node = "df_mapitems:cave_pearls", + target = 1 + }, + _dfcaverns_achievements = {"dfcaverns_prospector"}, +}) + +awards.register_achievement("dfcaverns_castle_coral", { + title = S("Collect Castle Coral"), + description = S("Collect a piece of Castle Coral from the Sunless Sea."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_castle_coral_achievement.png^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "dig", + node = "df_mapitems:castle_coral", + target = 1 + }, + difficulty = 2, + _dfcaverns_achievements = {"dfcaverns_prospector"}, +}) + +awards.register_achievement("dfcaverns_ruby_crystals", { + title = S("Collect Giant Red Crystal"), + description = S("Collect one of the giant red crystals found in large barren caverns."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_big_red_crystal_achievement.png^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "dig", + node = "group:dfcaverns_big_crystal", + target = 1 + }, + difficulty = 1, + _dfcaverns_achievements = {"dfcaverns_prospector"}, +}) + +awards.register_achievement("dfcaverns_cave_coral", { + title = S("Collect Cave Coral"), + description = S("Collect a piece of Cave Coral from the Sunless Sea."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_cave_coral_achievement.png^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "dig", + node = "group:dfcaverns_cave_coral", + target = 1 + }, + difficulty = 1, + _dfcaverns_achievements = {"dfcaverns_prospector"}, +}) + +awards.register_achievement("dfcaverns_flawless_mese", { + title = S("Collect Flawless Mese Crystal Block"), + description = S("Collect a flawless Mese crystal block from the Magma Sea."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_glowmese_achievement.png^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "dig", + node = "df_mapitems:glow_mese", + target = 1 + }, + difficulty = 3, + _dfcaverns_achievements = {"dfcaverns_prospector"}, +}) + +awards.register_achievement("dfcaverns_luminous_salt", { + title = S("Collect Luminous Salt Crystal"), + description = S("Collect a luminous salt crystal from the dry caverns where Bloodthorns live."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_salt_achievement.png^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "dig", + node = "df_mapitems:salt_crystal", + target = 1 + }, + difficulty = 1, + _dfcaverns_achievements = {"dfcaverns_prospector"}, +}) + +awards.register_achievement("dfcaverns_glow_amethyst", { + title = S("Collect Glowing Amethyst"), + description = S("Collect a block of glowing amethyst crystal from the Underworld."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_amethyst_achievement.png^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "dig", + node = "df_underworld_items:glow_amethyst", + target = 1 + }, + difficulty = 2, + _dfcaverns_achievements = {"dfcaverns_prospector"}, +}) + +awards.register_achievement("dfcaverns_glow_stone", { + title = S('"Collect" Lightseam Stone'), + description = S("Attempt to collect a piece of Lightseam, a strange glowing mineral found deep underground."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_glowstone_achievement.png^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "dig", + node = "df_underworld_items:glowstone", + target = 1 + }, + difficulty = 2, + _dfcaverns_achievements = {"dfcaverns_prospector"}, +}) + +------------------------------------------------------------------ + +awards.register_achievement("dfcaverns_prospector", { + title = S("Deep Prospector"), + description = S("Collect various different exotic items from various caverns."), + icon = "dfcaverns_awards_backgroundx32.png^"..crossed_pick_and_shovel.."^dfcaverns_awards_foregroundx32.png", + difficulty = 3 / df_achievements.get_child_achievement_count("dfcaverns_prospector"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_prospector", + target=df_achievements.get_child_achievement_count("dfcaverns_prospector"), + }, +}) diff --git a/df_achievements/farming.lua b/df_achievements/farming.lua new file mode 100644 index 0000000..b0d8455 --- /dev/null +++ b/df_achievements/farming.lua @@ -0,0 +1,153 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local nethercap_name = df_dependencies.nethercap_name + +local hoe_texture = df_dependencies.texture_tool_steelhoe +local soil_texture = df_dependencies.texture_farming_soil +local ice_texture = df_dependencies.texture_ice +local coal_ore = "(".. df_dependencies.texture_stone .."^".. df_dependencies.texture_mineral_coal ..")" + +local make_texture = function(plant_texture, bg_tex) + bg_tex = bg_tex or soil_texture + return "dfcaverns_awards_backgroundx32.png^[combine:32x32:3,4="..bg_tex.."^[combine:32x32:3,2="..plant_texture.."^[combine:32x32:14,13="..hoe_texture.."^dfcaverns_awards_foregroundx32.png" +end + +-- forestry + +local plant_node_achievements = +{ + ["df_trees:black_cap_sapling"] = {achievement="dfcaverns_plant_black_cap", + title=S("Plant Black Cap"), icon=make_texture("dfcaverns_black_cap_sapling.png", coal_ore), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:fungiwood_sapling"] = {achievement="dfcaverns_plant_fungiwood", + title=S("Plant Fungiwood"), icon=make_texture("dfcaverns_fungiwood_sapling.png"), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:goblin_cap_sapling"] = {achievement="dfcaverns_plant_goblin_cap", + title=S("Plant Goblin Cap"), icon=make_texture("dfcaverns_goblin_cap_sapling.png"), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:nether_cap_sapling"] = {achievement="dfcaverns_plant_nethercap", + title=S("Plant @1", nethercap_name), icon=make_texture("dfcaverns_nether_cap_sapling.png", ice_texture), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:spore_tree_sapling"] = {achievement="dfcaverns_plant_spore_tree", + title=S("Plant Spore Tree"), icon=make_texture("dfcaverns_spore_tree_sapling.png"), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:tower_cap_sapling"] = {achievement="dfcaverns_plant_tower_cap", + title=S("Plant Tower Cap"), icon=make_texture("dfcaverns_tower_cap_sapling.png"), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:tunnel_tube_sapling"] = {achievement="dfcaverns_plant_tunnel_tube", + title=S("Plant Tunnel Tube"), icon=make_texture("dfcaverns_tunnel_tube_sapling.png"), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:torchspine_ember"] = {achievement="dfcaverns_plant_torchspine", + title=S("Plant Torchspine"), icon=make_texture("dfcaverns_torchspine_achievement.png", coal_ore), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:spindlestem_seedling"] = {achievement="dfcaverns_plant_spindlestem", + title=S("Plant Spindlestem"), icon=make_texture("dfcaverns_spindlestem_achievement.png"), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_trees:blood_thorn"] = {achievement="dfcaverns_plant_bloodthorn", + title=S("Plant Bloodthorn"), icon=make_texture("dfcaverns_bloodthorn_achievement.png"), _dfcaverns_achievements={"dfcaverns_plant_all_upper_trees", "dfcaverns_plant_all_underground_trees"}, difficulty = 1,}, + ["df_primordial_items:giant_hypha_apical_meristem"] = {achievement="dfcaverns_plant_giant_mycelium", + title=S("Plant Primordial Mycelium"), icon=make_texture("dfcaverns_mush_soil.png"), secret = true, _dfcaverns_achievements={"dfcaverns_plant_all_primordial", "dfcaverns_plant_all_underground_trees"}, difficulty = 3,}, + ["df_primordial_items:fern_sapling"] = {achievement="dfcaverns_plant_primordial_fern", + title=S("Plant Primordial Fern"), icon=make_texture("dfcaverns_jungle_fern_03.png"), secret = true, _dfcaverns_achievements={"dfcaverns_plant_all_primordial", "dfcaverns_plant_all_underground_trees"}, difficulty = 3,}, + ["df_primordial_items:jungle_mushroom_sapling"] = {achievement="dfcaverns_plant_primordial_jungle_mushroom", + title=S("Plant Primordial Jungle Mushroom"), icon=make_texture("dfcaverns_jungle_mushroom_02.png"), secret = true, _dfcaverns_achievements={"dfcaverns_plant_all_primordial", "dfcaverns_plant_all_underground_trees"}, difficulty = 3,}, + ["df_primordial_items:jungletree_sapling"] = {achievement="dfcaverns_plant_primordial_jungletree", + title=S("Plant Primordial Jungle Tree"), icon=make_texture("dfcaverns_jungle_sapling.png"), secret = true, _dfcaverns_achievements={"dfcaverns_plant_all_primordial", "dfcaverns_plant_all_underground_trees"}, difficulty = 3,}, + ["df_primordial_items:mush_sapling"] = {achievement="dfcaverns_plant_primordial_mushroom", + title=S("Plant Primordial Mushroom"), icon=make_texture("dfcaverns_mush_sapling.png"), secret = true, _dfcaverns_achievements={"dfcaverns_plant_all_primordial", "dfcaverns_plant_all_underground_trees"}, difficulty = 3,}, + ["df_farming:cave_wheat_seed"] = {achievement="dfcaverns_plant_cave_wheat", + title=S("Plant Cave Wheat"), icon=make_texture("dfcaverns_cave_wheat_8.png"), _dfcaverns_achievements={"dfcaverns_plant_all_farmables"}, difficulty = 1,}, + ["df_farming:dimple_cup_seed"] = {achievement="dfcaverns_plant_dimple_cup", + title=S("Plant Dimple Cup"), icon=make_texture("dfcaverns_dimple_cup_4.png"), _dfcaverns_achievements={"dfcaverns_plant_all_farmables"}, difficulty = 1,}, + ["df_farming:pig_tail_seed"] = {achievement="dfcaverns_plant_pig_tail", + title=S("Plant Pig Tail"), icon=make_texture("dfcaverns_pig_tail_8.png"), _dfcaverns_achievements={"dfcaverns_plant_all_farmables"}, difficulty = 1,}, + ["df_farming:plump_helmet_spawn"] = {achievement="dfcaverns_plant_plump_helmet", + title=S("Plant Plump Helmet"), icon=make_texture("dfcaverns_plump_helmet_achievement.png"), _dfcaverns_achievements={"dfcaverns_plant_all_farmables"}, difficulty = 1,}, + ["df_farming:quarry_bush_seed"] = {achievement="dfcaverns_plant_quarry_bush", + title=S("Plant Quarry Bush"), icon=make_texture("dfcaverns_quarry_bush_5.png"), _dfcaverns_achievements={"dfcaverns_plant_all_farmables"}, difficulty = 1,}, + ["df_farming:sweet_pod_seed"] = {achievement="dfcaverns_plant_sweet_pod", + title=S("Plant Sweet Pod"), icon=make_texture("dfcaverns_sweet_pod_6.png"), _dfcaverns_achievements={"dfcaverns_plant_all_farmables"}, difficulty = 1,}, +} + +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) + local player_name = placer:get_player_name() + if player_name == nil then return end + local player_awards = awards.player(player_name) + local achievement = plant_node_achievements[newnode.name] + if not achievement then return end + local achievement_name = achievement.achievement + if not player_awards.unlocked or player_awards.unlocked[achievement_name] ~= achievement_name then + -- all of the growable plants in DFCaverns are timer-based. If you place + -- a seedling or seed and the resulting node has a timer running, then + -- it's passed the checks to see if it was placed in a growable area. + if minetest.get_node_timer(pos):is_started() then + awards.unlock(player_name, achievement_name) + end + end +end) + +for seed_item, def in pairs(plant_node_achievements) do + awards.register_achievement(def.achievement, { + title = def.title, + description = S("Plant a @1 in a place where it can grow.", minetest.registered_items[seed_item].description), + icon = def.icon, + secret = def.secret, + _dfcaverns_achievements = def._dfcaverns_achievements, + }) +end + +awards.register_achievement("dfcaverns_plant_all_upper_trees", { + title = S("Fungal Arborist"), + description = S("Plant one of every kind of 'tree' found in the caverns above the Sunless Sea."), + icon = "dfcaverns_awards_backgroundx32.png^" + .."(dfcaverns_awards_cavern_towercapx32.png^dfcaverns_awards_cavern_fungiwoodx32.png^dfcaverns_awards_cavern_goblincapx32.png)^[transformFX" + .."^[combine:32x32:16,15="..hoe_texture.."^dfcaverns_awards_foregroundx32.png", + difficulty = 1 / df_achievements.get_child_achievement_count("dfcaverns_plant_all_upper_trees"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_plant_all_upper_trees", + target=df_achievements.get_child_achievement_count("dfcaverns_plant_all_upper_trees"), + }, +}) + +awards.register_achievement("dfcaverns_plant_all_primordial", { + title = S("Primordial Arborist"), + description = S("Plant one of every kind of 'tree' from the Primordial caverns."), + icon = "dfcaverns_awards_backgroundx32.png^" + .."(dfcaverns_awards_cavern_primordial_mushx32.png^dfcaverns_awards_cavern_junglex32.png)^[transformFX" + .."^[combine:32x32:16,15="..hoe_texture.."^dfcaverns_awards_foregroundx32.png", + secret = true, + difficulty = 3 / df_achievements.get_child_achievement_count("dfcaverns_plant_all_primordial"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_plant_all_primordial", + target=df_achievements.get_child_achievement_count("dfcaverns_plant_all_primordial"), + }, +}) + +awards.register_achievement("dfcaverns_plant_all_underground_trees", { + title = S("Underground Arborist"), + description = S("Plant one of every kind of 'tree' found in the caverns beneath the surface."), + icon = "dfcaverns_awards_backgroundx32.png^" + .."(dfcaverns_awards_cavern_towercapx32.png^dfcaverns_awards_cavern_fungiwoodx32.png^dfcaverns_awards_cavern_goblincapx32.png)^[transformFX" + .. "^dfcaverns_awards_cavern_primordial_mushx32.png^dfcaverns_awards_cavern_junglex32.png" + .."^[combine:32x32:16,15="..hoe_texture.."^dfcaverns_awards_foregroundx32.png", + difficulty = 4 / df_achievements.get_child_achievement_count("dfcaverns_plant_all_underground_trees"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_plant_all_underground_trees", + target=df_achievements.get_child_achievement_count("dfcaverns_plant_all_underground_trees"), + }, +}) + +awards.register_achievement("dfcaverns_plant_all_farmables", { + title = S("Underground Farmer"), + description = S("Plant one of every kind of small farmable plant found in the caverns beneath the surface."), + icon = "dfcaverns_awards_backgroundx32.png" + .."^[combine:32x32:0,0="..soil_texture + .."^[combine:32x32:0,16="..soil_texture + .."^[combine:32x32:16,0="..soil_texture + .."^[combine:32x32:16,16="..soil_texture + .."^[combine:32x32:0,0=dfcaverns_cave_wheat_8.png" + .."^[combine:32x32:16,0=dfcaverns_dimple_cup_4.png" + .."^[combine:32x32:8,8=dfcaverns_plump_helmet_achievement.png" + .."^[combine:32x32:0,16=dfcaverns_sweet_pod_6.png" + .."^[combine:32x32:16,16=dfcaverns_quarry_bush_5.png" + .."^[combine:32x32:16,15="..hoe_texture.."^dfcaverns_awards_foregroundx32.png", + difficulty = 1 / df_achievements.get_child_achievement_count("dfcaverns_plant_all_farmables"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_plant_all_farmables", + target=df_achievements.get_child_achievement_count("dfcaverns_plant_all_farmables"), + }, +}) \ No newline at end of file diff --git a/df_achievements/food.lua b/df_achievements/food.lua new file mode 100644 index 0000000..c1092f3 --- /dev/null +++ b/df_achievements/food.lua @@ -0,0 +1,88 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +for itemname, def in pairs(minetest.registered_items) do + --"df_farming:"..item_name.."_"..recipe_type.name.."_meal" + if string.sub(itemname, 1, 11) == "df_farming:" and string.sub(itemname, -5, -1) == "_meal" then + local meal_name = string.sub(itemname, 12, -1) + local meal_desc = def.description + local image = string.sub(def.inventory_image, 1, -7) .. "32.png" + + awards.register_achievement("dfcaverns_meal_"..meal_name, { + title = S("Eat @1", meal_desc), + description = S("One of the many delights that can be crafted only from fungal growths found deep underground."), + icon = "dfcaverns_awards_backgroundx32.png^" .. image .. "^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "eat", + item = itemname, + target = 1 + }, + difficulty = 2, + _dfcaverns_achievements = {"dfcaverns_gourmand"}, + }) + end +end + +local bread_def = minetest.registered_items["df_farming:cave_bread"] +awards.register_achievement("dfcaverns_meal_dwarven_bread", { + title = S("Eat @1", bread_def.description), + description = S("It's a basic staple of the underground, but at least it's not Plump Helmet."), + icon = "dfcaverns_awards_backgroundx32.png^dfcaverns_prepared_food13x32.png^dfcaverns_awards_foregroundx32.png", + trigger = { + type = "eat", + item = "df_farming:cave_bread", + target = 1, + }, + difficulty = 1, + _dfcaverns_achievements = {"dfcaverns_gourmand"}, +}) + +awards.register_achievement("dfcaverns_gourmand", { + title = S("Dwarven Gourmand"), + description = S("Eat one of each of the various meals that can be cooked or crafted from underground ingredients."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_prepared_food28x32.png^dfcaverns_gourmand_achievement.png^dfcaverns_awards_foregroundx32.png", + difficulty = 2 / df_achievements.get_child_achievement_count("dfcaverns_gourmand"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_gourmand", + target=df_achievements.get_child_achievement_count("dfcaverns_gourmand"), + }, +}) + +if minetest.get_modpath("df_primordial_items") then + awards.register_achievement("dfcaverns_primordial_fruit", { + title = S("Eat a Primordial Fruit"), + description = S("Eat one of the strange fruits found only deep underground in the Primordial caverns."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_primordial_fruit.png^dfcaverns_awards_foregroundx32.png", + difficulty = 3, + trigger = { + type = "eat", + item = "df_primordial_items:primordial_fruit", + target = 1 + }, + secret = true, + }) + + awards.register_achievement("dfcaverns_glowtato", { + title = S("Eat a Glowtato"), + description = S("Slightly less prestigious than the Primordial Fruit, but still rare and exotic compared to surface world fare."), + icon ="dfcaverns_awards_backgroundx32.png^dfcaverns_glowtato.png^dfcaverns_awards_foregroundx32.png", + difficulty = 3, + trigger = { + type = "eat", + item = "df_primordial_items:glowtato", + target = 1 + }, + }) + +-- too mundane compared to the other achievements +-- awards.register_achievement("dfcaverns_diced_mushroom", { +-- title = S("Eat Diced Mushroom"), +-- description = S(""), +-- icon =, +-- trigger = { +-- type = "eat", +-- item = "df_primordial_items:diced_mushroom", +-- target = 1 +-- }, +-- }) +end \ No newline at end of file diff --git a/df_achievements/init.lua b/df_achievements/init.lua new file mode 100644 index 0000000..b38cc4e --- /dev/null +++ b/df_achievements/init.lua @@ -0,0 +1,102 @@ +if not minetest.get_modpath("awards") then + minetest.log("warning", "[df_achievements] the df_achievements mod was installed but the [awards] mod was not." + .. " df_achievements depends on awards, but it is listed as an optional dependency so that installing the" + .. " dfcaverns modpack won't automatically enable it. If you want df_achievements to function please" + .. " install awards as well, otherwise you should disable df_achievements.") + return +end + +df_achievements = {} + +local old_awards_version = false +if awards.run_trigger_callbacks then + -- older versions of awards crash when attempting to use newer versions of triggers + -- this "run_trigger_callbacks" API call is present in those older versions, so using that + -- as a fingerprint to discover them + old_awards_version = true + + minetest.register_on_dignode(function(pos, oldnode, digger) + -- the old version of awards doesn't handle groups when triggering dug nodes, use this to hack around that + local node_name = oldnode.name + if minetest.get_item_group(node_name, "dfcaverns_big_crystal") > 0 then + awards.unlock(digger:get_player_name(), "dfcaverns_ruby_crystals") + elseif minetest.get_item_group(node_name, "dfcaverns_cave_coral") > 0 then + awards.unlock(digger:get_player_name(), "dfcaverns_cave_coral") + end + end) +else + -- used to track the progress of achievements that are based off of other achievements + awards.register_trigger("dfcaverns_achievements", { + type="counted_key", + progress = "@1/@2", -- awards seems to use a conflicting syntax with internationalization, ick. Avoid words here. + get_key = function(self, def) + return def.trigger.achievement_name + end, + }) +end + + +local achievement_parents = {} +df_achievements.get_child_achievement_count = function(parent_achievement) + return #achievement_parents[parent_achievement] +end + +local register_achievement_old = awards.register_achievement +awards.register_achievement = function(achievement_name, achievement_def, ...) + if old_awards_version and achievement_def.trigger and achievement_def.trigger.type=="dfcaverns_achievements" then + -- there's a significant difference between how triggers work + -- in older versions of the awards mod. The new version of the trigger doesn't + -- work with the old. Rather than do a bunch of work to support old versions, strip them out. + achievement_def.trigger = nil + end + + -- The achievement being registered has "parent" achievements that progress when it is unlocked, + -- track that here + if achievement_def._dfcaverns_achievements then + for _, parent_achievement in pairs(achievement_def._dfcaverns_achievements) do + local parent_source_list = achievement_parents[parent_achievement] or {} + achievement_parents[parent_achievement] = parent_source_list + table.insert(parent_source_list, achievement_name) + end + end + + register_achievement_old(achievement_name, achievement_def, ...) +end + +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +awards.register_on_unlock(function(player_name, def) + local def_dfcaverns_achievements = def._dfcaverns_achievements + if not def_dfcaverns_achievements then return end + local player_awards = awards.player(player_name) + if not player_awards then return end + local unlocked = player_awards.unlocked + if not unlocked then return end + + -- the achievement that just got unlocked had one or more "parent" achievements associated with it. + for _, achievement_parent in pairs(def_dfcaverns_achievements) do + player_awards.dfcaverns_achievements = player_awards.dfcaverns_achievements or {} + local source_list = achievement_parents[achievement_parent] + local total = #source_list + local count = 0 + for _, source_achievement in pairs(source_list) do + if unlocked[source_achievement] == source_achievement then count = count + 1 end + end + player_awards.dfcaverns_achievements[achievement_parent] = count + awards.save() + if count >= total then + minetest.after(4, awards.unlock, player_name, achievement_parent) + end + end +end) + + + +dofile(modpath.."/travel.lua") +dofile(modpath.."/farming.lua") +dofile(modpath.."/dig.lua") +dofile(modpath.."/food.lua") +dofile(modpath.."/misc.lua") + +-- not used outside this mod +df_achievements.test_list = nil \ No newline at end of file diff --git a/df_achievements/locale/template.txt b/df_achievements/locale/template.txt new file mode 100644 index 0000000..83ac323 --- /dev/null +++ b/df_achievements/locale/template.txt @@ -0,0 +1,180 @@ +# textdomain: df_achievements + + +### dig.lua ### + +"Collect" Lightseam Stone= + +Attempt to collect a piece of Lightseam, a strange glowing mineral found deep underground.= + +Collect Castle Coral= +Collect Cave Coral= +Collect Cave Pearls= +Collect Flawless Mese Crystal Block= +Collect Giant Red Crystal= +Collect Giant Webbing= +Collect Glow Worms= +Collect Glowing Amethyst= +Collect Luminous Salt Crystal= + +Collect a block of glowing amethyst crystal from the Underworld.= + +Collect a flawless Mese crystal block from the Magma Sea.= + +Collect a luminous salt crystal from the dry caverns where Bloodthorns live.= + +Collect a piece of Castle Coral from the Sunless Sea.= +Collect a piece of Cave Coral from the Sunless Sea.= +Collect a piece of giant webbing found in a cave.= + +Collect one of the giant red crystals found in large barren caverns.= + +Collect some cave pearls from the wall of a cave.= +Collect various different exotic items from various caverns.= +Deep Prospector= +Destroy a Gas Seep= + +Plug a crack that mine gas is seeping out of to make the caves just a little bit safer.= + + +### dig.lua ### +### food.lua ### +### misc.lua ### + += + +### farming.lua ### + +Fungal Arborist= +Plant @1= +Plant Black Cap= +Plant Bloodthorn= +Plant Cave Wheat= +Plant Dimple Cup= +Plant Fungiwood= +Plant Goblin Cap= +Plant Pig Tail= +Plant Plump Helmet= +Plant Primordial Fern= +Plant Primordial Jungle Mushroom= +Plant Primordial Jungle Tree= +Plant Primordial Mushroom= +Plant Primordial Mycelium= +Plant Quarry Bush= +Plant Spindlestem= +Plant Spore Tree= +Plant Sweet Pod= +Plant Torchspine= +Plant Tower Cap= +Plant Tunnel Tube= +Plant a @1 in a place where it can grow.= + +Plant one of every kind of 'tree' found in the caverns above the Sunless Sea.= + +Plant one of every kind of 'tree' found in the caverns beneath the surface.= + +Plant one of every kind of 'tree' from the Primordial caverns.= + +Plant one of every kind of small farmable plant found in the caverns beneath the surface.= + +Primordial Arborist= +Underground Arborist= +Underground Farmer= + +### food.lua ### + +Dwarven Gourmand= +Eat @1= +Eat Diced Mushroom= +Eat a Glowtato= +Eat a Primordial Fruit= + +Eat one of each of the various meals that can be cooked or crafted from underground ingredients.= + +Eat one of the strange fruits found only deep underground in the Primordial caverns.= + +It's a basic staple of the underground, but at least it's not Plump Helmet.= + +One of the many delights that can be crafted only from fungal growths found deep underground.= + +Slightly less prestigious than the Primordial Fruit, but still rare and exotic compared to surface world fare.= + + +### misc.lua ### + +Activating a puzzle seal has produced a breach in the slade foundations of the world.= + +Capture an Ice Sprite= +Decipher the code of the ancients. Do you dare turn the key?= +Detonate Mine Gas= +Get Attacked by an Underworld Guardian= +Loot 100 Ancient Warrior Bones= +Loot Ancient Warrior Bones= +Punch Veinstone= +Punch a vein to hear the heartbeat of the stone.= +Repair 100 Ancient Lanterns= +Repair an Ancient Lantern= +Solve a Puzzle Seal= +Trigger a Slade Breacher= + +You may not be able to build new ones, but at least you can get the old ones shining brightly again.= + +You've captured an ice sprite and placed it in a bottle. It dances and sparkles and sheds light through the frosted glass while making a faint tinkling sound. Pretty.= + +You've discovered something important about those mysterious slade statues in the Underworld.= + + +### travel.lua ### + +Discover @1s= +Discover All Fungal Cavern Types= +Discover All Overworld Cavern Types= +Discover All Underground Cavern Types= +Discover Black Caps= +Discover Bloodthorns= +Discover Fungiwood= +Discover Goblin Caps= +Discover Spore Trees= +Discover Tower Caps= +Discover Tunnel Tubes= +Discover a Deep Chasm= +Discover a Deep Sinkhole= +Discover a Glowing Pit= +Discover a cavern containing oil deep underground.= +Discover a cavern where @1s grow in the wild.= +Discover a cavern where Black Caps grow in the wild.= +Discover a cavern where Bloodthorns grow in the wild.= +Discover a cavern where Fungiwoods grow in the wild.= +Discover a cavern where Goblin Caps grow in the wild.= +Discover a cavern where Spore Trees grow in the wild.= +Discover a cavern where Tower Caps grow in the wild.= +Discover a cavern where Tunnel Tubes grow in the wild.= +Discover a deep natural sinkhole.= +Discover a gigantic underground natural chasm.= + +Discover a glowing pit in the slade foundations of the world.= + +Discover all Primordial Cavern Types= +Discover all major kinds of giant cavern environment.= + +Discover all of the major types of cavern below the foundations of the world.= + +Discover all of the major types of cavern environments between the Sunless Sea and the foundations of the world.= + +Discover examples of all of the fungal cavern biomes.= +Discover the Magma Sea= +Discover the Oil Sea= +Discover the Primordial Fungus= +Discover the Primordial Jungle= +Discover the Sunless Sea= +Discover the Underworld= + +Discover the ancient caverns at the foundations of the world.= + +Discover the fungus-ridden caverns below the foundations of the world.= + +Discover the giant caverns to which all water from the surface ultimately drain.= + +Discover the lost jungles below the foundations of the world.= + +Discover the sea of magma that volcanoes draw from.= diff --git a/df_achievements/misc.lua b/df_achievements/misc.lua new file mode 100644 index 0000000..e8cd84c --- /dev/null +++ b/df_achievements/misc.lua @@ -0,0 +1,103 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +-- misc +if df_dependencies.node_name_glass_bottle then + awards.register_achievement("dfcaverns_captured_ice_sprite", { + title = S("Capture an Ice Sprite"), + description = S("You've captured an ice sprite and placed it in a bottle. It dances and sparkles and sheds light through the frosted glass while making a faint tinkling sound. Pretty."), + icon = "dfcaverns_awards_backgroundx32.png^ice_sprites_bottle.png^dfcaverns_awards_foregroundx32.png", + difficulty = 2, + trigger = { + type = "craft", + item = "ice_sprites:ice_sprite_bottle", + target = 1, + }, + }) +end + +df_mapitems.on_veinstone_punched = function(pos, node, puncher, pointed_thing) + awards.unlock(puncher:get_player_name(), "dfcaverns_punched_veinstone") +end +awards.register_achievement("dfcaverns_punched_veinstone", { + title = S("Punch Veinstone"), + description = S("Punch a vein to hear the heartbeat of the stone."), + difficulty = 2, + icon = "dfcaverns_awards_backgroundx32.png^((".. df_dependencies.texture_stone .. "^dfcaverns_veins.png)^[resize:32x32)^dfcaverns_awards_foregroundx32.png", +}) + +if minetest.get_modpath("df_underworld_items") then + + if minetest.get_modpath("hunter_statue") then + hunter_statue.player_punched = function(node_name, pos, player) + if node_name ~= "df_underworld_items:hunter_statue" then return end + awards.unlock(player:get_player_name(), "dfcaverns_attacked_by_guardian_statue") + end + awards.register_achievement("dfcaverns_attacked_by_guardian_statue", { + title = S("Get Attacked by an Underworld Guardian"), + difficulty = 2, + description = S("You've discovered something important about those mysterious slade statues in the Underworld."), + icon = "dfcaverns_awards_backgroundx32.png^dfcaverns_guardian_achievement.png^dfcaverns_awards_foregroundx32.png", + secret=true, + }) + end + + df_underworld_items.puzzle_seal_solved = function(pos, player) + if player == nil then return end + awards.unlock(player:get_player_name(), "dfcaverns_solved_puzzle_seal") + end + awards.register_achievement("dfcaverns_solved_puzzle_seal", { + title = S("Solve a Puzzle Seal"), + difficulty = 4, + description = S("Decipher the code of the ancients. Do you dare turn the key?"), + icon = "dfcaverns_puzzle_seal_solvedx32.png^dfcaverns_awards_foregroundx32.png", + }) + + df_underworld_items.slade_breacher_triggered = function(pos, player) + awards.unlock(player:get_player_name(), "dfcaverns_triggered_slade_breacher") + end + awards.register_achievement("dfcaverns_triggered_slade_breacher", { + title = S("Trigger a Slade Breacher"), + difficulty = 1, + description = S("Activating a puzzle seal has produced a breach in the slade foundations of the world."), + icon = "dfcaverns_puzzle_seal_activex32.png^dfcaverns_awards_foregroundx32.png", + secret=true, + }) + + df_underworld_items.ancient_lantern_fixed = function(pos, player) + awards.unlock(player:get_player_name(), "dfcaverns_repaired_lantern") + end + awards.register_achievement("dfcaverns_repaired_lantern", { + title = S("Repair an Ancient Lantern"), + difficulty = 2, + description = S("You may not be able to build new ones, but at least you can get the old ones shining brightly again."), + icon = "dfcaverns_awards_backgroundx32.png^((dfcaverns_slade_brick.png^(" .. df_dependencies.texture_meselamp .. "^[mask:dfcaverns_lantern_mask.png))^[resize:32x32)^dfcaverns_awards_foregroundx32.png", + secret=true, + }) + +-- awards.register_achievement("dfcaverns_repaired_100_lanterns", { +-- title = S("Repair 100 Ancient Lanterns"), +-- description = S(""), +-- icon =, +-- }) + +end + + +-- can't think of an easy way to detect these +--awards.register_achievement("dfcaverns_torch_detonated_mine_gas", { +-- title = S("Detonate Mine Gas"), +-- description = S(""), +-- icon =, +--}) + +--awards.register_achievement("dfcaverns_looted_underworld_bones", { +-- title = S("Loot Ancient Warrior Bones"), +-- description = S(""), +-- icon =, +--}) +-- +--awards.register_achievement("dfcaverns_looted_100_underworld_bones", { +-- title = S("Loot 100 Ancient Warrior Bones"), +-- description = S(""), +-- icon =, +--}) diff --git a/df_achievements/mod.conf b/df_achievements/mod.conf new file mode 100644 index 0000000..11fb8e7 --- /dev/null +++ b/df_achievements/mod.conf @@ -0,0 +1,4 @@ +name=df_achievements +description=Achievements for DFCaverns +depends=df_caverns, df_trees, df_farming, df_mapitems, df_dependencies, pit_caves +optional_depends=df_underworld_items, hunter_statue, awards \ No newline at end of file diff --git a/df_achievements/textures/dfcaverns_amethyst_achievement.png b/df_achievements/textures/dfcaverns_amethyst_achievement.png new file mode 100644 index 0000000..eb865a4 Binary files /dev/null and b/df_achievements/textures/dfcaverns_amethyst_achievement.png differ diff --git a/df_achievements/textures/dfcaverns_awards_backgroundx32.png b/df_achievements/textures/dfcaverns_awards_backgroundx32.png new file mode 100644 index 0000000..2d230fa Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_backgroundx32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_background_platformx32.png b/df_achievements/textures/dfcaverns_awards_cavern_background_platformx32.png new file mode 100644 index 0000000..345fa25 Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_background_platformx32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_background_stalactitex32.png b/df_achievements/textures/dfcaverns_awards_cavern_background_stalactitex32.png new file mode 100644 index 0000000..ed7ad33 Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_background_stalactitex32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_backgroundx32.png b/df_achievements/textures/dfcaverns_awards_cavern_backgroundx32.png new file mode 100644 index 0000000..1007bbc Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_backgroundx32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_blackcapx32.png b/df_achievements/textures/dfcaverns_awards_cavern_blackcapx32.png new file mode 100644 index 0000000..a30ae7b Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_blackcapx32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_bloodthornx32.png b/df_achievements/textures/dfcaverns_awards_cavern_bloodthornx32.png new file mode 100644 index 0000000..8ad53d5 Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_bloodthornx32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_chasmx32.png b/df_achievements/textures/dfcaverns_awards_cavern_chasmx32.png new file mode 100644 index 0000000..88be89f Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_chasmx32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_fungalx32.png b/df_achievements/textures/dfcaverns_awards_cavern_fungalx32.png new file mode 100644 index 0000000..d64f89f Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_fungalx32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_fungiwoodx32.png b/df_achievements/textures/dfcaverns_awards_cavern_fungiwoodx32.png new file mode 100644 index 0000000..e344913 Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_fungiwoodx32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_goblincapx32.png b/df_achievements/textures/dfcaverns_awards_cavern_goblincapx32.png new file mode 100644 index 0000000..49944c1 Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_goblincapx32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_junglex32.png b/df_achievements/textures/dfcaverns_awards_cavern_junglex32.png new file mode 100644 index 0000000..efacb41 Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_junglex32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_lavax32.png b/df_achievements/textures/dfcaverns_awards_cavern_lavax32.png new file mode 100644 index 0000000..cf5b6e7 Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_lavax32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_nethercapx32.png b/df_achievements/textures/dfcaverns_awards_cavern_nethercapx32.png new file mode 100644 index 0000000..6b70104 Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_nethercapx32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_oilx32.png b/df_achievements/textures/dfcaverns_awards_cavern_oilx32.png new file mode 100644 index 0000000..642871c Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_oilx32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_pitx32.png b/df_achievements/textures/dfcaverns_awards_cavern_pitx32.png new file mode 100644 index 0000000..b8bf4b0 Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_pitx32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_primordial_mushx32.png b/df_achievements/textures/dfcaverns_awards_cavern_primordial_mushx32.png new file mode 100644 index 0000000..ae2130b Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_primordial_mushx32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_seax32.png b/df_achievements/textures/dfcaverns_awards_cavern_seax32.png new file mode 100644 index 0000000..8b77f8f Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_seax32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_sporetreesx32.png b/df_achievements/textures/dfcaverns_awards_cavern_sporetreesx32.png new file mode 100644 index 0000000..f8012e7 Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_sporetreesx32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_towercapx32.png b/df_achievements/textures/dfcaverns_awards_cavern_towercapx32.png new file mode 100644 index 0000000..1a41ad2 Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_towercapx32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_tunneltubex32.png b/df_achievements/textures/dfcaverns_awards_cavern_tunneltubex32.png new file mode 100644 index 0000000..c18c05b Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_tunneltubex32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_cavern_underworldx32.png b/df_achievements/textures/dfcaverns_awards_cavern_underworldx32.png new file mode 100644 index 0000000..a9d25f4 Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_cavern_underworldx32.png differ diff --git a/df_achievements/textures/dfcaverns_awards_foregroundx32.png b/df_achievements/textures/dfcaverns_awards_foregroundx32.png new file mode 100644 index 0000000..fbebb9d Binary files /dev/null and b/df_achievements/textures/dfcaverns_awards_foregroundx32.png differ diff --git a/df_achievements/textures/dfcaverns_big_red_crystal_achievement.png b/df_achievements/textures/dfcaverns_big_red_crystal_achievement.png new file mode 100644 index 0000000..4dd585b Binary files /dev/null and b/df_achievements/textures/dfcaverns_big_red_crystal_achievement.png differ diff --git a/df_achievements/textures/dfcaverns_bloodthorn_achievement.png b/df_achievements/textures/dfcaverns_bloodthorn_achievement.png new file mode 100644 index 0000000..6abee2f Binary files /dev/null and b/df_achievements/textures/dfcaverns_bloodthorn_achievement.png differ diff --git a/df_achievements/textures/dfcaverns_castle_coral_achievement.png b/df_achievements/textures/dfcaverns_castle_coral_achievement.png new file mode 100644 index 0000000..3996dee Binary files /dev/null and b/df_achievements/textures/dfcaverns_castle_coral_achievement.png differ diff --git a/df_achievements/textures/dfcaverns_cave_coral_achievement.png b/df_achievements/textures/dfcaverns_cave_coral_achievement.png new file mode 100644 index 0000000..d54fe3e Binary files /dev/null and b/df_achievements/textures/dfcaverns_cave_coral_achievement.png differ diff --git a/df_achievements/textures/dfcaverns_cave_pearls_achievement.png b/df_achievements/textures/dfcaverns_cave_pearls_achievement.png new file mode 100644 index 0000000..f062fe8 Binary files /dev/null and b/df_achievements/textures/dfcaverns_cave_pearls_achievement.png differ diff --git a/df_achievements/textures/dfcaverns_glowmese_achievement.png b/df_achievements/textures/dfcaverns_glowmese_achievement.png new file mode 100644 index 0000000..74fbb33 Binary files /dev/null and b/df_achievements/textures/dfcaverns_glowmese_achievement.png differ diff --git a/df_achievements/textures/dfcaverns_glowstone_achievement.png b/df_achievements/textures/dfcaverns_glowstone_achievement.png new file mode 100644 index 0000000..4286351 Binary files /dev/null and b/df_achievements/textures/dfcaverns_glowstone_achievement.png differ diff --git a/df_achievements/textures/dfcaverns_gourmand_achievement.png b/df_achievements/textures/dfcaverns_gourmand_achievement.png new file mode 100644 index 0000000..c75037f Binary files /dev/null and b/df_achievements/textures/dfcaverns_gourmand_achievement.png differ diff --git a/df_achievements/textures/dfcaverns_guardian_achievement.png b/df_achievements/textures/dfcaverns_guardian_achievement.png new file mode 100644 index 0000000..850f93a Binary files /dev/null and b/df_achievements/textures/dfcaverns_guardian_achievement.png differ diff --git a/df_achievements/textures/dfcaverns_plump_helmet_achievement.png b/df_achievements/textures/dfcaverns_plump_helmet_achievement.png new file mode 100644 index 0000000..50cadfc Binary files /dev/null and b/df_achievements/textures/dfcaverns_plump_helmet_achievement.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food01x32.png b/df_achievements/textures/dfcaverns_prepared_food01x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food01x32.png rename to df_achievements/textures/dfcaverns_prepared_food01x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food02x32.png b/df_achievements/textures/dfcaverns_prepared_food02x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food02x32.png rename to df_achievements/textures/dfcaverns_prepared_food02x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food03x32.png b/df_achievements/textures/dfcaverns_prepared_food03x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food03x32.png rename to df_achievements/textures/dfcaverns_prepared_food03x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food04x32.png b/df_achievements/textures/dfcaverns_prepared_food04x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food04x32.png rename to df_achievements/textures/dfcaverns_prepared_food04x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food05x32.png b/df_achievements/textures/dfcaverns_prepared_food05x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food05x32.png rename to df_achievements/textures/dfcaverns_prepared_food05x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food06x32.png b/df_achievements/textures/dfcaverns_prepared_food06x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food06x32.png rename to df_achievements/textures/dfcaverns_prepared_food06x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food07x32.png b/df_achievements/textures/dfcaverns_prepared_food07x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food07x32.png rename to df_achievements/textures/dfcaverns_prepared_food07x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food08x32.png b/df_achievements/textures/dfcaverns_prepared_food08x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food08x32.png rename to df_achievements/textures/dfcaverns_prepared_food08x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food09x32.png b/df_achievements/textures/dfcaverns_prepared_food09x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food09x32.png rename to df_achievements/textures/dfcaverns_prepared_food09x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food10x32.png b/df_achievements/textures/dfcaverns_prepared_food10x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food10x32.png rename to df_achievements/textures/dfcaverns_prepared_food10x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food11x32.png b/df_achievements/textures/dfcaverns_prepared_food11x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food11x32.png rename to df_achievements/textures/dfcaverns_prepared_food11x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food12x32.png b/df_achievements/textures/dfcaverns_prepared_food12x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food12x32.png rename to df_achievements/textures/dfcaverns_prepared_food12x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food13x32.png b/df_achievements/textures/dfcaverns_prepared_food13x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food13x32.png rename to df_achievements/textures/dfcaverns_prepared_food13x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food14x32.png b/df_achievements/textures/dfcaverns_prepared_food14x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food14x32.png rename to df_achievements/textures/dfcaverns_prepared_food14x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food15x32.png b/df_achievements/textures/dfcaverns_prepared_food15x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food15x32.png rename to df_achievements/textures/dfcaverns_prepared_food15x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food16x32.png b/df_achievements/textures/dfcaverns_prepared_food16x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food16x32.png rename to df_achievements/textures/dfcaverns_prepared_food16x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food17x32.png b/df_achievements/textures/dfcaverns_prepared_food17x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food17x32.png rename to df_achievements/textures/dfcaverns_prepared_food17x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food18x32.png b/df_achievements/textures/dfcaverns_prepared_food18x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food18x32.png rename to df_achievements/textures/dfcaverns_prepared_food18x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food19x32.png b/df_achievements/textures/dfcaverns_prepared_food19x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food19x32.png rename to df_achievements/textures/dfcaverns_prepared_food19x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food20x32.png b/df_achievements/textures/dfcaverns_prepared_food20x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food20x32.png rename to df_achievements/textures/dfcaverns_prepared_food20x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food21x32.png b/df_achievements/textures/dfcaverns_prepared_food21x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food21x32.png rename to df_achievements/textures/dfcaverns_prepared_food21x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food22x32.png b/df_achievements/textures/dfcaverns_prepared_food22x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food22x32.png rename to df_achievements/textures/dfcaverns_prepared_food22x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food23x32.png b/df_achievements/textures/dfcaverns_prepared_food23x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food23x32.png rename to df_achievements/textures/dfcaverns_prepared_food23x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food24x32.png b/df_achievements/textures/dfcaverns_prepared_food24x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food24x32.png rename to df_achievements/textures/dfcaverns_prepared_food24x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food25x32.png b/df_achievements/textures/dfcaverns_prepared_food25x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food25x32.png rename to df_achievements/textures/dfcaverns_prepared_food25x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food26x32.png b/df_achievements/textures/dfcaverns_prepared_food26x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food26x32.png rename to df_achievements/textures/dfcaverns_prepared_food26x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food27x32.png b/df_achievements/textures/dfcaverns_prepared_food27x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food27x32.png rename to df_achievements/textures/dfcaverns_prepared_food27x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food28x32.png b/df_achievements/textures/dfcaverns_prepared_food28x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food28x32.png rename to df_achievements/textures/dfcaverns_prepared_food28x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food29x32.png b/df_achievements/textures/dfcaverns_prepared_food29x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food29x32.png rename to df_achievements/textures/dfcaverns_prepared_food29x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food30x32.png b/df_achievements/textures/dfcaverns_prepared_food30x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food30x32.png rename to df_achievements/textures/dfcaverns_prepared_food30x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food31x32.png b/df_achievements/textures/dfcaverns_prepared_food31x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food31x32.png rename to df_achievements/textures/dfcaverns_prepared_food31x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food32x32.png b/df_achievements/textures/dfcaverns_prepared_food32x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food32x32.png rename to df_achievements/textures/dfcaverns_prepared_food32x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food33x32.png b/df_achievements/textures/dfcaverns_prepared_food33x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food33x32.png rename to df_achievements/textures/dfcaverns_prepared_food33x32.png diff --git a/df_farming/textures/dfcaverns_prepared_food34x32.png b/df_achievements/textures/dfcaverns_prepared_food34x32.png similarity index 100% rename from df_farming/textures/dfcaverns_prepared_food34x32.png rename to df_achievements/textures/dfcaverns_prepared_food34x32.png diff --git a/df_achievements/textures/dfcaverns_puzzle_seal_activex32.png b/df_achievements/textures/dfcaverns_puzzle_seal_activex32.png new file mode 100644 index 0000000..33f93e2 Binary files /dev/null and b/df_achievements/textures/dfcaverns_puzzle_seal_activex32.png differ diff --git a/df_achievements/textures/dfcaverns_puzzle_seal_solvedx32.png b/df_achievements/textures/dfcaverns_puzzle_seal_solvedx32.png new file mode 100644 index 0000000..9405611 Binary files /dev/null and b/df_achievements/textures/dfcaverns_puzzle_seal_solvedx32.png differ diff --git a/df_achievements/textures/dfcaverns_salt_achievement.png b/df_achievements/textures/dfcaverns_salt_achievement.png new file mode 100644 index 0000000..da33b96 Binary files /dev/null and b/df_achievements/textures/dfcaverns_salt_achievement.png differ diff --git a/df_achievements/textures/dfcaverns_spindlestem_achievement.png b/df_achievements/textures/dfcaverns_spindlestem_achievement.png new file mode 100644 index 0000000..433a7f3 Binary files /dev/null and b/df_achievements/textures/dfcaverns_spindlestem_achievement.png differ diff --git a/df_achievements/textures/dfcaverns_torchspine_achievement.png b/df_achievements/textures/dfcaverns_torchspine_achievement.png new file mode 100644 index 0000000..1bc320c Binary files /dev/null and b/df_achievements/textures/dfcaverns_torchspine_achievement.png differ diff --git a/df_achievements/travel.lua b/df_achievements/travel.lua new file mode 100644 index 0000000..4bdfa4b --- /dev/null +++ b/df_achievements/travel.lua @@ -0,0 +1,349 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local nethercap_name = df_dependencies.nethercap_name +local lava_node = df_dependencies.node_name_lava_source + +local node_types = {} +node_types.fungiwood = {"df_trees:fungiwood", "df_trees:fungiwood_shelf"} +node_types.towercap = {"df_trees:tower_cap_stem", "df_trees:tower_cap_gills", "df_trees:tower_cap"} +node_types.goblincap = {"df_trees:goblin_cap_stem", "df_trees:goblin_cap", "df_trees:goblin_cap_gills"} +node_types.sporetree = {"df_trees:spore_tree", "df_trees:spore_tree_hyphae", "df_trees:spore_tree_fruiting_body"} +node_types.tunneltube = {"df_trees:tunnel_tube", "df_trees:tunnel_tube_slant_bottom", "df_trees:tunnel_tube_slant_top", "df_trees:tunnel_tube_slant_full", "df_trees:tunnel_tube_fruiting_body"} +node_types.nethercap = {"df_mapitems:icicle_1", "df_mapitems:icicle_2", "df_mapitems:icicle_3", "df_mapitems:icicle_4", "ice_sprites:ice_sprite", "ice_sprites:hidden_ice_sprite", "df_trees:nether_cap", "df_trees:nether_cap_gills", "df_trees:nether_cap_stem"} +node_types.bloodthorn = {"df_trees:blood_thorn", "df_trees:blood_thorn_spike"} +node_types.blackcap = {"df_trees:black_cap", "df_trees:black_cap_stem", "df_trees:black_cap_gills", "df_trees:torchspine_1", "df_trees:torchspine_1_lit", "df_trees:torchspine_2", "df_trees:torchspine_3", "df_trees:torchspine_4"} +node_types.primordial_jungle = {"df_primordial_items:giant_fern_leaves", "df_primordial_items:giant_fern_tree", "df_primordial_items:giant_fern_tree_slant_bottom", "df_primordial_items:giant_fern_tree_slant_full", "df_primordial_items:giant_fern_tree_slant_top", "df_primordial_items:jungle_leaves", "df_primordial_items:jungle_leaves_glowing", "df_primordial_items:jungle_mushroom_cap_1", "df_primordial_items:jungle_mushroom_cap_2", "df_primordial_items:jungle_mushroom_trunk", "df_primordial_items:jungle_tree", "df_primordial_items:jungle_tree_glowing", "df_primordial_items:jungle_tree_mossy", "df_primordial_items:packed_roots", "df_primordial_items:plant_matter", } +node_types.primordial_fungus = {"df_primordial_items:giant_hypha_root", "df_primordial_items:giant_hypha", "df_primordial_items:mushroom_cap", "df_primordial_items:mushroom_gills", "df_primordial_items:mushroom_gills_glowing", "df_primordial_items:mushroom_trunk", "df_primordial_items:glownode", "df_primordial_items:glownode_stalk",} +node_types.other = {"oil:oil_source", "df_underworld_items:slade", lava_node, "df_underworld_items:glow_amethyst"} +node_types.sunless_sea = {"df_mapitems:castle_coral", "df_mapitems:cave_coral_1", "df_mapitems:cave_coral_2", "df_mapitems:cave_coral_3", "df_mapitems:snareweed"} + +local all_nodes = {} +for _, nodes in pairs(node_types) do + for _, node in pairs(nodes) do + table.insert(all_nodes, node) + end +end + +local radius = 6 +local get_player_data = function(player) + -- get head level node at player position + local pos = player:get_pos() + if not pos then return end + + -- get all set nodes around player + local ps, cn = minetest.find_nodes_in_area( + {x = pos.x - radius, y = pos.y - radius, z = pos.z - radius}, + {x = pos.x + radius, y = pos.y + radius, z = pos.z + radius}, all_nodes) + + return { + pos = pos, + biome = df_caverns.get_biome(pos) or "", + totals = cn + } +end + +local check_nodes = function(nodes, totals) + for _, node in pairs(nodes) do + if (totals[node] or 0) > 1 then + return true + end + end + return false +end + +local timer = 0 +minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer < 10 then return end + timer = 0 + + local player_name + local player_awards + local unlocked + local player_data + local biome + local totals + + -- loop through players + for _, player in pairs(minetest.get_connected_players()) do + player_name = player:get_player_name() + player_awards = awards.player(player_name) + unlocked = player_awards.unlocked or {} + + if unlocked["dfcaverns_visit_all_caverns"] ~= "dfcaverns_visit_all_caverns" or + unlocked["dfcaverns_visit_glowing_pit"] ~= "dfcaverns_visit_glowing_pit" then + player_data = get_player_data(player) + biome = player_data.biome + totals = player_data.totals + if biome == "towercap" and check_nodes(node_types.towercap, totals) then + awards.unlock(player_name, "dfcaverns_visit_tower_cap") + elseif biome == "fungiwood" and check_nodes(node_types.fungiwood, totals) then + awards.unlock(player_name, "dfcaverns_visit_fungiwood") + elseif biome == "goblincap" and check_nodes(node_types.goblincap, totals) then + awards.unlock(player_name, "dfcaverns_visit_goblin_cap") + elseif biome == "sporetree" and check_nodes(node_types.sporetree, totals) then + awards.unlock(player_name, "dfcaverns_visit_spore_tree") + elseif biome == "tunneltube" and check_nodes(node_types.tunneltube, totals) then + awards.unlock(player_name, "dfcaverns_visit_tunnel_tube") + elseif biome == "nethercap" and check_nodes(node_types.nethercap, totals) then + awards.unlock(player_name, "dfcaverns_visit_nethercap") + elseif biome == "bloodthorn" and check_nodes(node_types.bloodthorn, totals) then + awards.unlock(player_name, "dfcaverns_visit_blood_thorn") + elseif biome == "blackcap" and check_nodes(node_types.blackcap, totals) then + awards.unlock(player_name, "dfcaverns_visit_black_cap") + elseif + (biome == "fungispore" and ( + check_nodes(node_types.fungiwood, totals) or + check_nodes(node_types.sporetree, totals))) + or + (biome == "towergoblin" and ( + check_nodes(node_types.towercap, totals) or + check_nodes(node_types.goblincap, totals))) + or + check_nodes(node_types.sunless_sea, totals) + then + awards.unlock(player_name, "dfcaverns_visit_sunless_sea") + elseif biome == "oil_sea" and (totals["oil:oil_source"] or 0) > 1 then + awards.unlock(player_name, "dfcaverns_visit_oil_sea") + elseif biome == "underworld" then + if (totals["df_underworld_items:slade"] or 0) > 1 then + awards.unlock(player_name, "dfcaverns_visit_underworld") + end + if (totals["df_underworld_items:glow_amethyst"] or 0) > 1 and + unlocked["dfcaverns_visit_glowing_pit"] ~= "dfcaverns_visit_glowing_pit" then + local player_pos = player:get_pos() + local pit = df_caverns.get_nearest_glowing_pit(player_pos) + pit.location.y = player_pos.y + if vector.distance(player_pos, pit.location) <= pit.radius+10 then + awards.unlock(player_name, "dfcaverns_visit_glowing_pit") + end + end + elseif biome == "lava_sea" and (totals[lava_node] or 0) > 1 then + awards.unlock(player_name, "dfcaverns_visit_lava_sea") + elseif biome == "primordial fungus" and check_nodes(node_types.primordial_fungus, totals) then + awards.unlock(player_name, "dfcaverns_visit_primordial_fungal") + elseif biome == "primordial jungle" and check_nodes(node_types.primordial_jungle, totals) then + awards.unlock(player_name, "dfcaverns_visit_primordial_jungle") + end + end + if unlocked["dfcaverns_visit_chasm"] ~= "dfcaverns_visit_chasm" and chasms.is_in_chasm(player:get_pos()) then + awards.unlock(player_name, "dfcaverns_visit_chasm") + end + if unlocked["dfcaverns_visit_pit"] ~= "dfcaverns_visit_pit" then + local pos = player:get_pos() + local pos_y = pos.y + if pos_y < -30 then -- ignore pits when near the surface + local nearest_pit = pit_caves.get_nearest_pit(pos) + nearest_pit.location.y = pos_y -- for the distance check + if pos_y >= nearest_pit.depth and pos_y <= nearest_pit.top and vector.distance(pos, nearest_pit.location) <= 20 then + awards.unlock(player_name, "dfcaverns_visit_pit") + end + end + end + end +end) + +-- travelogue + +--biomes + +local cavern_background = "dfcaverns_awards_cavern_backgroundx32.png^dfcaverns_awards_cavern_background_stalactitex32.png^dfcaverns_awards_cavern_background_platformx32.png" + +awards.register_achievement("dfcaverns_visit_tower_cap", { + title = S("Discover Tower Caps"), + description = S("Discover a cavern where Tower Caps grow in the wild."), + icon =cavern_background.."^dfcaverns_awards_cavern_towercapx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_fungiwood", { + title = S("Discover Fungiwood"), + description = S("Discover a cavern where Fungiwoods grow in the wild."), + icon =cavern_background.."^dfcaverns_awards_cavern_fungiwoodx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_goblin_cap", { + title = S("Discover Goblin Caps"), + description = S("Discover a cavern where Goblin Caps grow in the wild."), + icon =cavern_background.."^dfcaverns_awards_cavern_goblincapx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_spore_tree", { + title = S("Discover Spore Trees"), + description = S("Discover a cavern where Spore Trees grow in the wild."), + icon =cavern_background.."^dfcaverns_awards_cavern_sporetreesx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_tunnel_tube", { + title = S("Discover Tunnel Tubes"), + description = S("Discover a cavern where Tunnel Tubes grow in the wild."), + icon =cavern_background.."^dfcaverns_awards_cavern_tunneltubex32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_nethercap", { + title = S("Discover @1s", nethercap_name), + description = S("Discover a cavern where @1s grow in the wild.", nethercap_name), + icon =cavern_background.."^dfcaverns_awards_cavern_nethercapx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_blood_thorn", { + title = S("Discover Bloodthorns"), + description = S("Discover a cavern where Bloodthorns grow in the wild."), + icon =cavern_background.."^dfcaverns_awards_cavern_bloodthornx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_black_cap", { + title = S("Discover Black Caps"), + description = S("Discover a cavern where Black Caps grow in the wild."), + icon =cavern_background.."^dfcaverns_awards_cavern_blackcapx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_sunless_sea", { + title = S("Discover the Sunless Sea"), + description = S("Discover the giant caverns to which all water from the surface ultimately drain."), + icon =cavern_background.."^dfcaverns_awards_cavern_seax32.png^dfcaverns_awards_cavern_towercapx32.png^dfcaverns_awards_cavern_fungiwoodx32.png^dfcaverns_awards_cavern_goblincapx32.png^dfcaverns_awards_cavern_sporetreesx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_upper_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + + + +awards.register_achievement("dfcaverns_visit_oil_sea", { + title = S("Discover the Oil Sea"), + description = S("Discover a cavern containing oil deep underground."), + icon =cavern_background.."^dfcaverns_awards_cavern_oilx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_middle_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 2, +}) + +awards.register_achievement("dfcaverns_visit_lava_sea", { + title = S("Discover the Magma Sea"), + description = S("Discover the sea of magma that volcanoes draw from."), + icon = cavern_background.."^dfcaverns_awards_cavern_lavax32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_middle_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 2, +}) + +awards.register_achievement("dfcaverns_visit_underworld", { + title = S("Discover the Underworld"), + description = S("Discover the ancient caverns at the foundations of the world."), + icon ="dfcaverns_awards_cavern_underworldx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_middle_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 2, +}) + + + +awards.register_achievement("dfcaverns_visit_primordial_jungle", { + title = S("Discover the Primordial Jungle"), + description = S("Discover the lost jungles below the foundations of the world."), + icon = "dfcaverns_awards_cavern_backgroundx32.png^(dfcaverns_awards_cavern_background_stalactitex32.png^[multiply:#127a0b)^dfcaverns_awards_cavern_background_platformx32.png^dfcaverns_awards_cavern_junglex32.png^dfcaverns_awards_foregroundx32.png", + secret = true, + _dfcaverns_achievements = {"dfcaverns_visit_all_primordial_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 3, +}) + +awards.register_achievement("dfcaverns_visit_primordial_fungal", { + title = S("Discover the Primordial Fungus"), + description = S("Discover the fungus-ridden caverns below the foundations of the world."), + icon = cavern_background .. "^dfcaverns_awards_cavern_fungalx32.png^dfcaverns_awards_cavern_primordial_mushx32.png^dfcaverns_awards_foregroundx32.png", + secret = true, + _dfcaverns_achievements = {"dfcaverns_visit_all_primordial_biomes", "dfcaverns_visit_all_caverns"}, + difficulty = 3, +}) + +local stone_background = "([combine:32x32:0,0=" .. df_dependencies.texture_cobble .. ":0,16=" .. df_dependencies.texture_cobble + .. ":16,0=" .. df_dependencies.texture_cobble .. ":16,16=" .. df_dependencies.texture_cobble .. ")" + + +awards.register_achievement("dfcaverns_visit_chasm", { + title = S("Discover a Deep Chasm"), + description = S("Discover a gigantic underground natural chasm."), + icon = stone_background .. "^dfcaverns_awards_cavern_chasmx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + +awards.register_achievement("dfcaverns_visit_pit", { + title = S("Discover a Deep Sinkhole"), + description = S("Discover a deep natural sinkhole."), + icon = stone_background .. "^dfcaverns_awards_cavern_pitx32.png^dfcaverns_awards_foregroundx32.png", + _dfcaverns_achievements = {"dfcaverns_visit_all_caverns"}, + difficulty = 1, +}) + + + +awards.register_achievement("dfcaverns_visit_all_upper_biomes", { + title = S("Discover All Fungal Cavern Types"), + description = S("Discover examples of all of the fungal cavern biomes."), + icon = "dfcaverns_awards_backgroundx32.png^"..df_dependencies.texture_mapping_kit.."^dfcaverns_awards_foregroundx32.png", + difficulty = 1 / df_achievements.get_child_achievement_count("dfcaverns_visit_all_upper_biomes"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_visit_all_upper_biomes", + target=df_achievements.get_child_achievement_count("dfcaverns_visit_all_upper_biomes"), + }, +}) + +awards.register_achievement("dfcaverns_visit_all_middle_biomes", { + title = S("Discover All Overworld Cavern Types"), + description = S("Discover all of the major types of cavern environments between the Sunless Sea and the foundations of the world."), + icon = "dfcaverns_awards_backgroundx32.png^"..df_dependencies.texture_mapping_kit.."^dfcaverns_awards_foregroundx32.png", + difficulty = 2 / df_achievements.get_child_achievement_count("dfcaverns_visit_all_middle_biomes"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_visit_all_middle_biomes", + target=df_achievements.get_child_achievement_count("dfcaverns_visit_all_middle_biomes"), + }, +}) + +awards.register_achievement("dfcaverns_visit_all_primordial_biomes", { + title = S("Discover all Primordial Cavern Types"), + description = S("Discover all of the major types of cavern below the foundations of the world."), + icon = "dfcaverns_awards_backgroundx32.png^"..df_dependencies.texture_mapping_kit.."^dfcaverns_awards_foregroundx32.png", + difficulty = 3 / df_achievements.get_child_achievement_count("dfcaverns_visit_all_primordial_biomes"), + secret = true, + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_visit_all_primordial_biomes", + target=df_achievements.get_child_achievement_count("dfcaverns_visit_all_primordial_biomes"), + }, +}) + +awards.register_achievement("dfcaverns_visit_all_caverns", { + title = S("Discover All Underground Cavern Types"), + description = S("Discover all major kinds of giant cavern environment."), + icon = "dfcaverns_awards_backgroundx32.png^"..df_dependencies.texture_mapping_kit.."^dfcaverns_awards_foregroundx32.png", + difficulty = 4 / df_achievements.get_child_achievement_count("dfcaverns_visit_all_caverns"), + trigger = { + type="dfcaverns_achievements", + achievement_name="dfcaverns_visit_all_caverns", + target=df_achievements.get_child_achievement_count("dfcaverns_visit_all_caverns"), + }, +}) + +-- other places + +awards.register_achievement("dfcaverns_visit_glowing_pit", { + title = S("Discover a Glowing Pit"), + description = S("Discover a glowing pit in the slade foundations of the world."), + icon ="dfcaverns_pit_plasma_static.png^dfcaverns_awards_foregroundx32.png", + difficulty = 2, + secret = true, +}) diff --git a/df_ambience/LICENSE.txt b/df_ambience/LICENSE.txt new file mode 100644 index 0000000..a1aef26 --- /dev/null +++ b/df_ambience/LICENSE.txt @@ -0,0 +1,24 @@ +Sounds are under various licenses, see the license.txt file in the /sounds directory for details and also the metadata in each sound file. + +License for Code +---------------- + +Copyright (C) 2022 FaceDeer, TenPlus1 (Ambience Redo mod), Neuromancer (Immersive Sounds mod) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/df_ambience/init.lua b/df_ambience/init.lua new file mode 100644 index 0000000..c323dfb --- /dev/null +++ b/df_ambience/init.lua @@ -0,0 +1,138 @@ +df_ambience = {} + +local pplus = minetest.get_modpath("playerplus") +local S = minetest.get_translator(minetest.get_current_modname()) + +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +local radius = 6 +local registered_sets = {} +local set_nodes = {} +local muted_players = {} + +local ensure_set_node = function(node_name) + for _, existing_node in pairs(set_nodes) do + if node_name == existing_node then + return + end + end + table.insert(set_nodes, node_name) +end + +df_ambience.add_set = function(def) + assert(def) + assert(def.sounds) + if def.nodes then + for _, node_name in pairs(def.nodes) do + ensure_set_node(node_name) + end + end + def.frequency = def.frequency or 0.05 + table.insert(registered_sets, def) +end + +local timer = 0 +local random = math.random + +local get_player_data = function(player, name) + -- get head level node at player position + local pos = player:get_pos() + if not pos then return end + local prop = player:get_properties() + local eyeh = prop.eye_height or 1.47 -- eye level with fallback + + pos.y = pos.y + eyeh + local nod_head = pplus and name and playerplus[name] + and playerplus[name].nod_head or minetest.get_node(pos).name + pos.y = pos.y - eyeh + + -- get all set nodes around player + local ps, cn = minetest.find_nodes_in_area( + {x = pos.x - radius, y = pos.y - radius, z = pos.z - radius}, + {x = pos.x + radius, y = pos.y + radius, z = pos.z + radius}, set_nodes) + + return { + pos = pos, + head_node = nod_head, + biome = df_caverns.get_biome(pos), + totals = cn + } +end + +local check_nodes = function(totals, nodes) + for _, node in pairs(nodes) do + if (totals[node] or 0) > 1 then + return true + end + end + return false +end + +-- selects sound set +local get_ambience = function(player, name) + local player_data + -- loop through sets in order and choose first that meets its conditions + for _, set in ipairs(registered_sets) do + if random() < set.frequency then + local check_passed + local sound_check = set.sound_check + local set_nodes = set.nodes + if sound_check or set_nodes then + player_data = player_data or get_player_data(player, name) + end + if ((not set_nodes) or check_nodes(player_data.totals, set_nodes)) and + ((not sound_check) or sound_check(player_data)) then + return set + end + end + end +end + +minetest.register_globalstep(function(dtime) + -- one second timer + timer = timer + dtime + if timer < 1 then return end + timer = 0 + + local player_name + local number + local ambience + + -- loop through players + for _, player in pairs(minetest.get_connected_players()) do + player_name = player:get_player_name() + if not muted_players[player_name] then + local set = get_ambience(player, player_name) + if set then + -- choose random sound from set + number = random(#set.sounds) + ambience = set.sounds[number] + + -- play sound + minetest.sound_play(ambience.name, { + to_player = player_name, + gain = ambience.gain or 0.3, + pitch = ambience.pitch or 1.0, + }, true) + end + end + end +end) + +minetest.register_chatcommand("mute_df_ambience", { + params = "", + description = S("Mutes or unmutes ambient sounds in deep caverns"), + func = function(name, param) + local message + if muted_players[name] then + message = S("Unmuted") + muted_players[name] = nil + else + message = S("Muted, no new sounds will start playing once current sounds finish") + muted_players[name] = true + end + return true, message + end +}) + +dofile(modpath.."/soundsets.lua") \ No newline at end of file diff --git a/df_ambience/locale/template.txt b/df_ambience/locale/template.txt new file mode 100644 index 0000000..4ca71a0 --- /dev/null +++ b/df_ambience/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: df_ambience + + +### init.lua ### + +Muted, no new sounds will start playing once current sounds finish= + +Mutes or unmutes ambient sounds in deep caverns= +Unmuted= diff --git a/df_ambience/mod.conf b/df_ambience/mod.conf new file mode 100644 index 0000000..0bd4e08 --- /dev/null +++ b/df_ambience/mod.conf @@ -0,0 +1,4 @@ +name = df_ambience +description = Ambient wildlife sounds for DFCaverns +depends = df_caverns, df_dependencies +optional_depends = chasms, playerplus, df_underworld_items \ No newline at end of file diff --git a/df_ambience/sounds/LICENSE.txt b/df_ambience/sounds/LICENSE.txt new file mode 100644 index 0000000..f5c9c56 --- /dev/null +++ b/df_ambience/sounds/LICENSE.txt @@ -0,0 +1,52 @@ +CC-0: +howling 2 - https://freesound.org/people/PhonosUPF/sounds/499700/ +howling 3 - https://freesound.org/people/PhonosUPF/sounds/499701/ +howling 4 - https://freesound.org/people/PhonosUPF/sounds/499703/ +howling 5 - https://freesound.org/people/PhonosUPF/sounds/499706/ +howling 6 - https://freesound.org/people/PhonosUPF/sounds/499704/ +howling 7 - https://freesound.org/people/PhonosUPF/sounds/499705/ +howling 8 - https://freesound.org/people/PhonosUPF/sounds/499702/ +cave monsters - https://freesound.org/people/Trebblofang/sounds/176930/ +dark cave factory atmo - https://freesound.org/people/szegvari/sounds/583474/ +bird noise - https://freesound.org/people/SpaceJoe/sounds/507257/ +solitary bird song - https://freesound.org/people/nuncaconoci/sounds/623862/ +pig grunting and grumbling - https://freesound.org/people/felix.blume/sounds/158746/ +whalesong - https://freesound.org/people/taure/sounds/361423/ +200614 fies, close buzzing, periodic, wide stereo 7am - https://freesound.org/people/TRP/sounds/567732/ +howler_monkey_jungle_4 - https://freesound.org/people/itsmrjack/sounds/123044/ +TRIBAL TOY BONGOS-89 - https://freesound.org/people/TA-AT/sounds/449811/ +shamanic drum 1 - https://freesound.org/people/adharca/sounds/275376/ +shamanic drum 2 - https://freesound.org/people/adharca/sounds/275377/ +cave tribal song - https://freesound.org/people/szegvari/sounds/517317/ +ghostly whispers - https://freesound.org/people/dimbark1/sounds/316797/ +whisper trail 1 - https://freesound.org/people/Black%20Boe/sounds/22328/ +whisper trail 2 - https://freesound.org/people/Black%20Boe/sounds/22329/ +whisper trail 3 - https://freesound.org/people/Black%20Boe/sounds/22330/ +frogs - https://freesound.org/people/derjuli/sounds/535066/ +frog croaking (uk common frog) - https://freesound.org/people/shaunhillyard/sounds/532235/ +glitched birds - https://freesound.org/people/soramoosic/sounds/256153/ +bird song 03 - https://freesound.org/people/olliehahn12/sounds/474493/ +pajaro_palenque - https://freesound.org/people/nicotep/sounds/619305/ + + +CC-BY-A +exotic creature song - https://freesound.org/people/InspectorJ/sounds/469312/ +crow slow - https://freesound.org/people/InspectorJ/sounds/418262/ +long bird song slow - https://freesound.org/people/IESP/sounds/339907/ +bird budgie song - https://freesound.org/people/danielfergusonmusic/sounds/404957/ +horse neigh - https://freesound.org/people/dobroide/sounds/18229/ +horse whinny - https://freesound.org/people/GoodListener/sounds/322445/ +horse nicker - https://freesound.org/people/GoodListener/sounds/322449/ +moan - https://freesound.org/people/GoodListener/sounds/322444/ +horse snort 2 - https://freesound.org/people/GoodListener/sounds/322454/ +braying donkey - ane brayant - https://freesound.org/people/beskhu/sounds/186704/ +whale - https://freesound.org/people/Tritus/sounds/186899/ +treBccc1 - https://freesound.org/people/tomerbe/sounds/546110/ +Tribal memories - https://freesound.org/people/InSintesi/sounds/370353/ +Celtic_Drum - https://freesound.org/people/13NHarri/sounds/263974/ +whisper5 - thanvannispen +creepywhisper_ambient - https://freesound.org/people/ohnobones/sounds/412769/ +bangkok frog - https://freesound.org/people/WIM/sounds/9099/ +black casqued hornbill 5-https://freesound.org/people/ERH/sounds/56549/ +exotic birds sound - https://freesound.org/people/bolkmar/sounds/423804/ +avalanche - https://freesound.org/people/mystiscool/sounds/7141/ diff --git a/df_ambience/sounds/dfcaverns_avalanche.ogg b/df_ambience/sounds/dfcaverns_avalanche.ogg new file mode 100644 index 0000000..34b3768 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_avalanche.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.1.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.1.ogg new file mode 100644 index 0000000..cefce29 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.1.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.10.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.10.ogg new file mode 100644 index 0000000..48d4223 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.10.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.11.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.11.ogg new file mode 100644 index 0000000..a986c45 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.11.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.12.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.12.ogg new file mode 100644 index 0000000..5964973 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.12.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.13.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.13.ogg new file mode 100644 index 0000000..05f4eeb Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.13.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.14.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.14.ogg new file mode 100644 index 0000000..3da0c60 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.14.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.15.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.15.ogg new file mode 100644 index 0000000..638a845 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.15.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.16.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.16.ogg new file mode 100644 index 0000000..f04f2e5 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.16.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.17.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.17.ogg new file mode 100644 index 0000000..5b34b03 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.17.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.18.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.18.ogg new file mode 100644 index 0000000..d2e2059 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.18.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.2.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.2.ogg new file mode 100644 index 0000000..54914f2 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.2.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.3.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.3.ogg new file mode 100644 index 0000000..267c9db Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.3.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.4.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.4.ogg new file mode 100644 index 0000000..a6c2e0f Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.4.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.5.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.5.ogg new file mode 100644 index 0000000..327ab8e Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.5.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.6.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.6.ogg new file mode 100644 index 0000000..c9937ec Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.6.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.7.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.7.ogg new file mode 100644 index 0000000..8ece143 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.7.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.8.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.8.ogg new file mode 100644 index 0000000..29ef269 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.8.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_budgie_song.9.ogg b/df_ambience/sounds/dfcaverns_bird_budgie_song.9.ogg new file mode 100644 index 0000000..77af346 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_budgie_song.9.ogg differ diff --git a/df_ambience/sounds/dfcaverns_bird_noise.ogg b/df_ambience/sounds/dfcaverns_bird_noise.ogg new file mode 100644 index 0000000..5991c66 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_bird_noise.ogg differ diff --git a/df_ambience/sounds/dfcaverns_crow_slow.ogg b/df_ambience/sounds/dfcaverns_crow_slow.ogg new file mode 100644 index 0000000..c96a2ff Binary files /dev/null and b/df_ambience/sounds/dfcaverns_crow_slow.ogg differ diff --git a/df_ambience/sounds/dfcaverns_drums.1.ogg b/df_ambience/sounds/dfcaverns_drums.1.ogg new file mode 100644 index 0000000..55c777b Binary files /dev/null and b/df_ambience/sounds/dfcaverns_drums.1.ogg differ diff --git a/df_ambience/sounds/dfcaverns_drums.2.ogg b/df_ambience/sounds/dfcaverns_drums.2.ogg new file mode 100644 index 0000000..5b36785 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_drums.2.ogg differ diff --git a/df_ambience/sounds/dfcaverns_drums.3.ogg b/df_ambience/sounds/dfcaverns_drums.3.ogg new file mode 100644 index 0000000..bc5c560 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_drums.3.ogg differ diff --git a/df_ambience/sounds/dfcaverns_drums.4.ogg b/df_ambience/sounds/dfcaverns_drums.4.ogg new file mode 100644 index 0000000..7894874 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_drums.4.ogg differ diff --git a/df_ambience/sounds/dfcaverns_drums.5.ogg b/df_ambience/sounds/dfcaverns_drums.5.ogg new file mode 100644 index 0000000..c1c97e7 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_drums.5.ogg differ diff --git a/df_ambience/sounds/dfcaverns_drums.6.ogg b/df_ambience/sounds/dfcaverns_drums.6.ogg new file mode 100644 index 0000000..c58d83d Binary files /dev/null and b/df_ambience/sounds/dfcaverns_drums.6.ogg differ diff --git a/df_ambience/sounds/dfcaverns_drums.7.ogg b/df_ambience/sounds/dfcaverns_drums.7.ogg new file mode 100644 index 0000000..70f0dca Binary files /dev/null and b/df_ambience/sounds/dfcaverns_drums.7.ogg differ diff --git a/df_ambience/sounds/dfcaverns_exotic_creature_song.1.ogg b/df_ambience/sounds/dfcaverns_exotic_creature_song.1.ogg new file mode 100644 index 0000000..2aac07b Binary files /dev/null and b/df_ambience/sounds/dfcaverns_exotic_creature_song.1.ogg differ diff --git a/df_ambience/sounds/dfcaverns_exotic_creature_song.2.ogg b/df_ambience/sounds/dfcaverns_exotic_creature_song.2.ogg new file mode 100644 index 0000000..5ba7b3e Binary files /dev/null and b/df_ambience/sounds/dfcaverns_exotic_creature_song.2.ogg differ diff --git a/df_ambience/sounds/dfcaverns_exotic_creature_song.3.ogg b/df_ambience/sounds/dfcaverns_exotic_creature_song.3.ogg new file mode 100644 index 0000000..80b5d07 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_exotic_creature_song.3.ogg differ diff --git a/df_ambience/sounds/dfcaverns_exotic_creature_song.4.ogg b/df_ambience/sounds/dfcaverns_exotic_creature_song.4.ogg new file mode 100644 index 0000000..690cc85 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_exotic_creature_song.4.ogg differ diff --git a/df_ambience/sounds/dfcaverns_flies.1.ogg b/df_ambience/sounds/dfcaverns_flies.1.ogg new file mode 100644 index 0000000..603c69a Binary files /dev/null and b/df_ambience/sounds/dfcaverns_flies.1.ogg differ diff --git a/df_ambience/sounds/dfcaverns_flies.10.ogg b/df_ambience/sounds/dfcaverns_flies.10.ogg new file mode 100644 index 0000000..bf44827 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_flies.10.ogg differ diff --git a/df_ambience/sounds/dfcaverns_flies.11.ogg b/df_ambience/sounds/dfcaverns_flies.11.ogg new file mode 100644 index 0000000..ca68c4e Binary files /dev/null and b/df_ambience/sounds/dfcaverns_flies.11.ogg differ diff --git a/df_ambience/sounds/dfcaverns_flies.12.ogg b/df_ambience/sounds/dfcaverns_flies.12.ogg new file mode 100644 index 0000000..6d0db2d Binary files /dev/null and b/df_ambience/sounds/dfcaverns_flies.12.ogg differ diff --git a/df_ambience/sounds/dfcaverns_flies.2.ogg b/df_ambience/sounds/dfcaverns_flies.2.ogg new file mode 100644 index 0000000..0fde66a Binary files /dev/null and b/df_ambience/sounds/dfcaverns_flies.2.ogg differ diff --git a/df_ambience/sounds/dfcaverns_flies.3.ogg b/df_ambience/sounds/dfcaverns_flies.3.ogg new file mode 100644 index 0000000..b457bc9 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_flies.3.ogg differ diff --git a/df_ambience/sounds/dfcaverns_flies.4.ogg b/df_ambience/sounds/dfcaverns_flies.4.ogg new file mode 100644 index 0000000..e192138 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_flies.4.ogg differ diff --git a/df_ambience/sounds/dfcaverns_flies.5.ogg b/df_ambience/sounds/dfcaverns_flies.5.ogg new file mode 100644 index 0000000..61cba0d Binary files /dev/null and b/df_ambience/sounds/dfcaverns_flies.5.ogg differ diff --git a/df_ambience/sounds/dfcaverns_flies.6.ogg b/df_ambience/sounds/dfcaverns_flies.6.ogg new file mode 100644 index 0000000..23a8120 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_flies.6.ogg differ diff --git a/df_ambience/sounds/dfcaverns_flies.7.ogg b/df_ambience/sounds/dfcaverns_flies.7.ogg new file mode 100644 index 0000000..3851405 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_flies.7.ogg differ diff --git a/df_ambience/sounds/dfcaverns_flies.8.ogg b/df_ambience/sounds/dfcaverns_flies.8.ogg new file mode 100644 index 0000000..4896988 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_flies.8.ogg differ diff --git a/df_ambience/sounds/dfcaverns_flies.9.ogg b/df_ambience/sounds/dfcaverns_flies.9.ogg new file mode 100644 index 0000000..21b33f0 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_flies.9.ogg differ diff --git a/df_ambience/sounds/dfcaverns_frog.1.ogg b/df_ambience/sounds/dfcaverns_frog.1.ogg new file mode 100644 index 0000000..94dde63 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_frog.1.ogg differ diff --git a/df_ambience/sounds/dfcaverns_frog.2.ogg b/df_ambience/sounds/dfcaverns_frog.2.ogg new file mode 100644 index 0000000..34c9b6b Binary files /dev/null and b/df_ambience/sounds/dfcaverns_frog.2.ogg differ diff --git a/df_ambience/sounds/dfcaverns_frog.3.ogg b/df_ambience/sounds/dfcaverns_frog.3.ogg new file mode 100644 index 0000000..ff8a412 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_frog.3.ogg differ diff --git a/df_ambience/sounds/dfcaverns_frog.4.ogg b/df_ambience/sounds/dfcaverns_frog.4.ogg new file mode 100644 index 0000000..18b9d3f Binary files /dev/null and b/df_ambience/sounds/dfcaverns_frog.4.ogg differ diff --git a/df_ambience/sounds/dfcaverns_frog.5.ogg b/df_ambience/sounds/dfcaverns_frog.5.ogg new file mode 100644 index 0000000..c310eca Binary files /dev/null and b/df_ambience/sounds/dfcaverns_frog.5.ogg differ diff --git a/df_ambience/sounds/dfcaverns_frog.6.ogg b/df_ambience/sounds/dfcaverns_frog.6.ogg new file mode 100644 index 0000000..5314971 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_frog.6.ogg differ diff --git a/df_ambience/sounds/dfcaverns_horse_neigh.1.ogg b/df_ambience/sounds/dfcaverns_horse_neigh.1.ogg new file mode 100644 index 0000000..b3d4615 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_horse_neigh.1.ogg differ diff --git a/df_ambience/sounds/dfcaverns_horse_neigh.2.ogg b/df_ambience/sounds/dfcaverns_horse_neigh.2.ogg new file mode 100644 index 0000000..64df26e Binary files /dev/null and b/df_ambience/sounds/dfcaverns_horse_neigh.2.ogg differ diff --git a/df_ambience/sounds/dfcaverns_horse_neigh.3.ogg b/df_ambience/sounds/dfcaverns_horse_neigh.3.ogg new file mode 100644 index 0000000..731620d Binary files /dev/null and b/df_ambience/sounds/dfcaverns_horse_neigh.3.ogg differ diff --git a/df_ambience/sounds/dfcaverns_horse_neigh.4.ogg b/df_ambience/sounds/dfcaverns_horse_neigh.4.ogg new file mode 100644 index 0000000..eb10a21 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_horse_neigh.4.ogg differ diff --git a/df_ambience/sounds/dfcaverns_horse_neigh.5.ogg b/df_ambience/sounds/dfcaverns_horse_neigh.5.ogg new file mode 100644 index 0000000..72a2244 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_horse_neigh.5.ogg differ diff --git a/df_ambience/sounds/dfcaverns_horse_neigh.6.ogg b/df_ambience/sounds/dfcaverns_horse_neigh.6.ogg new file mode 100644 index 0000000..9e6864d Binary files /dev/null and b/df_ambience/sounds/dfcaverns_horse_neigh.6.ogg differ diff --git a/df_ambience/sounds/dfcaverns_horse_neigh.7.ogg b/df_ambience/sounds/dfcaverns_horse_neigh.7.ogg new file mode 100644 index 0000000..6f528e0 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_horse_neigh.7.ogg differ diff --git a/df_ambience/sounds/dfcaverns_howler_monkey.1.ogg b/df_ambience/sounds/dfcaverns_howler_monkey.1.ogg new file mode 100644 index 0000000..5a34819 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_howler_monkey.1.ogg differ diff --git a/df_ambience/sounds/dfcaverns_howler_monkey.2.ogg b/df_ambience/sounds/dfcaverns_howler_monkey.2.ogg new file mode 100644 index 0000000..c5ca4cf Binary files /dev/null and b/df_ambience/sounds/dfcaverns_howler_monkey.2.ogg differ diff --git a/df_ambience/sounds/dfcaverns_howler_monkey.3.ogg b/df_ambience/sounds/dfcaverns_howler_monkey.3.ogg new file mode 100644 index 0000000..b490a72 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_howler_monkey.3.ogg differ diff --git a/df_ambience/sounds/dfcaverns_howler_monkey.4.ogg b/df_ambience/sounds/dfcaverns_howler_monkey.4.ogg new file mode 100644 index 0000000..d0979ea Binary files /dev/null and b/df_ambience/sounds/dfcaverns_howler_monkey.4.ogg differ diff --git a/df_ambience/sounds/dfcaverns_howler_monkey.5.ogg b/df_ambience/sounds/dfcaverns_howler_monkey.5.ogg new file mode 100644 index 0000000..4624b35 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_howler_monkey.5.ogg differ diff --git a/df_ambience/sounds/dfcaverns_howler_monkey.6.ogg b/df_ambience/sounds/dfcaverns_howler_monkey.6.ogg new file mode 100644 index 0000000..7c7ac11 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_howler_monkey.6.ogg differ diff --git a/df_ambience/sounds/dfcaverns_howling.1.ogg b/df_ambience/sounds/dfcaverns_howling.1.ogg new file mode 100644 index 0000000..e8675f8 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_howling.1.ogg differ diff --git a/df_ambience/sounds/dfcaverns_howling.2.ogg b/df_ambience/sounds/dfcaverns_howling.2.ogg new file mode 100644 index 0000000..31e294c Binary files /dev/null and b/df_ambience/sounds/dfcaverns_howling.2.ogg differ diff --git a/df_ambience/sounds/dfcaverns_howling.3.ogg b/df_ambience/sounds/dfcaverns_howling.3.ogg new file mode 100644 index 0000000..d8f06b0 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_howling.3.ogg differ diff --git a/df_ambience/sounds/dfcaverns_howling.4.ogg b/df_ambience/sounds/dfcaverns_howling.4.ogg new file mode 100644 index 0000000..8b37e0f Binary files /dev/null and b/df_ambience/sounds/dfcaverns_howling.4.ogg differ diff --git a/df_ambience/sounds/dfcaverns_howling.5.ogg b/df_ambience/sounds/dfcaverns_howling.5.ogg new file mode 100644 index 0000000..d8d3a51 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_howling.5.ogg differ diff --git a/df_ambience/sounds/dfcaverns_howling.6.ogg b/df_ambience/sounds/dfcaverns_howling.6.ogg new file mode 100644 index 0000000..1458271 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_howling.6.ogg differ diff --git a/df_ambience/sounds/dfcaverns_howling.7.ogg b/df_ambience/sounds/dfcaverns_howling.7.ogg new file mode 100644 index 0000000..3d2366c Binary files /dev/null and b/df_ambience/sounds/dfcaverns_howling.7.ogg differ diff --git a/df_ambience/sounds/dfcaverns_jungle_bird.1.ogg b/df_ambience/sounds/dfcaverns_jungle_bird.1.ogg new file mode 100644 index 0000000..64959cc Binary files /dev/null and b/df_ambience/sounds/dfcaverns_jungle_bird.1.ogg differ diff --git a/df_ambience/sounds/dfcaverns_jungle_bird.10.ogg b/df_ambience/sounds/dfcaverns_jungle_bird.10.ogg new file mode 100644 index 0000000..b2f17db Binary files /dev/null and b/df_ambience/sounds/dfcaverns_jungle_bird.10.ogg differ diff --git a/df_ambience/sounds/dfcaverns_jungle_bird.11.ogg b/df_ambience/sounds/dfcaverns_jungle_bird.11.ogg new file mode 100644 index 0000000..9012590 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_jungle_bird.11.ogg differ diff --git a/df_ambience/sounds/dfcaverns_jungle_bird.12.ogg b/df_ambience/sounds/dfcaverns_jungle_bird.12.ogg new file mode 100644 index 0000000..e4ce7d0 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_jungle_bird.12.ogg differ diff --git a/df_ambience/sounds/dfcaverns_jungle_bird.2.ogg b/df_ambience/sounds/dfcaverns_jungle_bird.2.ogg new file mode 100644 index 0000000..22d33f5 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_jungle_bird.2.ogg differ diff --git a/df_ambience/sounds/dfcaverns_jungle_bird.3.ogg b/df_ambience/sounds/dfcaverns_jungle_bird.3.ogg new file mode 100644 index 0000000..c213e94 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_jungle_bird.3.ogg differ diff --git a/df_ambience/sounds/dfcaverns_jungle_bird.4.ogg b/df_ambience/sounds/dfcaverns_jungle_bird.4.ogg new file mode 100644 index 0000000..a84564f Binary files /dev/null and b/df_ambience/sounds/dfcaverns_jungle_bird.4.ogg differ diff --git a/df_ambience/sounds/dfcaverns_jungle_bird.5.ogg b/df_ambience/sounds/dfcaverns_jungle_bird.5.ogg new file mode 100644 index 0000000..7455a5d Binary files /dev/null and b/df_ambience/sounds/dfcaverns_jungle_bird.5.ogg differ diff --git a/df_ambience/sounds/dfcaverns_jungle_bird.6.ogg b/df_ambience/sounds/dfcaverns_jungle_bird.6.ogg new file mode 100644 index 0000000..889b315 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_jungle_bird.6.ogg differ diff --git a/df_ambience/sounds/dfcaverns_jungle_bird.7.ogg b/df_ambience/sounds/dfcaverns_jungle_bird.7.ogg new file mode 100644 index 0000000..bf0e40f Binary files /dev/null and b/df_ambience/sounds/dfcaverns_jungle_bird.7.ogg differ diff --git a/df_ambience/sounds/dfcaverns_jungle_bird.8.ogg b/df_ambience/sounds/dfcaverns_jungle_bird.8.ogg new file mode 100644 index 0000000..262ca9d Binary files /dev/null and b/df_ambience/sounds/dfcaverns_jungle_bird.8.ogg differ diff --git a/df_ambience/sounds/dfcaverns_jungle_bird.9.ogg b/df_ambience/sounds/dfcaverns_jungle_bird.9.ogg new file mode 100644 index 0000000..44c8212 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_jungle_bird.9.ogg differ diff --git a/df_ambience/sounds/dfcaverns_long_bird_song_slow.ogg b/df_ambience/sounds/dfcaverns_long_bird_song_slow.ogg new file mode 100644 index 0000000..65721a7 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_long_bird_song_slow.ogg differ diff --git a/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.1.ogg b/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.1.ogg new file mode 100644 index 0000000..2eb3ad2 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.1.ogg differ diff --git a/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.2.ogg b/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.2.ogg new file mode 100644 index 0000000..4d3e50e Binary files /dev/null and b/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.2.ogg differ diff --git a/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.3.ogg b/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.3.ogg new file mode 100644 index 0000000..3772cd0 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.3.ogg differ diff --git a/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.4.ogg b/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.4.ogg new file mode 100644 index 0000000..5fb382e Binary files /dev/null and b/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.4.ogg differ diff --git a/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.5.ogg b/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.5.ogg new file mode 100644 index 0000000..e989221 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.5.ogg differ diff --git a/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.6.ogg b/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.6.ogg new file mode 100644 index 0000000..2ed89ec Binary files /dev/null and b/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.6.ogg differ diff --git a/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.7.ogg b/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.7.ogg new file mode 100644 index 0000000..8a156a8 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_pig_grunting_grumbling.7.ogg differ diff --git a/df_ambience/sounds/dfcaverns_solitary_bird_song.1.ogg b/df_ambience/sounds/dfcaverns_solitary_bird_song.1.ogg new file mode 100644 index 0000000..c0c7082 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_solitary_bird_song.1.ogg differ diff --git a/df_ambience/sounds/dfcaverns_solitary_bird_song.2.ogg b/df_ambience/sounds/dfcaverns_solitary_bird_song.2.ogg new file mode 100644 index 0000000..7b36fb1 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_solitary_bird_song.2.ogg differ diff --git a/df_ambience/sounds/dfcaverns_solitary_bird_song.3.ogg b/df_ambience/sounds/dfcaverns_solitary_bird_song.3.ogg new file mode 100644 index 0000000..ba5b5a9 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_solitary_bird_song.3.ogg differ diff --git a/df_ambience/sounds/dfcaverns_solitary_bird_song.4.ogg b/df_ambience/sounds/dfcaverns_solitary_bird_song.4.ogg new file mode 100644 index 0000000..06c0c05 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_solitary_bird_song.4.ogg differ diff --git a/df_ambience/sounds/dfcaverns_solitary_bird_song.5.ogg b/df_ambience/sounds/dfcaverns_solitary_bird_song.5.ogg new file mode 100644 index 0000000..0c8d686 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_solitary_bird_song.5.ogg differ diff --git a/df_ambience/sounds/dfcaverns_solitary_bird_song.6.ogg b/df_ambience/sounds/dfcaverns_solitary_bird_song.6.ogg new file mode 100644 index 0000000..7b1c4b1 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_solitary_bird_song.6.ogg differ diff --git a/df_ambience/sounds/dfcaverns_whale.1.ogg b/df_ambience/sounds/dfcaverns_whale.1.ogg new file mode 100644 index 0000000..0ffef09 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_whale.1.ogg differ diff --git a/df_ambience/sounds/dfcaverns_whale.2.ogg b/df_ambience/sounds/dfcaverns_whale.2.ogg new file mode 100644 index 0000000..976806c Binary files /dev/null and b/df_ambience/sounds/dfcaverns_whale.2.ogg differ diff --git a/df_ambience/sounds/dfcaverns_whale.3.ogg b/df_ambience/sounds/dfcaverns_whale.3.ogg new file mode 100644 index 0000000..dc6e593 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_whale.3.ogg differ diff --git a/df_ambience/sounds/dfcaverns_whale.4.ogg b/df_ambience/sounds/dfcaverns_whale.4.ogg new file mode 100644 index 0000000..064ae08 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_whale.4.ogg differ diff --git a/df_ambience/sounds/dfcaverns_whale.5.ogg b/df_ambience/sounds/dfcaverns_whale.5.ogg new file mode 100644 index 0000000..5b06904 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_whale.5.ogg differ diff --git a/df_ambience/sounds/dfcaverns_whale.6.ogg b/df_ambience/sounds/dfcaverns_whale.6.ogg new file mode 100644 index 0000000..48b2f51 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_whale.6.ogg differ diff --git a/df_ambience/sounds/dfcaverns_whale.7.ogg b/df_ambience/sounds/dfcaverns_whale.7.ogg new file mode 100644 index 0000000..aa16352 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_whale.7.ogg differ diff --git a/df_ambience/sounds/dfcaverns_whispers.1.ogg b/df_ambience/sounds/dfcaverns_whispers.1.ogg new file mode 100644 index 0000000..554697f Binary files /dev/null and b/df_ambience/sounds/dfcaverns_whispers.1.ogg differ diff --git a/df_ambience/sounds/dfcaverns_whispers.2.ogg b/df_ambience/sounds/dfcaverns_whispers.2.ogg new file mode 100644 index 0000000..0a817c4 Binary files /dev/null and b/df_ambience/sounds/dfcaverns_whispers.2.ogg differ diff --git a/df_ambience/sounds/dfcaverns_whispers.3.ogg b/df_ambience/sounds/dfcaverns_whispers.3.ogg new file mode 100644 index 0000000..0d0a00c Binary files /dev/null and b/df_ambience/sounds/dfcaverns_whispers.3.ogg differ diff --git a/df_ambience/sounds/dfcaverns_whispers.4.ogg b/df_ambience/sounds/dfcaverns_whispers.4.ogg new file mode 100644 index 0000000..ada575d Binary files /dev/null and b/df_ambience/sounds/dfcaverns_whispers.4.ogg differ diff --git a/df_ambience/sounds/dfcaverns_whispers.5.ogg b/df_ambience/sounds/dfcaverns_whispers.5.ogg new file mode 100644 index 0000000..af6d54c Binary files /dev/null and b/df_ambience/sounds/dfcaverns_whispers.5.ogg differ diff --git a/df_ambience/sounds/dfcaverns_whispers.6.ogg b/df_ambience/sounds/dfcaverns_whispers.6.ogg new file mode 100644 index 0000000..d5b368e Binary files /dev/null and b/df_ambience/sounds/dfcaverns_whispers.6.ogg differ diff --git a/df_ambience/soundsets.lua b/df_ambience/soundsets.lua new file mode 100644 index 0000000..ca29454 --- /dev/null +++ b/df_ambience/soundsets.lua @@ -0,0 +1,174 @@ +if minetest.get_modpath("chasms") then +df_ambience.add_set({ + frequency = 0.03, + sounds = { + {name = "dfcaverns_long_bird_song_slow", gain = 0.5}, + {name = "dfcaverns_crow_slow", gain = 0.5}, + {name = "dfcaverns_bird_noise", gain = 0.5}, + }, + sound_check = function(def) + if chasms.is_in_chasm(def.pos) then return true end + end, +}) +end + +-- Level 1 + +df_ambience.add_set({ + frequency = 0.075, + nodes = {"df_mapitems:dirt_with_cave_moss", "df_trees:fungiwood", "df_trees:fungiwood_shelf"}, + sounds = { + {name = "dfcaverns_bird_budgie_song", gain = 0.5}, + }, + sound_check = function(def) + return def.biome == "fungiwood" or def.biome == "fungispore" + end, +}) + +df_ambience.add_set({ + frequency = 0.050, + nodes = {"df_mapitems:dirt_with_cave_moss", "df_trees:tower_cap_stem", "df_trees:tower_cap_gills", "df_trees:tower_cap"}, + sounds = { + {name = "dfcaverns_exotic_creature_song", gain = 0.5}, + }, + sound_check = function(def) + return def.biome == "towercap" or def.biome == "towergoblin" + end, +}) + +-- Level 2 + +df_ambience.add_set({ + frequency = 0.050, + nodes = {"df_mapitems:dirt_with_cave_moss", "df_trees:goblin_cap_stem", "df_trees:goblin_cap", "df_trees:goblin_cap_gills"}, + sounds = { + {name = "dfcaverns_pig_grunting_grumbling", gain = 0.25}, + }, + sound_check = function(def) + return def.biome == "goblincap" or def.biome == "towergoblin" + end, +}) + +df_ambience.add_set({ + frequency = 0.025, + nodes = {"df_mapitems:dirt_with_stillworm", "df_trees:tunnel_tube", "df_trees:tunnel_tube_slant_bottom", "df_trees:tunnel_tube_slant_top", "df_trees:tunnel_tube_slant_full", "df_trees:tunnel_tube_fruiting_body"}, + sounds = { + {name = "dfcaverns_solitary_bird_song", gain = 0.25}, + }, + sound_check = function(def) + return def.biome == "tunneltube" + end, +}) + +df_ambience.add_set({ + frequency = 0.035, + nodes = {"df_mapitems:dirt_with_pebble_fungus", "df_trees:spore_tree", "df_trees:spore_tree_hyphae", "df_trees:spore_tree_fruiting_body"}, + sounds = { + {name = "dfcaverns_horse_neigh", gain = 0.25}, + }, + sound_check = function(def) + return def.biome == "sporetree" or def.biome == "fungispore" + end, +}) + +-- Level 3 + +local ice = df_dependencies.node_name_ice +local snow = df_dependencies.node_name_snow +df_ambience.add_set({ + frequency = 0.050, + nodes = {"df_mapitems:icicle_1", "df_mapitems:icicle_2", "df_mapitems:icicle_3", "df_mapitems:icicle_4", "ice_sprites:ice_sprite", "ice_sprites:hidden_ice_sprite", "df_trees:nether_cap", "df_trees:nether_cap_gills", "df_trees:nether_cap_stem", ice, snow}, + sounds = { + {name = "dfcaverns_howling", gain = 0.5}, + }, + sound_check = function(def) + return def.biome == "nethercap" + end, +}) + +df_ambience.add_set({ + frequency = 0.075, + nodes = {"df_trees:blood_thorn", "df_trees:blood_thorn_spike"}, + sounds = { + {name = "dfcaverns_flies", gain = 0.5}, + }, + sound_check = function(def) + return def.biome == "bloodthorn" + end, +}) + +-- blackcap left silent, torchspines make their own noise + +-- Sunless sea + +local water_source = df_dependencies.node_name_water_source +df_ambience.add_set({ + frequency = 0.050, + sounds = { + {name = "dfcaverns_whale", gain = 0.5}, + }, + sound_check = function(def) + return def.head_node == water_source and df_caverns.get_biome(def.pos) == "sunless undersea" + end, +}) + + +-- Oil sea +-- No soundset here + +-- Lava sea + +if minetest.get_modpath("df_underworld_items") then +local lava_source = df_dependencies.node_name_lava_source +df_ambience.add_set({ + frequency = 0.0750, + nodes = {lava_source}, + sounds = { + {name = "dfcaverns_massive_digging", gain = 1.0}, + {name = "dfcaverns_avalanche", gain = 1.0}, + }, + sound_check = function(def) + return df_caverns.get_biome(def.pos) == "lava_sea" + end, +}) +end + +-- Underworld + +df_ambience.add_set({ + frequency = 0.025, + nodes = {"df_underworld_items:slade"}, + sounds = { + {name = "dfcaverns_whispers", gain = 0.15}, + }, + sound_check = function(def) + return def.biome == "underworld" + end, +}) + +-- Primordial + +local jungle_bird = {name = "dfcaverns_jungle_bird", gain = 0.4} +df_ambience.add_set({ + frequency = 0.075, + nodes = {"df_primordial_items:dirt_with_jungle_grass", "df_primordial_items:fern_1", "df_primordial_items:fern_2", "df_primordial_items:giant_fern_leaves", "df_primordial_items:giant_fern_tree", "df_primordial_items:giant_fern_tree_slant_bottom", "df_primordial_items:giant_fern_tree_slant_full", "df_primordial_items:giant_fern_tree_slant_top", "df_primordial_items:glow_plant_1", "df_primordial_items:glow_plant_2", "df_primordial_items:glow_plant_3", "df_primordial_items:jungle_grass_1", "df_primordial_items:jungle_grass_2", "df_primordial_items:jungle_grass_3", "df_primordial_items:jungle_ivy", "df_primordial_items:jungle_leaves", "df_primordial_items:jungle_leaves_glowing", "df_primordial_items:jungle_mushroom_1", "df_primordial_items:jungle_mushroom_2", "df_primordial_items:jungle_mushroom_cap_1", "df_primordial_items:jungle_mushroom_cap_2", "df_primordial_items:jungle_mushroom_trunk", "df_primordial_items:jungle_roots_1", "df_primordial_items:jungle_roots_2", "df_primordial_items:jungle_thorns", "df_primordial_items:jungle_tree", "df_primordial_items:jungle_tree_glowing", "df_primordial_items:jungle_tree_mossy", "df_primordial_items:packed_roots", "df_primordial_items:plant_matter", }, + sounds = { + {name = "dfcaverns_drums", gain = 0.3}, + {name = "dfcaverns_frog", gain = 0.5}, + jungle_bird, jungle_bird, -- double up the birds to make them more common + }, + sound_check = function(def) + return def.biome == "primordial jungle" + end, +}) + +df_ambience.add_set({ + frequency = 0.05, + nodes = {"df_primordial_items:dirt_with_mycelium", "df_primordial_items:fungal_grass_1", "df_primordial_items:fungal_grass_2", "df_primordial_items:glow_orb", "df_primordial_items:glow_orb_stalks", "df_primordial_items:glow_pods", "df_primordial_items:giant_hypha_root", "df_primordial_items:giant_hypha", "df_primordial_items:mushroom_cap", "df_primordial_items:mushroom_gills", "df_primordial_items:mushroom_gills_glowing", "df_primordial_items:mushroom_trunk", "df_primordial_items:glow_orb_hanging", "df_primordial_items:glownode", "df_primordial_items:glownode_stalk",}, + sounds = { + {name = "dfcaverns_howler_monkey", gain = 0.3}, + }, + sound_check = function(def) + return def.biome == "primordial fungus" + end, +}) \ No newline at end of file diff --git a/df_caverns/dungeon_loot.lua b/df_caverns/dungeon_loot.lua index 1dcbcdc..cae636e 100644 --- a/df_caverns/dungeon_loot.lua +++ b/df_caverns/dungeon_loot.lua @@ -45,18 +45,19 @@ end if minetest.get_modpath("bones_loot") and df_caverns.config.enable_underworld then +if minetest.get_modpath("default") then bones_loot.register_loot({ {name = "binoculars:binoculars", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, {name = "boats:boat", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, {name = "bucket:bucket_empty", chance = 0.3, count = {1,1}, types = {"underworld_warrior"}}, {name = "fire:flint_and_steel", chance = 0.3, count = {1,1}, types = {"underworld_warrior"}}, - {name = "flowers:tulip_black", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, - {name = "flowers:dandelion_white", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, - {name = "flowers:dandelion_yellow", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, - {name = "flowers:rose", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, - {name = "flowers:tulip", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, - {name = "flowers:chrysanthemum_green", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, - {name = "flowers:geranium", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, + {name = "flowers:tulip_black", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "flowers:dandelion_white", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "flowers:dandelion_yellow", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "flowers:rose", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "flowers:tulip", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "flowers:chrysanthemum_green", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + {name = "flowers:geranium", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, {name = "map:mapping_kit", chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, {name = "screwdriver:screwdriver", chance = 0.05, count = {1,1}, types = {"underworld_warrior"}}, -- don't give the player tnt:tnt, they can craft that from this if tnt is enabled for them @@ -105,10 +106,51 @@ bones_loot.register_loot({ {name = "default:ladder_steel", chance = 0.2, count = {1,5}, types = {"underworld_warrior"}}, {name = "default:meselamp", chance = 0.1, count = {1,2}, types = {"underworld_warrior"}}, {name = "default:mese_post_light", chance = 0.25, count = {1,5}, types = {"underworld_warrior"}}, +}) +end +if minetest.get_modpath("mcl_core") then +bones_loot.register_loot({ + -- Taken from the ruined portal loot table in mcl + {name = "mcl_core:iron_nugget", types = {"underworld_warrior"}, chance = 40/50, count ={9, 18}}, + {name = "mcl_core:flint", types = {"underworld_warrior"}, chance = 40/50, count ={9, 18}}, + {name = "mcl_core:obsidian", types = {"underworld_warrior"}, chance = 40/50, count ={1, 2}}, + {name = "mcl_fire:fire_charge", types = {"underworld_warrior"}, chance = 40/50, count ={1, 1}}, + {name = "mcl_fire:flint_and_steel", types = {"underworld_warrior"}, chance = 40/50, count ={1, 1}}, + {name = "mcl_core:gold_nugget", types = {"underworld_warrior"}, chance = 15/50, count ={4, 24}}, + {name = "mcl_core:apple_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_tools:axe_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_farming:hoe_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_tools:pick_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_tools:shovel_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_tools:sword_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_armor:helmet_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_armor:chestplate_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_armor:leggings_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_armor:boots_gold", types = {"underworld_warrior"}, chance = 15/50, count ={1, 1}}, + {name = "mcl_potions:speckled_melon", types = {"underworld_warrior"}, chance = 5/50, count ={4, 12}}, + {name = "mcl_farming:carrot_item_gold", types = {"underworld_warrior"}, chance = 5/50, count ={4, 12}}, + {name = "mcl_core:gold_ingot", types = {"underworld_warrior"}, chance = 5/50, count ={2, 8}}, + {name = "mcl_clock:clock", types = {"underworld_warrior"}, chance = 5/50, count ={1,1}}, + {name = "mesecons_pressureplates:pressure_plate_gold_off", types = {"underworld_warrior"}, chance = 5/50, count ={1,1}}, + {name = "mobs_mc:gold_horse_armor", types = {"underworld_warrior"}, chance = 5/50, count ={1,1}}, + {name = "mcl_bells:bell", types = {"underworld_warrior"}, chance = 1/50, count ={1,1}}, + {name = "mcl_core:apple_gold_enchanted", types = {"underworld_warrior"}, chance = 1/50, count ={1,1}}, +}) + +for flower_name, _ in pairs(mcl_flowers.registered_simple_flowers) do + bones_loot.register_loot({ + {name = flower_name, chance = 0.1, count = {1,1}, types = {"underworld_warrior"}}, + }) + +end + +end + +bones_loot.register_loot({ {name = "ice_sprites:ice_sprite_bottle", chance = 0.025, count = {1, 1}, types = {"underworld_warrior"}}, {name = "df_underworld_items:glow_amethyst", chance = 0.25, count = {1, 2}, types = {"underworld_warrior"}}, -}) +}) if df_caverns.config.enable_lava_sea then bones_loot.register_loot({name = "df_mapitems:mese_crystal", chance = 0.25, count = {1, 2}, types = {"underworld_warrior"}}) diff --git a/df_caverns/growth_restrictions.lua b/df_caverns/growth_restrictions.lua new file mode 100644 index 0000000..db9d814 --- /dev/null +++ b/df_caverns/growth_restrictions.lua @@ -0,0 +1,48 @@ +local add_biome_restrictions = function(root_table, function_name, biome_set) + local old_function = root_table[function_name] + root_table[function_name] = function(pos) + local biome = df_caverns.get_biome(pos) + return old_function(pos) and biome_set[biome] + end +end + +if df_caverns.config.restrict_trees_to_biomes then + + if minetest.get_modpath("df_trees") then + add_biome_restrictions(df_trees, "black_cap_growth_permitted", {blackcap = true}) + add_biome_restrictions(df_trees, "blood_thorn_growth_permitted", {bloodthorn = true}) + add_biome_restrictions(df_trees, "fungiwood_growth_permitted", {fungiwood = true, fungispore = true}) + add_biome_restrictions(df_trees, "goblin_cap_growth_permitted", {goblincap = true, towergoblin = true}) + add_biome_restrictions(df_trees, "nether_cap_growth_permitted", {nethercap = true}) + add_biome_restrictions(df_trees, "spore_tree_growth_permitted", {sporetree = true, fungispore = true}) + add_biome_restrictions(df_trees, "tower_cap_growth_permitted", {towercap = true, towergoblin = true}) + add_biome_restrictions(df_trees, "tunnel_tube_growth_permitted", {tunneltube = true}) + -- Deliberately not biome-restricted + --add_biome_restrictions(df_trees, "torchspine_growth_permitted", {}) + --add_biome_restrictions(df_trees, "spindlestem_growth_permitted", {}) + end + + if minetest.get_modpath("df_primordial_items") then + add_biome_restrictions(df_primordial_items, "primordial_mushroom_growth_permitted", {["primordial fungus"] = true}) + add_biome_restrictions(df_primordial_items, "giant_mycelium_growth_permitted", {["primordial fungus"] = true}) + add_biome_restrictions(df_primordial_items, "giant_fern_growth_permitted", {["primordial jungle"] = true}) + add_biome_restrictions(df_primordial_items, "jungle_mushroom_growth_permitted", {["primordial jungle"] = true}) + add_biome_restrictions(df_primordial_items, "jungletree_growth_permitted", {["primordial jungle"] = true}) + end + +end + +if df_caverns.config.restrict_farmables_to_biomes and minetest.get_modpath("df_farming") then + add_biome_restrictions(df_farming.growth_permitted, "df_farming:cave_wheat_seed", + {fungiwood = true, tunneltube = true, sporetree = true, fungispore = true}) + add_biome_restrictions(df_farming.growth_permitted, "df_farming:dimple_cup_seed", + {towergoblin = true}) + add_biome_restrictions(df_farming.growth_permitted, "df_farming:pig_tail_seed", + {sporetree = true, fungispore = true}) + add_biome_restrictions(df_farming.growth_permitted, "df_farming:quarry_bush_seed", + {bloodthorn = true}) + add_biome_restrictions(df_farming.growth_permitted, "df_farming:sweet_pod_seed", + {tunneltube = true, fungispore = true}) + add_biome_restrictions(df_farming.growth_permitted, "df_farming:plump_helmet_spawn", + {fungiwood = true, towercap = true, goblincap = true, towergoblin = true}) +end \ No newline at end of file diff --git a/df_caverns/init.lua b/df_caverns/init.lua index 8b2ecbb..ceeee01 100644 --- a/df_caverns/init.lua +++ b/df_caverns/init.lua @@ -1,11 +1,10 @@ df_caverns = {} +df_caverns.config = df_dependencies.config --grab a shorthand for the filepath of the mod local modpath = minetest.get_modpath(minetest.get_current_modname()) --load companion lua files -dofile(modpath.."/config.lua") - dofile(modpath.."/node_ids.lua") dofile(modpath.."/shared.lua") @@ -19,3 +18,4 @@ dofile(modpath.."/lava_sea.lua") dofile(modpath.."/underworld.lua") dofile(modpath.."/primordial.lua") dofile(modpath.."/dungeon_loot.lua") +dofile(modpath.."/growth_restrictions.lua") \ No newline at end of file diff --git a/df_caverns/lava_sea.lua b/df_caverns/lava_sea.lua index f9aca51..25e0a35 100644 --- a/df_caverns/lava_sea.lua +++ b/df_caverns/lava_sea.lua @@ -9,6 +9,10 @@ local c_mese_crystal = df_caverns.node_id.mese_crystal local c_mese_crystal_block = df_caverns.node_id.mese_crystal_block local c_obsidian = df_caverns.node_id.obsidian +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end ------------------------------------------------------------------------------------------- local perlin_cave = { @@ -49,6 +53,13 @@ local wave_mult = 10 local y_max = median + 2*wave_mult + -2*ceiling_mult + ceiling_displace local y_min = median - 2*wave_mult - 2*floor_mult + floor_displace +df_caverns.register_biome_check(function(pos, heat, humidity) + if pos.y > y_max or pos.y < y_min then + return + end + return "lava_sea" +end) + minetest.register_on_generated(function(minp, maxp, seed) --if out of range of cave definition limits, abort if minp.y > y_max or maxp.y < y_min then @@ -84,6 +95,7 @@ minetest.register_on_generated(function(minp, maxp, seed) data[vi] = c_air else data[vi] = c_lava + if log_location then log_location("magma_sea", area:position(vi)) end end elseif y > floor_height - 5 and y < ceiling_height and y <= lava_height + 2 and not mapgen_helper.buildable_to(data[vi]) then data[vi] = c_obsidian -- thick obsidian floor @@ -112,13 +124,16 @@ minetest.register_on_generated(function(minp, maxp, seed) -- decorate ceiling if math.random() < 0.25 then data[vi] = c_meseore + if log_location then log_location("magma_sea_meseore", area:position(vi)) end elseif mese_intensity > 0.75 and math.random() < 0.1 then data[vi] = c_meseore local bi = vi-area.ystride data[bi] = c_mese_crystal data_param2[bi] = math.random(1,4) + 19 + if log_location then log_location("magma_sea_mesecrystal", area:position(vi)) end elseif mese_intensity > 0.85 and math.random() < 0.025 then subterrane.big_stalactite(vi-area.ystride, area, data, 6, 13, c_meseore, c_meseore, c_mese_crystal_block) + if log_location then log_location("magma_sea_mesebig", area:position(vi)) end end end end diff --git a/df_caverns/level1.lua b/df_caverns/level1.lua index 774079f..617ce75 100644 --- a/df_caverns/level1.lua +++ b/df_caverns/level1.lua @@ -28,6 +28,11 @@ if minetest.get_modpath("df_farming") then } end +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + local subsea_level = df_caverns.config.level1_min - (df_caverns.config.level1_min - df_caverns.config.ymax) * 0.33 local flooding_threshold = math.min(df_caverns.config.tunnel_flooding_threshold, df_caverns.config.cavern_threshold) @@ -41,6 +46,13 @@ local get_biome = function(heat, humidity) end end +df_caverns.register_biome_check(function(pos, heat, humidity) + if pos.y < df_caverns.config.level1_min or pos.y > df_caverns.config.ymax then + return nil + end + return get_biome(heat, humidity) +end) + local tower_cap_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) local ystride = area.ystride if abs_cracks < 0.1 then @@ -118,15 +130,20 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data) if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then -- underwater floor df_caverns.flooded_cavern_floor(abs_cracks, vert_rand, vi, area, data) + if log_location then log_location("level1_flooded_"..biome_name, area:position(vi)) end elseif biome_name == "towercap" then tower_cap_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level1_towercap", area:position(vi)) end elseif biome_name == "fungiwood" then fungiwood_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level1_fungiwood", area:position(vi)) end elseif biome_name == "barren" then if flooded_caverns then df_caverns.wet_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level1_barren_wet", area:position(vi)) end else df_caverns.dry_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level1_barren_dry", area:position(vi)) end end end end @@ -215,6 +232,12 @@ local decorate_level_1 = function(minp, maxp, seed, vm, node_arrays, area, data) local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. local ystride = area.ystride + if log_location then + local flood_name = "" + if flooded_caverns then flood_name = "_flooded" end + log_location("level1_warren_"..biome_name..flood_name, area:position(vi)) + end + if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then if flooded_caverns or biome_name ~= "barren" then -- we're in flooded areas or are not barren diff --git a/df_caverns/level2.lua b/df_caverns/level2.lua index 732a214..72e3e9f 100644 --- a/df_caverns/level2.lua +++ b/df_caverns/level2.lua @@ -16,6 +16,10 @@ local c_pearls = df_caverns.node_id.pearls local chasms_path = minetest.get_modpath("chasms") +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end local wall_vein_perlin_params = { offset = 0, @@ -43,6 +47,13 @@ local get_biome = function(heat, humidity) end end +df_caverns.register_biome_check(function(pos, heat, humidity) + if pos.y < df_caverns.config.level2_min or pos.y >= df_caverns.config.level1_min then + return nil + end + return get_biome(heat, humidity) +end) + local goblin_cap_shrublist local tunnel_tube_shrublist local spore_tree_shrublist @@ -161,6 +172,7 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data) if data[vi] == c_air and math.abs(vein_noise[vein_area:transform(area, vi)]) < 0.02 then data[vi] = c_veinstone end + if log_location then log_location("level2_veinstone", area:position(vi)) end end end if data[vi] == c_air and y <= subsea_level then @@ -182,18 +194,24 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data) if minp.y < subsea_level and area:get_y(vi) < subsea_level and flooded_caverns then -- underwater floor df_caverns.flooded_cavern_floor(abs_cracks, vert_rand, vi, area, data) + if log_location then log_location("level2_flooded_"..biome_name, area:position(vi)) end elseif biome_name == "barren" then if flooded_caverns then df_caverns.wet_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level2_barren_wet", area:position(vi)) end else df_caverns.dry_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level2_barren_dry", area:position(vi)) end end elseif biome_name == "goblincap" then - goblin_cap_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + goblin_cap_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level2_goblincap", area:position(vi)) end elseif biome_name == "sporetree" then spore_tree_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level2_sporetree", area:position(vi)) end elseif biome_name == "tunneltube" then tunnel_tube_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level2_tunneltube", area:position(vi)) end end end @@ -296,6 +314,12 @@ local decorate_level_2 = function(minp, maxp, seed, vm, node_arrays, area, data) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + if log_location then + local flood_name = "" + if flooded_caverns then flood_name = "_flooded" end + log_location("level2_warren_"..biome_name..flood_name, area:position(vi)) + end + if not (flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level) then if flooded_caverns or biome_name ~= "barren" then -- we're in flooded areas or are not barren diff --git a/df_caverns/level3.lua b/df_caverns/level3.lua index 5a9d0de..9c2fc34 100644 --- a/df_caverns/level3.lua +++ b/df_caverns/level3.lua @@ -21,6 +21,11 @@ local c_webs_egg = df_caverns.node_id.big_webs_egg local chasms_path = minetest.get_modpath("chasms") +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + local subsea_level = math.floor(df_caverns.config.level3_min - (df_caverns.config.level3_min - df_caverns.config.level2_min) * 0.33) local flooding_threshold = math.min(df_caverns.config.tunnel_flooding_threshold, df_caverns.config.cavern_threshold) @@ -36,6 +41,20 @@ local get_biome = function(heat, humidity) end end +df_caverns.register_biome_check(function(pos, heat, humidity) + if pos.y < df_caverns.config.level3_min or pos.y >= df_caverns.config.level2_min then + return nil + end + local biome = get_biome(heat, humidity) + if biome == "bloodnether" then + if subterrane.get_cavern_value("cavern layer 3", pos) < 0 then + return "nethercap" + end + return "bloodthorn" + end + return biome +end) + local black_cap_shrublist local nether_cap_shrublist local blood_thorn_shrublist @@ -214,10 +233,12 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data) -- oil slick if y == subsea_level and data[vi] == c_water and math.abs(cave) + nvals_cracks[index2d]*0.025 < cavern_def.cave_threshold + 0.1 then data[vi] = c_oil + if log_location then log_location("level3_blackcap_oil", vector.new(x,y,z)) end end elseif biome_name == "bloodnether" and y <= subsea_level and y > subsea_level - ice_thickness and data[vi] == c_water then -- floating ice data[vi] = c_ice + if log_location then log_location("level3_nethercap_floating_ice", vector.new(x,y,z)) end end end end @@ -236,7 +257,7 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data) local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then - -- underwater floor + -- underwater floor. Not using df_caverns.flooded_cavern_floor to make level 3 water darker local ystride = area.ystride if abs_cracks > 0.25 and data[vi-ystride] ~= c_water then data[vi] = c_gravel @@ -247,10 +268,12 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data) subterrane.big_stalagmite(vi+ystride, area, data, 6, 15, c_wet_flowstone, c_wet_flowstone, c_wet_flowstone) end end + if log_location then log_location("level3_flooded_"..biome_name, area:position(vi)) end elseif biome_name == "barren" then if flooded_caverns then -- wet zone floor df_caverns.dry_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level3_barren_dry", area:position(vi)) end else -- dry zone floor, add crystals if abs_cracks < 0.075 then @@ -258,14 +281,18 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data) elseif abs_cracks > 0.3 and math.random() < 0.005 then df_mapitems.place_big_crystal_cluster(area, data, data_param2, vi+area.ystride, math.random(0,2), false) end + if log_location then log_location("level3_barren_wet", area:position(vi)) end end elseif biome_name == "blackcap" then - black_cap_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + black_cap_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level3_blackcap", area:position(vi)) end elseif biome_name == "bloodnether" then if flooded_caverns then nether_cap_cavern_floor(cracks, abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level3_nethercap", area:position(vi)) end else blood_thorn_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("level3_bloodthorn", area:position(vi)) end end end end @@ -396,6 +423,12 @@ local decorate_level_3 = function(minp, maxp, seed, vm, node_arrays, area, data) local biome_name = get_biome(heatmap[index2d], humiditymap[index2d]) local flooded_caverns = nvals_cave[vi] < 0 -- this indicates if we're in the "flooded" set of caves or not. + if log_location then + local flood_name = "" + if flooded_caverns then flood_name = "_flooded" end + log_location("level3_warren_"..biome_name..flood_name, area:position(vi)) + end + if flooded_caverns and minp.y < subsea_level and area:get_y(vi) < subsea_level then -- underwater ceiling, do nothing elseif biome_name == "bloodnether" and flooded_caverns then diff --git a/df_caverns/mod.conf b/df_caverns/mod.conf index 0c3b855..103ebb4 100644 --- a/df_caverns/mod.conf +++ b/df_caverns/mod.conf @@ -1,4 +1,4 @@ name = df_caverns description = Adds vast underground caverns in the style of Dwarf Fortress, complete with underground flora in diverse biomes. Also adds stalactite/stalagmite decorations in the smaller tunnels. -depends = default, subterrane, df_trees, df_mapitems -optional_depends = df_farming, ice_sprites, oil, df_underworld_items, magma_conduits, bones_loot, named_waypoints, name_generator, fireflies, chasms, big_webs \ No newline at end of file +depends = df_dependencies, subterrane, df_trees, df_mapitems +optional_depends = df_farming, ice_sprites, oil, df_underworld_items, magma_conduits, bones_loot, named_waypoints, name_generator, fireflies, chasms, big_webs, mcl_flowers \ No newline at end of file diff --git a/df_caverns/node_ids.lua b/df_caverns/node_ids.lua index f71d708..0b003cd 100644 --- a/df_caverns/node_ids.lua +++ b/df_caverns/node_ids.lua @@ -1,41 +1,41 @@ df_caverns.node_id = {} -minetest.after(1, function() df_caverns.node_id = nil end) -- should only be used during initialization. +minetest.after(0, function() df_caverns.node_id = nil end) -- should only be used during initialization. -if minetest.get_modpath("ice_sprites") then - df_caverns.node_id.sprite = minetest.get_content_id("ice_sprites:ice_sprite") +if df_dependencies.node_name_fireflies then + df_caverns.node_id.fireflies = minetest.get_content_id(df_dependencies.node_name_fireflies) end -if minetest.get_modpath("fireflies") then - df_caverns.node_id.fireflies = minetest.get_content_id("fireflies:firefly") -end - -if minetest.get_modpath("df_farming") then - df_caverns.node_id.dead_fungus = minetest.get_content_id("df_farming:dead_fungus") -end +df_caverns.node_id.cobble = minetest.get_content_id(df_dependencies.node_name_cobble) +df_caverns.node_id.desert_sand = minetest.get_content_id(df_dependencies.node_name_desert_sand) +df_caverns.node_id.dirt = minetest.get_content_id(df_dependencies.node_name_dirt) +df_caverns.node_id.gravel = minetest.get_content_id(df_dependencies.node_name_gravel) +df_caverns.node_id.ice = minetest.get_content_id(df_dependencies.node_name_ice) +df_caverns.node_id.lava = minetest.get_content_id(df_dependencies.node_name_lava_source) +df_caverns.node_id.meseore = minetest.get_content_id(df_dependencies.node_name_stone_with_mese) +df_caverns.node_id.mossycobble = minetest.get_content_id(df_dependencies.node_name_mossycobble) +df_caverns.node_id.obsidian = minetest.get_content_id(df_dependencies.node_name_obsidian) +df_caverns.node_id.sand = minetest.get_content_id(df_dependencies.node_name_sand) +df_caverns.node_id.silver_sand = minetest.get_content_id(df_dependencies.node_name_silver_sand) +df_caverns.node_id.snow = minetest.get_content_id(df_dependencies.node_name_snow) +df_caverns.node_id.stone = minetest.get_content_id(df_dependencies.node_name_stone) +df_caverns.node_id.stone_with_coal = minetest.get_content_id(df_dependencies.node_name_stone_with_coal) +df_caverns.node_id.water = minetest.get_content_id(df_dependencies.node_name_water_source) if minetest.get_modpath("big_webs") then df_caverns.node_id.big_webs = minetest.get_content_id("big_webs:webbing") df_caverns.node_id.big_webs_egg = minetest.get_content_id("big_webs:web_egg") end -df_caverns.node_id.air = minetest.get_content_id("air") +if minetest.get_modpath("ice_sprites") then + df_caverns.node_id.sprite = minetest.get_content_id("ice_sprites:ice_sprite") +end -df_caverns.node_id.cobble = minetest.get_content_id("default:cobble") -df_caverns.node_id.desert_sand = minetest.get_content_id("default:desert_sand") -df_caverns.node_id.dirt = minetest.get_content_id("default:dirt") -df_caverns.node_id.gravel = minetest.get_content_id("default:gravel") -df_caverns.node_id.ice = minetest.get_content_id("default:ice") -df_caverns.node_id.lava = minetest.get_content_id("default:lava_source") -df_caverns.node_id.meseore = minetest.get_content_id("default:stone_with_mese") -df_caverns.node_id.mossycobble = minetest.get_content_id("default:mossycobble") -df_caverns.node_id.obsidian = minetest.get_content_id("default:obsidian") -df_caverns.node_id.sand = minetest.get_content_id("default:sand") -df_caverns.node_id.silver_sand = minetest.get_content_id("default:silver_sand") -df_caverns.node_id.snow = minetest.get_content_id("default:snow") -df_caverns.node_id.stone = minetest.get_content_id("default:stone") -df_caverns.node_id.stone_with_coal = minetest.get_content_id("default:stone_with_coal") -df_caverns.node_id.water = minetest.get_content_id("default:water_source") +if minetest.get_modpath("df_farming") then + df_caverns.node_id.dead_fungus = minetest.get_content_id("df_farming:dead_fungus") +end + +df_caverns.node_id.air = minetest.get_content_id("air") df_caverns.node_id.cobble_fungus = minetest.get_content_id("df_mapitems:cobble_with_floor_fungus") df_caverns.node_id.cobble_fungus_fine = minetest.get_content_id("df_mapitems:cobble_with_floor_fungus_fine") diff --git a/df_caverns/oil_sea.lua b/df_caverns/oil_sea.lua index b16ef2f..7123b2d 100644 --- a/df_caverns/oil_sea.lua +++ b/df_caverns/oil_sea.lua @@ -8,6 +8,11 @@ local c_gas_wisp = df_caverns.node_id.gas_wisp local c_lava = df_caverns.node_id.lava local c_obsidian = df_caverns.node_id.obsidian +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + ------------------------------------------------------------------------------------------- local perlin_cave = { @@ -41,6 +46,13 @@ local c_lava_set local y_max = median + 2*wave_mult + 2*ceiling_mult + ceiling_displace local y_min = median - 2*wave_mult + 2*floor_mult + floor_displace +df_caverns.register_biome_check(function(pos, heat, humidity) + if pos.y > y_max or pos.y < y_min then + return + end + return "oil_sea" +end) + minetest.register_on_generated(function(minp, maxp, seed) --if out of range of cave definition limits, abort if minp.y > y_max or maxp.y < y_min then @@ -86,6 +98,7 @@ minetest.register_on_generated(function(minp, maxp, seed) end else data[vi] = c_oil + if log_location then log_location("oil_sea", area:position(vi)) end end end @@ -109,7 +122,7 @@ end) minetest.register_ore({ ore_type = "scatter", ore = "mine_gas:gas_seep", - wherein = "default:stone", + wherein = df_dependencies.node_name_stone, clust_scarcity = 32 * 32 * 32, clust_num_ores = 27, clust_size = 6, diff --git a/df_caverns/primordial.lua b/df_caverns/primordial.lua index 4991c60..d72f708 100644 --- a/df_caverns/primordial.lua +++ b/df_caverns/primordial.lua @@ -4,6 +4,11 @@ end local c_air = df_caverns.node_id.air +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + local perlin_cave_primordial = { offset = 0, scale = 1, @@ -24,6 +29,16 @@ local perlin_wave_primordial = { local giant_mycelium_timer_spread = tonumber(minetest.settings:get("dcaverns_giant_mycelium_timer_spread")) or 10 +df_caverns.register_biome_check(function(pos, heat, humidity) + if pos.y < df_caverns.config.primordial_min or pos.y > df_caverns.config.primordial_max then + return nil + end + if subterrane.get_cavern_value("primordial", pos) < 0 then + return "primordial jungle" + end + return "primordial fungus" +end) + ----------------------------------------------------------------------------------------- -- Fungal biome @@ -150,6 +165,16 @@ local jungle_cavern_floor = function(abs_cracks, humidity, vi, area, data, data_ local ystride = area.ystride local humidityfactor = humidity/100 + if log_location then + local pos = area:position(vi) + log_location("primordial_jungle", pos) + if humidityfactor < 0.25 then + log_location("primordial_jungle_low_humidity", pos) + elseif humidityfactor > 0.75 then + log_location("primordial_jungle_high_humidity", pos) + end + end + data[vi] = c_jungle_dirt local rand = math.random() @@ -169,6 +194,7 @@ local jungle_cavern_floor = function(abs_cracks, humidity, vi, area, data, data_ local firefly_vi = vi + ystride * math.random(1, 5) if data[firefly_vi] == c_air then data[firefly_vi] = c_fireflies + minetest.get_node_timer(area:position(firefly_vi)):start(1) end end end @@ -237,6 +263,7 @@ local jungle_warren_floor = function(abs_cracks, vi, area, data, data_param2) local firefly_vi = vi + ystride * math.random(1, 5) if data[firefly_vi] == c_air then data[firefly_vi] = c_fireflies + minetest.get_node_timer(area:position(firefly_vi)):start(1) end end end @@ -268,6 +295,7 @@ local decorate_primordial = function(minp, maxp, seed, vm, node_arrays, area, da jungle_cavern_floor(abs_cracks, humidity, vi, area, data, data_param2) else mushroom_cavern_floor(abs_cracks, humidity, vi, area, data, data_param2) + if log_location then log_location("primordial_mushrooms", area:position(vi)) end end end @@ -327,8 +355,10 @@ local decorate_primordial = function(minp, maxp, seed, vm, node_arrays, area, da if jungle then jungle_warren_floor(abs_cracks, vi, area, data, data_param2) + if log_location then log_location("primordial_jungle_warren", area:position(vi)) end else mushroom_warren_floor(abs_cracks, vi, area, data, data_param2) + if log_location then log_location("primordial_mushroom_warren", area:position(vi)) end end end @@ -367,7 +397,7 @@ subterrane.register_layer({ columns = { maximum_radius = 20, minimum_radius = 5, - node = "default:stone", -- no flowstone below the Sunless Sea, replace with something else + node = df_dependencies.node_name_stone, -- no flowstone below the Sunless Sea, replace with something else weight = 0.5, maximum_count = 60, minimum_count = 10, @@ -411,7 +441,7 @@ minetest.register_ore({ random_factor = 0, }) --- Rather than make plants farmable, have them randomly respawn in jungle soil. You can only get them down there. +-- Rather than make plants farmable, have them randomly respawn in jungle soil. You can only get them down there by foraging, not farming. minetest.register_abm({ label = "Primordial plant growth", nodenames = {"df_primordial_items:dirt_with_jungle_grass"}, diff --git a/df_caverns/schematics/lamppost.lua b/df_caverns/schematics/lamppost.lua index 52f27ad..5565469 100644 --- a/df_caverns/schematics/lamppost.lua +++ b/df_caverns/schematics/lamppost.lua @@ -1,35 +1,49 @@ -local outer_stair = "stairs:stair_outer_slade_brick" -if stairs.register_stair_outer == nil then -- 0.4.16 compatibility - outer_stair = "df_underworld_items:slade_brick" -end - local n1 = { name = "df_underworld_items:slade_block", force_place=true } -local n2 = { name = outer_stair, param2 = 1, force_place=true } -local n3 = { name = "stairs:stair_slade_brick", force_place=true } -local n4 = { name = outer_stair, force_place=true } +local n2 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 1, force_place=true } +local n3 = { name = df_dependencies.node_name_stair_slade_brick, force_place=true } +local n4 = { name = df_dependencies.node_name_stair_outer_slade_brick, force_place=true } local n5 = { name = "air", force_place=true } local n6 = { name = "df_underworld_items:slade_seal", force_place=true } -local n7 = { name = "stairs:stair_slade_brick", param2 = 1, force_place=true } +local n7 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 1, force_place=true } local n8 = { name = "df_underworld_items:slade_brick", force_place=true } -local n9 = { name = "stairs:stair_slade_brick", param2 = 3, force_place=true } +local n9 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 3, force_place=true } local n10 = { name = "df_underworld_items:slade_wall", force_place=true } -local n11 = { name = "default:meselamp", force_place=true } -local n12 = { name = outer_stair, param2 = 2, force_place=true } -local n13 = { name = "stairs:stair_slade_brick", param2 = 2, force_place=true } -local n14 = { name = outer_stair, param2 = 3, force_place=true } +local n11 = { name = "df_underworld_items:ancient_lantern_slade_worn", prob=192 } -- 50% chance of being force-placed +local n12 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 2, force_place=true } +local n13 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 2, force_place=true } +local n14 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 3, force_place=true } return { name = "df_caverns:lamppost", size = {x = 3, y = 15, z = 3}, center_pos = {x = 1, y = 7, z = 1}, data = { - n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, - n1, n1, n1, n1, n1, n1, n1, n2, n3, n4, n5, n5, n5, n5, n5, n5, n5, - n5, n5, n5, n5, n5, n5, n5, n5, n5, n5, n5, n1, n1, n1, n1, n5, n1, - n1, n5, n1, n1, n5, n1, n1, n5, n1, n1, n5, n1, n1, n5, n1, n1, n6, - n1, n7, n8, n9, n5, n8, n5, n5, n8, n5, n5, n10, n5, n5, n10, n5, n5, - n11, n5, n5, n5, n5, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, - n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n12, n13, n14, n5, - n5, n5, n5, n5, n5, n5, n5, n5, n5, n5, n5, n5, n5, n5, n5, n5, n5, + n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n2, n3, n4, + n5, n5, n5, + n5, n5, n5, + n5, n5, n5, + n5, n5, n5, + n5, n11, n5, + n5, n5, n5, + n1, n1, n1, n1, n5, n1, n1, n5, n1, + n1, n5, n1, n1, n5, n1, n1, n5, n1, + n1, n5, n1, n1, n6, n1, n7, n8, n9, + n5, n8, n5, + n5, n8, n5, + n5, n10, n5, + n5, n10, n5, + n11, n10, n11, + n5, n5, n5, + n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n1, n1, n1, + n1, n1, n1, n1, n1, n1, n12, n13, n14, + n5, n5, n5, + n5, n5, n5, + n5, n5, n5, + n5, n5, n5, + n5, n11, n5, + n5, n5, n5, } } diff --git a/df_caverns/schematics/medium_building.lua b/df_caverns/schematics/medium_building.lua index d200a2f..1385364 100644 --- a/df_caverns/schematics/medium_building.lua +++ b/df_caverns/schematics/medium_building.lua @@ -1,28 +1,23 @@ -local outer_stair = "stairs:stair_outer_slade_brick" -if stairs.register_stair_outer == nil then -- 0.4.16 compatibility - outer_stair = "df_underworld_items:slade_brick" -end - local n1 = { name = "ignore"} local n8 = { name = "air", force_place=true } local n3 = { name = "df_underworld_items:slade_brick", force_place=true } local n4 = { name = "df_underworld_items:slade_wall", force_place=true } -local n5 = { name = outer_stair, param2 = 1, force_place=true } -local n6 = { name = "stairs:stair_slade_brick", force_place=true } -local n7 = { name = outer_stair, force_place=true } -local n9 = { name = "stairs:slab_slade_brick", param2 = 23, force_place=true } -local n10 = { name = "stairs:stair_slade_brick", param2 = 1, force_place=true } -local n11 = { name = "stairs:stair_slade_brick", param2 = 3, force_place=true } -local n14 = { name = "stairs:stair_slade_brick", param2 = 23, force_place=true } -local n15 = { name = outer_stair, param2 = 2, force_place=true } -local n16 = { name = "stairs:stair_slade_brick", param2 = 2, force_place=true } -local n17 = { name = outer_stair, param2 = 3, force_place=true } +local n5 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 1, force_place=true } +local n6 = { name = df_dependencies.node_name_stair_slade_brick, force_place=true } +local n7 = { name = df_dependencies.node_name_stair_outer_slade_brick, force_place=true } +local n9 = { name = df_dependencies.node_name_slab_slade_brick, param2 = 23, force_place=true } +local n10 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 1, force_place=true } +local n11 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 3, force_place=true } +local n14 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 23, force_place=true } +local n15 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 2, force_place=true } +local n16 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 2, force_place=true } +local n17 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 3, force_place=true } -- foundation nodes local n2 = { name = "df_underworld_items:slade_brick", force_place=false, place_on_condition=mapgen_helper.buildable_to } local n12 = { name = "df_underworld_items:slade_wall", force_place=false, place_on_condition=mapgen_helper.buildable_to } -local n13 = { name = "stairs:stair_slade_brick", param2 = 1, force_place=false, place_on_condition=mapgen_helper.buildable_to } +local n13 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 1, force_place=false, place_on_condition=mapgen_helper.buildable_to } return { diff --git a/df_caverns/schematics/oubliette.lua b/df_caverns/schematics/oubliette.lua index e78c216..99c7d51 100644 --- a/df_caverns/schematics/oubliette.lua +++ b/df_caverns/schematics/oubliette.lua @@ -1,19 +1,14 @@ -local outer_stair = "stairs:stair_outer_slade_brick" -if stairs.register_stair_outer == nil then -- 0.4.16 compatibility - outer_stair = "df_underworld_items:slade_brick" -end - local n1 = { name = "df_underworld_items:slade_block", force_place=true } -local n2 = { name = outer_stair, param2 = 1, force_place=true } -local n3 = { name = "stairs:stair_slade_brick", force_place=true } -local n4 = { name = outer_stair, force_place=true } +local n2 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 1, force_place=true } +local n3 = { name = df_dependencies.node_name_stair_slade_brick, force_place=true } +local n4 = { name = df_dependencies.node_name_stair_outer_slade_brick, force_place=true } local n5 = { name = "air", force_place=true } local n6 = { name = "df_underworld_items:slade_seal", force_place=true } -local n7 = { name = "stairs:stair_slade_brick", param2 = 1, force_place=true } -local n8 = { name = "stairs:stair_slade_brick", param2 = 3, force_place=true } -local n9 = { name = outer_stair, param2 = 2, force_place=true } -local n10 = { name = "stairs:stair_slade_brick", param2 = 2, force_place=true } -local n11 = { name = outer_stair, param2 = 3, force_place=true } +local n7 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 1, force_place=true } +local n8 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 3, force_place=true } +local n9 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 2, force_place=true } +local n10 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 2, force_place=true } +local n11 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 3, force_place=true } return { name="df_caverns:oubliette", diff --git a/df_caverns/schematics/small_building.lua b/df_caverns/schematics/small_building.lua index 8b6cb6e..a819b48 100644 --- a/df_caverns/schematics/small_building.lua +++ b/df_caverns/schematics/small_building.lua @@ -1,28 +1,26 @@ -local outer_stair = "stairs:stair_outer_slade_brick" -if stairs.register_stair_outer == nil then -- 0.4.16 compatibility - outer_stair = "df_underworld_items:slade_brick" -end - local n1 = { name = "ignore" } local n10 = { name = "air", force_place=true } local n3 = { name = "df_underworld_items:slade_brick", force_place=true } local n4 = { name = "df_underworld_items:slade_wall", force_place=true } -local n5 = { name = outer_stair, param2 = 1, force_place=true } -local n6 = { name = "stairs:stair_slade_brick", force_place=true } -local n7 = { name = outer_stair, force_place=true } -local n11 = { name = "stairs:stair_slade_brick", param2 = 1, force_place=true } -local n12 = { name = "stairs:slab_slade_brick", param2 = 22, force_place=true} -local n13 = { name = "stairs:stair_slade_brick", param2 = 3, force_place=true } -local n15 = { name = outer_stair, param2 = 2, force_place=true } -local n16 = { name = "stairs:stair_slade_brick", param2 = 2, force_place=true } -local n17 = { name = outer_stair, param2 = 3, force_place=true } +local n5 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 1, force_place=true } +local n6 = { name = df_dependencies.node_name_stair_slade_brick, force_place=true } +local n7 = { name = df_dependencies.node_name_stair_outer_slade_brick, force_place=true } +local n11 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 1, force_place=true } +local n12 = { name = df_dependencies.node_name_slab_slade_brick, param2 = 22, force_place=true} +local n13 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 3, force_place=true } +local n15 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 2, force_place=true } +local n16 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 2, force_place=true } +local n17 = { name = df_dependencies.node_name_stair_outer_slade_brick, param2 = 3, force_place=true } -- foundation nodes local n2 = { name = "df_underworld_items:slade_brick", force_place=false, place_on_condition=mapgen_helper.buildable_to } -local n8 = { name = "stairs:stair_slade_brick", param2 = 2, force_place=false, place_on_condition=mapgen_helper.buildable_to } -local n9 = { name = "stairs:stair_slade_brick", force_place=false, place_on_condition=mapgen_helper.buildable_to } -local n14 = { name = "stairs:stair_slade_brick", param2 = 1, force_place=false, place_on_condition=mapgen_helper.buildable_to } +local n8 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 2, force_place=false, place_on_condition=mapgen_helper.buildable_to } +local n9 = { name = df_dependencies.node_name_stair_slade_brick, force_place=false, place_on_condition=mapgen_helper.buildable_to } +local n14 = { name = df_dependencies.node_name_stair_slade_brick, param2 = 1, force_place=false, place_on_condition=mapgen_helper.buildable_to } + + +local n18 = { name = "df_underworld_items:puzzle_chest_closed", param2 = 1, prob=192 } -- 50% chance of being force-placed. return { name = "df_caverns:small_building", @@ -51,7 +49,7 @@ return { n2, n2, n2, n2, n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n1, n2, n3, n3, n3, n3, n3, n3, n3, n1, n1, n1, - n10, n10, n10, n10, n10, n10, n10, n4, n1, n1, n1, n10, n10, n10, + n10, n10, n10, n10, n10, n10, n18, n4, n1, n1, n1, n10, n10, n10, n10, n10, n10, n10, n4, n1, n1, n1, n1, n11, n12, n12, n12, n12, n12, n13, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n2, n2, n2, n2, n2, n2, n2, n2, n2, n1, n1, n9, n2, n2, n2, n2, n2, n2, n2, n2, diff --git a/df_caverns/schematics/small_slab.lua b/df_caverns/schematics/small_slab.lua index b7293dd..91c46c4 100644 --- a/df_caverns/schematics/small_slab.lua +++ b/df_caverns/schematics/small_slab.lua @@ -1,15 +1,10 @@ -local inner_stair = "stairs:stair_inner_slade_brick" -if stairs.register_stair_inner == nil then -- 0.4.16 compatibility - inner_stair = "df_underworld_items:slade_brick" -end - local n1 = { name = "df_underworld_items:slade_brick", force_place=false, place_on_condition=mapgen_helper.buildable_to } -local n2 = { name = inner_stair, param2 = 1, force_place=true } -local n3 = { name = inner_stair, force_place=true } +local n2 = { name = df_dependencies.node_name_stair_inner_slade_brick, param2 = 1, force_place=true } +local n3 = { name = df_dependencies.node_name_stair_inner_slade_brick, force_place=true } local n4 = { name = "df_underworld_items:slade_brick", force_place=true } -local n5 = { name = inner_stair, param2 = 2, force_place=true } -local n6 = { name = inner_stair, param2 = 3, force_place=true } +local n5 = { name = df_dependencies.node_name_stair_inner_slade_brick, param2 = 2, force_place=true } +local n6 = { name = df_dependencies.node_name_stair_inner_slade_brick, param2 = 3, force_place=true } return { name = "df_caverns:small_slab", diff --git a/df_caverns/shared.lua b/df_caverns/shared.lua index 733e257..bf8120a 100644 --- a/df_caverns/shared.lua +++ b/df_caverns/shared.lua @@ -21,7 +21,35 @@ local c_wet_flowstone = df_caverns.node_id.wet_flowstone local c_webs = df_caverns.node_id.big_webs local c_webs_egg = df_caverns.node_id.big_webs_egg -df_caverns.data_param2 = {} +df_caverns.data_param2 = {} -- shared among all mapgens to reduce memory clutter + +local get_biome_at_pos_list = {} -- a list of methods of the form function(pos, heat, humidity) to allow modpack-wide queries about what should grow where +df_caverns.register_biome_check = function(func) + table.insert(get_biome_at_pos_list, func) +end +df_caverns.get_biome = function(pos) + local heat = minetest.get_heat(pos) + local humidity = minetest.get_humidity(pos) + for _, val in pairs(get_biome_at_pos_list) do + local biome = val(pos, heat, humidity) + if biome ~= nil then + return biome + end + end +end + +-- for testing +--local debug_timer = 0 +--minetest.register_globalstep(function(dtime) +-- debug_timer = debug_timer + dtime +-- if debug_timer > 5 then +-- local singleplayer = minetest.get_player_by_name("singleplayer") +-- if singleplayer then +-- minetest.debug(df_caverns.get_biome(singleplayer:get_pos())) +-- end +-- debug_timer = debug_timer - 5 +-- end +--end) -- prevent mapgen from using these nodes as a base for stalactites or stalagmites local dont_build_speleothems_on = {} diff --git a/df_caverns/sunless_sea.lua b/df_caverns/sunless_sea.lua index 4625ccc..607d91f 100644 --- a/df_caverns/sunless_sea.lua +++ b/df_caverns/sunless_sea.lua @@ -11,6 +11,11 @@ local c_obsidian = df_caverns.node_id.obsidian local chasms_path = minetest.get_modpath("chasms") +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + local c_coral_table = {} for node_name, node_def in pairs(minetest.registered_nodes) do if minetest.get_item_group(node_name, "dfcaverns_cave_coral") > 0 then @@ -18,11 +23,11 @@ for node_name, node_def in pairs(minetest.registered_nodes) do end end -local mushroom_shrublist +local towergoblin_shrublist local fungispore_shrublist if minetest.get_modpath("df_farming") then - mushroom_shrublist = { + towergoblin_shrublist = { df_farming.spawn_plump_helmet_vm, df_farming.spawn_plump_helmet_vm, df_farming.spawn_dimple_cup_vm, @@ -94,7 +99,24 @@ local hot_zone_boundary = 70 local middle_zone_boundary = 50 local cool_zone_boundary = 30 -local mushroom_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) +df_caverns.register_biome_check(function(pos, heat, humidity) + if pos.y < df_caverns.config.sunless_sea_min or pos.y >= df_caverns.config.level3_min then + return nil + end + if pos.y < sea_level then + return "sunless undersea" + elseif heat > hot_zone_boundary then + return "barren" -- hot zone + elseif heat > middle_zone_boundary then + return "fungispore" + elseif heat > cool_zone_boundary then + return "towergoblin" + else + return "barren" -- cool zone + end +end) + +local towergoblin_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, data_param2) local ystride = area.ystride if abs_cracks < 0.1 then df_caverns.stalagmites(abs_cracks, vert_rand, vi, area, data, data_param2, true) @@ -105,7 +127,7 @@ local mushroom_cavern_floor = function(abs_cracks, vert_rand, vi, area, data, da data[vi] = c_dirt_moss end if math.random() < 0.1 then - df_caverns.place_shrub(vi+ystride, area, data, data_param2, mushroom_shrublist) + df_caverns.place_shrub(vi+ystride, area, data, data_param2, towergoblin_shrublist) elseif abs_cracks > 0.25 then if math.random() < 0.01 then df_trees.spawn_tower_cap_vm(vi+ystride, area, data) @@ -216,6 +238,7 @@ local decorate_sunless_sea = function(minp, maxp, seed, vm, node_arrays, area, d end elseif y > floor_height and y < ceiling_height and data[vi] ~= c_wet_flowstone then data[vi] = c_air + if log_location then log_location("sunless_sea_river", vector.new(x,y,z)) end elseif y == ceiling_height and not mapgen_helper.buildable_to(data[vi]) then df_caverns.glow_worm_cavern_ceiling(math.abs(cracks), mapgen_helper.xz_consistent_randomi(area, vi), vi, area, data, data_param2) @@ -266,12 +289,16 @@ local decorate_sunless_sea = function(minp, maxp, seed, vm, node_arrays, area, d if y >= sea_level then if heat > hot_zone_boundary then hot_zone_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("sunless_sea_hot", area:position(vi)) end elseif heat > middle_zone_boundary then fungispore_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("sunless_sea_fungispore", area:position(vi)) end elseif heat > cool_zone_boundary then - mushroom_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + towergoblin_cavern_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("sunless_sea_towergoblin", area:position(vi)) end else cool_zone_floor(abs_cracks, vert_rand, vi, area, data, data_param2) + if log_location then log_location("sunless_sea_cool", area:position(vi)) end end elseif y >= sea_level - 30 then if math.random() < 0.005 then @@ -285,6 +312,7 @@ local decorate_sunless_sea = function(minp, maxp, seed, vm, node_arrays, area, d local iterations = math.random(1, 6) df_mapitems.spawn_coral_pile(area, data, vi, iterations) df_mapitems.spawn_castle_coral(area, data, vi+area.ystride, iterations) + if log_location then log_location("sunless_sea_castle_coral", area:position(vi)) end end end end @@ -368,6 +396,7 @@ local decorate_sunless_sea = function(minp, maxp, seed, vm, node_arrays, area, d for _, vi in ipairs(node_arrays.warren_floor_nodes) do if area:get_y(vi) >= sea_level and not mapgen_helper.buildable_to(data[vi]) then df_caverns.tunnel_floor(minp, maxp, area, vi, nvals_cracks, data, data_param2, true) + if log_location then log_location("sunless_sea_warren", area:position(vi)) end end end diff --git a/df_caverns/surface_tunnels.lua b/df_caverns/surface_tunnels.lua index 9b966a7..0335748 100644 --- a/df_caverns/surface_tunnels.lua +++ b/df_caverns/surface_tunnels.lua @@ -15,6 +15,7 @@ minetest.register_on_generated(function(minp, maxp, seed) local t_start = os.clock() local vm, data, data_param2, area = mapgen_helper.mapgen_vm_data_param2() + local data_changed = false local eminp = {x=minp.x, y=area.MinEdge.y, z=minp.z} local emaxp = {x=maxp.x, y=area.MaxEdge.y, z=maxp.z} @@ -51,9 +52,11 @@ minetest.register_on_generated(function(minp, maxp, seed) local index2d = mapgen_helper.index2d(minp, maxp, x, z) local humidity = humiditymap[index2d] if previous_potential_floor_y <= maxp_y and previous_potential_floor_y >= minp_y then + data_changed = true df_caverns.tunnel_floor(minp, maxp, area, previous_potential_floor_vi, nvals_cracks, data, data_param2, humidity > 30) end if y <= maxp_y and y >= minp_y then + data_changed = true df_caverns.tunnel_ceiling(minp, maxp, area, vi, nvals_cracks, data, data_param2, humidity > 30) end previous_potential_floor_vi = nil @@ -66,16 +69,18 @@ minetest.register_on_generated(function(minp, maxp, seed) end - --send data back to voxelmanip - vm:set_data(data) - vm:set_param2_data(data_param2) - --calc lighting - vm:set_lighting({day = 0, night = 0}) - vm:calc_lighting() + if data_changed then + --send data back to voxelmanip + vm:set_data(data) + vm:set_param2_data(data_param2) + --calc lighting + vm:set_lighting({day = 0, night = 0}) + vm:calc_lighting() - vm:update_liquids() - --write it to world - vm:write_to_map() + vm:update_liquids() + --write it to world + vm:write_to_map() + end local time_taken = os.clock() - t_start -- how long this chunk took, in seconds mapgen_helper.record_time("df_caverns surface tunnels", time_taken) diff --git a/df_caverns/underworld.lua b/df_caverns/underworld.lua index ffe2d8b..6ad18f7 100644 --- a/df_caverns/underworld.lua +++ b/df_caverns/underworld.lua @@ -6,11 +6,17 @@ local modpath = minetest.get_modpath(modname) local S = minetest.get_translator(modname) local bones_loot_path = minetest.get_modpath("bones_loot") +local bones_node = df_dependencies.node_name_bones local named_waypoints_path = minetest.get_modpath("named_waypoints") local name_generator_path = minetest.get_modpath("name_generator") local hunters_enabled = minetest.get_modpath("hunter_statue") and df_underworld_items.config.underworld_hunter_statues +local log_location +if mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + local name_pit = function() end local name_ruin = function() end @@ -304,6 +310,8 @@ local get_pit = function(pos) return {location = location, radius = radius, variance = variance, depth = depth} end +df_caverns.get_nearest_glowing_pit = get_pit + local perlin_pit = { offset = 0, scale = 1, @@ -328,6 +336,13 @@ minetest.register_chatcommand("find_pit", { end, }) +df_caverns.register_biome_check(function(pos, heat, humidity) + if pos.y > y_max or pos.y < y_min then + return + end + return "underworld" +end) + minetest.register_on_generated(function(minp, maxp, seed) --if out of range of cave definition limits, abort @@ -387,6 +402,7 @@ minetest.register_on_generated(function(minp, maxp, seed) if distance < pit.radius -2.5 then if y < median + floor_displace + wave - pit.depth or y < underside_height + plasma_depth_min then data[vi] = c_pit_plasma + if log_location then log_location("underworld_pit", vector.new(x,y,z)) end else data[vi] = c_air end @@ -463,15 +479,40 @@ minetest.register_on_generated(function(minp, maxp, seed) mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, oubliette_schematic, 0, {["df_underworld_items:slade_seal"] = "air"}) elseif building.building_type == "lamppost" then mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, lamppost_schematic) + local lamp_pos = vector.new(building.pos.x, building.pos.y+6, building.pos.z) + minetest.after(math.random()*10, function() + -- not all of these locations will get a lamp, but it's easier to just set four + -- timers than to worry about testing first. + minetest.get_node_timer({x=lamp_pos.x+1, y=lamp_pos.y, z=lamp_pos.z}):start(math.random()*30) + minetest.get_node_timer({x=lamp_pos.x-1, y=lamp_pos.y, z=lamp_pos.z}):start(math.random()*30) + minetest.get_node_timer({x=lamp_pos.x, y=lamp_pos.y, z=lamp_pos.z+1}):start(math.random()*30) + minetest.get_node_timer({x=lamp_pos.x, y=lamp_pos.y, z=lamp_pos.z-1}):start(math.random()*30) + end) elseif building.building_type == "small building" then mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, small_building_schematic, building.rotation) + local pos = building.pos + minetest.after(1, function() + local puzzle_chest = minetest.find_node_near(pos, 4, {"df_underworld_items:puzzle_chest_closed"}, true) + if puzzle_chest then + local def = minetest.registered_nodes["df_underworld_items:puzzle_chest_closed"] + def.can_dig(puzzle_chest) -- initializes the inventory + local meta = minetest.get_meta(puzzle_chest) + local inv = meta:get_inventory() + for i = 1, math.random(1,8) do + local item = ItemStack(df_underworld_items.colour_items[math.random(1,#df_underworld_items.colour_items)]) + --item:set_count(math.random(1,4)) + inv:add_item("main", item) + end + end + end) elseif building.building_type == "medium building" then mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, medium_building_schematic, building.rotation) if name_generator_path then if not next(named_waypoints.get_waypoints_in_area("underworld_ruins", vector.subtract(building.pos, 250), vector.add(building.pos, 250))) then named_waypoints.add_waypoint("underworld_ruins", {x=building.pos.x, y=floor_height+1, z=building.pos.z}, {name=name_ruin()}) end - end + end + if log_location then log_location("underworld_building", building.pos) end elseif building.building_type == "small slab" then mapgen_helper.place_schematic_on_data(data, data_param2, area, building.pos, small_slab_schematic, building.rotation) else @@ -499,6 +540,7 @@ minetest.register_on_generated(function(minp, maxp, seed) end puzzle_seal = {x=minp.x+3, y=floor_height+1, z=minp.z+3} minetest.log("info", "Puzzle seal generated at " .. minetest.pos_to_string(puzzle_seal)) + if log_location then log_location("underworld_puzzle_seal", puzzle_seal) end end end @@ -534,7 +576,7 @@ minetest.register_on_generated(function(minp, maxp, seed) local ceiling_height = math.floor(abs_cave * ceiling_mult + median + ceiling_displace + wave) if floor_height < ceiling_height then local zone = math.abs(nvals_zone[index2d]) - if math.random() < zone then -- bones are more common in the built-up areas + if math.random() < zone/2 then -- bones are more common in the built-up areas local floor_node = minetest.get_node({x=x, y=floor_height, z=z}) local floor_node_def = minetest.registered_nodes[floor_node.name] if floor_node_def and not floor_node_def.buildable_to then @@ -545,7 +587,7 @@ minetest.register_on_generated(function(minp, maxp, seed) if target_node.name == "air" then bones_loot.place_bones(target_pos, "underworld_warrior", math.random(3, 10), nil, true) break - elseif target_node.name == "bones:bones" then + elseif target_node.name == bones_node then -- don't stack bones on bones, it looks silly break end diff --git a/df_dependencies/README.md b/df_dependencies/README.md new file mode 100644 index 0000000..ae97313 --- /dev/null +++ b/df_dependencies/README.md @@ -0,0 +1,5 @@ +The DF_Caverns modpack was originally written based on the minetest_game. It made extensive use of various nodes and helper functions that came from minetest_game's constituent mods. + +When Mineclone games rose in popularity, the task of making it compatible was a daunting one - there were dependencies on minetest_game's mods scattered everywhere. To make the task manageable, I created this mod to serve as a central location where analogous objects could be taken from those games to be referenced in a generic way. + +This requires abusing the "dependencies" system of Minetest, unfortunately. This mod is an enormous collection of either/or dependencies - things that can come from either mod A or mod B, but must come from one of them. \ No newline at end of file diff --git a/df_caverns/config.lua b/df_dependencies/config.lua similarity index 81% rename from df_caverns/config.lua rename to df_dependencies/config.lua index 0794480..f3a484f 100644 --- a/df_caverns/config.lua +++ b/df_dependencies/config.lua @@ -1,6 +1,8 @@ local CONFIG_FILE_PREFIX = "dfcaverns_" -df_caverns.config = {} +local config = {} +df_dependencies.config = config + local print_settingtypes = false @@ -16,7 +18,7 @@ local function setting(stype, name, default, description) if value == nil then value = default end - df_caverns.config[name] = value + config[name] = value if print_settingtypes then minetest.debug(CONFIG_FILE_PREFIX..name.." ("..description..") "..stype.." "..tostring(default)) @@ -38,17 +40,20 @@ setting("int", "level3_min", -2112, "Upper limit of the sunless seas") setting("int", "sunless_sea_min", -2512, "Lower limit of the sunless seas") setting("bool", "enable_oil_sea", true, "Enable oil sea") -df_caverns.config.enable_oil_sea = df_caverns.config.enable_oil_sea and minetest.get_modpath("oil") ~= nil +config.enable_oil_sea = config.enable_oil_sea and minetest.get_modpath("oil") ~= nil setting("int", "oil_sea_level", -2700, "Oil sea level") setting("bool", "enable_lava_sea", true, "Enable magma sea") setting("int", "lava_sea_level", -2900, "Lava sea level") setting("bool", "enable_underworld", true, "Enable underworld") -df_caverns.config.enable_underworld = df_caverns.config.enable_underworld and minetest.get_modpath("df_underworld_items") ~= nil +config.enable_underworld = config.enable_underworld and minetest.get_modpath("df_underworld_items") ~= nil setting("int", "underworld_level", -3200, "Underworld level") setting("int", "underworld_glowing_pit_mapblocks", 8, "Average pit spacing measured in mapblocks") setting("bool", "enable_primordial", true, "Enable primordial cavern") setting("int", "primordial_max", -3393, "Upper limit to primordial caverns") setting("int", "primordial_min", -4032, "Lower limit to primordial caverns") + +setting("bool", "restrict_trees_to_biomes", false, "Restrict underground tree growth to their home biomes") +setting("bool", "restrict_farmables_to_biomes", false, "Restrict underground farmable plant growth to their home biomes") \ No newline at end of file diff --git a/df_dependencies/fireflies.lua b/df_dependencies/fireflies.lua new file mode 100644 index 0000000..38ec608 --- /dev/null +++ b/df_dependencies/fireflies.lua @@ -0,0 +1,187 @@ +-- firefly/init.lua + +-- Load support for MT game translation. +local S = minetest.get_translator(minetest.get_current_modname()) + +local bottle = df_dependencies.node_name_glass_bottle + +minetest.register_node("df_dependencies:firefly", { + description = S("Firefly"), + drawtype = "plantlike", + tiles = {{ + name = "fireflies_firefly_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + inventory_image = "fireflies_firefly.png", + wield_image = "fireflies_firefly.png", + waving = 1, + paramtype = "light", + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = {catchable = 1, destroy_by_lava_flow=1}, + selection_box = { + type = "fixed", + fixed = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + }, + light_source = 6, + floodable = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "df_dependencies:firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) > 11 then + minetest.set_node(pos, {name = "df_dependencies:hidden_firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + +minetest.register_node("df_dependencies:hidden_firefly", { + description = S("Hidden Firefly"), + drawtype = "airlike", + inventory_image = "fireflies_firefly.png^default_invisible_node_overlay.png", + wield_image = "fireflies_firefly.png^default_invisible_node_overlay.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + groups = {not_in_creative_inventory = 1, destroy_by_lava_flow=1}, + floodable = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + local pos = pointed_thing.above + + if not minetest.is_protected(pos, player_name) and + not minetest.is_protected(pointed_thing.under, player_name) and + minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name = "df_dependencies:hidden_firefly"}) + minetest.get_node_timer(pos):start(1) + itemstack:take_item() + end + return itemstack + end, + on_timer = function(pos, elapsed) + if minetest.get_node_light(pos) <= 11 then + minetest.set_node(pos, {name = "df_dependencies:firefly"}) + end + minetest.get_node_timer(pos):start(30) + end +}) + + +-- bug net +minetest.register_tool("df_dependencies:bug_net", { + description = S("Bug Net"), + inventory_image = "fireflies_bugnet.png", + on_use = function(itemstack, player, pointed_thing) + local player_name = player and player:get_player_name() or "" + if not pointed_thing or pointed_thing.type ~= "node" or + minetest.is_protected(pointed_thing.under, player_name) then + return + end + local node_name = minetest.get_node(pointed_thing.under).name + local inv = player:get_inventory() + if minetest.get_item_group(node_name, "catchable") == 1 then + minetest.set_node(pointed_thing.under, {name = "air"}) + local stack = ItemStack(node_name.." 1") + local leftover = inv:add_item("main", stack) + if leftover:get_count() > 0 then + minetest.add_item(pointed_thing.under, node_name.." 1") + end + end + if not minetest.is_creative_enabled(player_name) then + itemstack:add_wear_by_uses(256) + return itemstack + end + end +}) + +minetest.register_craft( { + output = "df_dependencies:bug_net", + recipe = { + {df_dependencies.node_name_string, df_dependencies.node_name_string}, + {df_dependencies.node_name_string, df_dependencies.node_name_string}, + {"group:stick", ""} + } +}) + + +-- firefly in a bottle +minetest.register_node("df_dependencies:firefly_bottle", { + description = S("Firefly in a Bottle"), + inventory_image = "fireflies_bottle.png", + wield_image = "fireflies_bottle.png", + tiles = {{ + name = "fireflies_bottle_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + }}, + drawtype = "plantlike", + paramtype = "light", + sunlight_propagates = true, + light_source = 9, + walkable = false, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1, material_glass = 1, destroy_by_lava_flow=1}, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} + }, + sounds = df_dependencies.sound_glass(), + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local lower_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + if minetest.is_protected(pos, player:get_player_name()) or + minetest.get_node(lower_pos).name ~= "air" then + return + end + + local upper_pos = {x = pos.x, y = pos.y + 2, z = pos.z} + local firefly_pos + + if not minetest.is_protected(upper_pos, player:get_player_name()) and + minetest.get_node(upper_pos).name == "air" then + firefly_pos = upper_pos + elseif not minetest.is_protected(lower_pos, player:get_player_name()) then + firefly_pos = lower_pos + end + + if firefly_pos then + minetest.add_item(pos, bottle) + minetest.set_node(pos, {name = "air"}) + minetest.set_node(firefly_pos, {name = "df_dependencies:firefly"}) + minetest.get_node_timer(firefly_pos):start(1) + end + end +}) + +minetest.register_craft( { + output = "df_dependencies:firefly_bottle", + type = "shapeless", + recipe = {"df_dependencies:firefly", bottle}, +}) diff --git a/df_dependencies/fireflies_license.txt b/df_dependencies/fireflies_license.txt new file mode 100644 index 0000000..eebdad6 --- /dev/null +++ b/df_dependencies/fireflies_license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (c) 2018 Shara RedCat + +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. + +For more details: +https://opensource.org/licenses/MIT + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2018 Shara RedCat + +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/ \ No newline at end of file diff --git a/df_dependencies/helper_functions.lua b/df_dependencies/helper_functions.lua new file mode 100644 index 0000000..ffc8bfa --- /dev/null +++ b/df_dependencies/helper_functions.lua @@ -0,0 +1,218 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +if minetest.get_modpath("default") then + df_dependencies.register_leafdecay = default.register_leafdecay + df_dependencies.after_place_leaves = default.after_place_leaves +elseif ("mcl_core") then + -- Mineclone does leaf decay differently, it uses the "leafdecay" group to require that leaves remain + -- within the group value distance of any node of group "tree". + -- make sure to add place_param2 = 1 to leaves to prevent decay of player-placed leaves + df_dependencies.register_leafdecay = function() end + df_dependencies.after_place_leaves = function() end +end + + +df_dependencies.mods_required.bucket = true +df_dependencies.mods_required.mcl_buckets = true +if minetest.get_modpath("bucket") then + df_dependencies.bucket_register_liquid = bucket.register_liquid +elseif minetest.get_modpath("mcl_buckets") then + df_dependencies.bucket_register_liquid = function(source_liquid, flowing_liquid, bucket_node, texture, desc) + mcl_buckets.register_liquid({ + bucketname = bucket_node, + source_take = {source_liquid}, + source_place = source_liquid, + inventory_image = texture, + name = desc}) + end +end + + +-- Note that a circular table reference will result in a crash, TODO: guard against that. +-- Unlikely to be needed, though - it'd take a lot of work for users to get into this bit of trouble. +local function deep_copy(table_in) + local table_out = {} + + for index, value in pairs(table_in) do + if type(value) == "table" then + table_out[index] = deep_copy(value) + else + table_out[index] = value + end + end + return table_out +end + +df_dependencies.mods_required.stairs = true +df_dependencies.mods_required.moreblocks = true +df_dependencies.mods_required.doors = true +df_dependencies.mods_required.mcl_stairs = true +df_dependencies.mods_required.mcl_fences = true +df_dependencies.mods_required.mcl_core = true + +local node_name_to_stair_properties = function(name, override_def) + local mod = minetest.get_current_modname() + + local node_def = minetest.registered_nodes[mod..":"..name] + override_def = override_def or {} + + local node_copy = deep_copy(node_def) + for index, value in pairs(override_def) do + node_copy[index] = value + end + return mod, node_copy +end + +df_dependencies.register_stairs = function(name, override_def) + local mod, node_copy = node_name_to_stair_properties(name, override_def) + if minetest.get_modpath("stairs") and stairs.register_stair_and_slab then + stairs.register_stair_and_slab( + name, + mod ..":" .. name, + node_copy.groups, + node_copy.tiles, + S("@1 Stair", node_copy.description), + S("@1 Slab", node_copy.description), + node_copy.sounds + ) + end + if minetest.get_modpath("mcl_stairs") and mcl_stairs.register_stair_and_slab_simple then + mcl_stairs.register_stair_and_slab_simple( + name, + mod ..":" .. name, + S("@1 Stair", node_copy.description), + S("@1 Slab", node_copy.description), + S("Double @1 Slab", node_copy.description) + ) + end +end + +df_dependencies.register_more_stairs = function(name, override_def) + local mod, node_copy = node_name_to_stair_properties(name, override_def) + if minetest.get_modpath("moreblocks") and stairsplus.register_all then + stairsplus:register_all(mod, name, mod..":"..name, node_copy) + end +end + +df_dependencies.register_all_fences = function (name, override_def) + local mod, node_def = node_name_to_stair_properties(name, override_def) + + override_def = override_def or {} + + local material = override_def.material or mod..":"..name + local burntime = override_def.burntime + local texture = override_def.texture or node_def.tiles[1] + + if minetest.get_modpath("default") then + if default.register_fence then + default.register_fence(material .. "_fence", { + description = S("@1 Fence", node_def.description), + texture = texture, + material = material, + groups = deep_copy(node_def.groups or {}), -- the default register_fence function modifies the groups table passed in, so send a copy instead to be on the safe side. + sounds = node_def.sounds + }) + if burntime then + minetest.register_craft({ + type = "fuel", + recipe = material .. "_fence", + burntime = burntime, -- ignoring two sticks + }) + end + end + + if default.register_fence_rail then + default.register_fence_rail(material .. "_fence_rail", { + description = S("@1 Fence Rail", node_def.description), + texture = texture, + material = material, + groups = deep_copy(node_def.groups or {}), -- the default register_fence_rail function modifies the groups table passed in, so send a copy instead to be on the safe side. + sounds = node_def.sounds + }) + if burntime then + minetest.register_craft({ + type = "fuel", + recipe = material .. "_fence_rail", + burntime = burntime * 4/16, + }) + end + end + + if default.register_mesepost then + default.register_mesepost(material .. "_mese_light", { + description = S("@1 Mese Post Light", node_def.description), + texture = texture, + material = material, + groups = deep_copy(node_def.groups or {}), -- the default register_fence_rail function modifies the groups table passed in, so send a copy instead to be on the safe side. + sounds = node_def.sounds + }) + end + end + + if minetest.get_modpath("doors") and doors.register_fencegate then + doors.register_fencegate(material .. "_fence_gate", { + description = S("@1 Fence Gate", node_def.description), + texture = texture, + material = material, + groups = deep_copy(node_def.groups or {}), -- the default register_fence_rail function modifies the groups table passed in, so send a copy instead to be on the safe side. + sounds = node_def.sounds + }) + + if burntime then + minetest.register_craft({ + type = "fuel", + recipe = material .. "_fence_gate_closed", + burntime = burntime * 2, -- ignoring four sticks + }) + end + end + + if minetest.get_modpath("mcl_fences") and mcl_fences.register_fence_and_fence_gate then + local groups = deep_copy(node_def.groups or {}) + groups.fence_wood = 1 + mcl_fences.register_fence_and_fence_gate(name .. "_fence", + S("@1 Fence", node_def.description), + S("@1 Fence Gate", node_def.description), + texture, + groups, + node_def._mcl_hardness or minetest.registered_nodes["mcl_core:wood"]._mcl_hardness, + node_def._mcl_blast_resistance or minetest.registered_nodes["mcl_core:wood"]._mcl_blast_resistance, + {"group:fence_wood"} + ) + end +end + +df_dependencies.register_all_stairs_and_fences = function(name, override_def) + df_dependencies.register_stairs(name, override_def) + df_dependencies.register_more_stairs(name, override_def) + df_dependencies.register_all_fences(name, override_def) +end + +df_dependencies.mods_required.tnt = true +df_dependencies.mods_required.mcl_explosions = true + +if minetest.get_modpath("tnt") then + df_dependencies.tnt_boom = tnt.boom +elseif minetest.get_modpath("mcl_explosions") then + df_dependencies.tnt_boom = function(pos, def) + local strength = def.radius * 5 + mcl_explosions.explode(pos, strength) + end +end + +df_dependencies.mods_required.mcl_formspec = true +df_dependencies.get_itemslot_bg = function(X,Y,W,H) return "" end +df_dependencies.get_itemslot_bg_padded = function(X,Y,W,H) return "" end +if minetest.get_modpath("mcl_formspec") then + df_dependencies.get_itemslot_bg = mcl_formspec.get_itemslot_bg + + df_dependencies.get_itemslot_bg_padded = function(x,y,w,h, padding) + local out = "" + for i = 0, w - 1, 1 do + for j = 0, h - 1, 1 do + out = out .. mcl_formspec.get_itemslot_bg(x+i+(i*padding), y+j+(j*padding), 1, 1) + end + end + return out + end +end \ No newline at end of file diff --git a/df_dependencies/init.lua b/df_dependencies/init.lua new file mode 100644 index 0000000..b8cbc49 --- /dev/null +++ b/df_dependencies/init.lua @@ -0,0 +1,55 @@ +df_dependencies = {} +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +df_dependencies.mods_required = {} + +df_dependencies.select_required = function(def) + local ret + for _, dependency in ipairs(def) do + local mod = dependency[1] + local item = dependency[2] + df_dependencies.mods_required[mod] = true + if minetest.get_modpath(mod) then + ret = item + end + end + assert(ret, "Unable to find item for dependency set " .. dump(def)) + return ret +end + +df_dependencies.select_optional = function(def) + local ret + for _, dependency in ipairs(def) do + local mod = dependency[1] + local item = dependency[2] + df_dependencies.mods_required[mod] = true + if minetest.get_modpath(mod) then + ret = item + end + end + return ret +end + +dofile(modpath.."/config.lua") +dofile(modpath.."/sounds.lua") +dofile(modpath.."/helper_functions.lua") +dofile(modpath.."/nodes.lua") +dofile(modpath.."/misc.lua") +dofile(modpath.."/mapgen.lua") + +local list_mods_required = function() + local mods_required = "" + local mods_sorted = {} + for mod, _ in pairs(df_dependencies.mods_required) do + table.insert(mods_sorted, mod) + end + table.sort(mods_sorted) + for _, mod in ipairs(mods_sorted) do + mods_required = mods_required .. ", " .. mod + end + minetest.debug(mods_required) +end +--list_mods_required() + +-- This mod is meant to only exist at initialization time. Other mods should make copies of anything it points to for their own use. +minetest.after(1, function() df_dependencies = nil end) diff --git a/df_dependencies/locale/df_dependencies.de.tr b/df_dependencies/locale/df_dependencies.de.tr new file mode 100644 index 0000000..e4674a4 --- /dev/null +++ b/df_dependencies/locale/df_dependencies.de.tr @@ -0,0 +1,27 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Insektennetz +# textdomain: fireflies +Firefly=Glühwürmchen +Firefly in a Bottle=Glühwürmchen in einer Flasche +Hidden Firefly=Verborgenes Glühwürmchen + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +@1 Slab=@1 Platte +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +@1 Stair=@1 Treppe +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/locale/df_dependencies.eo.tr b/df_dependencies/locale/df_dependencies.eo.tr new file mode 100644 index 0000000..ec20c31 --- /dev/null +++ b/df_dependencies/locale/df_dependencies.eo.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Insekta Reto +# textdomain: fireflies +Firefly=Lampiro +Firefly in a Bottle=Lampiro en Botelo +Hidden Firefly=Kaŝita Lampiro + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/locale/df_dependencies.es.tr b/df_dependencies/locale/df_dependencies.es.tr new file mode 100644 index 0000000..ab86da8 --- /dev/null +++ b/df_dependencies/locale/df_dependencies.es.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Red de insectos +# textdomain: fireflies +Firefly=Luciérnaga +Firefly in a Bottle=Luciérnaga en botella +Hidden Firefly=Luciérnaga oculta + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/locale/df_dependencies.fr.tr b/df_dependencies/locale/df_dependencies.fr.tr new file mode 100644 index 0000000..1f3a4ff --- /dev/null +++ b/df_dependencies/locale/df_dependencies.fr.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Filet à papillon +# textdomain: fireflies +Firefly=Luciole +Firefly in a Bottle=Luciole en bouteille +Hidden Firefly=Luciole cachée + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/locale/df_dependencies.id.tr b/df_dependencies/locale/df_dependencies.id.tr new file mode 100644 index 0000000..595d4a0 --- /dev/null +++ b/df_dependencies/locale/df_dependencies.id.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Jaring Serangga +# textdomain: fireflies +Firefly=Kunang-Kunang +Firefly in a Bottle=Kunang-Kunang dalam Botol +Hidden Firefly=Kunang-Kunang Tersembunyi + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/locale/df_dependencies.it.tr b/df_dependencies/locale/df_dependencies.it.tr new file mode 100644 index 0000000..d10fc23 --- /dev/null +++ b/df_dependencies/locale/df_dependencies.it.tr @@ -0,0 +1,27 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Retino +# textdomain: fireflies +Firefly=Lucciola +Firefly in a Bottle=Lucciola imbottigliata +Hidden Firefly=Lucciola nascosta + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +@1 Slab=@1 Lastra +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +@1 Stair=@1 Scala +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap=Cappello del Nether diff --git a/df_dependencies/locale/df_dependencies.ja.tr b/df_dependencies/locale/df_dependencies.ja.tr new file mode 100644 index 0000000..13c85e3 --- /dev/null +++ b/df_dependencies/locale/df_dependencies.ja.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=虫取り網 +# textdomain: fireflies +Firefly=ホタル +Firefly in a Bottle=ホタルの入った瓶 +Hidden Firefly=隠されたホタル + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/locale/df_dependencies.jbo.tr b/df_dependencies/locale/df_dependencies.jbo.tr new file mode 100644 index 0000000..39854d8 --- /dev/null +++ b/df_dependencies/locale/df_dependencies.jbo.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=lo cinki julne +# textdomain: fireflies +Firefly=lo gusycinki +Firefly in a Bottle=lo gusycinki poi nenri lo botpi +Hidden Firefly=lo se mipri gusycinki + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/locale/df_dependencies.ms.tr b/df_dependencies/locale/df_dependencies.ms.tr new file mode 100644 index 0000000..f19cd14 --- /dev/null +++ b/df_dependencies/locale/df_dependencies.ms.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Jaring Pepijat +# textdomain: fireflies +Firefly=Kelip-Kelip +Firefly in a Bottle=Kelip-Kelip dalam Botol +Hidden Firefly=Kelip-Kelip Tersembunyi + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/locale/df_dependencies.pl.tr b/df_dependencies/locale/df_dependencies.pl.tr new file mode 100644 index 0000000..f7f6118 --- /dev/null +++ b/df_dependencies/locale/df_dependencies.pl.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Siatka na owady +# textdomain: fireflies +Firefly=Świetlik +Firefly in a Bottle=Świetlik w butelce +Hidden Firefly=Ukryty świetlik + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/locale/df_dependencies.pt_BR.tr b/df_dependencies/locale/df_dependencies.pt_BR.tr new file mode 100644 index 0000000..ff7f09a --- /dev/null +++ b/df_dependencies/locale/df_dependencies.pt_BR.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Rede de Insetos +# textdomain: fireflies +Firefly=Vaga-lume +Firefly in a Bottle=Vaga-lume em uma garrafa +Hidden Firefly=Vaga-lume escondido + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/locale/df_dependencies.ru.tr b/df_dependencies/locale/df_dependencies.ru.tr new file mode 100644 index 0000000..bc5897d --- /dev/null +++ b/df_dependencies/locale/df_dependencies.ru.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Сачок Для Ловли Насекомых +# textdomain: fireflies +Firefly=Светлячок +Firefly in a Bottle=Светлячок в Бутылке +Hidden Firefly=Притаившийся Светлячок + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/locale/df_dependencies.sk.tr b/df_dependencies/locale/df_dependencies.sk.tr new file mode 100644 index 0000000..11fb58e --- /dev/null +++ b/df_dependencies/locale/df_dependencies.sk.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Sieťka na hmyz +# textdomain: fireflies +Firefly=Svetluška +Firefly in a Bottle=Svetluška vo fľaši +Hidden Firefly=Skrytá svetluška + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/locale/df_dependencies.sv.tr b/df_dependencies/locale/df_dependencies.sv.tr new file mode 100644 index 0000000..181fbe5 --- /dev/null +++ b/df_dependencies/locale/df_dependencies.sv.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Insektshåv +# textdomain: fireflies +Firefly=Eldfluga +Firefly in a Bottle=Eldfluga i en flaska +Hidden Firefly=Gömd eldfluga + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/locale/df_dependencies.uk.tr b/df_dependencies/locale/df_dependencies.uk.tr new file mode 100644 index 0000000..d265c25 --- /dev/null +++ b/df_dependencies/locale/df_dependencies.uk.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=Сачок Для Ловлі Комах +# textdomain: fireflies +Firefly=Світлячок +Firefly in a Bottle=Світлячок у Пляшці +Hidden Firefly=Світлячок, що причаївся + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/locale/df_dependencies.zh_CN.tr b/df_dependencies/locale/df_dependencies.zh_CN.tr new file mode 100644 index 0000000..5650f18 --- /dev/null +++ b/df_dependencies/locale/df_dependencies.zh_CN.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=虫网 +# textdomain: fireflies +Firefly=萤火虫 +Firefly in a Bottle=放在瓶子里的萤火虫 +Hidden Firefly=隐藏的萤火虫 + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/locale/df_dependencies.zh_TW.tr b/df_dependencies/locale/df_dependencies.zh_TW.tr new file mode 100644 index 0000000..ed83ca0 --- /dev/null +++ b/df_dependencies/locale/df_dependencies.zh_TW.tr @@ -0,0 +1,25 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net=蟲網 +# textdomain: fireflies +Firefly=螢火蟲 +Firefly in a Bottle=放在瓶子裡的螢火蟲 +Hidden Firefly=隱藏的螢火蟲 + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/locale/template.txt b/df_dependencies/locale/template.txt new file mode 100644 index 0000000..b89a4a4 --- /dev/null +++ b/df_dependencies/locale/template.txt @@ -0,0 +1,24 @@ +# textdomain: df_dependencies + + +### fireflies.lua ### + +Bug Net= +Firefly= +Firefly in a Bottle= +Hidden Firefly= + +### helper_functions.lua ### + +@1 Fence= +@1 Fence Gate= +@1 Fence Rail= +@1 Mese Post Light= +@1 Slab= +@1 Stair= +Double @1 Slab= + +### misc.lua ### + +Icecap= +Nethercap= diff --git a/df_dependencies/mapgen.lua b/df_dependencies/mapgen.lua new file mode 100644 index 0000000..f6f2d1a --- /dev/null +++ b/df_dependencies/mapgen.lua @@ -0,0 +1,280 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local function deep_copy(table_in) + local table_out = {} + for index, value in pairs(table_in) do + if type(value) == "table" then + table_out[index] = deep_copy(value) + else + table_out[index] = value + end + end + return table_out +end + +local config = df_dependencies.config + +local lowest_elevation = config.sunless_sea_min +if config.enable_oil_sea then + lowest_elevation = config.oil_sea_level +end +if config.enable_lava_sea then + lowest_elevation = config.lava_sea_level +end +if config.enable_underworld then + lowest_elevation = config.underworld_level +end +if config.enable_primordial then + lowest_elevation = config.primordial_min +end +lowest_elevation = lowest_elevation - 193 -- add a little buffer space + +df_dependencies.mods_required.mcl_init = true +df_dependencies.mods_required.mcl_worlds = true +df_dependencies.mods_required.mcl_strongholds = true +df_dependencies.mods_required.mcl_compatibility = true +df_dependencies.mods_required.mcl_mapgen = true + +local old_overworld_min + +local ores_extended = false +local extend_ores = function() + if ores_extended then return end -- should only do this once. + ores_extended = true + local ores_registered = {} + for key, val in pairs(minetest.registered_ores) do + ores_registered[val.ore] = true + end + + local wherein_stonelike = {"mcl_core:stone"} + local localseed = 12345 + + local stone_blobs = { + wherein = wherein_stonelike, + clust_scarcity = 1000, + clust_size = 7, + y_min = lowest_elevation, + y_max = old_overworld_min, + ore_type = "blob", + clust_num_ores = 58, + noise_params = { + octaves = 3, + seed = 12345, + lacunarity = 2, + spread = { + y = 250, + x = 250, + z = 250 + }, + persist = 0.6, + flags = "defaults", + offset = 0, + scale = 1 + }, + } + + local register_blob = function(ore, cluster_size, cluster_scarcity_cuberoot, ymin, ymax) + localseed = localseed + 1 -- increment this every time it's called to ensure different distributions + local blob_copy = deep_copy(stone_blobs) + blob_copy.ore = ore + blob_copy.clust_num_ores = cluster_size + blob_copy.clust_size = math.ceil(math.sqrt(cluster_size)) + blob_copy.clust_scarcity = cluster_scarcity_cuberoot*cluster_scarcity_cuberoot*cluster_scarcity_cuberoot + blob_copy.seed = localseed + blob_copy.y_min = ymin or stone_blobs.y_min + blob_copy.y_max = ymax or stone_blobs.y_max + --minetest.debug(dump(blob_copy)) + minetest.register_ore(blob_copy) + end + + local scattered_ore = { + wherein = wherein_stonelike, + ore_type = "scatter", + --ore = "mcl_core:stone_with_coal", + clust_scarcity = 525*3, + clust_num_ores = 5, + clust_size = 3, + y_min = lowest_elevation, + y_max = old_overworld_min, + noise_params = deep_copy(stone_blobs.noise_params), -- since there's so much volume to scatter ore in, using noise to make some regions "rich" and others "poor" for variety + noise_threshold= 0, + } + + local register_scattered_internal = function(ore, cluster_size, cluster_scarcity_cuberoot, threshold, ymin, ymax, wherein) + local scattered_copy = deep_copy(scattered_ore) + scattered_copy.ore = ore + scattered_copy.clust_size = cluster_size*cluster_size*cluster_size + scattered_copy.clust_scarcity = cluster_scarcity_cuberoot*cluster_scarcity_cuberoot*cluster_scarcity_cuberoot + scattered_copy.clust_num_ores = math.ceil(scattered_copy.clust_size/3) + scattered_copy.seed = localseed + scattered_copy.threshold = threshold + scattered_copy.y_min = ymin or scattered_ore.y_min + scattered_copy.y_max = ymax or scattered_ore.y_max + scattered_copy.wherein = wherein or scattered_ore.wherein + --minetest.debug(dump(scattered_copy)) + minetest.register_ore(scattered_copy) + end + local register_scattered = function(ore, cluster_size, cluster_scarcity_cuberoot, ymin, ymax, wherein) + assert(not (ymin and ymax) or ymin < ymax, "Elevation parameter error for register_scattered") + localseed = localseed + 1 -- increment this every time it's called to ensure different distributions + -- same seed makes the noise patterns overlap. + -- one produces widespread smaller clusters, other produces larger clusters at the peaks of the noise in addition to the smaller ones + register_scattered_internal(ore, cluster_size, cluster_scarcity_cuberoot, 0, ymin, ymax, wherein) + register_scattered_internal(ore, cluster_size*2, cluster_scarcity_cuberoot, 0.25, ymin, ymax, wherein) + end + + if ores_registered["mcl_core:diorite"] then + register_blob("mcl_core:diorite", 58, 10) + register_blob("mcl_core:diorite", 33, 15) + table.insert(wherein_stonelike, "mcl_core:diorite") + end + if ores_registered["mcl_core:andesite"] then + register_blob("mcl_core:andesite", 58, 10) + register_blob("mcl_core:andesite", 33, 15) + table.insert(wherein_stonelike, "mcl_core:andesite") + end + if ores_registered["mcl_core:granite"] then + register_blob("mcl_core:granite", 58, 10) + register_blob("mcl_core:granite", 33, 15) + table.insert(wherein_stonelike, "mcl_core:granite") + end + if ores_registered["mcl_core:dirt"] then + register_blob("mcl_core:dirt", 33, 15, config.sunless_sea_min) + if config.enable_primordial then + register_blob("mcl_core:dirt", 33, 15, config.primordial_min, config.primoridal_max) + end + end + if ores_registered["mcl_core:gravel"] then + register_blob("mcl_core:gravel", 33, 14) + end + + if ores_registered["mcl_core:stone_with_iron"] then + register_scattered("mcl_core:stone_with_iron", 3, 12) + end + if ores_registered["mcl_core:stone_with_coal"] then + register_scattered("mcl_core:stone_with_coal", 3, 12) + if config.enable_oil_sea then + register_blob("mcl_core:stone_with_coal", 80, 10, config.oil_sea_level-200, config.oil_sea_level+200) -- tons of coal in the oil sea + end + end + + if ores_registered["mcl_core:stone_with_lapis"] then + register_scattered("mcl_core:stone_with_lapis", 3, 25, config.sunless_sea_min, config.level3_min) -- Lapis is an ocean gem, I decided + if config.enable_primordial then + register_scattered("mcl_core:stone_with_lapis", 3, 25, config.primordial_min, config.primordial_max) + end + end + + if ores_registered["mcl_core:stone_with_redstone"] then + register_scattered("mcl_core:stone_with_redstone", 3, 15, config.level3_min, config.level2_min) -- Level 3 is the most magical, scatter redstone there + if config.enable_lava_sea then + register_scattered("mcl_core:stone_with_redstone", 4, 15, config.lava_sea_level-200, config.lava_sea_level+100) -- and of course plenty of redstone in the lava sea + end + end + + if ores_registered["mcl_core:stone_with_diamond"] then + register_scattered("mcl_core:stone_with_diamond", 2, 18, config.sunless_sea_min, config.level2_min) + if config.enable_oil_sea then + register_scattered("mcl_core:stone_with_diamond", 3, 18, config.oil_sea_level-200, config.oil_sea_level+200) + end + if config.enable_primordial then + register_scattered("mcl_core:stone_with_diamond", 3, 15, config.primordial_min, config.primordial_max) + end + end + + if ores_registered["mcl_core:stone_with_gold"] then + register_scattered("mcl_core:stone_with_gold", 2, 18) + if config.enable_primordial then + register_scattered("mcl_core:stone_with_gold", 3, 15, config.primordial_min, config.primordial_max) + end + end + + if ores_registered["mcl_core:stone_with_copper"] then + register_scattered("mcl_core:stone_with_copper", 3, 18) + end + + if ores_registered["mcl_deepslate:deepslate"] then + register_blob("mcl_deepslate:deepslate", 33, 15, lowest_elevation, config.sunless_sea_min) -- it's called deepslate, so put it deep + end + if ores_registered["mcl_deepslate:tuff"] then + register_blob("mcl_deepslate:tuff", 33, 15, lowest_elevation, config.sunless_sea_min) + end + + if ores_registered["mcl_deepslate:deepslate_with_emerald"] then + register_scattered("mcl_deepslate:deepslate_with_emerald", 1, 25, lowest_elevation, config.sunless_sea_min, "mcl_deepslate:deepslate") + end + if ores_registered["mcl_core:stone_with_emerald"] then + register_scattered("mcl_core:stone_with_emerald", 1, 25, lowest_elevation, config.sunless_sea_min) + end + +end + +if minetest.get_modpath("mcl_init") then -- Mineclone 2 + + old_overworld_min = mcl_vars.mg_overworld_min -- remember this for weather control + + mcl_vars.mg_overworld_min = lowest_elevation + mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min + mcl_vars.mg_lava_overworld_max = mcl_vars.mg_overworld_min + 10 + mcl_vars.mg_end_max = mcl_vars.mg_overworld_min - 2000 + + -- shouldn't need to worry about the setting, extend_ores checks if the ores + -- have already been registered. + --if minetest.settings:get_bool("mcl_generate_ores", true) then + extend_ores() + --end + + df_dependencies.mods_required.mcl_structures = true + -- never mind - add dependency on mcl_strongholds and these will get generated before overworld_min gets changed. + --if minetest.get_modpath("mcl_structures") and minetest.get_modpath("mcl_strongholds") then + -- local elevation_delta = old_overworld_min - lowest_elevation + -- local strongholds = mcl_structures.get_structure_data("stronghold") + -- mcl_structures.register_structure_data("stronghold", strongholds) + --end +end +if minetest.get_modpath("mcl_compatibility") then -- Mineclone 5 + old_overworld_min = mcl_vars.mg_overworld_min -- remember this for weather control + + mcl_vars.mg_overworld_min = lowest_elevation + mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min + mcl_vars.mg_bedrock_overworld_max = mcl_vars.mg_overworld_min+4 + mcl_vars.mg_lava_overworld_max = mcl_vars.mg_overworld_min+6 + mcl_vars.mg_lava = false + mcl_vars.mg_end_max = mcl_vars.mg_overworld_min - 2000 + mcl_vars.mg_realm_barrier_overworld_end_max = mcl_vars.mg_end_max + mcl_vars.mg_realm_barrier_overworld_end_min = mcl_vars.mg_end_max-11 +end +if minetest.get_modpath("mcl_mapgen") then -- Mineclone 5 + old_overworld_min = mcl_mapgen.overworld.min -- remember this for weather control + + mcl_mapgen.overworld.min = lowest_elevation + mcl_mapgen.overworld.bedrock_min = mcl_mapgen.overworld.min + mcl_mapgen.overworld.bedrock_max = mcl_mapgen.overworld.bedrock_min + (mcl_mapgen.bedrock_is_rough and 4 or 0) + mcl_mapgen.overworld.lava_max = mcl_mapgen.overworld.min+6 + mcl_mapgen.overworld.railcorridors_height_min = -50 + mcl_mapgen.overworld.railcorridors_height_max = -2 + + mcl_mapgen.end_.max = mcl_mapgen.overworld.min - 2000 + mcl_mapgen.realm_barrier_overworld_end_max = mcl_mapgen.end_.max + mcl_mapgen.realm_barrier_overworld_end_min = mcl_mapgen.end_.max - 11 + + if mcl_mapgen.on_settings_changed then + mcl_mapgen.on_settings_changed() + else + minetest.log("error", "The installed version of the mcl_mapgen mod (part of Mineclone 5) " + .."does not have an mcl_mapgen.on_settings_changed method. This will likely result in " + .."altitudes below the original bedrock being inaccessible to players.") + end + + extend_ores() +end +if minetest.get_modpath("mcl_worlds") then + local old_has_weather = mcl_worlds.has_weather + mcl_worlds.has_weather = function(pos) + -- No weather in the deep caverns + if pos.y >= lowest_elevation and pos.y <= old_overworld_min then + return false + end + return old_has_weather(pos) + end +end diff --git a/df_dependencies/misc.lua b/df_dependencies/misc.lua new file mode 100644 index 0000000..d298eb2 --- /dev/null +++ b/df_dependencies/misc.lua @@ -0,0 +1,76 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local select_required = df_dependencies.select_required +local select_optional = df_dependencies.select_optional + +df_dependencies.mods_required.farming = true + +-- If the farming mod is installed, add the "straw" group to farming straw. +-- This way goblin caps just need to check for group:straw to get cave straw as well +local straw_def = minetest.registered_items["farming:straw"] +if straw_def then + local new_groups = {} + for group, val in pairs(straw_def.groups) do + new_groups[group] = val + end + new_groups.straw = 1 + minetest.override_item("farming:straw", { + groups = new_groups + }) +end + +-- used to determine colour of spindlestem caps +if minetest.get_modpath("default") then + df_dependencies.data_iron_containing_nodes = {"default:stone_with_iron", "default:steelblock"} + df_dependencies.data_copper_containing_nodes = {"default:stone_with_copper", "default:copperblock"} + df_dependencies.data_mese_containing_nodes = {"default:stone_with_mese", "default:mese"} +elseif minetest.get_modpath("mcl_core") then + df_dependencies.data_iron_containing_nodes = {} + minetest.after(0, function() + for nodename, _ in pairs(minetest.registered_nodes) do + if string.find(nodename, "iron") then + table.insert(df_dependencies.data_iron_containing_nodes, nodename) + end + end + end) + df_dependencies.data_copper_containing_nodes = {} + minetest.after(0, function() + for nodename, _ in pairs(minetest.registered_nodes) do + if string.find(nodename, "copper") then + table.insert(df_dependencies.data_copper_containing_nodes, nodename) + end + end + end) + df_dependencies.data_mese_containing_nodes = {"mcl_deepslate:deepslate_with_redstone", "mcl_deepslate:deepslate_with_redstone_lit", + "mcl_core:stone_with_redstone", "mcl_core:stone_with_redstone_lit", "group:mesecon_conductor_craftable", "group:mesecon", "group:mesecon_effector_off"} +end + +-- common nodes that can be found next to pit plasma, triggering matter degradation +-- don't trigger on air, that's for sparkle generation +df_dependencies.abm_pit_plasma_neighbors = {"group:stone", "group:lava", "group:water", "group:material_stone"} + +df_dependencies.texture_cobble = select_required({{"default", "default_cobble.png"}, {"mcl_core", "default_cobble.png"}}) +df_dependencies.texture_coral_skeleton = select_required({{"default", "default_coral_skeleton.png"}, {"mcl_ocean", "mcl_ocean_dead_horn_coral_block.png"}}) +df_dependencies.texture_dirt = select_required({{"default", "default_dirt.png"}, {"mcl_core", "default_dirt.png"}}) +df_dependencies.texture_gold_block = select_required({{"default", "default_gold_block.png"}, {"mcl_core", "default_gold_block.png"}}) +df_dependencies.texture_ice = select_required({{"default", "default_ice.png"}, {"mcl_core", "default_ice.png"}}) +df_dependencies.texture_sand = select_required({{"default", "default_sand.png"}, {"mcl_core", "default_sand.png"}}) +df_dependencies.texture_stone = select_required({{"default", "default_stone.png"}, {"mcl_core", "default_stone.png"}}) +df_dependencies.texture_wood = select_required({{"default", "default_wood.png"}, {"mcl_core", "default_wood.png"}}) +df_dependencies.texture_mineral_coal = select_required({{"default", "default_mineral_coal.png"}, {"mcl_core", "mcl_core_coal_ore.png"}}) -- MCL's coal texture isn't transparent, but is only used with gas seeps and should work fine that way +df_dependencies.texture_glass_bottle = select_required({{"vessels", "vessels_glass_bottle.png"}, {"mcl_potions", "mcl_potions_potion_bottle.png"}}) +df_dependencies.texture_meselamp = "dfcaverns_glow_mese.png" + +df_dependencies.texture_tool_steelhoe = select_required({{"default", "farming_tool_steelhoe.png"}, {"mcl_farming", "farming_tool_steelhoe.png"}}) +df_dependencies.texture_tool_steelpick = select_required({{"default", "default_tool_steelpick.png"}, {"mcl_farming", "default_tool_steelpick.png"}}) +df_dependencies.texture_tool_steelshovel = select_required({{"default", "default_tool_steelshovel.png"}, {"mcl_farming", "default_tool_steelshovel.png"}}) +df_dependencies.texture_farming_soil = select_required({{"default", "(default_dirt.png^farming_soil.png)"}, {"mcl_farming", "mcl_farming_farmland_dry.png"}}) + +df_dependencies.texture_mapping_kit = select_required({{"default", "map_mapping_kit.png"}, {"mcl_maps", "mcl_maps_map_filled.png"}}) + +df_dependencies.nethercap_name = S("Nethercap") +if minetest.get_modpath("mcl_mapgen_core") then + -- since there's a whole layer called the Nether in Mineclone and it has its own mushrooms, rename + -- nethercaps when that's present to avoid confusion. + df_dependencies.nethercap_name = S("Icecap") +end \ No newline at end of file diff --git a/df_dependencies/mod.conf b/df_dependencies/mod.conf new file mode 100644 index 0000000..214684d --- /dev/null +++ b/df_dependencies/mod.conf @@ -0,0 +1,5 @@ +name = df_dependencies +description = A utility mod for df_caverns that gathers all dependencies on minetest_game in one place, to ease cross-compatibility efforts with Minetest Game, MineClone2 and MineClone5. +depends = +optional_depends = beds, bucket, default, doors, farming, fireflies, mcl_beds, mcl_buckets, mcl_chests, mcl_compatibility, mcl_copper, mcl_core, mcl_doors, mcl_explosions, mcl_farming, mcl_fences, mcl_formspec, mcl_furnaces, mcl_init, mcl_mapgen, mcl_maps, mcl_mobitems, mcl_ocean, mcl_potions, mcl_sounds, mcl_stairs, mcl_strongholds, mcl_tnt, mcl_torches, mcl_wool, mcl_worlds, mclx_core, mesecons, moreblocks, stairs, tnt, vessels, wool +supported_games = minetest_game, MineClone2 \ No newline at end of file diff --git a/df_dependencies/nodes.lua b/df_dependencies/nodes.lua new file mode 100644 index 0000000..2372547 --- /dev/null +++ b/df_dependencies/nodes.lua @@ -0,0 +1,126 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local required_nodes = {} +local function select_required(def) + local newdef = {} + for _, node in ipairs(def) do + table.insert(newdef, {string.match(node, "(.-):"), node}) + end + local ret = df_dependencies.select_required(newdef) + table.insert(required_nodes, ret) + return ret +end + +local function select_optional(def) + local newdef = {} + for _, node in ipairs(def) do + table.insert(newdef, {string.match(node, "(.-):"), node}) + end + local ret = df_dependencies.select_optional(newdef) + table.insert(required_nodes, ret) + return ret +end + + +minetest.after(0, function() + -- "after" needs to be used here because some of these nodes actually get registered in DF Caverns itself + -- stair nodes, for example, depend on the stairs mod but get registered from here. Kind of weird but + -- one goes to war with the mods one has. + local problem_nodes = {} + for _, node_name in pairs(required_nodes) do + if minetest.registered_items[node_name] == nil then + table.insert(problem_nodes, node_name) + end + end + + assert(#problem_nodes == 0, "Nodes " .. table.concat(problem_nodes, ", ") .. " were returned by a selection call but are not registered.") +end) + + +df_dependencies.node_name_apple = select_required({"default:apple", "mcl_core:apple"}) +df_dependencies.node_name_chest = select_required({"default:chest", "mcl_chests:chest"}) +df_dependencies.node_name_coalblock = select_required({"default:coalblock", "mcl_core:coalblock"}) +df_dependencies.node_name_coal_lump = select_required({"default:coal_lump", "mcl_core:coal_lump"}) +df_dependencies.node_name_cobble = select_required({"default:cobble", "mcl_core:cobble"}) +df_dependencies.node_name_coral_skeleton = select_required({"default:coral_skeleton", "mcl_ocean:dead_horn_coral_block"}) +df_dependencies.node_name_desert_sand = select_required({"default:desert_sand", "mcl_core:redsand"}) +df_dependencies.node_name_dirt = select_required({"default:dirt", "mcl_core:dirt"}) +df_dependencies.node_name_dry_grass_3 = select_required({"default:dry_grass_3", "mcl_core:deadbush"}) -- There doesn't seem to be an MCL equivalent of this +df_dependencies.node_name_dry_grass_4 = select_required({"default:dry_grass_4", "mcl_core:deadbush"}) -- There doesn't seem to be an MCL equivalent of this +df_dependencies.node_name_dry_shrub = select_required({"default:dry_shrub", "mcl_core:deadbush"}) +df_dependencies.node_name_furnace = select_required({"default:furnace", "mcl_furnaces:furnace"}) +df_dependencies.node_name_gold_ingot = select_required({"default:gold_ingot", "mcl_core:gold_ingot"}) +df_dependencies.node_name_gravel = select_required({"default:gravel", "mcl_core:gravel"}) +df_dependencies.node_name_ice = select_required({"default:ice", "mcl_core:ice"}) +df_dependencies.node_name_junglewood = select_required({"default:junglewood", "mcl_core:junglewood"}) +df_dependencies.node_name_lava_source = select_required({"default:lava_source", "mcl_core:lava_source"}) +df_dependencies.node_name_mese_crystal = select_required({"mesecons:wire_00000000_off", "default:mese_crystal"}) --make sure default:mese_crystal is second, so that default will take priority if mesecons is also installed. +df_dependencies.node_name_mossycobble = select_required({"default:mossycobble", "mcl_core:mossycobble"}) +df_dependencies.node_name_obsidian = select_required({"default:obsidian", "mcl_core:obsidian"}) +df_dependencies.node_name_paper = select_required({"default:paper", "mcl_core:paper"}) +df_dependencies.node_name_river_water_flowing = select_required({"default:river_water_flowing", "mclx_core:river_water_flowing"}) +df_dependencies.node_name_river_water_source = select_required({"default:river_water_source", "mclx_core:river_water_source"}) +df_dependencies.node_name_sand = select_required({"default:sand", "mcl_core:sand"}) +df_dependencies.node_name_silver_sand = select_required({"default:silver_sand", "mcl_core:sand"}) -- There doesn't seem to be an MCL equivalent of this +df_dependencies.node_name_snow = select_required({"default:snow", "mcl_core:snow"}) +df_dependencies.node_name_stone = select_required({"default:stone", "mcl_core:stone"}) +df_dependencies.node_name_stone_with_coal = select_required({"default:stone_with_coal", "mcl_core:stone_with_coal"}) +df_dependencies.node_name_stone_with_mese = select_required({"default:stone_with_mese", "mcl_core:stone_with_redstone"}) +df_dependencies.node_name_torch = select_required({"default:torch", "mcl_torches:torch"}) +df_dependencies.node_name_torch_wall = select_required({"default:torch_wall", "mcl_torches:torch_wall"}) +df_dependencies.node_name_water_flowing = select_required({"default:water_flowing", "mcl_core:water_flowing"}) +df_dependencies.node_name_water_source = select_required({"default:water_source", "mcl_core:water_source"}) +df_dependencies.node_name_stone_with_iron = select_required({"default:stone_with_iron", "mcl_core:stone_with_iron"}) +df_dependencies.node_name_steelblock = select_required({"default:steelblock", "mcl_core:ironblock"}) +df_dependencies.node_name_stone_with_copper = select_required({"default:stone_with_copper", "mcl_copper:stone_with_copper"}) +df_dependencies.node_name_copperblock = select_required({"default:copperblock", "mcl_copper:block_raw"}) + +df_dependencies.node_name_dirt_furrowed = select_required({"farming:soil", "mcl_farming:soil"}) +df_dependencies.node_name_dirt_wet = select_required({"farming:soil_wet", "mcl_farming:soil_wet"}) +--df_dependencies.node_name_mortar_pestle = select_optional({"farming:mortar_pestle"}) -- TODO where did this go? +df_dependencies.node_name_string = select_required({"farming:string", "mcl_mobitems:string"}) + +df_dependencies.node_name_bucket_empty = select_required({"bucket:bucket_empty", "mcl_buckets:bucket_empty"}) +df_dependencies.node_name_bucket_lava = select_required({"bucket:bucket_lava", "mcl_buckets:bucket_lava"}) + +-- from "wool" + +df_dependencies.node_name_wool_white = select_required({"wool:white", "mcl_wool:white"}) + +-- from "fireflies" +df_dependencies.node_name_fireflies = select_optional({"fireflies:firefly"}) + +-- from "vessels" +df_dependencies.node_name_glass_bottle = select_required({"vessels:glass_bottle", "mcl_potions:glass_bottle"}) +df_dependencies.node_name_shelf = select_optional({"vessels:shelf"}) + +-- from "beds" +df_dependencies.node_name_bed_bottom = select_required({"beds:bed_bottom", "mcl_beds:bed_red_bottom"}) +df_dependencies.node_name_bed_top = select_required({"beds:bed_top", "mcl_beds:bed_red_top"}) + +-- from "doors" +df_dependencies.node_name_door_wood_a = select_required({"doors:door_wood_a", "mcl_doors:wooden_door_b_1"}) +df_dependencies.node_name_door_hidden = select_required({"doors:hidden", "mcl_doors:wooden_door_t_1"}) + +-- from "stairs" + +df_dependencies.node_name_slab_goblin_cap_stem_wood = select_required({"stairs:slab_goblin_cap_stem_wood", "mcl_stairs:slab_goblin_cap_stem_wood"}) +df_dependencies.node_name_slab_slade_brick = select_required({"stairs:slab_slade_brick", "mcl_stairs:slab_slade_brick"}) +df_dependencies.node_name_stair_goblin_cap_stem_wood = select_required({"stairs:stair_goblin_cap_stem_wood", "mcl_stairs:stair_goblin_cap_stem_wood"}) +df_dependencies.node_name_stair_inner_slade_brick = select_required({"stairs:stair_inner_slade_brick", "mcl_stairs:stair_slade_brick_inner"}) +df_dependencies.node_name_stair_outer_slade_brick = select_required({"stairs:stair_outer_slade_brick", "mcl_stairs:stair_slade_brick_outer"}) +df_dependencies.node_name_stair_slade_block = select_required({"stairs:stair_slade_block", "mcl_stairs:stair_slade_block"}) +df_dependencies.node_name_slab_slade_block = select_required({"stairs:slab_slade_block", "mcl_stairs:slab_slade_block"}) +df_dependencies.node_name_stair_slade_brick = select_required({"stairs:stair_slade_brick", "mcl_stairs:stair_slade_brick"}) +df_dependencies.node_name_slab_slade_block_top = select_optional({"mcl_stairs:slab_slade_block_top"}) + +-- from "tnt" + +df_dependencies.node_name_gunpowder = select_optional({"tnt:gunpowder", "mcl_mobitems:gunpowder"}) + +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +if not df_dependencies.node_name_fireflies then + dofile(modpath.."/fireflies.lua") + df_dependencies.node_name_fireflies = "df_dependencies:firefly" +end \ No newline at end of file diff --git a/df_caverns/settingtypes.txt b/df_dependencies/settingtypes.txt similarity index 94% rename from df_caverns/settingtypes.txt rename to df_dependencies/settingtypes.txt index da19269..e7c5c95 100644 --- a/df_caverns/settingtypes.txt +++ b/df_dependencies/settingtypes.txt @@ -74,3 +74,8 @@ dfcaverns_primordial_min (Lower limit of primordial caverns) int -4032 # during mapgen of Primordial cavern layer mushroom caverns # then increasing this number may help. dcaverns_giant_mycelium_timer_spread (Giant Mycelium mapgen timer spread) int 10 + +[Plant growth restrictions] + +dfcaverns_restrict_trees_to_biomes (Restrict underground tree growth to their home biomes) bool false +dfcaverns_restrict_farmables_to_biomes (Restrict underground farmable plant growth to their home biomes) bool false \ No newline at end of file diff --git a/df_dependencies/sounds.lua b/df_dependencies/sounds.lua new file mode 100644 index 0000000..90ab2ad --- /dev/null +++ b/df_dependencies/sounds.lua @@ -0,0 +1,38 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local select_required = df_dependencies.select_required +local select_optional = df_dependencies.select_optional + +df_dependencies.mods_required.mcl_sounds = true + +if minetest.get_modpath("default") then + df_dependencies.sound_dirt = default.node_sound_dirt_defaults + df_dependencies.sound_glass = default.node_sound_glass_defaults + df_dependencies.sound_gravel = default.node_sound_gravel_defaults + df_dependencies.sound_leaves = default.node_sound_leaves_defaults + df_dependencies.sound_sand = default.node_sound_sand_defaults + df_dependencies.sound_stone = default.node_sound_stone_defaults + df_dependencies.sound_water = default.node_sound_water_defaults + df_dependencies.sound_wood = default.node_sound_wood_defaults +elseif minetest.get_modpath("mcl_sounds") then + df_dependencies.sound_dirt = mcl_sounds.node_sound_dirt_defaults + df_dependencies.sound_glass = mcl_sounds.node_sound_glass_defaults + df_dependencies.sound_gravel = function(table) + table = table or {} + table.footstep = table.footstep or {name="default_gravel_footstep", gain=0.45} + return mcl_sounds.node_sound_dirt_defaults(table) + end + df_dependencies.sound_leaves = mcl_sounds.node_sound_leaves_defaults + df_dependencies.sound_sand = mcl_sounds.node_sound_sand_defaults + df_dependencies.sound_stone = mcl_sounds.node_sound_stone_defaults + df_dependencies.sound_water = mcl_sounds.node_sound_water_defaults + df_dependencies.sound_wood = mcl_sounds.node_sound_wood_defaults +else + assert(false, "One of [default] or [mcl_sounds] must be active") +end + +df_dependencies.soundfile_grass_footstep = select_required({{"default", "default_grass_footstep"}, {"mcl_sounds", "default_grass_footstep"}}) +df_dependencies.soundfile_snow_footstep = select_required({{"default", "default_snow_footstep"}, {"mcl_sounds", "pedology_snow_soft_footstep"}}) +df_dependencies.soundfile_gravel_footstep = select_required({{"default", "default_gravel_footstep"}, {"mcl_sounds", "default_gravel_footstep"}}) +df_dependencies.soundfile_cool_lava = select_required({{"default", "default_cool_lava"}, {"mcl_sounds", "default_cool_lava"}}) +df_dependencies.soundfile_tnt_ignite = select_required({{"default", "tnt_ignite"}, {"mcl_tnt", "tnt_ignite"}}) \ No newline at end of file diff --git a/df_dependencies/textures/default_invisible_node_overlay.png b/df_dependencies/textures/default_invisible_node_overlay.png new file mode 100644 index 0000000..7fc8806 Binary files /dev/null and b/df_dependencies/textures/default_invisible_node_overlay.png differ diff --git a/df_dependencies/textures/fireflies_bottle.png b/df_dependencies/textures/fireflies_bottle.png new file mode 100644 index 0000000..ecca036 Binary files /dev/null and b/df_dependencies/textures/fireflies_bottle.png differ diff --git a/df_dependencies/textures/fireflies_bottle_animated.png b/df_dependencies/textures/fireflies_bottle_animated.png new file mode 100644 index 0000000..294ff97 Binary files /dev/null and b/df_dependencies/textures/fireflies_bottle_animated.png differ diff --git a/df_dependencies/textures/fireflies_bugnet.png b/df_dependencies/textures/fireflies_bugnet.png new file mode 100644 index 0000000..8ec3d33 Binary files /dev/null and b/df_dependencies/textures/fireflies_bugnet.png differ diff --git a/df_dependencies/textures/fireflies_firefly.png b/df_dependencies/textures/fireflies_firefly.png new file mode 100644 index 0000000..c086689 Binary files /dev/null and b/df_dependencies/textures/fireflies_firefly.png differ diff --git a/df_dependencies/textures/fireflies_firefly_animated.png b/df_dependencies/textures/fireflies_firefly_animated.png new file mode 100644 index 0000000..e6932e3 Binary files /dev/null and b/df_dependencies/textures/fireflies_firefly_animated.png differ diff --git a/df_farming/cave_wheat.lua b/df_farming/cave_wheat.lua index c8044b8..3040c4a 100644 --- a/df_farming/cave_wheat.lua +++ b/df_farming/cave_wheat.lua @@ -1,4 +1,4 @@ -local S = df_farming.S +local S = minetest.get_translator(minetest.get_current_modname()) local wheat_grow_time = df_farming.config.plant_growth_time * df_farming.config.cave_wheat_delay_multiplier / 8 @@ -18,8 +18,8 @@ local register_cave_wheat = function(number) is_ground_content = false, buildable_to = true, floodable = true, - groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11}, - sounds = df_farming.sounds.leaves, + groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, + sounds = df_dependencies.sound_leaves(), selection_box = { type = "fixed", fixed = { @@ -48,6 +48,9 @@ local register_cave_wheat = function(number) }, }, }, + + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, } if number < 8 then @@ -120,7 +123,8 @@ minetest.register_craftitem("df_farming:cave_bread", { sound = {eat = {name = "df_farming_chomp_crunch", gain = 1.0}}, on_use = minetest.item_eat(5), _hunger_ng = {satiates = 5}, - groups = {flammable = 2, food = 5}, + _mcl_saturation = 3, + groups = {flammable = 2, food = 5, eatable=5}, }) local recipe_registered = false @@ -129,15 +133,15 @@ if minetest.get_modpath("cottages") then recipe_registered = true end -if minetest.registered_items["farming:mortar_pestle"] ~= nil then +if minetest.registered_items[df_dependencies.node_name_mortar_pestle] ~= nil then minetest.register_craft({ type = "shapeless", output = "df_farming:cave_flour", recipe = { "df_farming:cave_wheat", "df_farming:cave_wheat", "df_farming:cave_wheat", - "df_farming:cave_wheat", "farming:mortar_pestle" + "df_farming:cave_wheat", df_dependencies.node_name_mortar_pestle }, - replacements = {{"group:food_mortar_pestle", "farming:mortar_pestle"}}, + replacements = {{"group:food_mortar_pestle", df_dependencies.node_name_mortar_pestle}}, }) recipe_registered = true end @@ -164,8 +168,10 @@ minetest.register_node("df_farming:cave_straw", { description = S("Cave Straw"), tiles = {"dfcaverns_cave_straw.png"}, is_ground_content = false, - groups = {snappy=3, flammable=4, fall_damage_add_percent=-30, straw=1}, - sounds = df_farming.sounds.leaves, + groups = {snappy=3, flammable=4, straw=1, handy=1,hoey=1, compostability=85, flammable=2, fire_encouragement=60, fire_flammability=20, building_block=1, fall_damage_add_percent=-80, enderman_takable=1}, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, }) minetest.register_craft({ @@ -203,9 +209,11 @@ if minetest.get_modpath("footprints") then {-0.5, -0.5, -0.5, 0.5, -3 / 8, 0.5} }, }, - groups = {snappy = 3, flammable = 2, attached_node = 1}, + groups = {snappy = 3, flammable = 2, attached_node = 1, handy=1, hoey=1, compostability=85, fire_encouragement=60, fire_flammability=20, fall_damage_add_percent=-30, destroy_by_lava_flow=1,dig_by_piston=1}, drop = "", - sounds = df_farming.sounds.leaves, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, }) footprints.register_trample_node("df_farming:cave_wheat_5", { diff --git a/df_farming/cooking.lua b/df_farming/cooking.lua index 6c25168..7cc625f 100644 --- a/df_farming/cooking.lua +++ b/df_farming/cooking.lua @@ -1,75 +1,6 @@ -local S = df_farming.S +local S = minetest.get_translator(minetest.get_current_modname()) -local register_cooking_recipes = function(def) - local prefix = def.prefix - local item = def.item - local replacements = def.replacements - minetest.register_craftitem("df_farming:"..item.."_simple_meal", { - description = def.simple.name, - _doc_items_longdesc = df_farming.doc.simple_meal_desc, - _doc_items_usagehelp = df_farming.doc.simple_meal_usage, - inventory_image = def.simple.image, - sound = def.simple.sound, - on_use = minetest.item_eat(4), - groups = {food = 4}, - _hunger_ng = {satiates = 4}, - }) - minetest.register_craftitem("df_farming:"..item.."_medium_meal", { - description = def.medium.name, - _doc_items_longdesc = df_farming.doc.medium_meal_desc, - _doc_items_usagehelp = df_farming.doc.medium_meal_usage, - inventory_image = def.medium.image, - sound = def.medium.sound, - on_use = minetest.item_eat(6), - groups = {food = 6}, - _hunger_ng = {satiates = 6}, - }) - minetest.register_craftitem("df_farming:"..item.."_complex_meal", { - description = def.complex.name, - _doc_items_longdesc = df_farming.doc.complex_meal_desc, - _doc_items_usagehelp = df_farming.doc.complex_meal_usage, - inventory_image = def.complex.image, - sound = def.complex.sound, - on_use = minetest.item_eat(8), - groups = {food = 8}, - _hunger_ng = {satiates = 8}, - }) - - minetest.register_alias("dfcaverns:"..item.."_biscuit", "df_farming:"..item.."_simple_meal") - minetest.register_alias("dfcaverns:"..item.."_stew", "df_farming:"..item.."_medium_meal") - minetest.register_alias("dfcaverns:"..item.."_roast", "df_farming:"..item.."_complex_meal") - minetest.register_alias("df_farming:"..item.."_biscuit", "df_farming:"..item.."_simple_meal") - minetest.register_alias("df_farming:"..item.."_stew", "df_farming:"..item.."_medium_meal") - minetest.register_alias("df_farming:"..item.."_roast", "df_farming:"..item.."_complex_meal") - - minetest.register_craft({ - type = "shapeless", - output = "df_farming:"..item.."_simple_meal", - recipe = {"group:dfcaverns_cookable", prefix..":"..item}, - replacements = replacements - }) - minetest.register_craft({ - type = "shapeless", - output = "df_farming:"..item.."_medium_meal", - recipe = {"group:dfcaverns_cookable", "group:dfcaverns_cookable", prefix..":"..item}, - replacements = replacements - }) - minetest.register_craft({ - type = "shapeless", - output = "df_farming:"..item.."_complex_meal", - recipe = {"group:dfcaverns_cookable", "group:dfcaverns_cookable", "group:dfcaverns_cookable", prefix..":"..item}, - replacements = replacements - }) -end - ---{ --- prefix =, --- item =, --- replacements =, --- simple = {name = , image = , sound = }, --- medium = {name = , image = , sound = }, --- complex = {name = , image = , sound = }, ---} +local bucket_empty = df_dependencies.node_name_bucket_empty local chomp = {eat = {name = "df_farming_chomp_crunch", gain = 1.0}} local crisp = {eat = {name = "df_farming_crisp_chew", gain = 1.0}} @@ -77,61 +8,117 @@ local gummy = {eat = {name = "df_farming_gummy_chew", gain = 1.0}} local mushy = {eat = {name = "df_farming_mushy_chew", gain = 1.0}} local soft = {eat = {name = "df_farming_soft_chew", gain = 1.0}} -register_cooking_recipes({prefix="df_farming", item="cave_flour", - simple = {name=S("Cave Wheat Flour Biscuit"), image="dfcaverns_prepared_food08x16.png", sound = crisp}, - medium = {name=S("Cave Wheat Flour Bun"), image="dfcaverns_prepared_food11x16.png", sound = mushy}, - complex = {name=S("Cave Wheat Flour Pancake"), image="dfcaverns_prepared_food07x16.png", sound = mushy}, -}) -register_cooking_recipes({prefix="df_farming", item="cave_wheat_seed", - simple = {name=S("Cave Wheat Seed Loaf"), image="dfcaverns_prepared_food17x16.png", sound = crisp}, - medium = {name=S("Cave Wheat Seed Puffs"), image="dfcaverns_prepared_food33x16.png", sound = soft}, - complex = {name=S("Cave Wheat Seed Risotto"), image="dfcaverns_prepared_food14x16.png", sound = gummy}, -}) -register_cooking_recipes({prefix="df_farming", item="sweet_pod_seed", - simple = {name=S("Sweet Pod Spore Dumplings"), image="dfcaverns_prepared_food09x16.png", sound = mushy}, - medium = {name=S("Sweet Pod Spore Single Crust Pie"), image="dfcaverns_prepared_food05x16.png", sound = mushy}, - complex = {name=S("Sweet Pod Spore Brule"), image="dfcaverns_prepared_food22x16.png", sound = soft}, -}) -register_cooking_recipes({prefix="df_farming", item="sugar", - simple = {name=S("Sweet Pod Sugar Cookie"), image="dfcaverns_prepared_food02x16.png", sound = crisp}, - medium = {name=S("Sweet Pod Sugar Gingerbread"), image="dfcaverns_prepared_food21x16.png", sound = chomp}, - complex = {name=S("Sweet Pod Sugar Roll"), image="dfcaverns_prepared_food25x16.png", sound = crisp}, -}) -register_cooking_recipes({prefix="group", item="plump_helmet", - simple = {name=S("Plump Helmet Mince"), image="dfcaverns_prepared_food15x16.png", sound = mushy}, - medium = {name=S("Plump Helmet Stalk Sausage"), image="dfcaverns_prepared_food18x16.png", sound = gummy}, - complex = {name=S("Plump Helmet Roast"), image="dfcaverns_prepared_food04x16.png", sound = mushy}, -}) -register_cooking_recipes({prefix="df_farming", item="plump_helmet_spawn", - simple = {name=S("Plump Helmet Spawn Soup"), image="dfcaverns_prepared_food10x16.png", sound = gummy}, - medium = {name=S("Plump Helmet Spawn Jambalaya"), image="dfcaverns_prepared_food01x16.png", sound = soft}, - complex = {name=S("Plump Helmet Sprout Stew"), image="dfcaverns_prepared_food26x16.png", sound = gummy}, -}) -register_cooking_recipes({prefix="df_farming", item="quarry_bush_leaves", - simple = {name=S("Quarry Bush Leaf Spicy Bun"), image="dfcaverns_prepared_food23x16.png", sound = soft}, - medium = {name=S("Quarry Bush Leaf Croissant"), image="dfcaverns_prepared_food29x16.png", sound = soft}, - complex = {name=S("Stuffed Quarry Bush Leaf"), image="dfcaverns_prepared_food27x16.png", sound = chomp}, -}) -register_cooking_recipes({prefix="df_farming", item="quarry_bush_seed", - simple = {name=S("Rock Nut Bread"), image="dfcaverns_prepared_food16x16.png", sound = soft}, - medium = {name=S("Rock Nut Cookie"), image="dfcaverns_prepared_food07x16.png", sound = chomp}, - complex = {name=S("Rock Nut Cake"), image="dfcaverns_prepared_food03x16.png", sound = soft}, -}) -register_cooking_recipes({prefix="df_farming", item="dimple_cup_seed", - simple = {name=S("Dimple Cup Spore Flatbread"), image="dfcaverns_prepared_food12x16.png", sound = crisp}, - medium = {name=S("Dimple Cup Spore Scone"), image="dfcaverns_prepared_food32x16.png", sound = chomp}, - complex = {name=S("Dimple Cup Spore Roll"), image="dfcaverns_prepared_food31x16.png", sound = soft}, -}) -register_cooking_recipes({prefix="df_farming", item="pig_tail_seed", - simple = {name=S("Pig Tail Spore Sandwich"), image="dfcaverns_prepared_food20x16.png", sound = soft}, - medium = {name=S("Pig Tail Spore Tofu"), image="dfcaverns_prepared_food30x16.png", sound = gummy}, - complex = {name=S("Pig Tail Spore Casserole"), image="dfcaverns_prepared_food34x16.png", sound = mushy}, -}) -register_cooking_recipes({prefix="df_farming", item="dwarven_syrup_bucket", replacements={{"df_farming:dwarven_syrup_bucket", "bucket:bucket_empty"}}, - simple = {name=S("Dwarven Syrup Taffy"), image="dfcaverns_prepared_food19x16.png", sound = gummy}, - medium = {name=S("Dwarven Syrup Jellies"), image="dfcaverns_prepared_food06x16.png", sound = gummy}, - complex = {name=S("Dwarven Syrup Delight"), image="dfcaverns_prepared_food24x16.png", sound = mushy}, -}) +local recipes = { +{recipe = {"df_farming:cave_flour", "df_farming:cave_wheat_seed"}, name=S("Cave Wheat Flour Biscuit"), image="dfcaverns_prepared_food08x16.png", sound = crisp}, +{recipe = {"df_farming:cave_flour", "df_farming:cave_wheat_seed", "group:sugar"}, name=S("Cave Wheat Flour Bun"), image="dfcaverns_prepared_food11x16.png", sound = mushy}, +{recipe = {"df_farming:cave_flour", "group:food_flour", "df_farming:cave_wheat_seed", "df_farming:plump_helmet_spawn"}, name=S("Cave Wheat Flour Pancake"), image="dfcaverns_prepared_food07x16.png", sound = mushy}, +{recipe = {"df_farming:cave_wheat_seed", "group:plump_helmet"}, name=S("Cave Wheat Seed Loaf"), image="dfcaverns_prepared_food17x16.png", sound = crisp}, +{recipe = {"df_farming:cave_wheat_seed", "df_farming:cave_wheat_seed", "group:sugar"}, name=S("Cave Wheat Seed Puffs"), image="dfcaverns_prepared_food33x16.png", sound = soft}, +{recipe = {"df_farming:cave_wheat_seed", "df_farming:cave_wheat_seed", "df_farming:pig_tail_seed", "df_farming:plump_helmet_spawn"}, name=S("Cave Wheat Seed Risotto"), image="dfcaverns_prepared_food14x16.png", sound = gummy}, +{recipe = {"df_farming:sweet_pod_seed", "group:food_flour"}, name=S("Sweet Pod Spore Dumplings"), image="dfcaverns_prepared_food09x16.png", sound = mushy}, +{recipe = {"df_farming:sweet_pod_seed", "group:food_flour", "group:sugar"}, name=S("Sweet Pod Spore Single Crust Pie"), image="dfcaverns_prepared_food05x16.png", sound = mushy}, +{recipe = {"df_farming:sweet_pod_seed", "group:sugar", "group:food_flour", "df_farming:dwarven_syrup_bucket"}, replacements={{"df_farming:dwarven_syrup_bucket", bucket_empty}}, name=S("Sweet Pod Spore Brule"), image="dfcaverns_prepared_food22x16.png", sound = soft}, +{recipe = {"df_farming:sugar", "group:food_flour"}, name=S("Sweet Pod Sugar Cookie"), image="dfcaverns_prepared_food02x16.png", sound = crisp}, +{recipe = {"df_farming:sugar", "group:food_flour", "df_farming:quarry_bush_leaves"}, name=S("Sweet Pod Sugar Gingerbread"), image="dfcaverns_prepared_food21x16.png", sound = chomp}, +{recipe = {"df_farming:sugar", "group:sugar", "group:food_flour", "group:food_flour"}, name=S("Sweet Pod Sugar Roll"), image="dfcaverns_prepared_food25x16.png", sound = crisp}, +{recipe = {"group:plump_helmet", "group:plump_helmet"}, name=S("Plump Helmet Mince"), image="dfcaverns_prepared_food15x16.png", sound = mushy}, +{recipe = {"group:plump_helmet", "group:plump_helmet", "df_farming:quarry_bush_leaves"}, name=S("Plump Helmet Stalk Sausage"), image="dfcaverns_prepared_food18x16.png", sound = gummy}, +{recipe = {"group:plump_helmet", "group:food_flour", "df_farming:plump_helmet_spawn", "df_farming:quarry_bush_leaves"}, name=S("Plump Helmet Roast"), image="dfcaverns_prepared_food04x16.png", sound = mushy}, +{recipe = {"df_farming:plump_helmet_spawn", "group:plump_helmet"}, name=S("Plump Helmet Spawn Soup"), image="dfcaverns_prepared_food10x16.png", sound = gummy}, +{recipe = {"df_farming:plump_helmet_spawn", "df_farming:quarry_bush_seed", "group:plump_helmet"}, name=S("Plump Helmet Spawn Jambalaya"), image="dfcaverns_prepared_food01x16.png", sound = soft}, +{recipe = {"df_farming:plump_helmet_spawn", "df_farming:plump_helmet_spawn", "group:plump_helmet", "group:plump_helmet"}, name=S("Plump Helmet Sprout Stew"), image="dfcaverns_prepared_food26x16.png", sound = gummy}, +{recipe = {"df_farming:quarry_bush_leaves", "df_farming:cave_bread"}, name=S("Quarry Bush Leaf Spicy Bun"), image="dfcaverns_prepared_food23x16.png", sound = soft}, +{recipe = {"df_farming:quarry_bush_leaves", "group:food_flour", "group:plump_helmet"}, name=S("Quarry Bush Leaf Croissant"), image="dfcaverns_prepared_food29x16.png", sound = soft}, +{recipe = {"df_farming:quarry_bush_leaves", "group:plump_helmet", "group:plump_helmet", "group:plump_helmet"}, name=S("Stuffed Quarry Bush Leaf"), image="dfcaverns_prepared_food27x16.png", sound = chomp}, +{recipe = {"df_farming:quarry_bush_seed", "df_farming:cave_bread"}, name=S("Rock Nut Bread"), image="dfcaverns_prepared_food16x16.png", sound = soft}, +{recipe = {"df_farming:quarry_bush_seed", "group:food_flour", "group:sugar"}, name=S("Rock Nut Cookie"), image="dfcaverns_prepared_food07x16.png", sound = chomp}, +{recipe = {"df_farming:quarry_bush_seed", "group:sugar", "df_farming:sweet_pod_seed", "group:food_flour"}, name=S("Rock Nut Cake"), image="dfcaverns_prepared_food03x16.png", sound = soft}, +{recipe = {"df_farming:dimple_cup_seed", "group:food_flour"}, name=S("Dimple Cup Spore Flatbread"), image="dfcaverns_prepared_food12x16.png", sound = crisp}, +{recipe = {"df_farming:dimple_cup_seed", "group:food_flour", "group:sugar"}, name=S("Dimple Cup Spore Scone"), image="dfcaverns_prepared_food32x16.png", sound = chomp}, +{recipe = {"df_farming:dimple_cup_seed", "df_farming:sweet_pod_seed", "df_farming:quarry_bush_seed", "group:food_flour"}, name=S("Dimple Cup Spore Roll"), image="dfcaverns_prepared_food31x16.png", sound = soft}, +{recipe = {"df_farming:pig_tail_seed", "df_farming:cave_bread"}, name=S("Pig Tail Spore Sandwich"), image="dfcaverns_prepared_food20x16.png", sound = soft}, +{recipe = {"df_farming:pig_tail_seed", "df_farming:pig_tail_seed", "df_farming:dwarven_syrup_bucket"}, name=S("Pig Tail Spore Tofu"), replacements={{"df_farming:dwarven_syrup_bucket", bucket_empty}}, image="dfcaverns_prepared_food30x16.png", sound = gummy}, +{recipe = {"df_farming:pig_tail_seed", "df_farming:sweet_pod_seed", "group:food_flour", "group:food_flour"}, name=S("Pig Tail Spore Casserole"), image="dfcaverns_prepared_food34x16.png", sound = mushy}, +{recipe = {"df_farming:dwarven_syrup_bucket", "df_farming:dwarven_syrup_bucket"}, replacements={{"df_farming:dwarven_syrup_bucket", bucket_empty}, {"df_farming:dwarven_syrup_bucket", bucket_empty}}, name=S("Dwarven Syrup Taffy"), image="dfcaverns_prepared_food19x16.png", sound = gummy}, +{recipe = {"df_farming:dwarven_syrup_bucket", "group:sugar", "group:plump_helmet"}, replacements={{"df_farming:dwarven_syrup_bucket", bucket_empty}}, name=S("Dwarven Syrup Jellies"), image="dfcaverns_prepared_food06x16.png", sound = gummy}, +{recipe = {"df_farming:dwarven_syrup_bucket", "group:food_flour", "group:sugar", "df_farming:quarry_bush_seed"}, replacements={{"df_farming:dwarven_syrup_bucket", bucket_empty}}, name=S("Dwarven Syrup Delight"), image="dfcaverns_prepared_food24x16.png", sound = mushy}, +} + +local complexity = {[2]={name="simple", value=4}, [3]={name="medium", value=6}, [4]={name="complex", value=8}} +local alias_items = {} + +-- validate the recipes. +for index1 = 1, table.getn(recipes)-1 do + for index2 = index1+1, table.getn(recipes) do + local recipe1 = recipes[index1].recipe + local recipe2 = recipes[index2].recipe + local recipe1count = {} + local recipe2count = {} + for _, item in pairs(recipe1) do + recipe1count[item] = (recipe1count[item] or 0) + 1 + end + for _, item in pairs(recipe2) do + recipe2count[item] = (recipe2count[item] or 0) + 1 + end + local identical = true + for key, val in pairs(recipe1count) do + if recipe2count[key] ~= val then + identical = false + break + end + end + for key, val in pairs(recipe2count) do + if recipe1count[key] ~= val then + identical = false + break + end + end + assert(not identical, "recipes " .. recipes[index1].name .. " and " .. recipes[index2].name .. " have identical ingredients!") + end +end +local ingredient_count = {} +--for _, recipe_entry in pairs(recipes) do +-- for _, item in pairs(recipe_entry.recipe) do +-- ingredient_count[item] = (ingredient_count[item] or 0) + 1 +-- end +--end +--minetest.debug(dump(ingredient_count)) + +for _, def in pairs(recipes) do + local recipe_type = complexity[table.getn(def.recipe)] + local _, item_name = string.match(def.recipe[1], "(.*):(.*)") + local output = "df_farming:"..item_name.."_"..recipe_type.name.."_meal" + alias_items[item_name] = true + + minetest.register_craftitem(output, { + description = def.name, + _doc_items_longdesc = df_farming.doc[recipe_type.name.."_meal_desc"], + _doc_items_usagehelp = df_farming.doc[recipe_type.name.."_meal_usage"], + inventory_image = def.image, + sound = def.sound, + on_use = minetest.item_eat(recipe_type.value), + groups = {food = recipe_type.value, eatable=recipe_type.value}, + _hunger_ng = {satiates = recipe_type.value}, + _mcl_saturation = recipe_type.value, -- TODO: make this more interesting + }) + + minetest.register_craft({ + type = "shapeless", + output = output, + recipe = def.recipe, + replacements = def.replacements + }) +end + +for item, _ in pairs(alias_items) do + minetest.register_alias("dfcaverns:"..item.."_biscuit", "df_farming:"..item.."_simple_meal") + minetest.register_alias("dfcaverns:"..item.."_stew", "df_farming:"..item.."_medium_meal") + minetest.register_alias("dfcaverns:"..item.."_roast", "df_farming:"..item.."_complex_meal") + minetest.register_alias("df_farming:"..item.."_biscuit", "df_farming:"..item.."_simple_meal") + minetest.register_alias("df_farming:"..item.."_stew", "df_farming:"..item.."_medium_meal") + minetest.register_alias("df_farming:"..item.."_roast", "df_farming:"..item.."_complex_meal") +end + -- dfcaverns_prepared_food28 is currently unused -- dfcaverns_prepared_food13 is used for dwarven bread \ No newline at end of file diff --git a/df_farming/dependencies.lua b/df_farming/dependencies.lua deleted file mode 100644 index f62ffd8..0000000 --- a/df_farming/dependencies.lua +++ /dev/null @@ -1,21 +0,0 @@ -df_farming.sounds = {} - -df_farming.sounds.leaves = default.node_sound_leaves_defaults() -df_farming.sounds.water = default.node_sound_water_defaults() - -df_farming.node_names = {} - -df_farming.node_names.dirt = "default:dirt" -df_farming.node_names.dirt_moss = "df_farming:dirt_with_cave_moss" -df_farming.node_names.floor_fungus = "df_farming:cobble_with_floor_fungus" -df_farming.node_names.dirt_wet = "farming:soil_wet" -df_farming.node_names.mortar_pestle = "farming:mortar_pestle" -df_farming.node_names.bucket = "bucket:bucket_empty" -df_farming.node_names.wool_white = "wool:white" - - --- these are only for initialization -minetest.after(0, function() - df_farming.sounds = nil - df_farming.node_names = nil -end) \ No newline at end of file diff --git a/df_farming/dimple_cup.lua b/df_farming/dimple_cup.lua index 19166b1..71adedd 100644 --- a/df_farming/dimple_cup.lua +++ b/df_farming/dimple_cup.lua @@ -1,7 +1,9 @@ -local S = df_farming.S +local S = minetest.get_translator(minetest.get_current_modname()) local dimple_grow_time = df_farming.config.plant_growth_time * df_farming.config.dimple_cup_delay_multiplier / 4 +local dimple_cup_groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, flower = 1, fire_encouragement=60,fire_flammability=100, compostability=70, handy=1,shearsy=1,hoey=1} + local register_dimple_cup = function(number) local name = "df_farming:dimple_cup_"..tostring(number) local def = { @@ -16,8 +18,8 @@ local register_dimple_cup = function(number) floodable = true, is_ground_content = false, buildable_to = true, - groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, color_blue = 1, light_sensitive_fungus = 11, flower = 1}, - sounds = df_farming.sounds.leaves, + groups = dimple_cup_groups, + sounds = df_dependencies.sound_leaves(), selection_box = { type = "fixed", fixed = { @@ -33,15 +35,17 @@ local register_dimple_cup = function(number) max_items = 1, items = { { - items = {'df_farming:dimple_cup_seed 2', 'df_farming:dimple_cup_4'}, + items = {'df_farming:dimple_cup_seed 2', 'df_farming:dimple_cup_harvested'}, rarity = 7-number, }, { - items = {'df_farming:dimple_cup_seed 1', 'df_farming:dimple_cup_4'}, + items = {'df_farming:dimple_cup_seed 1', 'df_farming:dimple_cup_harvested'}, rarity = 5-number, }, }, }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, } if number < 4 then @@ -56,6 +60,40 @@ for i = 1,4 do register_dimple_cup(i) end +local dimple_cup_groups_harvested = {} +for group, val in pairs(dimple_cup_groups) do + dimple_cup_groups_harvested[group] = val +end +dimple_cup_groups_harvested.color_blue = 1 +dimple_cup_groups_harvested.basecolor_blue = 1 +dimple_cup_groups_harvested.excolor_blue = 1 + +local name = "df_farming:dimple_cup_harvested" +local def = { + description = S("Dimple Cup"), + _doc_items_longdesc = df_farming.doc.dimple_cup_desc, + _doc_items_usagehelp = df_farming.doc.dimple_cup_usage, + drawtype = "plantlike", + tiles = {"dfcaverns_dimple_cup_4.png"}, + inventory_image = "dfcaverns_dimple_cup_4.png", + paramtype = "light", + walkable = false, + floodable = true, + is_ground_content = false, + buildable_to = true, + groups = dimple_cup_groups_harvested, + sounds = df_dependencies.sound_leaves(), + selection_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -8/16 + 4*4/16, 8/16}, + }, + }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, +} +minetest.register_node(name, def) + local place_list = { minetest.get_content_id("df_farming:dimple_cup_1"), minetest.get_content_id("df_farming:dimple_cup_2"), diff --git a/df_farming/doc.lua b/df_farming/doc.lua index e0495f5..c7820eb 100644 --- a/df_farming/doc.lua +++ b/df_farming/doc.lua @@ -4,7 +4,7 @@ if not minetest.get_modpath("doc") then return end -local S = df_farming.S +local S = minetest.get_translator(minetest.get_current_modname()) df_farming.doc.simple_meal_desc = S("A meal made from the admixture of two ingredients, it keeps well but are not a rich source of nutrients.") df_farming.doc.simple_meal_usage = nil diff --git a/df_farming/growth_conditions.lua b/df_farming/growth_conditions.lua new file mode 100644 index 0000000..c65d441 --- /dev/null +++ b/df_farming/growth_conditions.lua @@ -0,0 +1,13 @@ +df_farming.growth_permitted = {} + +local growable = {[df_dependencies.node_name_dirt_wet] = true, [df_dependencies.node_name_dirt] = true} +local check_farm_plant_soil = function(pos) + return growable[minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name] +end + +df_farming.growth_permitted["df_farming:cave_wheat_seed"] = check_farm_plant_soil +df_farming.growth_permitted["df_farming:dimple_cup_seed"] = check_farm_plant_soil +df_farming.growth_permitted["df_farming:pig_tail_seed"] = check_farm_plant_soil +df_farming.growth_permitted["df_farming:quarry_bush_seed"] = check_farm_plant_soil +df_farming.growth_permitted["df_farming:sweet_pod_seed"] = check_farm_plant_soil +df_farming.growth_permitted["df_farming:plump_helmet_spawn"] = check_farm_plant_soil \ No newline at end of file diff --git a/df_farming/init.lua b/df_farming/init.lua index b0b90bc..5e96c59 100644 --- a/df_farming/init.lua +++ b/df_farming/init.lua @@ -1,12 +1,10 @@ df_farming = {} local modname = minetest.get_current_modname() -df_farming.S = minetest.get_translator(modname) local modpath = minetest.get_modpath(modname) --load companion lua files dofile(modpath.."/config.lua") -dofile(modpath.."/dependencies.lua") dofile(modpath.."/doc.lua") dofile(modpath.."/aliases.lua") @@ -18,3 +16,4 @@ dofile(modpath.."/plump_helmet.lua") dofile(modpath.."/quarry_bush.lua") dofile(modpath.."/sweet_pod.lua") dofile(modpath.."/cooking.lua") +dofile(modpath.."/growth_conditions.lua") \ No newline at end of file diff --git a/df_farming/mod.conf b/df_farming/mod.conf index 4a8e42c..39c296a 100644 --- a/df_farming/mod.conf +++ b/df_farming/mod.conf @@ -1,4 +1,4 @@ name = df_farming description = Adds farmable underground plants that die in sunlight. Also includes various cooking reactions. -depends = default -optional_depends = farming, cottages, bucket, dynamic_liquid, wool, doc, crafting, footprints +depends = df_dependencies +optional_depends = cottages, dynamic_liquid, doc, crafting, footprints, oil diff --git a/df_farming/pig_tail.lua b/df_farming/pig_tail.lua index a69515e..d5dcc62 100644 --- a/df_farming/pig_tail.lua +++ b/df_farming/pig_tail.lua @@ -1,4 +1,4 @@ -local S = df_farming.S +local S = minetest.get_translator(minetest.get_current_modname()) local pig_tail_grow_time = df_farming.config.plant_growth_time * df_farming.config.pig_tail_delay_multiplier / 8 @@ -18,8 +18,8 @@ local register_pig_tail = function(number) is_ground_content = false, floodable = true, buildable_to = true, - groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11}, - sounds = df_farming.sounds.leaves, + groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, fire_encouragement=60,fire_flammability=100, compostability=70, handy=1,shearsy=1,hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, + sounds = df_dependencies.sound_leaves(), selection_box = { type = "fixed", fixed = { @@ -35,11 +35,11 @@ local register_pig_tail = function(number) max_items = 1, items = { { - items = {'df_farming:pig_tail_seed 2', 'df_farming:pig_tail_thread 2'}, + items = {'df_farming:pig_tail_seed 2', 'df_farming:pig_tail_thread 3'}, rarity = 9-number, }, { - items = {'df_farming:pig_tail_seed 1', 'df_farming:pig_tail_thread'}, + items = {'df_farming:pig_tail_seed 1', 'df_farming:pig_tail_thread 2'}, rarity = 9-number, }, { @@ -48,6 +48,8 @@ local register_pig_tail = function(number) }, }, }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, } if number < 8 then @@ -95,18 +97,18 @@ minetest.register_craftitem("df_farming:pig_tail_thread", { groups = {flammable = 1, thread = 1}, }) -if minetest.get_modpath("wool") then +if df_dependencies.node_name_wool_white then minetest.register_craft({ - output = df_farming.node_names.wool_white, + output = df_dependencies.node_name_wool_white, recipe = { {"group:thread", "group:thread"}, {"group:thread", "group:thread"}, } }) end -if minetest.get_modpath("farming") then +if df_dependencies.node_name_string then minetest.register_craft({ - output = "farming:string 2", + output = df_dependencies.node_name_string .. " 2", recipe = { {"group:thread"}, {"group:thread"}, @@ -135,9 +137,11 @@ if minetest.get_modpath("footprints") then {-0.5, -0.5, -0.5, 0.5, -3 / 8, 0.5} }, }, - groups = {snappy = 3, flammable = 2, attached_node = 1}, + groups = {snappy = 3, flammable = 2, attached_node = 1, handy=1, hoey=1, compostability=85, fire_encouragement=60, fire_flammability=20, fall_damage_add_percent=-30, destroy_by_lava_flow=1,dig_by_piston=1}, drop = "", - sounds = df_farming.sounds.leaves, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) footprints.register_trample_node("df_farming:pig_tail_5", { diff --git a/df_farming/plants.lua b/df_farming/plants.lua index 2434616..53c89ce 100644 --- a/df_farming/plants.lua +++ b/df_farming/plants.lua @@ -1,4 +1,4 @@ -local S = df_farming.S +local S = minetest.get_translator(minetest.get_current_modname()) ----------------------------------------------------------------------- -- Plants @@ -15,12 +15,14 @@ minetest.register_node("df_farming:dead_fungus", { is_ground_content = false, buildable_to = true, floodable = true, - groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, flow_through = 1}, - sounds = df_farming.sounds.leaves, + groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, flow_through = 1, fire_encouragement=60,fire_flammability=100,destroy_by_lava_flow=1,dig_by_piston=1, compostability=65, handy=1, hoey=1}, + sounds = df_dependencies.sound_leaves(), selection_box = { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5}, }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) minetest.register_craft({ @@ -35,7 +37,6 @@ df_farming.spawn_dead_fungus_vm = function(vi, area, data, param2_data) param2_data[vi] = 0 end --- not DF canon minetest.register_node("df_farming:cavern_fungi", { description = S("Cavern Fungi"), _doc_items_longdesc = df_farming.doc.cavern_fungi_desc, @@ -49,12 +50,14 @@ minetest.register_node("df_farming:cavern_fungi", { buildable_to = true, floodable = true, light_source = 6, - groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, flow_through = 1}, - sounds = df_farming.sounds.leaves, + groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, flow_through = 1, fire_encouragement=50,fire_flammability=60,destroy_by_lava_flow=1,dig_by_piston=1, compostability=65, handy=1, hoey=1}, + sounds = df_dependencies.sound_leaves(), selection_box = { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5}, }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) minetest.register_craft({ @@ -71,8 +74,8 @@ end ----------------------------------------------------------------------------------------- -local marginal = {[df_farming.node_names.dirt] = true, [df_farming.node_names.dirt_moss] = true, [df_farming.node_names.floor_fungus] = true} -local growable = {[df_farming.node_names.dirt_wet] = true, [df_farming.node_names.dirt] = true, [df_farming.node_names.dirt_moss] = true, [df_farming.node_names.floor_fungus] = true} +local marginal = {[df_dependencies.node_name_dirt] = true} +local growable = {[df_dependencies.node_name_dirt_wet] = true, [df_dependencies.node_name_dirt] = true} df_farming.plant_timer = function(pos, plantname, elapsed) local next_stage_time = minetest.registered_nodes[plantname]._dfcaverns_next_stage_time @@ -90,6 +93,15 @@ df_farming.plant_timer = function(pos, plantname, elapsed) end end +local function copy_pointed_thing(pointed_thing) + return { + type = pointed_thing.type, + above = pointed_thing.above and vector.copy(pointed_thing.above), + under = pointed_thing.under and vector.copy(pointed_thing.under), + ref = pointed_thing.ref, + } +end + local place_seed = function(itemstack, placer, pointed_thing, plantname) local pt = pointed_thing -- check if pointing at a node @@ -131,9 +143,31 @@ local place_seed = function(itemstack, placer, pointed_thing, plantname) end -- add the node and remove 1 item from the itemstack + local newnode= {name = itemstack:get_name(), param2 = 1, param1=0} + local oldnode= minetest.get_node(pt.above) minetest.add_node(pt.above, {name = plantname, param2 = 1}) - df_farming.plant_timer(pt.above, plantname) - if not minetest.settings:get_bool("creative_mode", false) then + + local growth_permitted_function = df_farming.growth_permitted[plantname] + if not growth_permitted_function or growth_permitted_function(pt.above) then + df_farming.plant_timer(pt.above, plantname) + else + minetest.get_node_timer(pt.above):stop() -- make sure no old timers are running on this node + end + + -- Run script hook + local take_item = true + for _, callback in ipairs(core.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + local place_to_copy = vector.copy(pt.above) + local newnode_copy = {name=newnode.name, param1=newnode.param1, param2=newnode.param2} + local oldnode_copy = {name=oldnode.name, param1=oldnode.param1, param2=oldnode.param2} + local pointed_thing_copy = copy_pointed_thing(pointed_thing) + if callback(place_to_copy, newnode_copy, placer, oldnode_copy, itemstack, pointed_thing_copy) then + take_item = false + end + end + + if not minetest.is_creative_enabled(placer:get_player_name()) then itemstack:take_item() end return itemstack @@ -149,7 +183,7 @@ df_farming.register_seed = function(name, description, image, stage_one, grow_ti wield_image = image, drawtype = "signlike", paramtype2 = "wallmounted", - groups = {seed = 1, snappy = 3, attached_node = 1, flammable = 2, dfcaverns_cookable = 1, digtron_on_place=1}, + groups = {seed = 1, snappy = 3, attached_node = 1, dfcaverns_cookable = 1, digtron_on_place=1,destroy_by_lava_flow=1,dig_by_piston=1, handy=1, hoey=1}, _dfcaverns_next_stage = stage_one, _dfcaverns_next_stage_time = grow_time, paramtype = "light", @@ -161,6 +195,8 @@ df_farming.register_seed = function(name, description, image, stage_one, grow_ti type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, on_place = function(itemstack, placer, pointed_thing) return place_seed(itemstack, placer, pointed_thing, "df_farming:"..name) @@ -169,6 +205,10 @@ df_farming.register_seed = function(name, description, image, stage_one, grow_ti on_timer = function(pos, elapsed) df_farming.grow_underground_plant(pos, "df_farming:"..name, elapsed) end, + + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, } minetest.register_node("df_farming:"..name, def) diff --git a/df_farming/plump_helmet.lua b/df_farming/plump_helmet.lua index 6f93af1..004b7f8 100644 --- a/df_farming/plump_helmet.lua +++ b/df_farming/plump_helmet.lua @@ -1,9 +1,18 @@ -local S = df_farming.S +local S = minetest.get_translator(minetest.get_current_modname()) local displace_x = 0.125 local displace_z = 0.125 -local plump_helmet_grow_time = df_farming.config.plant_growth_time * df_farming.config.cave_wheat_delay_multiplier / 4 +local plump_helmet_grow_time = df_farming.config.plant_growth_time * df_farming.config.plump_helmet_delay_multiplier / 4 + +local function copy_pointed_thing(pointed_thing) + return { + type = pointed_thing.type, + above = pointed_thing.above and vector.copy(pointed_thing.above), + under = pointed_thing.under and vector.copy(pointed_thing.under), + ref = pointed_thing.ref, + } +end local plump_helmet_on_place = function(itemstack, placer, pointed_thing, plantname) local pt = pointed_thing @@ -46,9 +55,30 @@ local plump_helmet_on_place = function(itemstack, placer, pointed_thing, plantn end -- add the node and remove 1 item from the itemstack - minetest.add_node(pt.above, {name = plantname, param2 = math.random(0,3)}) - df_farming.plant_timer(pt.above, plantname) - if not minetest.settings:get_bool("creative_mode", false) then + local new_param2 = math.random(0,3) + local newnode= {name = plantname, param2 = new_param2, param1=0} + local oldnode= minetest.get_node(pt.above) + minetest.add_node(pt.above, newnode) + + local growth_permitted_function = df_farming.growth_permitted["df_farming:plump_helmet_spawn"] -- use the same permitted function for all plump helmets + if not growth_permitted_function or growth_permitted_function(pt.above) then + df_farming.plant_timer(pt.above, plantname) + end + + -- Run script hook + local take_item = true + for _, callback in ipairs(core.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + local place_to_copy = vector.copy(pt.above) + local newnode_copy = {name=newnode.name, param1=newnode.param1, param2=newnode.param2} + local oldnode_copy = {name=oldnode.name, param1=oldnode.param1, param2=oldnode.param2} + local pointed_thing_copy = copy_pointed_thing(pointed_thing) + if callback(place_to_copy, newnode_copy, placer, oldnode_copy, itemstack, pointed_thing_copy) then + take_item = false + end + end + + if not minetest.is_creative_enabled(placer:get_player_name()) then itemstack:take_item() end return itemstack @@ -62,7 +92,7 @@ minetest.register_node("df_farming:plump_helmet_spawn", { tiles = { "dfcaverns_plump_helmet_cap.png", }, - groups = {snappy = 3, flammable = 2, plant = 1, attached_node = 1, light_sensitive_fungus = 11, dfcaverns_cookable = 1, digtron_on_place=1}, + groups = {snappy = 3, plant = 1, attached_node = 1, light_sensitive_fungus = 11, dfcaverns_cookable = 1, digtron_on_place=1, destroy_by_lava_flow=1,dig_by_piston=1, handy=1, hoey=1}, _dfcaverns_next_stage = "df_farming:plump_helmet_1", _dfcaverns_next_stage_time = plump_helmet_grow_time, drawtype = "nodebox", @@ -77,6 +107,8 @@ minetest.register_node("df_farming:plump_helmet_spawn", { {-0.0625 + displace_x, -0.5, -0.125 + displace_z, 0.125 + displace_x, -0.375, 0.0625 + displace_z}, } }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, on_place = function(itemstack, placer, pointed_thing) return plump_helmet_on_place(itemstack, placer, pointed_thing, "df_farming:plump_helmet_spawn") @@ -85,8 +117,23 @@ minetest.register_node("df_farming:plump_helmet_spawn", { on_timer = function(pos, elapsed) df_farming.grow_underground_plant(pos, "df_farming:plump_helmet_spawn", elapsed) end, + + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, }) +local plump_helmet_groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, dfcaverns_cookable = 1, plump_helmet = 1, digtron_on_place=1, fire_encouragement=30,fire_flammability=100,destroy_by_lava_flow=1,dig_by_piston=1,compostability=65} +local get_plump_helmet_groups = function(eatable) + local ret = {} + for key, val in pairs(plump_helmet_groups) do + ret[key]=val + end + ret.eatable = eatable + ret.food = eatable + return ret +end + minetest.register_node("df_farming:plump_helmet_1", { description = S("Plump Helmet"), _doc_items_longdesc = df_farming.doc.plump_helmet_desc, @@ -96,14 +143,14 @@ minetest.register_node("df_farming:plump_helmet_1", { "dfcaverns_plump_helmet_cap.png", "dfcaverns_plump_helmet_cap.png^[lowpart:5:dfcaverns_plump_helmet_stem.png", }, - groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, dfcaverns_cookable = 1, plump_helmet = 1, food = 1, digtron_on_place=1}, + groups = get_plump_helmet_groups(1), _dfcaverns_next_stage = "df_farming:plump_helmet_2", _dfcaverns_next_stage_time = plump_helmet_grow_time, drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", is_ground_content = false, - sounds = df_farming.sounds.leaves, + sounds = df_dependencies.sound_leaves(), sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}, walkable = false, floodable = true, @@ -114,6 +161,8 @@ minetest.register_node("df_farming:plump_helmet_1", { {-0.125 + displace_x, -0.4375, -0.1875 + displace_z, 0.1875 + displace_x, -0.3125, 0.125 + displace_z}, -- cap } }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, on_place = function(itemstack, placer, pointed_thing) return plump_helmet_on_place(itemstack, placer, pointed_thing, "df_farming:plump_helmet_1") @@ -121,6 +170,7 @@ minetest.register_node("df_farming:plump_helmet_1", { on_use = minetest.item_eat(1), _hunger_ng = {satiates = 1}, + _mcl_saturation = 0.5, on_timer = function(pos, elapsed) df_farming.grow_underground_plant(pos, "df_farming:plump_helmet_1", elapsed) @@ -137,13 +187,13 @@ minetest.register_node("df_farming:plump_helmet_2", { "dfcaverns_plump_helmet_cap.png", "dfcaverns_plump_helmet_cap.png^[lowpart:15:dfcaverns_plump_helmet_stem.png", }, - groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, dfcaverns_cookable = 1, plump_helmet = 1, food = 2, digtron_on_place=1}, + groups = get_plump_helmet_groups(2), _dfcaverns_next_stage = "df_farming:plump_helmet_3", _dfcaverns_next_stage_time = plump_helmet_grow_time, drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", - sounds = df_farming.sounds.leaves, + sounds = df_dependencies.sound_leaves(), sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}, walkable = false, is_ground_content = false, @@ -155,12 +205,16 @@ minetest.register_node("df_farming:plump_helmet_2", { {-0.125 + displace_x, -0.3125, -0.1875 + displace_z, 0.1875 + displace_x, -0.0625, 0.125 + displace_z}, -- cap } }, + _mcl_blast_resistance = 0.4, + _mcl_hardness = 0.4, + on_place = function(itemstack, placer, pointed_thing) return plump_helmet_on_place(itemstack, placer, pointed_thing, "df_farming:plump_helmet_2") end, on_use = minetest.item_eat(2), _hunger_ng = {satiates = 2}, + _mcl_saturation = 0.7, on_timer = function(pos, elapsed) df_farming.grow_underground_plant(pos, "df_farming:plump_helmet_2", elapsed) @@ -176,13 +230,13 @@ minetest.register_node("df_farming:plump_helmet_3", { "dfcaverns_plump_helmet_cap.png", "dfcaverns_plump_helmet_cap.png^[lowpart:35:dfcaverns_plump_helmet_stem.png", }, - groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, dfcaverns_cookable = 1, plump_helmet = 1, food = 3, digtron_on_place=1}, + groups = get_plump_helmet_groups(3), _dfcaverns_next_stage = "df_farming:plump_helmet_4", _dfcaverns_next_stage_time = plump_helmet_grow_time, drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", - sounds = df_farming.sounds.leaves, + sounds = df_dependencies.sound_leaves(), sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}, walkable = false, is_ground_content = false, @@ -194,12 +248,16 @@ minetest.register_node("df_farming:plump_helmet_3", { {-0.1875 + displace_x, -0.125, -0.25 + displace_z, 0.25 + displace_x, 0.1875, 0.1875 + displace_z}, -- cap } }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + on_place = function(itemstack, placer, pointed_thing) return plump_helmet_on_place(itemstack, placer, pointed_thing, "df_farming:plump_helmet_3") end, on_use = minetest.item_eat(3), _hunger_ng = {satiates = 3}, + _mcl_saturation = 0.9, on_timer = function(pos, elapsed) df_farming.grow_underground_plant(pos, "df_farming:plump_helmet_3", elapsed) @@ -215,11 +273,11 @@ minetest.register_node("df_farming:plump_helmet_4", { "dfcaverns_plump_helmet_cap.png", "dfcaverns_plump_helmet_cap.png^[lowpart:40:dfcaverns_plump_helmet_stem.png", }, - groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, dfcaverns_cookable = 1, plump_helmet = 1, food = 4, digtron_on_place=1}, + groups = get_plump_helmet_groups(4), drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", - sounds = df_farming.sounds.leaves, + sounds = df_dependencies.sound_leaves(), sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}, walkable = false, is_ground_content = false, @@ -232,6 +290,9 @@ minetest.register_node("df_farming:plump_helmet_4", { {-0.1875 + displace_x, 0.25, -0.25 + displace_z, 0.25 + displace_x, 0.3125, 0.1875 + displace_z}, -- cap rounding } }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + drop = { max_items = 4, items = { @@ -259,8 +320,16 @@ minetest.register_node("df_farming:plump_helmet_4", { on_use = minetest.item_eat(4), _hunger_ng = {satiates = 4}, + _mcl_saturation = 1, }) +local picked_groups = {} +for key, val in pairs(plump_helmet_groups) do + picked_groups[key]=val + picked_groups.eatable=4 + picked_groups.food=4 +end +picked_groups.not_in_creative_inventory = nil -- Need a separate picked type to prevent it from giving infinite spawn by just placing and re-harvesting minetest.register_node("df_farming:plump_helmet_4_picked", { description = S("Plump Helmet"), @@ -271,11 +340,11 @@ minetest.register_node("df_farming:plump_helmet_4_picked", { "dfcaverns_plump_helmet_cap.png", "dfcaverns_plump_helmet_cap.png^[lowpart:40:dfcaverns_plump_helmet_stem.png", }, - groups = {snappy = 3, flammable = 2, plant = 1, attached_node = 1, light_sensitive_fungus = 11, dfcaverns_cookable = 1, plump_helmet = 1, food = 4, digtron_on_place=1}, + groups = picked_groups, drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", - sounds = df_farming.sounds.leaves, + sounds = df_dependencies.sound_leaves(), sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}, walkable = false, is_ground_content = false, @@ -288,12 +357,16 @@ minetest.register_node("df_farming:plump_helmet_4_picked", { {-0.1875 + displace_x, 0.25, -0.25 + displace_z, 0.25 + displace_x, 0.3125, 0.1875 + displace_z}, -- cap rounding } }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + on_place = function(itemstack, placer, pointed_thing) return plump_helmet_on_place(itemstack, placer, pointed_thing, "df_farming:plump_helmet_4_picked") end, on_use = minetest.item_eat(4), _hunger_ng = {satiates = 4}, + _mcl_saturation = 1, }) local place_list = { diff --git a/df_farming/quarry_bush.lua b/df_farming/quarry_bush.lua index c0a0675..8c78d5a 100644 --- a/df_farming/quarry_bush.lua +++ b/df_farming/quarry_bush.lua @@ -1,4 +1,4 @@ -local S = df_farming.S +local S = minetest.get_translator(minetest.get_current_modname()) local quarry_grow_time = df_farming.config.plant_growth_time * df_farming.config.quarry_bush_delay_multiplier / 5 @@ -18,14 +18,16 @@ local register_quarry_bush = function(number) buildable_to = true, is_ground_content = false, floodable = true, - groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11}, - sounds = df_farming.sounds.leaves, + groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, fire_encouragement=60,fire_flammability=100, compostability=50, handy=1,shearsy=1,hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, + sounds = df_dependencies.sound_leaves(), selection_box = { type = "fixed", fixed = { {-8/16, -8/16, -8/16, 8/16, -8/16 + (16/5)*number/16, 8/16}, }, }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, on_timer = function(pos, elapsed) df_farming.grow_underground_plant(pos, name, elapsed) diff --git a/df_farming/sweet_pod.lua b/df_farming/sweet_pod.lua index d618b34..5417217 100644 --- a/df_farming/sweet_pod.lua +++ b/df_farming/sweet_pod.lua @@ -1,7 +1,12 @@ -local S = df_farming.S +local S = minetest.get_translator(minetest.get_current_modname()) local sweet_pod_grow_time = df_farming.config.plant_growth_time * df_farming.config.sweet_pod_delay_multiplier / 6 +local syrup_sound = df_dependencies.sound_water() +if minetest.get_modpath("oil") then + syrup_sound.footstep = {name = "oil_oil_footstep", gain = 0.2} +end + local register_sweet_pod = function(number) local name = "df_farming:sweet_pod_"..tostring(number) local def = { @@ -16,14 +21,16 @@ local register_sweet_pod = function(number) is_ground_content = false, buildable_to = true, floodable = true, - groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11}, - sounds = df_farming.sounds.leaves, + groups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, light_sensitive_fungus = 11, fire_encouragement=60,fire_flammability=100, compostability=70, handy=1,shearsy=1,hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, + sounds = df_dependencies.sound_leaves(), selection_box = { type = "fixed", fixed = { {-8/16, -8/16, -8/16, 8/16, -8/16 + (16/6)*number/16, 8/16}, }, }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, on_timer = function(pos, elapsed) df_farming.grow_underground_plant(pos, name, elapsed) @@ -104,7 +111,7 @@ minetest.register_craftitem("df_farming:sugar", { _doc_items_longdesc = df_farming.doc.sweet_pod_sugar_desc, _doc_items_usagehelp = df_farming.doc.sweet_pod_sugar_usage, inventory_image = "dfcaverns_sugar.png", - groups = {dfcaverns_cookable = 1}, + groups = {dfcaverns_cookable = 1, sugar = 1, food_sugar = 1}, }) local recipe_registered = false @@ -114,14 +121,14 @@ if minetest.get_modpath("cottages") then recipe_registered = true end -if minetest.registered_items[df_farming.node_names.mortar_pestle] ~= nil then +if minetest.registered_items[df_dependencies.node_name_mortar_pestle] ~= nil then minetest.register_craft({ type = "shapeless", output = "df_farming:sugar", recipe = { - "df_farming:sweet_pods", df_farming.node_names.mortar_pestle + "df_farming:sweet_pods", df_dependencies.node_name_mortar_pestle }, - replacements = {{"group:food_mortar_pestle", df_farming.node_names.mortar_pestle}}, + replacements = {{"group:food_mortar_pestle", df_dependencies.node_name_mortar_pestle}}, }) recipe_registered = true end @@ -138,7 +145,7 @@ end ---------------------------------------------- -- Syrup -if minetest.get_modpath("bucket") then +if df_dependencies.bucket_register_liquid then minetest.register_node("df_farming:dwarven_syrup_source", { description = S("Dwarven Syrup Source"), _doc_items_longdesc = df_farming.doc.sweet_pod_syrup_desc, @@ -183,8 +190,10 @@ if minetest.get_modpath("bucket") then liquid_renewable = false, liquid_range = 2, post_effect_color = {a = 204, r = 179, g = 131, b = 88}, - groups = {liquid = 3, flammable = 2}, - sounds = df_farming.sounds.water, + groups = {liquid = 1, flammable = -1, dig_by_piston=1, fire_encouragement=5}, + sounds = syrup_sound, + _mcl_blast_resistance = 100, + _mcl_hardness = -1, }) minetest.register_node("df_farming:dwarven_syrup_flowing", { @@ -232,11 +241,13 @@ if minetest.get_modpath("bucket") then liquid_renewable = false, liquid_range = 2, post_effect_color = {a = 204, r = 179, g = 131, b = 88}, - groups = {liquid = 3, flammable = 2, not_in_creative_inventory = 1}, - sounds = df_farming.sounds.water, + groups = {liquid = 1, flammable = -1, not_in_creative_inventory = 1, dig_by_piston=1, fire_encouragement = 5}, + sounds = syrup_sound, + _mcl_blast_resistance = 100, + _mcl_hardness = -1, }) - bucket.register_liquid( + df_dependencies.bucket_register_liquid( "df_farming:dwarven_syrup_source", "df_farming:dwarven_syrup_flowing", "df_farming:dwarven_syrup_bucket", @@ -247,7 +258,7 @@ if minetest.get_modpath("bucket") then if minetest.get_modpath("crafting") then simplecrafting_lib.register("furnace", { input = { - [df_farming.node_names.bucket] = 1, + [df_dependencies.node_name_bucket_empty] = 1, ["df_farming:sugar"] = 3, ["simplecrafting_lib:heat"] = 5, }, @@ -257,7 +268,7 @@ if minetest.get_modpath("bucket") then minetest.register_craft({ type = "shapeless", output = "df_farming:dwarven_syrup_bucket", - recipe = {df_farming.node_names.bucket, "df_farming:sugar", "df_farming:sugar", "df_farming:sugar"}, + recipe = {df_dependencies.node_name_bucket_empty, "df_farming:sugar", "df_farming:sugar", "df_farming:sugar"}, }) end diff --git a/df_farming/textures/dfcaverns_dimple_cup_seed.png b/df_farming/textures/dfcaverns_dimple_cup_seed.png index e4ce6e2..18c9bd6 100644 Binary files a/df_farming/textures/dfcaverns_dimple_cup_seed.png and b/df_farming/textures/dfcaverns_dimple_cup_seed.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food01x16.png b/df_farming/textures/dfcaverns_prepared_food01x16.png index bbff883..c30acdb 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food01x16.png and b/df_farming/textures/dfcaverns_prepared_food01x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food02x16.png b/df_farming/textures/dfcaverns_prepared_food02x16.png index 91b4c4a..dae399f 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food02x16.png and b/df_farming/textures/dfcaverns_prepared_food02x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food03x16.png b/df_farming/textures/dfcaverns_prepared_food03x16.png index fcac48f..a7bf12a 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food03x16.png and b/df_farming/textures/dfcaverns_prepared_food03x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food04x16.png b/df_farming/textures/dfcaverns_prepared_food04x16.png index 7aec4b0..2f0f37a 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food04x16.png and b/df_farming/textures/dfcaverns_prepared_food04x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food05x16.png b/df_farming/textures/dfcaverns_prepared_food05x16.png index 7b2f79b..3db0bd3 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food05x16.png and b/df_farming/textures/dfcaverns_prepared_food05x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food06x16.png b/df_farming/textures/dfcaverns_prepared_food06x16.png index f76ba16..e51ec1a 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food06x16.png and b/df_farming/textures/dfcaverns_prepared_food06x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food07x16.png b/df_farming/textures/dfcaverns_prepared_food07x16.png index 3cde717..3d7cf2d 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food07x16.png and b/df_farming/textures/dfcaverns_prepared_food07x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food08x16.png b/df_farming/textures/dfcaverns_prepared_food08x16.png index 3b731a5..1d0384e 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food08x16.png and b/df_farming/textures/dfcaverns_prepared_food08x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food09x16.png b/df_farming/textures/dfcaverns_prepared_food09x16.png index a37e93d..5360d93 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food09x16.png and b/df_farming/textures/dfcaverns_prepared_food09x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food10x16.png b/df_farming/textures/dfcaverns_prepared_food10x16.png index 600a345..a773b8e 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food10x16.png and b/df_farming/textures/dfcaverns_prepared_food10x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food11x16.png b/df_farming/textures/dfcaverns_prepared_food11x16.png index 4fd14d8..42a4702 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food11x16.png and b/df_farming/textures/dfcaverns_prepared_food11x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food12x16.png b/df_farming/textures/dfcaverns_prepared_food12x16.png index 7daa6ba..a9ca616 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food12x16.png and b/df_farming/textures/dfcaverns_prepared_food12x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food13x16.png b/df_farming/textures/dfcaverns_prepared_food13x16.png index 7bbeb7c..70dd545 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food13x16.png and b/df_farming/textures/dfcaverns_prepared_food13x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food14x16.png b/df_farming/textures/dfcaverns_prepared_food14x16.png index e1f805b..7601687 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food14x16.png and b/df_farming/textures/dfcaverns_prepared_food14x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food15x16.png b/df_farming/textures/dfcaverns_prepared_food15x16.png index b578c90..197651c 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food15x16.png and b/df_farming/textures/dfcaverns_prepared_food15x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food16x16.png b/df_farming/textures/dfcaverns_prepared_food16x16.png index b1ce647..e1f5eea 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food16x16.png and b/df_farming/textures/dfcaverns_prepared_food16x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food17x16.png b/df_farming/textures/dfcaverns_prepared_food17x16.png index 976153f..96ac7b6 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food17x16.png and b/df_farming/textures/dfcaverns_prepared_food17x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food18x16.png b/df_farming/textures/dfcaverns_prepared_food18x16.png index 80c08da..8bce7af 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food18x16.png and b/df_farming/textures/dfcaverns_prepared_food18x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food19x16.png b/df_farming/textures/dfcaverns_prepared_food19x16.png index e809144..82e2a6b 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food19x16.png and b/df_farming/textures/dfcaverns_prepared_food19x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food20x16.png b/df_farming/textures/dfcaverns_prepared_food20x16.png index e5fc072..ad94142 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food20x16.png and b/df_farming/textures/dfcaverns_prepared_food20x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food21x16.png b/df_farming/textures/dfcaverns_prepared_food21x16.png index e29f399..8ce8a68 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food21x16.png and b/df_farming/textures/dfcaverns_prepared_food21x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food22x16.png b/df_farming/textures/dfcaverns_prepared_food22x16.png index cc1fef1..2633108 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food22x16.png and b/df_farming/textures/dfcaverns_prepared_food22x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food23x16.png b/df_farming/textures/dfcaverns_prepared_food23x16.png index bcae8c0..3fdf353 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food23x16.png and b/df_farming/textures/dfcaverns_prepared_food23x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food24x16.png b/df_farming/textures/dfcaverns_prepared_food24x16.png index 2f90bf7..7bd6aaf 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food24x16.png and b/df_farming/textures/dfcaverns_prepared_food24x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food25x16.png b/df_farming/textures/dfcaverns_prepared_food25x16.png index df6c486..f4142d4 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food25x16.png and b/df_farming/textures/dfcaverns_prepared_food25x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food26x16.png b/df_farming/textures/dfcaverns_prepared_food26x16.png index 0d6252c..aa75463 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food26x16.png and b/df_farming/textures/dfcaverns_prepared_food26x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food27x16.png b/df_farming/textures/dfcaverns_prepared_food27x16.png index 8ee00fb..be867c0 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food27x16.png and b/df_farming/textures/dfcaverns_prepared_food27x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food28x16.png b/df_farming/textures/dfcaverns_prepared_food28x16.png index 62fda4f..1d6c6da 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food28x16.png and b/df_farming/textures/dfcaverns_prepared_food28x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food29x16.png b/df_farming/textures/dfcaverns_prepared_food29x16.png index 125db1e..7bcfee1 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food29x16.png and b/df_farming/textures/dfcaverns_prepared_food29x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food30x16.png b/df_farming/textures/dfcaverns_prepared_food30x16.png index a7b1e93..0d48fcb 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food30x16.png and b/df_farming/textures/dfcaverns_prepared_food30x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food31x16.png b/df_farming/textures/dfcaverns_prepared_food31x16.png index 24e85f6..b42119f 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food31x16.png and b/df_farming/textures/dfcaverns_prepared_food31x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food32x16.png b/df_farming/textures/dfcaverns_prepared_food32x16.png index 23ab019..04c96c8 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food32x16.png and b/df_farming/textures/dfcaverns_prepared_food32x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food33x16.png b/df_farming/textures/dfcaverns_prepared_food33x16.png index f5cacb4..4f5460b 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food33x16.png and b/df_farming/textures/dfcaverns_prepared_food33x16.png differ diff --git a/df_farming/textures/dfcaverns_prepared_food34x16.png b/df_farming/textures/dfcaverns_prepared_food34x16.png index 7a0801d..dd7540c 100644 Binary files a/df_farming/textures/dfcaverns_prepared_food34x16.png and b/df_farming/textures/dfcaverns_prepared_food34x16.png differ diff --git a/df_farming/textures/dfcaverns_quarry_bush_leaves.png b/df_farming/textures/dfcaverns_quarry_bush_leaves.png index 1d8fb98..11b1007 100644 Binary files a/df_farming/textures/dfcaverns_quarry_bush_leaves.png and b/df_farming/textures/dfcaverns_quarry_bush_leaves.png differ diff --git a/df_farming/textures/dfcaverns_rock_nuts.png b/df_farming/textures/dfcaverns_rock_nuts.png index c240805..89a1ce0 100644 Binary files a/df_farming/textures/dfcaverns_rock_nuts.png and b/df_farming/textures/dfcaverns_rock_nuts.png differ diff --git a/df_farming/textures/dfcaverns_sweet_pods.png b/df_farming/textures/dfcaverns_sweet_pods.png index a7a2d26..8a7beda 100644 Binary files a/df_farming/textures/dfcaverns_sweet_pods.png and b/df_farming/textures/dfcaverns_sweet_pods.png differ diff --git a/df_mapitems/castle_coral.lua b/df_mapitems/castle_coral.lua index 72e1a21..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"), @@ -16,8 +16,10 @@ minetest.register_node("df_mapitems:castle_coral", { mesh = "octagonal_coral.obj", drop = "df_mapitems:castle_coral_skeleton", paramtype = "light", - groups = {cracky=2,}, - sounds = df_mapitems.sounds.stone, + groups = {cracky=2, pickaxey = 1, building_block = 1, coral=1, coral_block=1}, + sounds = df_dependencies.sound_stone(), + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, }) minetest.register_node("df_mapitems:castle_coral_skeleton", { @@ -25,21 +27,23 @@ minetest.register_node("df_mapitems:castle_coral_skeleton", { _doc_items_longdesc = df_mapitems.doc.castle_coral_desc, _doc_items_usagehelp = df_mapitems.doc.castle_coral_usage, tiles = { - df_mapitems.texture.coral_skeleton + df_dependencies.texture_coral_skeleton }, drawtype = "mesh", mesh = "octagonal_coral.obj", paramtype = "light", is_ground_content = false, - groups = {cracky = 3}, - sounds = df_mapitems.sounds.stone, + groups = {cracky = 3,pickaxey = 1, building_block = 1, coral=2, coral_block=1}, + sounds = df_dependencies.sound_stone(), + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, }) local c_coral = minetest.get_content_id("df_mapitems:castle_coral") local c_coral_skeleton = minetest.get_content_id("df_mapitems:castle_coral_skeleton") -local c_stone = df_mapitems.node_id.stone -local c_water = df_mapitems.node_id.water +local c_stone = minetest.get_content_id(df_dependencies.node_name_stone) +local c_water = minetest.get_content_id(df_dependencies.node_name_water_source) df_mapitems.spawn_castle_coral = function(area, data, vi, iterations) local run = math.random(2,4) @@ -47,6 +51,7 @@ df_mapitems.spawn_castle_coral = function(area, data, vi, iterations) local zstride = area.zstride local ystride = area.ystride while run > 0 do + -- TODO should this be checking for not-water instead of stone? if math.random() > 0.95 or data[index] == c_stone or not area:containsi(index) then return end data[index] = c_coral if iterations > 2 then diff --git a/df_mapitems/cave_coral.lua b/df_mapitems/cave_coral.lua index 809ac58..263ce31 100644 --- a/df_mapitems/cave_coral.lua +++ b/df_mapitems/cave_coral.lua @@ -1,7 +1,7 @@ -local S = df_mapitems.S +local S = minetest.get_translator(minetest.get_current_modname()) -local water_source = df_mapitems.node_name.water -local coral_skeleton = df_mapitems.node_name.coral_skeleton +local water_source = df_dependencies.node_name_water_source +local coral_skeleton = df_dependencies.node_name_coral_skeleton minetest.register_node("df_mapitems:cave_coral_3", { description = S("Cave Coral"), @@ -12,13 +12,15 @@ minetest.register_node("df_mapitems:cave_coral_3", { light_source = 3, paramtype2 = "facedir", is_ground_content = false, - groups = {cracky = 3, dfcaverns_cave_coral = 1}, - sounds = df_mapitems.sounds.stone, + groups = {cracky = 3, dfcaverns_cave_coral = 1, pickaxey = 1, building_block = 1, coral=1, coral_block=1}, + sounds = df_dependencies.sound_stone(), on_timer = function(pos) if minetest.find_node_near(pos, 1, {water_source}) == nil then minetest.set_node(pos, {name=coral_skeleton}) end end, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, }) minetest.register_node("df_mapitems:cave_coral_2", { @@ -30,13 +32,15 @@ minetest.register_node("df_mapitems:cave_coral_2", { light_source = 2, paramtype2 = "facedir", is_ground_content = false, - groups = {cracky = 3, dfcaverns_cave_coral = 1}, - sounds = df_mapitems.sounds.stone, + groups = {cracky = 3, dfcaverns_cave_coral = 1, pickaxey = 1, building_block = 1, coral=1, coral_block=1}, + sounds = df_dependencies.sound_stone(), on_timer = function(pos) if minetest.find_node_near(pos, 1, {water_source}) == nil then minetest.set_node(pos, {name=coral_skeleton}) end end, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, }) minetest.register_node("df_mapitems:cave_coral_1", { @@ -48,17 +52,19 @@ minetest.register_node("df_mapitems:cave_coral_1", { light_source = 1, paramtype2 = "facedir", is_ground_content = false, - groups = {cracky = 3, dfcaverns_cave_coral = 1}, - sounds = df_mapitems.sounds.stone, + groups = {cracky = 3, dfcaverns_cave_coral = 1, pickaxey = 1, building_block = 1, coral=1, coral_block=1}, + sounds = df_dependencies.sound_stone(), on_timer = function(pos) if minetest.find_node_near(pos, 1, {water_source}) == nil then minetest.set_node(pos, {name=coral_skeleton}) end end, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, }) local coral_names = {"df_mapitems:cave_coral_1", "df_mapitems:cave_coral_2", "df_mapitems:cave_coral_3"} -local water_node = df_mapitems.node_name.water +local water_node = df_dependencies.node_name_water_source minetest.register_abm{ label = "df_mapitems:shifting_coral", nodenames = {"group:dfcaverns_cave_coral"}, diff --git a/df_mapitems/cave_pearls.lua b/df_mapitems/cave_pearls.lua index 8c587d7..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"), @@ -8,7 +8,7 @@ minetest.register_node("df_mapitems:cave_pearls", { drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", - groups = {cracky = 2}, + groups = {cracky = 2, pickaxey = 2,}, walkable = false, is_ground_content = false, climbable = true, @@ -22,4 +22,6 @@ minetest.register_node("df_mapitems:cave_pearls", { } }, on_place = df_mapitems.place_against_surface, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, }) diff --git a/df_mapitems/crystals_mese.lua b/df_mapitems/crystals_mese.lua index 998b014..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", { @@ -6,14 +6,16 @@ minetest.register_node("df_mapitems:glow_mese", { _doc_items_longdesc = df_mapitems.doc.glow_mese_desc, _doc_items_usagehelp = df_mapitems.doc.glow_mese_usage, tiles = {"dfcaverns_glow_mese.png"}, - groups = {cracky=3}, - sounds = df_mapitems.sounds.glass, + groups = {cracky=3, pickaxey=4, material_stone=1, enderman_takable=1}, + sounds = df_dependencies.sound_glass(), is_ground_content = false, light_source = 13, paramtype = "light", use_texture_alpha = "blend", drawtype = "glasslike", sunlight_propagates = true, + _mcl_blast_resistance = 1.5, + _mcl_hardness = 1.5, }) minetest.register_craft({ @@ -28,21 +30,23 @@ minetest.register_node("df_mapitems:mese_crystal", { _doc_items_longdesc = df_mapitems.doc.glow_mese_desc, _doc_items_usagehelp = df_mapitems.doc.glow_mese_usage, tiles = {"dfcaverns_glow_mese.png"}, - groups = {cracky = 2}, + groups = {cracky = 2, pickaxey=4, material_stone=1, building_block=1, enderman_takable=1}, paramtype = "light", paramtype2 = "facedir", drawtype = "mesh", mesh = "underch_crystal.obj", light_source = 12, is_ground_content = false, - sounds = df_mapitems.sounds.glass, + sounds = df_dependencies.sound_glass(), use_texture_alpha = "blend", sunlight_propagates = true, on_place = df_mapitems.place_against_surface, + _mcl_blast_resistance = 1.5, + _mcl_hardness = 1.5, }) minetest.register_craft({ - output = df_mapitems.node_name.mese_crystal .. ' 9', + output = df_dependencies.node_name_mese_crystal .. ' 18', recipe = { {'df_mapitems:mese_crystal'}, } diff --git a/df_mapitems/crystals_ruby.lua b/df_mapitems/crystals_ruby.lua index a4ed9c9..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"), @@ -6,8 +6,10 @@ minetest.register_node("df_mapitems:glow_ruby_ore", { _doc_items_usagehelp = df_mapitems.doc.glow_ruby_ore_usage, tiles = {"dfcaverns_glow_ruby_ore.png"}, is_ground_content = false, - groups = {cracky=2}, - sounds = df_mapitems.sounds.glass, + groups = {cracky=2, pickaxey=3, material_stone=1}, + sounds = df_dependencies.sound_glass(), + _mcl_blast_resistance = 1.5, + _mcl_hardness = 1.5, }) minetest.register_node("df_mapitems:big_crystal", { @@ -26,8 +28,8 @@ minetest.register_node("df_mapitems:big_crystal", { is_ground_content = false, sunlight_propagates = true, light_source = 12, - groups = {cracky=2, dfcaverns_big_crystal = 1}, - sounds = df_mapitems.sounds.glass, + groups = {cracky=2, dfcaverns_big_crystal = 1, pickaxey=5, material_stone=1, enderman_takable=1}, + sounds = df_dependencies.sound_glass(), selection_box = { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, 3, 0.5}, @@ -36,6 +38,8 @@ minetest.register_node("df_mapitems:big_crystal", { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, 3, 0.5}, }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) minetest.register_node("df_mapitems:med_crystal", { @@ -54,8 +58,8 @@ minetest.register_node("df_mapitems:med_crystal", { is_ground_content = false, sunlight_propagates = true, light_source = 12, - groups = {cracky=2, dfcaverns_big_crystal = 1}, - sounds = df_mapitems.sounds.glass, + groups = {cracky=2, dfcaverns_big_crystal = 1, pickaxey=5, material_stone=1}, + sounds = df_dependencies.sound_glass(), selection_box = { type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 1.25, 0.25}, @@ -64,6 +68,8 @@ minetest.register_node("df_mapitems:med_crystal", { type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 1.25, 0.25}, }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) @@ -84,8 +90,8 @@ minetest.register_node("df_mapitems:big_crystal_30", { is_ground_content = false, light_source = 12, drop = "df_mapitems:big_crystal", - groups = {cracky=2, dfcaverns_big_crystal = 1}, - sounds = df_mapitems.sounds.glass, + groups = {cracky=2, dfcaverns_big_crystal = 1, pickaxey=5, material_stone=1, enderman_takable=1}, + sounds = df_dependencies.sound_glass(), selection_box = { type = "fixed", fixed = { @@ -117,6 +123,8 @@ minetest.register_node("df_mapitems:big_crystal_30", { -- {-0.25, 2.0, -1.625, 0.25, 2.5, -1.125}, }, }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) minetest.register_node("df_mapitems:med_crystal_30", { @@ -136,8 +144,8 @@ minetest.register_node("df_mapitems:med_crystal_30", { is_ground_content = false, light_source = 12, drop = "df_mapitems:med_crystal", - groups = {cracky=2, dfcaverns_big_crystal = 1}, - sounds = df_mapitems.sounds.glass, + groups = {cracky=2, dfcaverns_big_crystal = 1, pickaxey=5, material_stone=1}, + sounds = df_dependencies.sound_glass(), selection_box = { type = "fixed", fixed = { @@ -154,6 +162,8 @@ minetest.register_node("df_mapitems:med_crystal_30", { {-0.25, 0.5, -0.9375, 0.25, 1.0, -0.4375}, }, }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) minetest.register_node("df_mapitems:big_crystal_30_45", { @@ -173,8 +183,8 @@ minetest.register_node("df_mapitems:big_crystal_30_45", { is_ground_content = false, light_source = 12, drop = "df_mapitems:big_crystal", - groups = {cracky=2, dfcaverns_big_crystal = 1}, - sounds = df_mapitems.sounds.glass, + groups = {cracky=2, dfcaverns_big_crystal = 1, pickaxey=5, material_stone=1, enderman_takable=1}, + sounds = df_dependencies.sound_glass(), selection_box = { type = "fixed", fixed = { @@ -191,6 +201,8 @@ minetest.register_node("df_mapitems:big_crystal_30_45", { {0.5, 1.5, -1.5, 1.5, 2.5, -0.5}, }, }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) @@ -211,8 +223,8 @@ minetest.register_node("df_mapitems:med_crystal_30_45", { is_ground_content = false, light_source = 12, drop = "df_mapitems:med_crystal", - groups = {cracky=2, dfcaverns_big_crystal = 1}, - sounds = df_mapitems.sounds.glass, + groups = {cracky=2, dfcaverns_big_crystal = 1, pickaxey=5, material_stone=1}, + sounds = df_dependencies.sound_glass(), selection_box = { type = "fixed", fixed = { @@ -229,6 +241,8 @@ minetest.register_node("df_mapitems:med_crystal_30_45", { {0.25, 0.5, -0.75, 0.75, 1.0, -0.25}, }, }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) minetest.register_craft({ @@ -262,7 +276,7 @@ minetest.register_craft({ recipe = {'df_mapitems:med_crystal_30_45'}, }) -local c_stone = df_mapitems.node_id.stone +local c_stone = minetest.get_content_id(df_dependencies.node_name_stone) local c_air = minetest.get_content_id("air") local c_big_crystal = minetest.get_content_id("df_mapitems:big_crystal") local c_med_crystal = minetest.get_content_id("df_mapitems:med_crystal") diff --git a/df_mapitems/crystals_salt.lua b/df_mapitems/crystals_salt.lua index 8b9b12d..51a0599 100644 --- a/df_mapitems/crystals_salt.lua +++ b/df_mapitems/crystals_salt.lua @@ -1,32 +1,36 @@ -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"), _doc_items_longdesc = df_mapitems.doc.salt_desc, _doc_items_usagehelp = df_mapitems.doc.salt_usage, tiles = {"dfcaverns_salt_crystal.png"}, - groups = {cracky = 2}, + groups = {cracky = 2, pickaxey = 1, shovely=1, material_stone=1}, paramtype = "light", paramtype2 = "facedir", drawtype = "mesh", mesh = "underch_crystal.obj", light_source = 6, - sounds = df_mapitems.sounds.glass, + sounds = df_dependencies.sound_glass(), use_texture_alpha = "blend", sunlight_propagates = true, is_ground_content = false, on_place = df_mapitems.place_against_surface, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, }) minetest.register_node("df_mapitems:salty_cobble", { description = S("Salty Cobble"), _doc_items_longdesc = df_mapitems.doc.salty_cobble_desc, _doc_items_usagehelp = df_mapitems.doc.salty_cobble_desc, - tiles = {df_mapitems.texture.cobble .. "^dfcaverns_salty.png"}, - groups = {cracky = 3, stone = 1, lava_heatable = 1}, - _magma_conduits_heats_to = df_mapitems.node_name.cobble, + tiles = {df_dependencies.texture_cobble .. "^dfcaverns_salty.png"}, + groups = {cracky = 3, stone = 1, lava_heatable = 1, pickaxey = 1, material_stone=1}, + _magma_conduits_heats_to = df_dependencies.node_name_cobble, is_ground_content = false, light_source = 2, - drop = df_mapitems.node_name.cobble, - sounds = df_mapitems.sounds.stone, + drop = df_dependencies.node_name_cobble, + sounds = df_dependencies.sound_stone(), + _mcl_blast_resistance = 6, + _mcl_hardness = 2, }) \ No newline at end of file diff --git a/df_mapitems/dependencies.lua b/df_mapitems/dependencies.lua deleted file mode 100644 index 851f068..0000000 --- a/df_mapitems/dependencies.lua +++ /dev/null @@ -1,45 +0,0 @@ -df_mapitems.sounds = {} - -df_mapitems.sounds.stone = default.node_sound_stone_defaults() -df_mapitems.sounds.floor_fungus = default.node_sound_stone_defaults({footstep = {name = "dfcaverns_squish", gain = 0.25},}) -df_mapitems.sounds.sandscum = default.node_sound_sand_defaults({footstep = {name = "dfcaverns_squish", gain = 0.25},}) -df_mapitems.sounds.glass = default.node_sound_glass_defaults() -df_mapitems.sounds.dirt = default.node_sound_dirt_defaults() -df_mapitems.sounds.dirt_mossy = default.node_sound_dirt_defaults({footstep = {name = "default_grass_footstep", gain = 0.25},}) - -df_mapitems.node_id = {} - -df_mapitems.node_id.stone = minetest.get_content_id("default:stone") -df_mapitems.node_id.water = minetest.get_content_id("default:water_source") -df_mapitems.node_id.dirt = minetest.get_content_id("default:dirt") - -df_mapitems.texture = {} - -df_mapitems.texture.coral_skeleton = "default_coral_skeleton.png" -df_mapitems.texture.cobble = "default_cobble.png" -df_mapitems.texture.stone = "default_stone.png" -df_mapitems.texture.ice = "default_ice.png" -df_mapitems.texture.sand = "default_sand.png" -df_mapitems.texture.dirt = "default_dirt.png" - -df_mapitems.node_name = {} - -df_mapitems.node_name.coral_skeleton = "default:coral_skeleton" -df_mapitems.node_name.water = "default:water_source" -df_mapitems.node_name.mese_crystal = "default:mese_crystal" -df_mapitems.node_name.cobble = "default:cobble" -df_mapitems.node_name.sand = "default:sand" -df_mapitems.node_name.dirt = "default:dirt" -df_mapitems.node_name.stone = "default:stone" -df_mapitems.node_name.ice = "default:ice" - -df_mapitems.node_name.farming_soil = "farming:soil" -df_mapitems.node_name.farming_soil_wet = "farming:soil_wet" - --- This stuff should only be used during initialization -minetest.after(0, function() - df_mapitems.node_name = nil - df_mapitems.sounds = nil - df_mapitems.texture = nil - df_mapitems.node_id = nil -end) \ No newline at end of file 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 a44a642..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()) ----------------------------------------------- @@ -7,23 +7,27 @@ df_mapitems.dry_stalagmite_ids = subterrane.register_stalagmite_nodes("df_mapite _doc_items_longdesc = df_mapitems.doc.dripstone_desc, _doc_items_usagehelp = df_mapitems.doc.dripstone_usage, tiles = { - df_mapitems.texture.stone .. "^[brighten", + df_dependencies.texture_stone .. "^[brighten", }, - groups = {cracky = 3, stone = 2}, - sounds = df_mapitems.sounds.stone, + groups = {cracky = 3, stone = 2, pickaxey=1, building_block=1, material_stone=1}, + sounds = df_dependencies.sound_stone(), is_ground_content = false, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, }) minetest.register_node("df_mapitems:dry_flowstone", { description = S("Dry Flowstone"), _doc_items_longdesc = df_mapitems.doc.flowstone_desc, _doc_items_usagehelp = df_mapitems.doc.flowstone_usage, - tiles = {df_mapitems.texture.stone .. "^[brighten"}, - groups = {cracky = 3, stone = 1, lava_heatable = 1}, - _magma_conduits_heats_to = df_mapitems.node_name.cobble, + tiles = {df_dependencies.texture_stone .. "^[brighten"}, + groups = {cracky = 3, stone = 1, lava_heatable = 1, pickaxey=1, building_block=1, material_stone=1}, + _magma_conduits_heats_to = df_dependencies.node_name_cobble, is_ground_content = false, - drop = df_mapitems.node_name.cobble, - sounds = df_mapitems.sounds.stone, + drop = df_dependencies.node_name_cobble, + sounds = df_dependencies.sound_stone(), + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, }) ----------------------------------------------- @@ -33,11 +37,13 @@ df_mapitems.wet_stalagmite_ids = subterrane.register_stalagmite_nodes("df_mapite _doc_items_longdesc = df_mapitems.doc.dripstone_desc, _doc_items_usagehelp = df_mapitems.doc.dripstone_usage, tiles = { - df_mapitems.texture.stone .. "^[brighten^dfcaverns_dripstone_streaks.png", + df_dependencies.texture_stone .. "^[brighten^dfcaverns_dripstone_streaks.png", }, - groups = {cracky = 3, stone = 2, subterrane_wet_dripstone = 1}, - sounds = df_mapitems.sounds.stone, + groups = {cracky = 3, stone = 2, subterrane_wet_dripstone = 1, pickaxey=1, building_block=1, material_stone=1}, + sounds = df_dependencies.sound_stone(), is_ground_content = false, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, }, "df_mapitems:dry_stal") @@ -45,12 +51,14 @@ minetest.register_node("df_mapitems:wet_flowstone", { description = S("Wet Flowstone"), _doc_items_longdesc = df_mapitems.doc.flowstone_desc, _doc_items_usagehelp = df_mapitems.doc.flowstone_usage, - tiles = {df_mapitems.texture.stone .. "^[brighten^dfcaverns_dripstone_streaks.png"}, - groups = {cracky = 3, stone = 1, subterrane_wet_dripstone = 1, lava_heatable = 1}, + tiles = {df_dependencies.texture_stone .. "^[brighten^dfcaverns_dripstone_streaks.png"}, + groups = {cracky = 3, stone = 1, subterrane_wet_dripstone = 1, lava_heatable = 1, pickaxey=1, building_block=1, material_stone=1}, _magma_conduits_heats_to = "df_mapitems:dry_flowstone", is_ground_content = false, - drop = df_mapitems.node_name.cobble, - sounds = df_mapitems.sounds.stone, + drop = df_dependencies.node_name_cobble, + sounds = df_dependencies.sound_stone(), + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, }) ----------------------------------------------- @@ -60,9 +68,11 @@ df_mapitems.icicle_ids = subterrane.register_stalagmite_nodes("df_mapitems:icicl _doc_items_longdesc = df_mapitems.doc.icicle_desc, _doc_items_usagehelp = df_mapitems.doc.icicle_usage, tiles = { - df_mapitems.texture.ice, + df_dependencies.texture_ice, }, - groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 3}, - sounds = df_mapitems.sounds.glass, + groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 3, pickaxey=1, building_block=1, handy=1, slippery=3, building_block=1, ice=1}, + sounds = df_dependencies.sound_glass(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, }) diff --git a/df_mapitems/glow_worms.lua b/df_mapitems/glow_worms.lua index ba00a2d..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 @@ -23,7 +23,7 @@ minetest.register_node("df_mapitems:glow_worm", { inventory_image = "dfcaverns_glow_worm.png", wield_image = "dfcaverns_glow_worm.png", is_ground_content = false, - groups = {oddly_breakable_by_hand=3, light_sensitive_fungus = 12}, + groups = {oddly_breakable_by_hand=3, light_sensitive_fungus = 12, shearsy=1, swordy=1, destroy_by_lava_flow=1}, _dfcaverns_dead_node = "air", light_source = 9, paramtype = "light", @@ -32,6 +32,8 @@ minetest.register_node("df_mapitems:glow_worm", { buildable_to = true, floodable = true, visual_scale = 1.0, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, after_place_node = function(pos, placer) if df_mapitems.config.glow_worm_delay_multiplier > 0 then minetest.get_node_timer(pos):start(math.random( diff --git a/df_mapitems/ground_cover.lua b/df_mapitems/ground_cover.lua index af10f59..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) @@ -18,21 +18,21 @@ local function soil_type_spread(label, node_to_spread, target_node) } end -local farming_soil = df_mapitems.node_name.farming_soil -local farming_soil_wet = df_mapitems.node_name.farming_soil_wet +local farming_soil = df_dependencies.node_name_dirt_furrowed +local farming_soil_wet = df_dependencies.node_name_dirt_wet -------------------------------------------------- -- Cave moss -- cyan/dark cyan -local dirt_texture = df_mapitems.texture.dirt -local sand_texture = df_mapitems.texture.sand +local dirt_texture = df_dependencies.texture_dirt +local sand_texture = df_dependencies.texture_sand -local dirt_node = df_mapitems.node_name.dirt -local sand_node = df_mapitems.node_name.sand -local stone_node = df_mapitems.node_name.stone -local cobble_node = df_mapitems.node_name.cobble +local dirt_node = df_dependencies.node_name_dirt +local sand_node = df_dependencies.node_name_sand +local stone_node = df_dependencies.node_name_stone +local cobble_node = df_dependencies.node_name_cobble minetest.register_node("df_mapitems:dirt_with_cave_moss", { description = S("Dirt with Cave Moss"), @@ -45,14 +45,16 @@ minetest.register_node("df_mapitems:dirt_with_cave_moss", { is_ground_content = false, light_source = 2, paramtype = "light", - groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8}, - sounds = df_mapitems.sounds.dirt_mossy, + groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8, handy=1,shovely=1,dirt=2, soil_sapling=2, soil_sugarcane=1, cultivatable=1, enderman_takable=1, building_block=1, compostability=30, opaque=1}, + sounds = df_dependencies.sound_dirt({footstep = {name = df_dependencies.soundfile_grass_footstep, gain = 0.25},}), soil = { base = "df_mapitems:dirt_with_cave_moss", dry = farming_soil, wet = farming_soil_wet }, _dfcaverns_dead_node = dirt_node, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.6, }) soil_type_spread("df_mapitems:cave_moss_spread", "df_mapitems:dirt_with_cave_moss", dirt_node) @@ -71,9 +73,11 @@ minetest.register_node("df_mapitems:sand_scum", { is_ground_content = false, light_source = 2, paramtype = "light", - groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8}, - sounds = df_mapitems.sounds.sandscum, + groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8, handy=1,shovely=1, falling_node=1, sand=1, soil_sugarcane=1, enderman_takable=1, building_block=1, material_sand=1, opaque=1}, + sounds = df_dependencies.sound_sand({footstep = {name = "dfcaverns_squish", gain = 0.25},}), _dfcaverns_dead_node = sand_node, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, }) soil_type_spread("df_mapitems:sand_scum_spread", "df_mapitems:sand_scum", sand_node) @@ -92,14 +96,16 @@ minetest.register_node("df_mapitems:dirt_with_pebble_fungus", { is_ground_content = false, light_source = 2, paramtype = "light", - groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8}, - sounds = df_mapitems.sounds.dirt, + groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8, handy=1,shovely=1,dirt=2, soil_sapling=2, soil_sugarcane=1, cultivatable=1, enderman_takable=1, building_block=1, compostability=30, opaque=1}, + sounds = df_dependencies.sound_dirt(), soil = { base = "df_mapitems:dirt_with_pebble_fungus", dry = farming_soil, wet = farming_soil_wet }, _dfcaverns_dead_node = dirt_node, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.6, }) soil_type_spread("df_mapitems:pebble_fungus_spread", "df_mapitems:dirt_with_pebble_fungus", dirt_node) @@ -118,14 +124,16 @@ minetest.register_node("df_mapitems:dirt_with_stillworm", { is_ground_content = false, light_source = 2, paramtype = "light", - groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8}, - sounds = df_mapitems.sounds.dirt_mossy, + groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8, handy=1,shovely=1,dirt=2, soil_sapling=2, soil_sugarcane=1, cultivatable=1, enderman_takable=1, building_block=1, compostability=30, opaque=1}, + sounds = df_dependencies.sound_dirt({footstep = {name = df_dependencies.soundfile_grass_footstep, gain = 0.25},}), soil = { base = "df_mapitems:dirt_with_stillworm", dry = farming_soil, wet = farming_soil_wet }, _dfcaverns_dead_node = dirt_node, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.6, }) soil_type_spread("df_mapitems:stillworm_spread", "df_mapitems:dirt_with_stillworm", dirt_node) @@ -138,32 +146,37 @@ minetest.register_node("df_mapitems:spongestone", { _doc_items_longdesc = df_mapitems.doc.sponge_stone_desc, _doc_items_usagehelp = df_mapitems.doc.sponge_stone_usage, tiles = {"dfcaverns_ground_cover_sponge_stone.png"}, + drop = dirt_node, is_ground_content = false, paramtype = "light", - groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8}, - sounds = df_mapitems.sounds.dirt, + groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8, shovely=1,dirt=2, enderman_takable=1, building_block=1, compostability=10, opaque=1}, + sounds = df_dependencies.sound_dirt(), soil = { base = "df_mapitems:spongestone", dry = farming_soil, wet = farming_soil_wet }, _dfcaverns_dead_node = dirt_node, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, }) minetest.register_node("df_mapitems:rock_rot", { description = S("Rock Rot"), _doc_items_longdesc = df_mapitems.doc.rock_rot_desc, _doc_items_usagehelp = df_mapitems.doc.rock_rot_usage, - tiles = {df_mapitems.texture.stone .. "^dfcaverns_ground_cover_rock_rot.png", df_mapitems.texture.stone, - {name = df_mapitems.texture.stone .. "^(dfcaverns_ground_cover_rock_rot.png^[mask:dfcaverns_ground_cover_side_mask.png)", + tiles = {df_dependencies.texture_stone .. "^dfcaverns_ground_cover_rock_rot.png", df_dependencies.texture_stone, + {name = df_dependencies.texture_stone .. "^(dfcaverns_ground_cover_rock_rot.png^[mask:dfcaverns_ground_cover_side_mask.png)", tileable_vertical = false}}, - drop = df_mapitems.node_name.cobble, + drop = df_dependencies.node_name_cobble, is_ground_content = false, light_source = 2, paramtype = "light", - groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8}, - sounds = df_mapitems.sounds.dirt, + groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 8, shovely=1,dirt=2, enderman_takable=1, building_block=1, compostability=5, opaque=1}, + sounds = df_dependencies.sound_dirt(), _dfcaverns_dead_node = stone_node, + _mcl_blast_resistance = 3, + _mcl_hardness = 1, }) soil_type_spread("df_mapitems:rock_rot_spread", "df_mapitems:rock_rot", stone_node) @@ -178,47 +191,53 @@ minetest.register_node("df_mapitems:cobble_with_floor_fungus", { description = S("Cobblestone with Floor Fungus"), _doc_items_longdesc = df_mapitems.doc.floor_fungus_desc, _doc_items_usagehelp = df_mapitems.doc.floor_fungus_usage, - tiles = {df_mapitems.texture.cobble .. "^dfcaverns_floor_fungus.png"}, - drops = cobble_node, - is_ground_content = false, + tiles = {df_dependencies.texture_cobble .. "^dfcaverns_floor_fungus.png"}, + drop = cobble_node, paramtype = "light", - groups = {cracky = 3, stone = 2, slippery = 1, light_sensitive_fungus = 8}, - _dfcaverns_dead_node = df_mapitems.node_name.cobble, - sounds = df_mapitems.sounds.floor_fungus, + is_ground_content = false, + groups = {cracky = 3, stone = 2, slippery = 1, light_sensitive_fungus = 8, df_caverns_floor_fungus = 1, pickaxey=1, building_block=1, material_stone=1, opaque=1}, + _dfcaverns_dead_node = df_dependencies.node_name_cobble, + sounds = df_dependencies.sound_stone({footstep = {name = "dfcaverns_squish", gain = 0.25},}), + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, }) minetest.register_node("df_mapitems:cobble_with_floor_fungus_fine", { description = S("Cobblestone with Floor Fungus"), _doc_items_longdesc = df_mapitems.doc.floor_fungus_desc, _doc_items_usagehelp = df_mapitems.doc.floor_fungus_usage, - tiles = {df_mapitems.texture.cobble .. "^dfcaverns_floor_fungus_fine.png"}, - drops = cobble_node, + tiles = {df_dependencies.texture_cobble .. "^dfcaverns_floor_fungus_fine.png"}, + drop = cobble_node, is_ground_content = false, paramtype = "light", - groups = {cracky = 3, stone = 2, slippery = 1, light_sensitive_fungus = 8}, - _dfcaverns_dead_node = df_mapitems.node_name.cobble, - df_mapitems.sounds.floor_fungus, + groups = {cracky = 3, stone = 2, slippery = 1, light_sensitive_fungus = 8, df_caverns_floor_fungus = 1, pickaxey=1, building_block=1, material_stone=1, opaque=1}, + _dfcaverns_dead_node = df_dependencies.node_name_cobble, + sounds = df_dependencies.sound_stone({footstep = {name = "dfcaverns_squish", gain = 0.25},}), + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + on_timer = function(pos, elapsed) + minetest.swap_node(pos, {name="df_mapitems:cobble_with_floor_fungus"}) + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, }) minetest.register_abm{ label = "df_mapitems:floor_fungus_spread", nodenames = {cobble_node}, - neighbors = {"df_mapitems:cobble_with_floor_fungus"}, + neighbors = {"group:df_caverns_floor_fungus"}, interval = 60, chance = 10, catch_up = true, action = function(pos) - minetest.swap_node(pos, {name="df_mapitems:cobble_with_floor_fungus_fine"}) - end, -} -minetest.register_abm{ - label = "df_mapitems:floor_fungus_thickening", - nodenames = {"df_mapitems:cobble_with_floor_fungus_fine"}, - interval = 59, - chance = 10, - catch_up = true, - action = function(pos) - minetest.swap_node(pos, {name="df_mapitems:cobble_with_floor_fungus"}) + local above_def = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name] + if above_def and (above_def.buildable_to == true or above_def.walkable == false) then + minetest.swap_node(pos, {name="df_mapitems:cobble_with_floor_fungus_fine"}) + if math.random() > 0.5 then + minetest.get_node_timer(pos):start(math.random(1000, 10000)) + end + end end, } @@ -229,14 +248,16 @@ minetest.register_node("df_mapitems:ice_with_hoar_moss", { description = S("Ice with Hoar Moss"), _doc_items_longdesc = df_mapitems.doc.hoar_moss_desc, _doc_items_usagehelp = df_mapitems.doc.hoar_moss_usage, - tiles = {df_mapitems.texture.ice .. "^dfcaverns_hoar_moss.png"}, - drops = df_mapitems.node_name.ice, + tiles = {df_dependencies.texture_ice .. "^dfcaverns_hoar_moss.png"}, + drop = df_dependencies.node_name_ice, paramtype = "light", light_source = 2, is_ground_content = false, - groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 2, light_sensitive_fungus = 8}, - sounds = df_mapitems.sounds.glass, - _dfcaverns_dead_node = df_mapitems.node_name.ice, + groups = {cracky = 3, puts_out_fire = 1, cools_lava = 1, slippery = 2, light_sensitive_fungus = 8, handy=1,pickaxey=1, building_block=1, ice=1, opaque=1}, + sounds = df_dependencies.sound_glass(), + _dfcaverns_dead_node = df_dependencies.node_name_ice, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, }) @@ -257,7 +278,7 @@ if minetest.get_modpath("footprints") then footprints.register_trample_node("df_mapitems:sand_scum", { trampled_node_def_override = {description = S("Sand Scum with Footprint"),}, - hard_pack_node_name = df_mapitems.node_name.sand, + hard_pack_node_name = df_dependencies.node_name_sand, footprint_opacity = 128, hard_pack_probability = HARDPACK_PROBABILITY, hard_pack_count = HARDPACK_COUNT * 0.5, diff --git a/df_mapitems/init.lua b/df_mapitems/init.lua index f80cb40..b2db915 100644 --- a/df_mapitems/init.lua +++ b/df_mapitems/init.lua @@ -1,12 +1,10 @@ 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 dofile(modpath.."/config.lua") -dofile(modpath.."/dependencies.lua") dofile(modpath.."/doc.lua") dofile(modpath.."/aliases.lua") dofile(modpath.."/util.lua") diff --git a/df_mapitems/mod.conf b/df_mapitems/mod.conf index 0d94c7b..bb146bb 100644 --- a/df_mapitems/mod.conf +++ b/df_mapitems/mod.conf @@ -1,4 +1,4 @@ name = df_mapitems description = Various node types used by the dfcaverns mapgen mod. Includes cave coral, flowstone, glowing crystals, glow worms, moss and fungi ground cover, and snare weed. -depends = default, subterrane -optional_depends = df_farming, farming, doc, radiant_damage, footprints \ No newline at end of file +depends = df_dependencies, subterrane +optional_depends = df_farming, doc, radiant_damage, footprints \ No newline at end of file diff --git a/df_mapitems/snareweed.lua b/df_mapitems/snareweed.lua index 50aa4af..1b8dc22 100644 --- a/df_mapitems/snareweed.lua +++ b/df_mapitems/snareweed.lua @@ -1,18 +1,20 @@ -local S = df_mapitems.S +local S = minetest.get_translator(minetest.get_current_modname()) minetest.register_node("df_mapitems:snareweed", { description = S("Snareweed"), _doc_items_longdesc = df_mapitems.doc.snareweed_desc, _doc_items_usagehelp = df_mapitems.doc.snareweed_usage, - tiles = {df_mapitems.texture.dirt .. "^dfcaverns_snareweed_roots.png", df_mapitems.texture.dirt}, + tiles = {df_dependencies.texture_dirt .. "^dfcaverns_snareweed_roots.png", df_dependencies.texture_dirt}, drawtype="plantlike_rooted", paramtype2 = "leveled", special_tiles = {{name = "dfcaverns_snareweed.png", tileable_vertical = true}}, is_ground_content = false, - drop = df_mapitems.node_name.dirt, + drop = df_dependencies.node_name_dirt, light_source = 6, - groups = {crumbly = 3, soil = 1}, - sounds = df_mapitems.sounds.dirt, + groups = {crumbly = 3, soil = 1, handy=1,shovely=1, dirt=1,}, + sounds = df_dependencies.sound_dirt(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.6, }) if df_mapitems.config.snareweed_damage then @@ -41,9 +43,9 @@ if df_mapitems.config.snareweed_damage then end -local c_water = df_mapitems.node_id.water -local c_dirt = df_mapitems.node_id.dirt -local c_stone = df_mapitems.node_id.stone +local c_water = minetest.get_content_id(df_dependencies.node_name_water_source) +local c_dirt = minetest.get_content_id(df_dependencies.node_name_dirt) +local c_stone = minetest.get_content_id(df_dependencies.node_name_stone) local c_snareweed = minetest.get_content_id("df_mapitems:snareweed") df_mapitems.place_snareweed = function(area, data, bi, param2_data) diff --git a/df_mapitems/sounds/dfcaverns_slow_heartbeat.ogg b/df_mapitems/sounds/dfcaverns_slow_heartbeat.ogg new file mode 100644 index 0000000..bb89890 Binary files /dev/null and b/df_mapitems/sounds/dfcaverns_slow_heartbeat.ogg differ diff --git a/df_mapitems/sounds/license.txt b/df_mapitems/sounds/license.txt index f537448..1e3ef90 100644 --- a/df_mapitems/sounds/license.txt +++ b/df_mapitems/sounds/license.txt @@ -1,3 +1,5 @@ dfcaverns_squish.1.ogg - from https://freesound.org/people/DrMinky/sounds/167074/ by DrMinky under Creative Commons BY 3.0 dfcaverns_squish.2.ogg - from https://freesound.org/people/DrMinky/sounds/167075/ by DrMinky under Creative Commons BY 3.0 -dfcaverns_squish.3.ogg - from https://freesound.org/people/DrMinky/sounds/167073/ by DrMinky under Creative Commons BY 3.0 \ No newline at end of file +dfcaverns_squish.3.ogg - from https://freesound.org/people/DrMinky/sounds/167073/ by DrMinky under Creative Commons BY 3.0 + +slow heartbeat - https://freesound.org/people/daandraait/sounds/249716/ under CC0 \ No newline at end of file diff --git a/df_mapitems/util.lua b/df_mapitems/util.lua index 3867e01..a4723d3 100644 --- a/df_mapitems/util.lua +++ b/df_mapitems/util.lua @@ -59,7 +59,7 @@ df_mapitems.place_against_surface = function(itemstack, placer, pointed_thing) end -- add the node and remove 1 item from the itemstack minetest.add_node(above_pos, {name = itemstack:get_name(), param2 = param2}) - if not minetest.settings:get_bool("creative_mode", false) and not minetest.check_player_privs(placer, "creative") then + if not minetest.is_creative_enabled(placer:get_player_name()) then itemstack:take_item() end return itemstack diff --git a/df_mapitems/veinstone.lua b/df_mapitems/veinstone.lua index 291dd0e..4df71f9 100644 --- a/df_mapitems/veinstone.lua +++ b/df_mapitems/veinstone.lua @@ -1,34 +1,42 @@ -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() +end minetest.register_node("df_mapitems:veinstone", { description = S("Veinstone"), _doc_items_longdesc = df_mapitems.doc.veinstone_desc, _doc_items_usagehelp = df_mapitems.doc.veinstone_usage, - tiles = {df_mapitems.texture.stone .. "^dfcaverns_veins.png"}, - groups = {cracky = 3, stone = 1, lava_heatable = 1}, - _magma_conduits_heats_to = df_mapitems.node_name.cobble, + tiles = {df_dependencies.texture_stone .. "^dfcaverns_veins.png"}, + groups = {cracky = 3, stone = 1, lava_heatable = 1, pickaxey=1, building_block=1, material_stone=1}, + _magma_conduits_heats_to = df_dependencies.node_name_cobble, is_ground_content = false, light_source = 2, drop = "df_mapitems:veinstone", - sounds = df_mapitems.sounds.stone, + sounds = df_dependencies.sound_stone(), on_punch = function(pos, node, puncher, pointed_thing) minetest.node_punch(pos, node, puncher, pointed_thing) minetest.swap_node(pos, {name="df_mapitems:veinstone_pulse"}) minetest.get_node_timer(pos):start(2) + minetest.sound_play({name="dfcaverns_slow_heartbeat", gain=0.5}, {pos = pos}) + df_mapitems.on_veinstone_punched(pos, node, puncher, pointed_thing) end, + _mcl_blast_resistance = 10, + _mcl_hardness = 3, }) minetest.register_node("df_mapitems:veinstone_pulse", { description = S("Veinstone"), _doc_items_longdesc = df_mapitems.doc.veinstone_desc, _doc_items_usagehelp = df_mapitems.doc.veinstone_usage, - tiles = {df_mapitems.texture.stone .. "^dfcaverns_veins.png"}, - groups = {cracky = 3, stone = 1, lava_heatable = 1, not_in_creative_inventory = 1}, - _magma_conduits_heats_to = df_mapitems.node_name.cobble, + tiles = {df_dependencies.texture_stone .. "^dfcaverns_veins.png"}, + groups = {cracky = 3, stone = 1, lava_heatable = 1, not_in_creative_inventory = 1, pickaxey=1, building_block=1, material_stone=1}, + _magma_conduits_heats_to = df_dependencies.node_name_cobble, is_ground_content = false, light_source = 8, drop = "df_mapitems:veinstone", - sounds = df_mapitems.sounds.stone, + sounds = df_dependencies.sound_stone(), on_timer = function(pos, elapsed) local positions, count = minetest.find_nodes_in_area(vector.add(pos,1), vector.subtract(pos,1), "df_mapitems:veinstone") if count["df_mapitems:veinstone"] == 0 then @@ -40,27 +48,34 @@ minetest.register_node("df_mapitems:veinstone_pulse", { if positions[1] == nil then positions = {[1] = minetest.find_node_near(pos, 4, "df_mapitems:veinstone")} end + if (positions[1] ~= nil) then + minetest.sound_play({name="dfcaverns_slow_heartbeat", gain=0.5}, {pos = pos}) + end for _, neighbor_pos in pairs(positions) do minetest.swap_node(neighbor_pos, {name="df_mapitems:veinstone_pulse"}) minetest.get_node_timer(neighbor_pos):start(2) - end + end minetest.swap_node(pos, {name="df_mapitems:veinstone_refractory"}) minetest.get_node_timer(pos):start(12) end, + _mcl_blast_resistance = 10, + _mcl_hardness = 3, }) minetest.register_node("df_mapitems:veinstone_refractory", { description = S("Veinstone"), _doc_items_longdesc = df_mapitems.doc.veinstone_desc, _doc_items_usagehelp = df_mapitems.doc.veinstone_usage, - tiles = {df_mapitems.texture.stone .. "^dfcaverns_veins.png"}, - groups = {cracky = 3, stone = 1, lava_heatable = 1, not_in_creative_inventory = 1}, - _magma_conduits_heats_to = df_mapitems.node_name.cobble, + tiles = {df_dependencies.texture_stone .. "^dfcaverns_veins.png"}, + groups = {cracky = 3, stone = 1, lava_heatable = 1, not_in_creative_inventory = 1, pickaxey=1, building_block=1, material_stone=1}, + _magma_conduits_heats_to = df_dependencies.node_name_cobble, is_ground_content = false, light_source = 1, drop = "df_mapitems:veinstone", - sounds = df_mapitems.sounds.stone, + sounds = df_dependencies.sound_stone(), on_timer = function(pos, elapsed) minetest.swap_node(pos, {name="df_mapitems:veinstone"}) end, + _mcl_blast_resistance = 10, + _mcl_hardness = 3, }) \ No newline at end of file diff --git a/df_primordial_items/ceiling_fungus.lua b/df_primordial_items/ceiling_fungus.lua index a76a69b..4b590e2 100644 --- a/df_primordial_items/ceiling_fungus.lua +++ b/df_primordial_items/ceiling_fungus.lua @@ -1,4 +1,4 @@ -local S = df_primordial_items.S +local S = minetest.get_translator(minetest.get_current_modname()) --------------------------------------------------------------------------------------- -- Glownode and stalk @@ -12,9 +12,11 @@ minetest.register_node("df_primordial_items:glownode", { paramtype = "light", sunlight_propagates = true, is_ground_content = false, - groups = {cracky = 3, oddly_breakable_by_hand = 3}, - sounds = df_primordial_items.sounds.glass, + groups = {cracky = 3, oddly_breakable_by_hand = 3, handy=1, glass=1, building_block=1, material_glass=1}, + sounds = df_dependencies.sound_glass(), light_source = minetest.LIGHT_MAX, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, }) minetest.register_node("df_primordial_items:glownode_stalk", { @@ -24,9 +26,11 @@ minetest.register_node("df_primordial_items:glownode_stalk", { tiles = {"dfcaverns_mush_stalk_top.png", "dfcaverns_mush_stalk_top.png", "dfcaverns_mush_stalk_side.png"}, paramtype2 = "facedir", is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, - sounds = df_primordial_items.sounds.wood, - on_place = minetest.rotate_node + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, handy=1,axey=1,building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + on_place = minetest.rotate_node, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) minetest.register_node("df_primordial_items:glow_orb_hanging", { @@ -36,7 +40,7 @@ minetest.register_node("df_primordial_items:glow_orb_hanging", { tiles = {"dfcaverns_mush_orb_vert.png"}, inventory_image = "dfcaverns_mush_orb_vert.png", wield_image = "dfcaverns_mush_orb_vert.png", - groups = {snappy = 3, flora = 1, flammable = 1}, + groups = {snappy = 3, flammable = 1, attached_node = 1, plant = 1, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, paramtype = "light", paramtype2 = "degrotate", drawtype = "plantlike", @@ -44,9 +48,11 @@ minetest.register_node("df_primordial_items:glow_orb_hanging", { is_ground_content = false, walkable = false, light_source = 6, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) local c_stalk = minetest.get_content_id("df_primordial_items:glownode_stalk") diff --git a/df_primordial_items/dependencies.lua b/df_primordial_items/dependencies.lua deleted file mode 100644 index 6cb15f0..0000000 --- a/df_primordial_items/dependencies.lua +++ /dev/null @@ -1,25 +0,0 @@ ---This file contains references to external dependencies, in hopes of making it easier to make those optional in the future - -df_primordial_items.node_names = {} - -df_primordial_items.node_names.dirt = "default:dirt" -df_primordial_items.node_names.dry_shrub = "default:dry_shrub" -df_primordial_items.node_names.dry_grass_3 = "default:dry_grass_3" -df_primordial_items.node_names.dry_grass_4 = "default:dry_grass_4" -df_primordial_items.node_names.junglewood = "default:junglewood" - -df_primordial_items.sounds = {} - -df_primordial_items.sounds.leaves = default.node_sound_leaves_defaults() -df_primordial_items.sounds.wood = default.node_sound_wood_defaults() -df_primordial_items.sounds.glass = default.node_sound_glass_defaults() -df_primordial_items.sounds.dirt = default.node_sound_dirt_defaults() - -df_primordial_items.register_leafdecay = default.register_leafdecay -df_primordial_items.after_place_leaves = default.after_place_leaves - --- This stuff should only be used during initialization -minetest.after(0, function() - df_primordial_items.node_names = nil - df_primordial_items.sounds = nil -end) \ No newline at end of file diff --git a/df_primordial_items/doc.lua b/df_primordial_items/doc.lua index 59a0dce..1877816 100644 --- a/df_primordial_items/doc.lua +++ b/df_primordial_items/doc.lua @@ -2,7 +2,7 @@ if not minetest.get_modpath("doc") then return end -local S = df_primordial_items.S +local S = minetest.get_translator(minetest.get_current_modname()) df_primordial_items.doc.big_mushroom_desc = S("Compared to the behemoths found elsewhere in the deep places of the world, the giant mushrooms of the primordial jungles are on the smaller side - often overwhelmed by the green plants that grow in the mysterious light below. Still, they can become substantial resources.") df_primordial_items.doc.big_mushroom_usage = S("The soft flesh of these large mushrooms is much less woody than other giant mushrooms, making it ill-suited to structural use. This makes it rather more nutritious, however.") diff --git a/df_primordial_items/edibles.lua b/df_primordial_items/edibles.lua index 3a89fb8..d6ca05d 100644 --- a/df_primordial_items/edibles.lua +++ b/df_primordial_items/edibles.lua @@ -1,14 +1,15 @@ -local S = df_primordial_items.S +local S = minetest.get_translator(minetest.get_current_modname()) minetest.register_craftitem("df_primordial_items:primordial_fruit", { description = S("Primordial Fruit"), _doc_items_longdesc = df_primordial_items.doc.primordial_fruit_desc, _doc_items_usagehelp = df_primordial_items.doc.primordial_fruit_usage, inventory_image = "dfcaverns_primordial_fruit.png", - groups = {food = 8}, + groups = {food = 8, eatable=8, plant=1}, sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}, on_use = minetest.item_eat(8), _hunger_ng = {heals = 8}, + _mcl_saturation = 12, }) minetest.register_craftitem("df_primordial_items:glowtato", { @@ -17,7 +18,8 @@ minetest.register_craftitem("df_primordial_items:glowtato", { _doc_items_usagehelp = df_primordial_items.doc.glowtato_usage, inventory_image = "dfcaverns_glowtato.png", sound = {eat = {name = "df_farming_chomp_crunch", gain = 1.0}}, - groups = {food = 8, dfcaverns_cookable = 1}, + groups = {food = 8, dfcaverns_cookable = 1, eatable=8, plant=1}, on_use = minetest.item_eat(8), _hunger_ng = {satiates = 8}, + _mcl_saturation = 8, }) diff --git a/df_primordial_items/fungal_nodes.lua b/df_primordial_items/fungal_nodes.lua index 9d76e4d..6cda843 100644 --- a/df_primordial_items/fungal_nodes.lua +++ b/df_primordial_items/fungal_nodes.lua @@ -1,4 +1,4 @@ -local S = df_primordial_items.S +local S = minetest.get_translator(minetest.get_current_modname()) ----------------------------------------------------------------------------------------------- -- Plants @@ -12,15 +12,18 @@ minetest.register_node("df_primordial_items:fungal_grass_1", { tiles = {"dfcaverns_mush_grass_01.png"}, inventory_image = "dfcaverns_mush_grass_01.png", wield_image = "dfcaverns_mush_grass_01.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 11}, + groups = {snappy = 3, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 11, plant=1, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, paramtype = "light", drawtype = "plantlike", buildable_to = true, is_ground_content = false, walkable = false, - sounds = df_primordial_items.sounds.leaves, + floodable = true, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) minetest.register_node("df_primordial_items:fungal_grass_2", { @@ -30,16 +33,19 @@ minetest.register_node("df_primordial_items:fungal_grass_2", { tiles = {"dfcaverns_mush_grass_02.png"}, inventory_image = "dfcaverns_mush_grass_02.png", wield_image = "dfcaverns_mush_grass_02.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 11}, + groups = {snappy = 3, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 11, plant=1, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, paramtype = "light", drawtype = "plantlike", buildable_to = true, is_ground_content = false, walkable = false, + floodable = true, place_param2 = 3, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) -- Glowing @@ -51,16 +57,19 @@ minetest.register_node("df_primordial_items:glow_orb", { tiles = {"dfcaverns_mush_orb.png"}, inventory_image = "dfcaverns_mush_orb.png", wield_image = "dfcaverns_mush_orb.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 13}, + groups = {snappy = 3, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 13, plant=1, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, paramtype = "light", drawtype = "plantlike", buildable_to = true, is_ground_content = false, walkable = false, + floodable = true, light_source = 9, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) minetest.register_node("df_primordial_items:glow_orb_stalks", { @@ -70,16 +79,19 @@ minetest.register_node("df_primordial_items:glow_orb_stalks", { tiles = {"dfcaverns_mush_stalks.png"}, inventory_image = "dfcaverns_mush_stalks.png", wield_image = "dfcaverns_mush_stalks.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 13}, + groups = {snappy = 3, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 13, plant=1, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, paramtype = "light", drawtype = "plantlike", buildable_to = true, is_ground_content = false, walkable = false, + floodable = true, light_source = 6, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) minetest.register_node("df_primordial_items:glow_pods", { @@ -89,7 +101,7 @@ minetest.register_node("df_primordial_items:glow_pods", { tiles = {"dfcaverns_mush_pods.png"}, inventory_image = "dfcaverns_mush_pods.png", wield_image = "dfcaverns_mush_pods.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 13}, + groups = {snappy = 3, attached_node = 1, flammable = 1, primordial_fungal_plant = 1, light_sensitive_fungus = 13, plant=1, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1}, paramtype = "light", drawtype = "plantlike", drop = { @@ -108,10 +120,13 @@ minetest.register_node("df_primordial_items:glow_pods", { buildable_to = true, is_ground_content = false, walkable = false, + floodable = true, light_source = 6, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) ------------------------------------------------------------------------------------ @@ -122,23 +137,26 @@ minetest.register_node("df_primordial_items:dirt_with_mycelium", { _doc_items_longdesc = df_primordial_items.doc.dirt_with_mycelium_desc, _doc_items_usagehelp = df_primordial_items.doc.dirt_with_mycelium_usage, tiles = {"dfcaverns_mush_soil.png"}, - groups = {crumbly = 3, soil = 1}, + groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 13, handy=1,shovely=1, dirt=2, building_block=1, opaque=1}, + _dfcaverns_dead_node = df_dependencies.node_name_dirt, is_ground_content = false, paramtype = "light", - drops = df_primordial_items.node_names.dirt, - sounds = df_primordial_items.sounds.dirt, + drop = df_dependencies.node_name_dirt, + sounds = df_dependencies.sound_dirt(), light_source = 3, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.6, }) minetest.register_abm{ label = "df_primordial_items:dirt_with_mycelium_spread", - nodenames = {df_primordial_items.node_names.dirt}, - neighbors = {"df_mapitems:dirt_with_mycelium"}, + nodenames = {df_dependencies.node_name_dirt}, + neighbors = {"df_primordial_items:dirt_with_mycelium"}, interval = 60, chance = 50, catch_up = true, action = function(pos) - minetest.swap_node(pos, {name="df_mapitems:dirt_with_mycelium"}) + minetest.swap_node(pos, {name="df_primordial_items:dirt_with_mycelium"}) end, } diff --git a/df_primordial_items/giant_fern.lua b/df_primordial_items/giant_fern.lua index 35c6aa2..863b0e8 100644 --- a/df_primordial_items/giant_fern.lua +++ b/df_primordial_items/giant_fern.lua @@ -1,4 +1,4 @@ -local S = df_primordial_items.S +local S = minetest.get_translator(minetest.get_current_modname()) ------------------------------------------------------------------------------------ -- Nodes @@ -8,13 +8,15 @@ minetest.register_node("df_primordial_items:giant_fern_tree", { _doc_items_longdesc = df_primordial_items.doc.giant_fern_desc, _doc_items_usagehelp = df_primordial_items.doc.giant_fern_usage, tiles = {"dfcaverns_jungle_fern_stem.png","dfcaverns_jungle_fern_stem.png","dfcaverns_jungle_fern_bark.png",}, - groups = {tree=1, choppy=2, oddly_breakable_by_hand=1, flammable= 2, fern_stem = 1}, + groups = {tree=1, choppy=2, oddly_breakable_by_hand=1, flammable= 2, fern_stem = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, is_ground_content = false, paramtype = "light", paramtype2 = "facedir", - sounds = df_primordial_items.sounds.wood, + sounds = df_dependencies.sound_wood(), sunlight_propagates = true, on_place = minetest.rotate_node, + _mcl_blast_resistance = 2, + _mcl_hardness = 1, }) minetest.register_node("df_primordial_items:giant_fern_tree_slant_bottom", { @@ -34,8 +36,8 @@ minetest.register_node("df_primordial_items:giant_fern_tree_slant_bottom", { mesh = "dfcaverns_fern_slant.obj", paramtype = "light", drop = "df_primordial_items:giant_fern_tree", - groups = {choppy = 2, tree = 1, oddly_breakable_by_hand=1, flammable = 2, fern_stem = 1}, - sounds = df_primordial_items.sounds.wood, + groups = {choppy = 2, tree = 1, oddly_breakable_by_hand=1, flammable = 2, fern_stem = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), is_ground_content = false, on_place = minetest.rotate_node, selection_box = { @@ -52,6 +54,8 @@ minetest.register_node("df_primordial_items:giant_fern_tree_slant_bottom", { {-0.5, 0.0, -0.875, 0.5, 0.5, 0.125}, }, }, + _mcl_blast_resistance = 2, + _mcl_hardness = 1, }) minetest.register_node("df_primordial_items:giant_fern_tree_slant_top", { @@ -71,8 +75,8 @@ minetest.register_node("df_primordial_items:giant_fern_tree_slant_top", { mesh = "dfcaverns_fern_slant_2.obj", paramtype = "light", drop = "df_primordial_items:giant_fern_tree", - groups = {choppy = 2, tree = 1, oddly_breakable_by_hand=1, flammable = 2, fern_stem = 1}, - sounds = df_primordial_items.sounds.wood, + groups = {choppy = 2, tree = 1, oddly_breakable_by_hand=1, flammable = 2, fern_stem = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), is_ground_content = false, on_place = minetest.rotate_node, selection_box = { @@ -89,6 +93,8 @@ minetest.register_node("df_primordial_items:giant_fern_tree_slant_top", { {-0.5, 0.0, -0.375, 0.5, 0.5, 0.625}, }, }, + _mcl_blast_resistance = 2, + _mcl_hardness = 1, }) minetest.register_node("df_primordial_items:giant_fern_tree_slant_full", { @@ -108,8 +114,8 @@ minetest.register_node("df_primordial_items:giant_fern_tree_slant_full", { mesh = "dfcaverns_fern_slant_full.obj", paramtype = "light", drop = "df_primordial_items:giant_fern_tree", - groups = {choppy = 2, tree = 1, oddly_breakable_by_hand=1, flammable = 2, fern_stem = 1}, - sounds = df_primordial_items.sounds.wood, + groups = {choppy = 2, tree = 1, oddly_breakable_by_hand=1, flammable = 2, fern_stem = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), is_ground_content = false, on_place = minetest.rotate_node, selection_box = { @@ -126,6 +132,8 @@ minetest.register_node("df_primordial_items:giant_fern_tree_slant_full", { {-0.5, 0, -1.25, 0.5, 0.5, -0.25}, }, }, + _mcl_blast_resistance = 2, + _mcl_hardness = 1, }) minetest.register_node("df_primordial_items:fern_wood", { @@ -133,10 +141,12 @@ minetest.register_node("df_primordial_items:fern_wood", { _doc_items_longdesc = df_primordial_items.doc.giant_fern_desc, _doc_items_usagehelp = df_primordial_items.doc.giant_fern_usage, paramtype2 = "facedir", - tiles = {"default_wood.png^[multiply:#10FF10"}, + tiles = {df_dependencies.texture_wood .. "^[multiply:#10FF10"}, is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, - sounds = df_primordial_items.sounds.wood, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=10}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 3, + _mcl_hardness = 1, }) minetest.register_craft({ @@ -146,6 +156,8 @@ minetest.register_craft({ } }) +df_dependencies.register_all_stairs_and_fences("fern_wood", {burntime=7}) + minetest.register_node("df_primordial_items:giant_fern_leaves", { description = S("Giant Fern Leaves"), _doc_items_longdesc = df_primordial_items.doc.giant_fern_desc, @@ -154,17 +166,18 @@ minetest.register_node("df_primordial_items:giant_fern_leaves", { visual_scale = 1.41, inventory_image = "dfcaverns_jungle_fern_leaves_01.png", wield_image = "dfcaverns_jungle_fern_leaves_01.png", - groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + groups = {snappy = 3, leafdecay = 2, flammable = 2, leaves = 1, handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=30}, is_ground_content = false, paramtype = "light", drawtype = "plantlike", buildable_to = true, walkable = false, waving = 2, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, - after_place_node = df_primordial_items.after_place_leaves, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes drop = { max_items = 1, items = { @@ -178,14 +191,37 @@ minetest.register_node("df_primordial_items:giant_fern_leaves", { } } }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) -df_primordial_items.register_leafdecay({ +df_dependencies.register_leafdecay({ trunks = {"df_primordial_items:giant_fern_tree_slant_full", "df_primordial_items:giant_fern_tree_slant_top", "df_primordial_items:giant_fern_tree_slant_bottom", "df_primordial_items:giant_fern_tree"}, leaves = {"df_primordial_items:giant_fern_leaves"}, radius = 2, }) + +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:fern_wood", + burntime = 7, +}) +minetest.register_craft({ + type = "fuel", + recipe = "group:fern_stem", + burntime = 28, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:giant_fern_leaves", + burntime = 2, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:fern_sapling", + burntime = 2, +}) ------------------------------------------------------------------------------------ -- Schematics @@ -268,8 +304,8 @@ minetest.register_node("df_primordial_items:fern_sapling", { tiles = {"dfcaverns_jungle_fern_03.png"}, inventory_image = "dfcaverns_jungle_fern_03.png", wield_image = "dfcaverns_jungle_fern_03.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, sapling = 1, light_sensitive_fungus = 13}, - _dfcaverns_dead_node = df_primordial_items.node_names.dry_shrub, + groups = {snappy = 3, attached_node = 1, flammable = 1, sapling = 1, light_sensitive_fungus = 13, attached_node=1,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30,dig_immediate=3}, + _dfcaverns_dead_node = df_dependencies.node_name_dry_shrub, selection_box = { type = "fixed", fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} @@ -279,16 +315,17 @@ minetest.register_node("df_primordial_items:fern_sapling", { buildable_to = true, is_ground_content = false, walkable = false, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, on_construct = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") == 0 then - return + if df_primordial_items.giant_fern_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.tree_min_growth_delay, + df_trees.config.tree_max_growth_delay)) end - minetest.get_node_timer(pos):start(math.random( - df_trees.config.tree_min_growth_delay, - df_trees.config.tree_max_growth_delay)) end, on_destruct = function(pos) minetest.get_node_timer(pos):stop() @@ -299,12 +336,16 @@ minetest.register_node("df_primordial_items:fern_sapling", { end if minetest.get_node_light(pos) > 6 then - local fern = df_primordial_items.get_fern_schematic() - local rotation = rotations[math.random(1,#rotations)] - minetest.set_node(pos, {name="air"}) -- clear sapling so fern can replace it - mapgen_helper.place_schematic(pos, fern, rotation) + df_primordial_items.spawn_giant_fern(pos) else minetest.get_node_timer(pos):start(df_trees.config.tree_min_growth_delay) end end, -}) \ No newline at end of file +}) + +df_primordial_items.spawn_giant_fern = function(pos) + local fern = df_primordial_items.get_fern_schematic() + local rotation = rotations[math.random(1,#rotations)] + minetest.set_node(pos, {name="air"}) -- clear sapling so fern can replace it + mapgen_helper.place_schematic(pos, fern, rotation) +end \ No newline at end of file diff --git a/df_primordial_items/giant_mycelium.lua b/df_primordial_items/giant_mycelium.lua index d3a256d..d41c577 100644 --- a/df_primordial_items/giant_mycelium.lua +++ b/df_primordial_items/giant_mycelium.lua @@ -1,6 +1,6 @@ -- This file defines a type of root-like growth that spreads over the surface of the ground in a random web-like pattern -local S = df_primordial_items.S +local S = minetest.get_translator(minetest.get_current_modname()) -- hub_thickness -- the bit in the middle that's seen at the ends and corners of long hypha runs -- connector_thickness @@ -34,7 +34,7 @@ minetest.register_node("df_primordial_items:giant_hypha_root", { light_source = 2, is_ground_content = false, climbable = true, - groups = {oddly_breakable_by_hand = 1, choppy = 2, hypha = 1}, + groups = {oddly_breakable_by_hand = 1, choppy = 2, hypha = 1, handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=1, fire_flammability=1}, sounds = df_trees.node_sound_tree_soft_fungus_defaults(), drop = { max_items = 1, @@ -48,6 +48,8 @@ minetest.register_node("df_primordial_items:giant_hypha_root", { }, }, }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) minetest.register_node("df_primordial_items:giant_hypha", { description = S("Giant Hypha"), @@ -65,7 +67,7 @@ minetest.register_node("df_primordial_items:giant_hypha", { light_source = 2, is_ground_content = false, climbable = true, - groups = {oddly_breakable_by_hand = 1, choppy = 2, hypha = 1}, + groups = {oddly_breakable_by_hand = 1, choppy = 2, hypha = 1, handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=1, fire_flammability=1}, sounds = df_trees.node_sound_tree_soft_fungus_defaults(), drop = { max_items = 1, @@ -79,6 +81,8 @@ minetest.register_node("df_primordial_items:giant_hypha", { }, }, }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) minetest.register_craftitem("df_primordial_items:mycelial_fibers", { @@ -316,11 +320,15 @@ minetest.register_node("df_primordial_items:giant_hypha_apical_meristem", { paramtype = "light", is_ground_content = false, - groups = {oddly_breakable_by_hand = 1, choppy = 2, hypha = 1, light_sensitive_fungus = 13}, + groups = {oddly_breakable_by_hand = 1, choppy = 2, hypha = 1, light_sensitive_fungus = 13, handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=1, fire_flammability=1}, _dfcaverns_dead_node = "df_primordial_items:giant_hypha_root", sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + _mcl_blast_resistance = 2, + _mcl_hardness = 2, on_construct = function(pos) - minetest.get_node_timer(pos):start(math.random(min_growth_delay, max_growth_delay)) + if df_primordial_items.giant_mycelium_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random(min_growth_delay, max_growth_delay)) + end end, on_destruct = function(pos) minetest.get_node_timer(pos):stop() @@ -403,7 +411,9 @@ minetest.register_node("df_primordial_items:giant_hypha_apical_mapgen", { paramtype = "light", is_ground_content = false, - groups = {oddly_breakable_by_hand = 1, choppy = 2, hypha = 1, not_in_creative_inventory = 1, light_sensitive_fungus = 13}, + groups = {oddly_breakable_by_hand = 1, choppy = 2, hypha = 1, not_in_creative_inventory = 1, light_sensitive_fungus = 13, handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=1, fire_flammability=1}, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, sounds = df_trees.node_sound_tree_soft_fungus_defaults(), on_timer = function(pos, elapsed) grow_mycelium_immediately(pos) @@ -416,13 +426,13 @@ minetest.register_node("df_primordial_items:giant_hypha_apical_mapgen", { end, }) --- Just in case mapgen fails to trigger the timer on a mapgen mycelium this ABM will clean up. -minetest.register_abm({ - label = "df_primordial_items ensure giant mycelium growth", - nodenames = {"df_primordial_items:giant_hypha_apical_mapgen"}, - interval = 10.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) +-- Just in case mapgen fails to trigger the timer on a mapgen mycelium this LBM will clean up. +minetest.register_lbm({ + label = "ensure mapgen mycelium has a timer running", + name = "df_primordial_items:ensure_mapgen_mycelium_timer", + nodenames = {"df_primordial_items:giant_hypha_apical_mapgen"}, + run_at_every_load = true, + action = function(pos, node) local timer = minetest.get_node_timer(pos) if not timer:is_started() then timer:start(math.random(1,10)) diff --git a/df_primordial_items/init.lua b/df_primordial_items/init.lua index c6253ac..02aae71 100644 --- a/df_primordial_items/init.lua +++ b/df_primordial_items/init.lua @@ -2,10 +2,8 @@ df_primordial_items = {} df_primordial_items.doc = {} local modname = minetest.get_current_modname() -df_primordial_items.S = minetest.get_translator(modname) local modpath = minetest.get_modpath(modname) -dofile(modpath.."/dependencies.lua") dofile(modpath.."/doc.lua") dofile(modpath.."/jungle_nodes.lua") dofile(modpath.."/jungle_tree.lua") @@ -15,4 +13,5 @@ dofile(modpath.."/fungal_nodes.lua") dofile(modpath.."/ceiling_fungus.lua") dofile(modpath.."/primordial_mushroom.lua") dofile(modpath.."/giant_mycelium.lua") -dofile(modpath.."/edibles.lua") \ No newline at end of file +dofile(modpath.."/edibles.lua") +dofile(modpath.."/sapling_growth_conditions.lua") \ No newline at end of file diff --git a/df_primordial_items/jungle_mushroom.lua b/df_primordial_items/jungle_mushroom.lua index da3de57..4841a17 100644 --- a/df_primordial_items/jungle_mushroom.lua +++ b/df_primordial_items/jungle_mushroom.lua @@ -1,4 +1,4 @@ -local S = df_primordial_items.S +local S = minetest.get_translator(minetest.get_current_modname()) ------------------------------------------------------------------------------------------ -- Big jungle mushroom @@ -10,9 +10,11 @@ minetest.register_node("df_primordial_items:jungle_mushroom_trunk", { tiles = {"dfcaverns_jungle_mushroom_stem.png", "dfcaverns_jungle_mushroom_stem.png", "dfcaverns_jungle_mushroom_stem_02.png"}, paramtype2 = "facedir", is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, sounds = df_trees.node_sound_tree_soft_fungus_defaults(), - on_place = minetest.rotate_node + on_place = minetest.rotate_node, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) minetest.register_node("df_primordial_items:jungle_mushroom_cap_1", { @@ -22,7 +24,7 @@ minetest.register_node("df_primordial_items:jungle_mushroom_cap_1", { tiles = {"dfcaverns_jungle_mushroom_top_02.png"}, paramtype2 = "facedir", is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_mushroom_cap = 1}, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_mushroom_cap = 1, handy=1,axey=1, tree=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5, compostability=30}, sounds = df_trees.node_sound_tree_soft_fungus_defaults(), on_place = minetest.rotate_node, drop = { @@ -37,6 +39,8 @@ minetest.register_node("df_primordial_items:jungle_mushroom_cap_1", { } } }, + _mcl_blast_resistance = 2, + _mcl_hardness = 1, }) minetest.register_node("df_primordial_items:jungle_mushroom_cap_2", { @@ -46,7 +50,7 @@ minetest.register_node("df_primordial_items:jungle_mushroom_cap_2", { tiles = {"dfcaverns_jungle_mushroom_top_01.png"}, paramtype2 = "facedir", is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_mushroom_cap = 1}, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_mushroom_cap = 1, handy=1,axey=1, tree=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5, compostability=30}, sounds = df_trees.node_sound_tree_soft_fungus_defaults(), on_place = minetest.rotate_node, drop = { @@ -61,6 +65,8 @@ minetest.register_node("df_primordial_items:jungle_mushroom_cap_2", { } } }, + _mcl_blast_resistance = 2, + _mcl_hardness = 1, }) minetest.register_craftitem("df_primordial_items:diced_mushroom", { @@ -68,10 +74,11 @@ minetest.register_craftitem("df_primordial_items:diced_mushroom", { _doc_items_longdesc = df_primordial_items.doc.big_mushroom_desc, _doc_items_usagehelp = df_primordial_items.doc.big_mushroom_usage, inventory_image = "dfcaverns_mush_diced_giant_mushroom.png", - groups = {food = 1, dfcaverns_cookable = 1}, + groups = {food = 1, dfcaverns_cookable = 1, eatable=1, plant=1}, sound = {eat = {name = "df_farming_gummy_chew", gain = 1.0}}, on_use = minetest.item_eat(1), _hunger_ng = {satiates = 1}, + _mcl_saturation = 0.5, }) minetest.register_craft({ @@ -80,7 +87,7 @@ minetest.register_craft({ recipe = { "group:primordial_mushroom_cap"}, }) --- Note: no wood-making recipe for the trunk, it's pretty useless +-- Note: no wood-making recipe for the trunk, it's deliberately pretty useless since the cap is edible minetest.register_craft({ type = "fuel", recipe = "df_primordial_items:jungle_mushroom_trunk", @@ -94,7 +101,7 @@ minetest.register_node("df_primordial_items:jungle_mushroom_sapling", { tiles = {"dfcaverns_jungle_mushroom_02.png^[brighten"}, inventory_image = "dfcaverns_jungle_mushroom_02.png^[brighten", wield_image = "dfcaverns_jungle_mushroom_02.png^[brighten", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, light_sensitive_fungus = 13}, + groups = {snappy = 3, attached_node = 1, flammable = 1, sapling = 1, light_sensitive_fungus = 13, dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30,dig_immediate=3}, selection_box = { type = "fixed", fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} @@ -104,17 +111,18 @@ minetest.register_node("df_primordial_items:jungle_mushroom_sapling", { buildable_to = true, is_ground_content = false, walkable = false, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, on_construct = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") == 0 then - return + if df_primordial_items.jungle_mushroom_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.tree_min_growth_delay, + df_trees.config.tree_max_growth_delay)) end - minetest.get_node_timer(pos):start(math.random( - df_trees.config.tree_min_growth_delay, - df_trees.config.tree_max_growth_delay)) end, on_destruct = function(pos) minetest.get_node_timer(pos):stop() @@ -124,7 +132,6 @@ minetest.register_node("df_primordial_items:jungle_mushroom_sapling", { if df_farming and df_farming.kill_if_sunlit(pos) then return end - minetest.set_node(pos, {name="air"}) df_primordial_items.spawn_jungle_mushroom(pos) end, }) @@ -135,6 +142,7 @@ local c_cap_2 = minetest.get_content_id("df_primordial_items:jungle_mushroom_cap local c_air = minetest.get_content_id("air") df_primordial_items.spawn_jungle_mushroom = function(pos) + minetest.set_node(pos, {name="air"}) local x, y, z = pos.x, pos.y, pos.z local stem_height = math.random(1,3) local cap_radius = math.random(2,3) diff --git a/df_primordial_items/jungle_nodes.lua b/df_primordial_items/jungle_nodes.lua index ae5ad57..a44569c 100644 --- a/df_primordial_items/jungle_nodes.lua +++ b/df_primordial_items/jungle_nodes.lua @@ -1,8 +1,10 @@ -local S = df_primordial_items.S +local S = minetest.get_translator(minetest.get_current_modname()) ---------------------------------------------------- -- Ferns +local jungle_plant_groups = {snappy = 3, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1, compostability = 30} + minetest.register_node("df_primordial_items:fern_1", { description = S("Primordial Fern"), _doc_items_longdesc = df_primordial_items.doc.fern_desc, @@ -10,17 +12,20 @@ minetest.register_node("df_primordial_items:fern_1", { tiles = {"dfcaverns_jungle_fern_01.png"}, inventory_image = "dfcaverns_jungle_fern_01.png", wield_image = "dfcaverns_jungle_fern_01.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13}, - _dfcaverns_dead_node = df_primordial_items.node_names.dry_shrub, + groups = jungle_plant_groups, + _dfcaverns_dead_node = df_dependencies.node_name_dry_shrub, visual_scale = 1.69, paramtype = "light", drawtype = "plantlike", buildable_to = true, is_ground_content = false, walkable = false, - sounds = df_primordial_items.sounds.leaves, + floodable = true, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) minetest.register_node("df_primordial_items:fern_2", { @@ -31,16 +36,19 @@ minetest.register_node("df_primordial_items:fern_2", { visual_scale = 1.69, inventory_image = "dfcaverns_jungle_fern_02.png", wield_image = "dfcaverns_jungle_fern_02.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13}, - _dfcaverns_dead_node = df_primordial_items.node_names.dry_shrub, + groups = jungle_plant_groups, + _dfcaverns_dead_node = df_dependencies.node_name_dry_shrub, paramtype = "light", drawtype = "plantlike", buildable_to = true, is_ground_content = false, walkable = false, - sounds = df_primordial_items.sounds.leaves, + floodable = true, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) --------------------------------------------------------- @@ -53,13 +61,14 @@ minetest.register_node("df_primordial_items:glow_plant_1", { tiles = {"dfcaverns_jungle_flower_01.png"}, inventory_image = "dfcaverns_jungle_flower_01.png", wield_image = "dfcaverns_jungle_flower_01.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13}, - _dfcaverns_dead_node = df_primordial_items.node_names.dry_shrub, + groups = jungle_plant_groups, + _dfcaverns_dead_node = df_dependencies.node_name_dry_shrub, paramtype = "light", drawtype = "plantlike", buildable_to = true, is_ground_content = false, walkable = false, + floodable = true, light_source = 6, drop = { max_items = 2, @@ -74,9 +83,11 @@ minetest.register_node("df_primordial_items:glow_plant_1", { }, }, }, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) minetest.register_node("df_primordial_items:glow_plant_2", { @@ -86,18 +97,21 @@ minetest.register_node("df_primordial_items:glow_plant_2", { tiles = {"dfcaverns_jungle_glow_plant_01.png"}, inventory_image = "dfcaverns_jungle_glow_plant_01.png", wield_image = "dfcaverns_jungle_glow_plant_01.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13}, - _dfcaverns_dead_node = df_primordial_items.node_names.dry_shrub, + groups = jungle_plant_groups, + _dfcaverns_dead_node = df_dependencies.node_name_dry_shrub, paramtype = "light", drawtype = "plantlike", buildable_to = true, is_ground_content = false, walkable = false, + floodable = true, drop = "df_primordial_items:glowtato", light_source = 6, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) minetest.register_node("df_primordial_items:glow_plant_3", { @@ -107,18 +121,21 @@ minetest.register_node("df_primordial_items:glow_plant_3", { tiles = {"dfcaverns_jungle_glow_plant_02.png"}, inventory_image = "dfcaverns_jungle_glow_plant_02.png", wield_image = "dfcaverns_jungle_glow_plant_02.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13}, - _dfcaverns_dead_node = df_primordial_items.node_names.dry_shrub, + groups = jungle_plant_groups, + _dfcaverns_dead_node = df_dependencies.node_name_dry_shrub, paramtype = "light", drawtype = "plantlike", drop = "df_primordial_items:glowtato 2", buildable_to = true, is_ground_content = false, walkable = false, + floodable = true, light_source = 6, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) @@ -132,16 +149,19 @@ minetest.register_node("df_primordial_items:jungle_grass_1", { tiles = {"dfcaverns_jungle_grass_01.png"}, inventory_image = "dfcaverns_jungle_grass_01.png", wield_image = "dfcaverns_jungle_grass_01.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13}, - _dfcaverns_dead_node = df_primordial_items.node_names.dry_grass_3, + groups = jungle_plant_groups, + _dfcaverns_dead_node = df_dependencies.node_name_dry_grass_3, paramtype = "light", drawtype = "plantlike", buildable_to = true, is_ground_content = false, walkable = false, - sounds = df_primordial_items.sounds.leaves, + floodable = true, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) minetest.register_node("df_primordial_items:jungle_grass_2", { @@ -151,17 +171,20 @@ minetest.register_node("df_primordial_items:jungle_grass_2", { tiles = {"dfcaverns_jungle_grass_02.png"}, inventory_image = "dfcaverns_jungle_grass_02.png", wield_image = "dfcaverns_jungle_grass_02.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13}, - _dfcaverns_dead_node = df_primordial_items.node_names.dry_grass_4, + groups = jungle_plant_groups, + _dfcaverns_dead_node = df_dependencies.node_name_dry_grass_4, paramtype = "light", drawtype = "plantlike", buildable_to = true, is_ground_content = false, walkable = false, + floodable = true, place_param2 = 3, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) minetest.register_node("df_primordial_items:jungle_grass_3", { @@ -171,17 +194,20 @@ minetest.register_node("df_primordial_items:jungle_grass_3", { tiles = {"dfcaverns_jungle_grass_03.png"}, inventory_image = "dfcaverns_jungle_grass_03.png", wield_image = "dfcaverns_jungle_grass_03.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 13}, - _dfcaverns_dead_node = df_primordial_items.node_names.dry_grass_4, + groups = jungle_plant_groups, + _dfcaverns_dead_node = df_dependencies.node_name_dry_grass_4, paramtype = "light", drawtype = "plantlike", buildable_to = true, is_ground_content = false, walkable = false, + floodable = true, place_param2 = 3, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) @@ -195,13 +221,13 @@ minetest.register_node("df_primordial_items:jungle_ivy", { tiles = {"dfcaverns_jungle_ivy_01.png"}, inventory_image = "dfcaverns_jungle_ivy_01.png", wield_image = "dfcaverns_jungle_ivy_01.png", - groups = {snappy = 3, flora = 1, flammable = 1, vines = 1}, + groups = {snappy = 3, flammable = 1, vines = 1, handy=1,axey=1,shearsy=1,swordy=1, flammable=2,deco_block=1,destroy_by_lava_flow=1,dig_by_piston=1, fire_encouragement=15, fire_flammability=100, compostability=50}, paramtype = "light", drawtype = "plantlike", place_param2 = 3, --paramtype2 = "wallmouinted", --drawtype = "signlike", - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, is_ground_content = false, @@ -210,6 +236,8 @@ minetest.register_node("df_primordial_items:jungle_ivy", { -- selection_box = { -- type = "wallmounted", -- }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) ------------------------------------------------------------------------------------- @@ -222,15 +250,18 @@ minetest.register_node("df_primordial_items:jungle_mushroom_1", { tiles = {"dfcaverns_jungle_mushroom_01.png^[multiply:#f3df2a"}, inventory_image = "dfcaverns_jungle_mushroom_01.png^[multiply:#f3df2a", wield_image = "dfcaverns_jungle_mushroom_01.png^[multiply:#f3df2a", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 11}, + groups = jungle_plant_groups, paramtype = "light", drawtype = "plantlike", buildable_to = true, is_ground_content = false, walkable = false, - sounds = df_primordial_items.sounds.leaves, + floodable = true, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) minetest.register_node("df_primordial_items:jungle_mushroom_2", { @@ -240,15 +271,18 @@ minetest.register_node("df_primordial_items:jungle_mushroom_2", { tiles = {"dfcaverns_jungle_mushroom_02.png"}, inventory_image = "dfcaverns_jungle_mushroom_02.png", wield_image = "dfcaverns_jungle_mushroom_02.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, primordial_jungle_plant = 1, light_sensitive_fungus = 11}, + groups = jungle_plant_groups, paramtype = "light", drawtype = "plantlike", buildable_to = true, is_ground_content = false, walkable = false, - sounds = df_primordial_items.sounds.leaves, + floodable = true, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) ---------------------------------------------------------------------------------------- @@ -260,24 +294,26 @@ minetest.register_node("df_primordial_items:dirt_with_jungle_grass", { _doc_items_usagehelp = df_primordial_items.doc.dirt_with_jungle_grass_usage, tiles = {"dfcaverns_jungle_plant_grass_node_01.png"}, paramtype = "light", - groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 13}, - _dfcaverns_dead_node = df_primordial_items.node_names.dirt, + groups = {crumbly = 3, soil = 1, light_sensitive_fungus = 13, handy=1,shovely=1, dirt=2, building_block=1, opaque=1}, + _dfcaverns_dead_node = df_dependencies.node_name_dirt, is_ground_content = false, - drops = df_primordial_items.node_names.dirt, - sounds = df_primordial_items.sounds.dirt, + drop = df_dependencies.node_name_dirt, + sounds = df_dependencies.sound_dirt(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.6, }) minetest.register_abm{ label = "df_primordial_items:jungle_grass_spread", - nodenames = {df_primordial_items.node_names.dirt}, - neighbors = {"df_mapitems:dirt_with_jungle_grass"}, + nodenames = {df_dependencies.node_name_dirt}, + neighbors = {"df_primordial_items:dirt_with_jungle_grass"}, interval = 60, chance = 50, catch_up = true, action = function(pos) local above_def = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name] if above_def and (above_def.buildable_to == true or above_def.walkable == false) then - minetest.swap_node(pos, {name="df_mapitems:dirt_with_jungle_grass"}) + minetest.swap_node(pos, {name="df_primordial_items:dirt_with_jungle_grass"}) end end, } @@ -288,9 +324,8 @@ minetest.register_node("df_primordial_items:plant_matter", { _doc_items_usagehelp = df_primordial_items.doc.plant_matter_usage, tiles = {"dfcaverns_jungle_plant_matter_01.png"}, is_ground_content = false, - paramtype = "light", - groups = {crumbly = 3, soil = 1, flammable = 1}, - sounds = df_primordial_items.sounds.dirt, + groups = {crumbly = 3, soil = 1, flammable = 1, handy=1,shovely=1, dirt=2, building_block=1, fire_encouragement=1, fire_flammability=1}, + sounds = df_dependencies.sound_dirt(), on_timer = function(pos, elapsed) if elapsed > 130 then -- the timer triggered more than ten seconds after it was suppposed to, @@ -303,6 +338,8 @@ minetest.register_node("df_primordial_items:plant_matter", { minetest.set_node(pos, {name="df_primordial_items:packed_roots"}) end end, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) minetest.register_node("df_primordial_items:packed_roots", { @@ -312,8 +349,10 @@ minetest.register_node("df_primordial_items:packed_roots", { tiles = {"dfcaverns_jungle_plant_packed_roots_01.png"}, paramtype2 = "facedir", is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = df_primordial_items.sounds.wood, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 3, + _mcl_hardness = 3, }) @@ -359,15 +398,17 @@ minetest.register_node("df_primordial_items:jungle_roots_1", { tiles = {"dfcaverns_jungle_root_01.png"}, inventory_image = "dfcaverns_jungle_root_01.png", wield_image = "dfcaverns_jungle_root_01.png", - groups = {snappy = 3, flora = 1, flammable = 1, vines = 1}, + groups = {snappy = 3, flammable = 1, vines = 1, handy=1,axey=1,shearsy=1,swordy=1, deco_block=1,destroy_by_lava_flow=1,dig_by_piston=1, fire_encouragement=3, fire_flammability=10, compostability=50}, paramtype = "light", drawtype = "plantlike", - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, walkable = false, climbable = true, is_ground_content = false, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.2, }) minetest.register_node("df_primordial_items:jungle_roots_2", { @@ -377,15 +418,17 @@ minetest.register_node("df_primordial_items:jungle_roots_2", { tiles = {"dfcaverns_jungle_root_02.png"}, inventory_image = "dfcaverns_jungle_root_02.png", wield_image = "dfcaverns_jungle_root_02.png", - groups = {snappy = 3, flora = 1, flammable = 1, vines = 1}, + groups = {snappy = 3, flammable = 1, vines = 1, handy=1,axey=1,shearsy=1,swordy=1, deco_block=1,destroy_by_lava_flow=1,dig_by_piston=1, fire_encouragement=3, fire_flammability=10, compostability=50}, paramtype = "light", drawtype = "plantlike", - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", is_ground_content = false, sunlight_propagates = true, walkable = false, climbable = true, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.2, }) -------------------------------------------------------------------------------- @@ -399,16 +442,19 @@ minetest.register_node("df_primordial_items:jungle_thorns", { visual_scale = 1.41, inventory_image = "dfcaverns_jungle_thorns_01.png", wield_image = "dfcaverns_jungle_thorns_01.png", - groups = {snappy = 3, flora = 1, flammable = 1, primordial_jungle_plant = 1}, + groups = {snappy = 3, flammable = 1, primordial_jungle_plant = 1, handy=1, swordy=1, hoey=1, destroy_by_lava_flow=1,dig_by_piston=1, fire_encouragement=30, fire_flammability=100, compostability=50}, paramtype = "light", drawtype = "plantlike", walkable = false, + floodable = true, is_ground_content = false, place_param2 = 3, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, damage_per_second = 1, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.3, }) diff --git a/df_primordial_items/jungle_tree.lua b/df_primordial_items/jungle_tree.lua index 4aef551..73c3477 100644 --- a/df_primordial_items/jungle_tree.lua +++ b/df_primordial_items/jungle_tree.lua @@ -1,4 +1,4 @@ -local S = df_primordial_items.S +local S = minetest.get_translator(minetest.get_current_modname()) -- Leaves minetest.register_node("df_primordial_items:jungle_leaves", { @@ -15,8 +15,8 @@ minetest.register_node("df_primordial_items:jungle_leaves", { paramtype = "light", is_ground_content = false, buildable_to = true, - groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, - sounds = df_primordial_items.sounds.leaves, + groups = {snappy = 3, leafdecay = 1, flammable = 2, leaves = 1, handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=30, fire_flammability=60, compostability=30}, + sounds = df_dependencies.sound_leaves(), drop = { max_items = 1, items = { @@ -29,7 +29,10 @@ minetest.register_node("df_primordial_items:jungle_leaves", { } } }, - after_place_node = df_primordial_items.after_place_leaves, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) minetest.register_node("df_primordial_items:jungle_leaves_glowing", { @@ -47,8 +50,8 @@ minetest.register_node("df_primordial_items:jungle_leaves_glowing", { is_ground_content = false, buildable_to = true, light_source = 2, - groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, - sounds = df_primordial_items.sounds.leaves, + groups = {snappy = 3, leafdecay = 1, flammable = 2, leaves = 1, handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=30, fire_flammability=60, compostability=30}, + sounds = df_dependencies.sound_leaves(), drop = { max_items = 1, items = { @@ -61,7 +64,10 @@ minetest.register_node("df_primordial_items:jungle_leaves_glowing", { } } }, - after_place_node = df_primordial_items.after_place_leaves, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) -- Trunk @@ -73,9 +79,11 @@ minetest.register_node("df_primordial_items:jungle_tree", { tiles = {"dfcaverns_jungle_wood_02.png", "dfcaverns_jungle_wood_02.png", "dfcaverns_jungle_wood_01.png"}, paramtype2 = "facedir", is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_jungle_tree = 1}, - sounds = df_primordial_items.sounds.wood, - on_place = minetest.rotate_node + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_jungle_tree = 1, handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + on_place = minetest.rotate_node, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) minetest.register_node("df_primordial_items:jungle_tree_mossy", { @@ -85,9 +93,11 @@ minetest.register_node("df_primordial_items:jungle_tree_mossy", { tiles = {"dfcaverns_jungle_wood_02.png", "dfcaverns_jungle_wood_02.png", "dfcaverns_jungle_wood_03.png"}, paramtype2 = "facedir", is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_jungle_tree = 1}, - sounds = df_primordial_items.sounds.wood, - on_place = minetest.rotate_node + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_jungle_tree = 1, handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + on_place = minetest.rotate_node, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) minetest.register_node("df_primordial_items:jungle_tree_glowing", { @@ -98,19 +108,21 @@ minetest.register_node("df_primordial_items:jungle_tree_glowing", { paramtype2 = "facedir", is_ground_content = false, light_source = 4, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_jungle_tree = 1}, - sounds = df_primordial_items.sounds.wood, - on_place = minetest.rotate_node + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, primordial_jungle_tree = 1, handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + on_place = minetest.rotate_node, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) -df_primordial_items.register_leafdecay({ +df_dependencies.register_leafdecay({ trunks = {"df_primordial_items:jungle_tree", "df_primordial_items:jungle_tree_mossy", "df_primordial_items:jungle_tree_glowing"}, leaves = {"df_primordial_items:jungle_leaves", "df_primordial_items:jungle_leaves_glowing"}, radius = 1, }) minetest.register_craft({ - output = df_primordial_items.node_names.junglewood .. " 4", + output = df_dependencies.node_name_junglewood .. " 4", recipe = { {"group:primordial_jungle_tree"}, } @@ -119,7 +131,6 @@ minetest.register_craft({ ---------------------------- -- Spawn --- TODO: make use of the variant trunk and leaf nodes local c_leaves = minetest.get_content_id("df_primordial_items:jungle_leaves") local c_leaves_glow = minetest.get_content_id("df_primordial_items:jungle_leaves_glowing") local c_trunk = minetest.get_content_id("df_primordial_items:jungle_tree") @@ -222,8 +233,8 @@ minetest.register_node("df_primordial_items:jungletree_sapling", { tiles = {"dfcaverns_jungle_sapling.png"}, inventory_image = "dfcaverns_jungle_sapling.png", wield_image = "dfcaverns_jungle_sapling.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, sapling = 1, light_sensitive_fungus = 13}, - _dfcaverns_dead_node = df_primordial_items.node_names.dry_shrub, + groups = {snappy = 3, attached_node = 1, flammable = 1, sapling = 1, light_sensitive_fungus = 13, dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30,dig_immediate=3}, + _dfcaverns_dead_node = df_dependencies.node_name_dry_shrub, selection_box = { type = "fixed", fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} @@ -233,16 +244,17 @@ minetest.register_node("df_primordial_items:jungletree_sapling", { buildable_to = true, walkable = false, is_ground_content = false, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, on_construct = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") == 0 then - return + if df_primordial_items.jungletree_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.tree_min_growth_delay, + df_trees.config.tree_max_growth_delay)) end - minetest.get_node_timer(pos):start(math.random( - df_trees.config.tree_min_growth_delay, - df_trees.config.tree_max_growth_delay)) end, on_destruct = function(pos) minetest.get_node_timer(pos):stop() diff --git a/df_primordial_items/mod.conf b/df_primordial_items/mod.conf index aaa8d04..61b95d2 100644 --- a/df_primordial_items/mod.conf +++ b/df_primordial_items/mod.conf @@ -1,4 +1,4 @@ name = df_primordial_items description = A collection of flora found in the "primordial" cavern layer of DF Caverns -depends = default, mapgen_helper, subterrane, df_underworld_items, df_trees +depends = df_dependencies, mapgen_helper, subterrane, df_underworld_items, df_trees optional_depends = footprints, df_farming \ No newline at end of file diff --git a/df_primordial_items/primordial_mushroom.lua b/df_primordial_items/primordial_mushroom.lua index 9869738..10e3dac 100644 --- a/df_primordial_items/primordial_mushroom.lua +++ b/df_primordial_items/primordial_mushroom.lua @@ -1,4 +1,4 @@ -local S = df_primordial_items.S +local S = minetest.get_translator(minetest.get_current_modname()) minetest.register_node("df_primordial_items:mushroom_trunk", { description = S("Primordial Mushroom Trunk"), @@ -7,9 +7,11 @@ minetest.register_node("df_primordial_items:mushroom_trunk", { tiles = {"dfcaverns_mush_shaft_top.png", "dfcaverns_mush_shaft_top.png", "dfcaverns_mush_shaft_side.png"}, paramtype2 = "facedir", is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, sounds = df_trees.node_sound_tree_soft_fungus_defaults(), - on_place = minetest.rotate_node + on_place = minetest.rotate_node, + _mcl_blast_resistance = 3, + _mcl_hardness = 3, }) minetest.register_node("df_primordial_items:mushroom_cap", { @@ -19,9 +21,11 @@ minetest.register_node("df_primordial_items:mushroom_cap", { tiles = {"dfcaverns_mush_cap.png"}, paramtype2 = "facedir", is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, sounds = df_trees.node_sound_tree_soft_fungus_defaults(), - on_place = minetest.rotate_node + on_place = minetest.rotate_node, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) minetest.register_node("df_primordial_items:mushroom_gills", { @@ -31,14 +35,14 @@ minetest.register_node("df_primordial_items:mushroom_gills", { tiles = {"dfcaverns_mush_gills.png"}, inventory_image = "dfcaverns_mush_gills.png", wield_image = "dfcaverns_mush_gills.png", - groups = {snappy = 3, flora = 1, flammable = 1, leaves = 1}, + groups = {snappy = 3, flammable = 1, leaves = 1, leafdecay = 8,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=30}, paramtype = "light", drawtype = "plantlike", waving = 2, walkable = false, climbable = true, is_ground_content = false, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, drop = { @@ -54,7 +58,10 @@ minetest.register_node("df_primordial_items:mushroom_gills", { } } }, - after_place_node = df_primordial_items.after_place_leaves, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) minetest.register_node("df_primordial_items:mushroom_gills_glowing", { @@ -64,7 +71,7 @@ minetest.register_node("df_primordial_items:mushroom_gills_glowing", { tiles = {"dfcaverns_mush_gills_glow.png"}, inventory_image = "dfcaverns_mush_gills_glow.png", wield_image = "dfcaverns_mush_gills_glow.png", - groups = {snappy = 3, flora = 1, flammable = 1, leaves = 1}, + groups = {snappy = 3, flammable = 1, leaves = 1, leafdecay = 8,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=30}, paramtype = "light", drawtype = "plantlike", waving = 2, @@ -72,7 +79,7 @@ minetest.register_node("df_primordial_items:mushroom_gills_glowing", { climbable = true, is_ground_content = false, light_source = 6, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, drop = { @@ -88,10 +95,13 @@ minetest.register_node("df_primordial_items:mushroom_gills_glowing", { } } }, - after_place_node = df_primordial_items.after_place_leaves, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) -df_primordial_items.register_leafdecay({ +df_dependencies.register_leafdecay({ trunks = {"df_primordial_items:mushroom_trunk", "df_primordial_items:mushroom_cap"}, leaves = {"df_primordial_items:mushroom_gills", "df_primordial_items:mushroom_gills_glowing"}, radius = 5, @@ -104,8 +114,10 @@ minetest.register_node("df_primordial_items:primordial_mush_trunk_wood", { paramtype2 = "facedir", tiles = {"dfcaverns_mush_shaft_side.png^(dfcaverns_mush_gills.png^[multiply:#888888)"}, is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, - sounds = df_primordial_items.sounds.wood, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 4, + _mcl_hardness = 3, }) minetest.register_craft({ @@ -115,6 +127,8 @@ minetest.register_craft({ } }) +df_dependencies.register_all_stairs_and_fences("primordial_mush_trunk_wood", {burntime = 7}) + minetest.register_node("df_primordial_items:primordial_mush_cap_wood", { description = S("Primordial Cap Wood"), _doc_items_longdesc = df_primordial_items.doc.giant_mushroom_desc, @@ -122,8 +136,10 @@ minetest.register_node("df_primordial_items:primordial_mush_cap_wood", { paramtype2 = "facedir", tiles = {"dfcaverns_mush_cap.png^dfcaverns_mush_gills.png"}, is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, - sounds = df_primordial_items.sounds.wood, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 3, + _mcl_hardness = 2, }) minetest.register_craft({ @@ -133,6 +149,44 @@ minetest.register_craft({ } }) +df_dependencies.register_all_stairs_and_fences("primordial_mush_cap_wood", {burntime=12}) + +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:primordial_mush_cap_wood", + burntime = 12, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:primordial_mush_trunk_wood", + burntime = 7, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:mushroom_cap", + burntime = 40, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:mushroom_trunk", + burntime = 30, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:mushroom_gills", + burntime = 2, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:mushroom_gills_glowing", + burntime = 4, +}) +minetest.register_craft({ + type = "fuel", + recipe = "df_primordial_items:mush_sapling", + burntime = 2, +}) + ------ -- Schematics: -- Originally created by ClockGen, released under CC-BY 4.0 @@ -693,7 +747,7 @@ minetest.register_node("df_primordial_items:mush_sapling", { tiles = {"dfcaverns_mush_sapling.png"}, inventory_image = "dfcaverns_mush_sapling.png", wield_image = "dfcaverns_mush_sapling.png", - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1, sapling = 1, light_sensitive_fungus = 11}, + groups = {snappy = 3, attached_node = 1, flammable = 1, sapling = 1, light_sensitive_fungus = 11, dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30,dig_immediate=3}, selection_box = { type = "fixed", fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} @@ -703,16 +757,17 @@ minetest.register_node("df_primordial_items:mush_sapling", { buildable_to = true, walkable = false, is_ground_content = false, - sounds = df_primordial_items.sounds.leaves, + sounds = df_dependencies.sound_leaves(), use_texture_alpha = "clip", sunlight_propagates = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, on_construct = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") == 0 then - return + if df_primordial_items.primordial_mushroom_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.tree_min_growth_delay, + df_trees.config.tree_max_growth_delay)) end - minetest.get_node_timer(pos):start(math.random( - df_trees.config.tree_min_growth_delay, - df_trees.config.tree_max_growth_delay)) end, on_destruct = function(pos) minetest.get_node_timer(pos):stop() @@ -721,10 +776,13 @@ minetest.register_node("df_primordial_items:mush_sapling", { if df_farming and df_farming.kill_if_sunlit(pos) then return end - local mushroom = df_primordial_items.get_primordial_mushroom() - local rotation = (math.random(1,4)-1)*90 - minetest.set_node(pos, {name="air"}) -- clear sapling so mushroom can replace it - mapgen_helper.place_schematic(pos, mushroom, rotation) + df_primordial_items.spawn_primordial_mushroom(pos) end, }) +df_primordial_items.spawn_primordial_mushroom = function(pos) + local mushroom = df_primordial_items.get_primordial_mushroom() + local rotation = (math.random(1,4)-1)*90 + minetest.set_node(pos, {name="air"}) -- clear sapling so mushroom can replace it + mapgen_helper.place_schematic(pos, mushroom, rotation) +end \ No newline at end of file diff --git a/df_primordial_items/sapling_growth_conditions.lua b/df_primordial_items/sapling_growth_conditions.lua new file mode 100644 index 0000000..1fc5325 --- /dev/null +++ b/df_primordial_items/sapling_growth_conditions.lua @@ -0,0 +1,22 @@ +-- these methods should indicate whether a sapling placed at pos should bother attempting to grow. +-- check soil conditions and biome here, for example. + +df_primordial_items.giant_fern_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end + +df_primordial_items.giant_mycelium_growth_permitted = function(pos) + return true +end + +df_primordial_items.jungle_mushroom_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end + +df_primordial_items.jungletree_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end + +df_primordial_items.primordial_mushroom_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end \ No newline at end of file diff --git a/df_primordial_items/textures/dfcaverns_glowtato.png b/df_primordial_items/textures/dfcaverns_glowtato.png index 6456425..fb11de3 100644 Binary files a/df_primordial_items/textures/dfcaverns_glowtato.png and b/df_primordial_items/textures/dfcaverns_glowtato.png differ diff --git a/df_primordial_items/textures/dfcaverns_primordial_fruit.png b/df_primordial_items/textures/dfcaverns_primordial_fruit.png index 723374b..dcb7c1c 100644 Binary files a/df_primordial_items/textures/dfcaverns_primordial_fruit.png and b/df_primordial_items/textures/dfcaverns_primordial_fruit.png differ diff --git a/df_trees/black_cap.lua b/df_trees/black_cap.lua index ebd6c0c..7567350 100644 --- a/df_trees/black_cap.lua +++ b/df_trees/black_cap.lua @@ -1,4 +1,4 @@ -local S = df_trees.S +local S = minetest.get_translator(minetest.get_current_modname()) --stem minetest.register_node("df_trees:black_cap_stem", { @@ -7,8 +7,10 @@ minetest.register_node("df_trees:black_cap_stem", { _doc_items_usagehelp = df_trees.doc.black_cap_usage, tiles = {"dfcaverns_black_cap_top.png","dfcaverns_black_cap_top.png","dfcaverns_black_cap_side.png",}, is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, - sounds = df_trees.sounds.wood, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 6, + _mcl_hardness = 5, }) --cap @@ -18,8 +20,10 @@ minetest.register_node("df_trees:black_cap", { _doc_items_usagehelp = df_trees.doc.black_cap_usage, tiles = {"dfcaverns_black_cap_top.png","dfcaverns_black_cap_top.png","dfcaverns_black_cap_side.png^[transformR90",}, is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, - sounds = df_trees.sounds.wood, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 6, + _mcl_hardness = 5, }) --gills @@ -29,8 +33,8 @@ minetest.register_node("df_trees:black_cap_gills", { _doc_items_usagehelp = df_trees.doc.black_cap_usage, tiles = {"dfcaverns_black_cap_gills.png"}, is_ground_content = false, - groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, - sounds = df_trees.sounds.leaves, + groups = {snappy = 3, leafdecay = 1, flammable = 2, leaves = 1,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=30}, + sounds = df_dependencies.sound_leaves(), drawtype = "plantlike", paramtype = "light", drop = { @@ -45,10 +49,13 @@ minetest.register_node("df_trees:black_cap_gills", { } } }, - after_place_node = df_trees.after_place_leaves, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) -df_trees.register_leafdecay({ +df_dependencies.register_leafdecay({ trunks = {"df_trees:black_cap"}, -- don't need stem nodes here leaves = {"df_trees:black_cap_gills"}, radius = 1, @@ -70,7 +77,7 @@ minetest.register_craft({ }) minetest.register_craft({ - output = df_trees.node_names.torch .. ' 8', + output = df_dependencies.node_name_torch .. ' 8', recipe = { {'df_trees:black_cap_gills'}, {'group:stick'}, @@ -94,11 +101,13 @@ minetest.register_node("df_trees:black_cap_wood", { place_param2 = 0, tiles = {"dfcaverns_black_cap_wood.png"}, is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, - sounds = df_trees.sounds.wood, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 5, + _mcl_hardness = 5, }) -df_trees.register_all_stairs("black_cap_wood") +df_dependencies.register_all_stairs_and_fences("black_cap_wood", {burntime = 30}) minetest.register_craft({ type = "fuel", @@ -146,12 +155,13 @@ minetest.register_node("df_trees:black_cap_sapling", { fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} }, groups = {snappy = 2, dig_immediate = 3, flammable = 2, - attached_node = 1, sapling = 1, light_sensitive_fungus = 11}, - sounds = df_trees.sounds.leaves, + attached_node = 1, sapling = 1, light_sensitive_fungus = 11, dig_immediate=3,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, on_construct = function(pos) - local below_node_name = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name - if minetest.get_item_group(below_node_name, "soil") > 0 or minetest.get_item_group(below_node_name, "coal") > 0 then + if df_trees.black_cap_growth_permitted(pos) then minetest.get_node_timer(pos):start(math.random( df_trees.config.black_cap_delay_multiplier*df_trees.config.tree_min_growth_delay, df_trees.config.black_cap_delay_multiplier*df_trees.config.tree_max_growth_delay)) @@ -162,6 +172,9 @@ minetest.register_node("df_trees:black_cap_sapling", { end, on_timer = function(pos) + if df_farming and df_farming.kill_if_sunlit(pos) then + return + end minetest.set_node(pos, {name="air"}) df_trees.spawn_black_cap(pos) end, diff --git a/df_trees/blood_thorn.lua b/df_trees/blood_thorn.lua index bb8d02b..1a7ff6a 100644 --- a/df_trees/blood_thorn.lua +++ b/df_trees/blood_thorn.lua @@ -6,7 +6,7 @@ -- High density wood -- Depth 3 -local S = df_trees.S +local S = minetest.get_translator(minetest.get_current_modname()) local spike_directions = { {dir={x=0,y=0,z=1}, facedir=2}, @@ -26,6 +26,9 @@ local blood_thorn_after_dig = function(pos, oldnode, oldmetadata, digger) end end +local blood_thorn_min_delay = df_trees.config.blood_thorn_delay_multiplier*df_trees.config.tree_min_growth_delay +local blood_thorn_max_delay = df_trees.config.blood_thorn_delay_multiplier*df_trees.config.tree_max_growth_delay + minetest.register_node("df_trees:blood_thorn", { description = S("Blood Thorn Stem"), _doc_items_longdesc = df_trees.doc.blood_thorn_desc, @@ -34,12 +37,46 @@ minetest.register_node("df_trees:blood_thorn", { "dfcaverns_blood_thorn_side.png", "dfcaverns_blood_thorn_side.png", "dfcaverns_blood_thorn_side.png", "dfcaverns_blood_thorn_side.png"}, paramtype2 = "facedir", paramtype = "light", - groups = {choppy = 3, tree = 1, flammable = 2, light_sensitive_fungus = 11}, + groups = {choppy = 3, tree = 1, flammable = 2, light_sensitive_fungus = 11, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5, opaque=1}, _dfcaverns_dead_node = "df_trees:blood_thorn_dead", - sounds = df_trees.sounds.wood, + sounds = df_dependencies.sound_wood(), is_ground_content = false, on_place = minetest.rotate_node, after_dig_node = blood_thorn_after_dig, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, + + on_construct = function(pos) + if not df_trees.blood_thorn_growth_permitted(pos) then + return + end + minetest.get_node_timer(pos):start(math.random(blood_thorn_min_delay, blood_thorn_max_delay)) + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + local below = {x=pos.x, y=pos.y-1, z=pos.z} + local below_node = minetest.get_node(below) + while below_node.name == "df_trees:blood_thorn" do + -- if you chop down a bloodthorn it can start growing again + minetest.get_node_timer(below):start(math.random(blood_thorn_min_delay, blood_thorn_max_delay)) + below.y = below.y-1 + below_node = minetest.get_node(below) + end + end, + + on_timer = function(pos, elapsed) + while elapsed > blood_thorn_max_delay do + -- catch up if the block was unloaded for a long time + elapsed = elapsed - blood_thorn_max_delay + if not df_trees.grow_blood_thorn(vector.new(pos), minetest.get_node(pos)) then + return + end + end + if df_trees.grow_blood_thorn(vector.new(pos), minetest.get_node(pos)) then + minetest.get_node_timer(pos):start(math.random(blood_thorn_min_delay, blood_thorn_max_delay)) + end + end, + }) minetest.register_node("df_trees:blood_thorn_dead", { @@ -50,11 +87,13 @@ minetest.register_node("df_trees:blood_thorn_dead", { "dfcaverns_blood_thorn_side.png^[multiply:#804000"}, paramtype2 = "facedir", paramtype = "light", - groups = {choppy = 3, tree = 1, flammable = 2}, - sounds = df_trees.sounds.wood, + groups = {choppy = 3, tree = 1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), is_ground_content = false, on_place = minetest.rotate_node, after_dig_node = blood_thorn_after_dig, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, }) minetest.register_node("df_trees:blood_thorn_spike", { @@ -69,9 +108,9 @@ minetest.register_node("df_trees:blood_thorn_spike", { "dfcaverns_blood_thorn_spike_front.png", "dfcaverns_blood_thorn_spike_front.png" }, - groups = {choppy = 3, flammable = 2, fall_damage_add_percent=100, light_sensitive_fungus = 11}, + groups = {choppy = 3, flammable = 2, fall_damage_add_percent=100, light_sensitive_fungus = 11, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, _dfcaverns_dead_node = "df_trees:blood_thorn_spike_dead", - sounds = df_trees.sounds.wood, + sounds = df_dependencies.sound_wood(), drawtype = "nodebox", climbable = true, is_ground_content = false, @@ -86,6 +125,8 @@ minetest.register_node("df_trees:blood_thorn_spike", { {-0.0625, -0.0625, -0.5, 0.0625, 0.0625, -0.125}, -- tip } }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1, }) minetest.register_node("df_trees:blood_thorn_spike_dead", { @@ -100,8 +141,8 @@ minetest.register_node("df_trees:blood_thorn_spike_dead", { "dfcaverns_blood_thorn_spike_front.png^[multiply:#804000", "dfcaverns_blood_thorn_spike_front.png^[multiply:#804000" }, - groups = {choppy = 3, flammable = 2, fall_damage_add_percent=100}, - sounds = df_trees.sounds.wood, + groups = {choppy = 3, flammable = 2, fall_damage_add_percent=100, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), drawtype = "nodebox", climbable = true, is_ground_content = false, @@ -115,6 +156,8 @@ minetest.register_node("df_trees:blood_thorn_spike_dead", { {-0.0625, -0.0625, -0.5, 0.0625, 0.0625, -0.125}, -- tip } }, + _mcl_blast_resistance = 1, + _mcl_hardness = 0.8, }) @@ -140,11 +183,13 @@ minetest.register_node("df_trees:blood_thorn_wood", { place_param2 = 0, tiles = {"dfcaverns_blood_thorn_wood.png"}, is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, - sounds = df_trees.sounds.wood, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 2, + _mcl_hardness = 1, }) -df_trees.register_all_stairs("blood_thorn_wood") +df_dependencies.register_all_stairs_and_fences("blood_thorn_wood", {burntime = 40}) minetest.register_craft({ type = "fuel", @@ -191,11 +236,7 @@ function df_trees.grow_blood_thorn(pos, node) if node.param2 >= 4 then return end - pos.y = pos.y - 1 - if minetest.get_item_group(minetest.get_node(pos).name, "sand") == 0 then - return - end - pos.y = pos.y + 1 + local height = 0 local max_height = max_bloodthorn_height(pos) while node.name == "df_trees:blood_thorn" and height < max_height do @@ -222,15 +263,14 @@ function df_trees.grow_blood_thorn(pos, node) return true end -minetest.register_abm({ - label = "Grow Blood Thorn", - nodenames = {"df_trees:blood_thorn"}, - catch_up = true, - interval = df_trees.config.blood_thorn_growth_interval, - chance = df_trees.config.blood_thorn_growth_chance, - action = function(pos, node) - df_trees.grow_blood_thorn(pos, node) - end +minetest.register_lbm({ + label = "Start timers for bloodthorn nodes that used to depend on the ABM", + name = "df_trees:start_bloodthorn_timers", + nodenames = {"df_trees:blood_thorn"}, + run_at_every_load = false, + action = function(pos, node) + minetest.get_node_timer(pos):start(math.random(blood_thorn_min_delay, blood_thorn_max_delay)) + end, }) function df_trees.spawn_blood_thorn(pos) diff --git a/df_trees/config.lua b/df_trees/config.lua index 60f4d0f..41f4f86 100644 --- a/df_trees/config.lua +++ b/df_trees/config.lua @@ -31,6 +31,7 @@ local trees = { {name="nether_cap", delay_multiplier = 1}, {name="goblin_cap", delay_multiplier = 1}, {name="tower_cap", delay_multiplier = 1}, + {name="blood_thorn", delay_multiplier = 1}, } --Trees @@ -42,10 +43,8 @@ for _, tree in pairs(trees) do setting("float", tree.name.."_delay_multiplier", tree.delay_multiplier, tree.name.." growth delay multiplier") end -setting("int", "blood_thorn_growth_interval", 12, "blood_thorn growth ABM interval") -setting("int", "blood_thorn_growth_chance", 83, "blood_thorn growth ABM chance") - -if minetest.get_modpath("tnt") then +-- TODO: mineclone settings +if df_dependencies.tnt_boom then df_trees.config.enable_tnt = minetest.settings:get_bool("enable_tnt") if df_trees.config.enable_tnt == nil then -- Default to enabled when in singleplayer diff --git a/df_trees/dependencies.lua b/df_trees/dependencies.lua deleted file mode 100644 index 0d3a315..0000000 --- a/df_trees/dependencies.lua +++ /dev/null @@ -1,55 +0,0 @@ -df_trees.sounds = {} - -df_trees.sounds.wood = default.node_sound_wood_defaults() -df_trees.sounds.leaves = default.node_sound_leaves_defaults() -df_trees.sounds.nethercap_wood = default.node_sound_wood_defaults({ - footstep = {name = "default_snow_footstep", gain = 0.2}, -}) -df_trees.sounds.glass = default.node_sound_glass_defaults() - -df_trees.node_names = {} - -df_trees.node_names.torch = "default:torch" -df_trees.node_names.chest = "default:chest" -df_trees.node_names.furnace = "default:furnace" -df_trees.node_names.apple = "default:apple" -df_trees.node_names.gold_ingot = "default:gold_ingot" -df_trees.node_names.water_source = "default:water_source" -df_trees.node_names.river_water_source = "default:river_water_source" -df_trees.node_names.ice = "default:ice" -df_trees.node_names.water_flowing = "default:water_flowing" -df_trees.node_names.river_water_flowing = "default:river_water_flowing" -df_trees.node_names.snow = "default:snow" -df_trees.node_names.torch_wall = "default:torch_wall" -df_trees.node_names.stone_with_coal = "default:stone_with_coal" -df_trees.node_names.coalblock = "default:coalblock" -df_trees.node_names.paper = "default:paper" - - -df_trees.textures = {} -df_trees.textures.gold_block = "default_gold_block.png" - --- this stuff is only for during initialization -minetest.after(0, function() - df_trees.sounds = nil - df_trees.node_names = nil - df_trees.textures = nil -end) - - -df_trees.iron_containing_nodes = {"default:stone_with_iron", "default:steelblock"} -df_trees.copper_containing_nodes = {"default:stone_with_copper", "default:copperblock"} -df_trees.mese_containing_nodes = {"default:stone_with_mese", "default:mese"} - - -df_trees.after_place_leaves = default.after_place_leaves -df_trees.register_leafdecay = default.register_leafdecay - --- This is used by other mods, leave it exposed -df_trees.node_sound_tree_soft_fungus_defaults = function(table) - table = table or {} - table.footstep = table.footstep or - {name = "dfcaverns_fungus_footstep", gain = 0.3} - default.node_sound_wood_defaults(table) - return table -end diff --git a/df_trees/doc.lua b/df_trees/doc.lua index 40629ea..37e1a18 100644 --- a/df_trees/doc.lua +++ b/df_trees/doc.lua @@ -1,10 +1,12 @@ df_trees.doc = {} +local nethercap_name = df_dependencies.nethercap_name + if not minetest.get_modpath("doc") then return end -local S = df_trees.S +local S = minetest.get_translator(minetest.get_current_modname()) -- Trees df_trees.doc.black_cap_desc = S("The dense black wood of these mushrooms is heavy and hard to work with, and has few remarkable properties.") @@ -21,8 +23,8 @@ df_trees.doc.fungiwood_usage = S("Fungiwood stalk is strong and very fine-graine df_trees.doc.goblin_cap_desc = S("Massive but squat, mature goblin cap mushrooms are the size of small cottages.") df_trees.doc.goblin_cap_usage = S("Goblin cap stem and cap material can be cut into wood of two different hues, a subdued cream and a bright orange-red.") -df_trees.doc.nether_cap_desc = S("Nether caps have an unusual biochemistry that allows them to somehow subsist on ambient heat, in violation of all known laws of thermodynamics. They grow deep underground in frigid, icy caverns that should by all rights be volcanic.") -df_trees.doc.nether_cap_usage = S("Nether cap wood, in addition to being a beautiful blue hue, retains the odd heat-draining ability of living nether caps and is able to quickly freeze nearby water solid.") +df_trees.doc.nether_cap_desc = S("@1 have an unusual biochemistry that allows them to somehow subsist on ambient heat, in violation of all known laws of thermodynamics. They grow deep underground in frigid, icy caverns that should by all rights be volcanic.", nethercap_name) +df_trees.doc.nether_cap_usage = S("@1 wood, in addition to being a beautiful blue hue, retains the odd heat-draining ability of living icecaps and is able to quickly freeze nearby water solid.", nethercap_name) df_trees.doc.spore_tree_desc = S("Spore trees have a sturdy 'trunk' that supports a large spongy mesh of branching fibers, with embedded fruiting bodies that produce a copious amount of spores that gently rain down around the spore tree's base.") df_trees.doc.spore_tree_usage = S("Spore tree trunks can be cut into pale woody planks. The branching fibers and fruiting bodies are only useful as fuel.") diff --git a/df_trees/fungiwood.lua b/df_trees/fungiwood.lua index 558150b..ea7be80 100644 --- a/df_trees/fungiwood.lua +++ b/df_trees/fungiwood.lua @@ -5,7 +5,7 @@ -- Max trunk height 8 -- depth 1-2 -local S = df_trees.S +local S = minetest.get_translator(minetest.get_current_modname()) minetest.register_node("df_trees:fungiwood", { description = S("Fungiwood Stem"), @@ -14,8 +14,10 @@ minetest.register_node("df_trees:fungiwood", { tiles = {"dfcaverns_fungiwood.png"}, paramtype2 = "facedir", is_ground_content = false, - groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, - sounds = df_trees.sounds.wood, + groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 2, + _mcl_hardness = 2, on_place = minetest.rotate_node }) @@ -36,11 +38,13 @@ minetest.register_node("df_trees:fungiwood_wood", { place_param2 = 0, tiles = {"dfcaverns_fungiwood_wood.png"}, is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, - sounds = df_trees.sounds.wood, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 3, + _mcl_hardness = 2, }) -df_trees.register_all_stairs("fungiwood_wood") +df_dependencies.register_all_stairs_and_fences("fungiwood_wood", {burntime = 7}) minetest.register_craft({ type = "fuel", @@ -80,7 +84,7 @@ minetest.register_node("df_trees:fungiwood_shelf",{ } }, is_ground_content = false, - groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + groups = {snappy = 3, leafdecay = 5, flammable = 2, leaves = 1,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=30}, drop = { max_items = 1, items = { @@ -88,12 +92,15 @@ minetest.register_node("df_trees:fungiwood_shelf",{ {items = {"df_trees:fungiwood_shelf"}} } }, - sounds = df_trees.sounds.leaves, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, - after_place_node = df_trees.after_place_leaves, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes }) -df_trees.register_leafdecay({ +df_dependencies.register_leafdecay({ trunks = {"df_trees:fungiwood"}, leaves = {"df_trees:fungiwood_shelf"}, radius = 5, @@ -118,16 +125,17 @@ minetest.register_node("df_trees:fungiwood_sapling", { fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} }, groups = {snappy = 2, dig_immediate = 3, flammable = 2, - attached_node = 1, sapling = 1, light_sensitive_fungus = 11}, - sounds = df_trees.sounds.leaves, + attached_node = 1, sapling = 1, light_sensitive_fungus = 11, dig_immediate=3,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, on_construct = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") == 0 then - return + if df_trees.fungiwood_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.fungiwood_delay_multiplier*df_trees.config.tree_min_growth_delay, + df_trees.config.fungiwood_delay_multiplier*df_trees.config.tree_max_growth_delay)) end - minetest.get_node_timer(pos):start(math.random( - df_trees.config.fungiwood_delay_multiplier*df_trees.config.tree_min_growth_delay, - df_trees.config.fungiwood_delay_multiplier*df_trees.config.tree_max_growth_delay)) end, on_destruct = function(pos) minetest.get_node_timer(pos):stop() diff --git a/df_trees/goblin_cap.lua b/df_trees/goblin_cap.lua index aa6bc63..3932f54 100644 --- a/df_trees/goblin_cap.lua +++ b/df_trees/goblin_cap.lua @@ -1,5 +1,10 @@ local modpath = minetest.get_modpath(minetest.get_current_modname()) -local S = df_trees.S +local S = minetest.get_translator(minetest.get_current_modname()) + +local log_location +if minetest.get_modpath("mapgen_helper") and mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end --stem minetest.register_node("df_trees:goblin_cap_stem", { @@ -8,8 +13,10 @@ minetest.register_node("df_trees:goblin_cap_stem", { _doc_items_usagehelp = df_trees.doc.goblin_cap_usage, tiles = {"dfcaverns_goblin_cap_stem.png"}, is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, goblin_cap = 1}, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, goblin_cap = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) --cap @@ -19,8 +26,10 @@ minetest.register_node("df_trees:goblin_cap", { _doc_items_usagehelp = df_trees.doc.goblin_cap_usage, tiles = {"dfcaverns_goblin_cap.png"}, is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, goblin_cap = 1}, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, goblin_cap = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) --gills @@ -30,8 +39,8 @@ minetest.register_node("df_trees:goblin_cap_gills", { _doc_items_usagehelp = df_trees.doc.goblin_cap_usage, tiles = {"dfcaverns_goblin_cap_gills.png"}, is_ground_content = false, - groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, goblin_cap = 1}, - sounds = df_trees.sounds.leaves, + groups = {snappy = 3, leafdecay = 1, flammable = 2, leaves = 1, goblin_cap = 1,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=30}, + sounds = df_dependencies.sound_leaves(), drawtype = "plantlike", paramtype = "light", drop = { @@ -46,10 +55,13 @@ minetest.register_node("df_trees:goblin_cap_gills", { } } }, - after_place_node = df_trees.after_place_leaves, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, }) -df_trees.register_leafdecay({ +df_dependencies.register_leafdecay({ trunks = {"df_trees:goblin_cap"}, -- don't need stem nodes here leaves = {"df_trees:goblin_cap_gills"}, radius = 1, @@ -78,8 +90,10 @@ minetest.register_node("df_trees:goblin_cap_wood", { place_param2 = 0, tiles = {"dfcaverns_goblin_cap_wood.png"}, is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, - sounds = df_trees.sounds.wood, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 3, + _mcl_hardness = 2, }) minetest.register_node("df_trees:goblin_cap_stem_wood", { @@ -90,12 +104,14 @@ minetest.register_node("df_trees:goblin_cap_stem_wood", { place_param2 = 0, tiles = {"dfcaverns_goblin_cap_stem_wood.png"}, is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, - sounds = df_trees.sounds.wood, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 3, + _mcl_hardness = 2, }) -df_trees.register_all_stairs("goblin_cap_wood") -df_trees.register_all_stairs("goblin_cap_stem_wood") +df_dependencies.register_all_stairs_and_fences("goblin_cap_wood", {burntime = 12}) +df_dependencies.register_all_stairs_and_fences("goblin_cap_stem_wood", {burntime = 7}) minetest.register_craft({ type = "fuel", @@ -134,10 +150,10 @@ local bigger_goblin_cap_schem = dofile(modpath.."/schematics/goblin_cap_bigger.l local bigger_goblin_cap_hut_schem = dofile(modpath.."/schematics/goblin_cap_bigger_hut.lua") -- The hut has a chest and furnace near pos, use this to initialize it -local chest_node = df_trees.node_names.chest -local furnace_node = df_trees.node_names.furnace -local gold_item = df_trees.node_names.gold_ingot -local apple_item = df_trees.node_names.apple +local chest_node = df_dependencies.node_name_chest +local furnace_node = df_dependencies.node_name_furnace +local gold_item = df_dependencies.node_name_gold_ingot +local apple_item = df_dependencies.node_name_apple local chest_on_construct = minetest.registered_items[chest_node].on_construct local furnace_on_construct = minetest.registered_items[furnace_node].on_construct @@ -204,16 +220,17 @@ minetest.register_node("df_trees:goblin_cap_sapling", { fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} }, groups = {snappy = 2, dig_immediate = 3, flammable = 2, - attached_node = 1, sapling = 1, light_sensitive_fungus = 11}, - sounds = df_trees.sounds.leaves, + attached_node = 1, sapling = 1, light_sensitive_fungus = 11, dig_immediate=3,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, on_construct = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") == 0 then - return + if df_trees.goblin_cap_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.goblin_cap_delay_multiplier*df_trees.config.tree_min_growth_delay, + df_trees.config.goblin_cap_delay_multiplier*df_trees.config.tree_max_growth_delay)) end - minetest.get_node_timer(pos):start(math.random( - df_trees.config.goblin_cap_delay_multiplier*df_trees.config.tree_min_growth_delay, - df_trees.config.goblin_cap_delay_multiplier*df_trees.config.tree_max_growth_delay)) end, on_destruct = function(pos) minetest.get_node_timer(pos):stop() @@ -242,23 +259,6 @@ local c_stem = minetest.get_content_id("df_trees:goblin_cap_stem") local c_cap = minetest.get_content_id("df_trees:goblin_cap") local c_gills = minetest.get_content_id("df_trees:goblin_cap_gills") --- If the farming mod is installed, add the "straw" group to farming straw. --- This way we just need to check for group:straw to get cave straw as well, without --- needing a df_farming dependency for this mod. -if minetest.get_modpath("farming") then - local straw_def = minetest.registered_items["farming:straw"] - if straw_def then - local new_groups = {} - for group, val in pairs(straw_def.groups) do - new_groups[group] = val - end - new_groups.straw = 1 - minetest.override_item("farming:straw", { - groups = new_groups - }) - end -end - df_trees.spawn_goblin_cap = function(pos) if math.random() < 0.1 then if math.random() < 0.5 then @@ -295,18 +295,22 @@ df_trees.spawn_goblin_cap_vm = function(vi, area, data, data_param2) local pos = area:position(vi) if math.random() < 0.5 then mapgen_helper.place_schematic_on_data(data, data_param2, area, pos, big_goblin_cap_schem) + if log_location then log_location("goblin_cap_big", pos) end elseif math.random() < 0.9 then mapgen_helper.place_schematic_on_data(data, data_param2, area, pos, bigger_goblin_cap_schem) + if log_location then log_location("goblin_cap_bigger", pos) end else -- easter egg - every once in a while (0.5%), a mapgen Goblin cap is a Smurf house minetest.after(5, init_hut, pos) if math.random() < 0.5 then mapgen_helper.place_schematic_on_data(data, data_param2, area, pos, big_goblin_cap_hut_schem) + if log_location then log_location("goblin_cap_big_hut", pos) end else if init_vessels then minetest.after(5, init_vessels, pos) end mapgen_helper.place_schematic_on_data(data, data_param2, area, pos, bigger_goblin_cap_hut_schem) + if log_location then log_location("goblin_cap_bigger_hut", pos) end end end return diff --git a/df_trees/init.lua b/df_trees/init.lua index 45f0bdb..efaba73 100644 --- a/df_trees/init.lua +++ b/df_trees/init.lua @@ -1,59 +1,22 @@ df_trees = {} local modname = minetest.get_current_modname() -df_trees.S = minetest.get_translator(modname) local modpath = minetest.get_modpath(modname) +-- This is used by other mods, leave it exposed +df_trees.node_sound_tree_soft_fungus_defaults = function(table) + table = table or {} + table.footstep = table.footstep or + {name = "dfcaverns_fungus_footstep", gain = 0.3} + df_dependencies.sound_wood(table) + return table +end + --load companion lua files dofile(modpath.."/config.lua") -dofile(modpath.."/dependencies.lua") dofile(modpath.."/doc.lua") dofile(modpath.."/aliases.lua") -local S = df_trees.S - -df_trees.register_all_stairs = function(name, override_def) - local mod = "df_trees" - - local node_def = minetest.registered_nodes[mod..":"..name] - override_def = override_def or {} - - -- Note that a circular table reference will result in a crash, TODO: guard against that. - -- Unlikely to be needed, though - it'd take a lot of work for users to get into this bit of trouble. - local function deep_copy(table_in) - local table_out = {} - - for index, value in pairs(table_in) do - if type(value) == "table" then - table_out[index] = deep_copy(value) - else - table_out[index] = value - end - end - return table_out - end - - local node_copy = deep_copy(node_def) - for index, value in pairs(override_def) do - node_copy[index] = value - end - - if minetest.get_modpath("stairs") then - stairs.register_stair_and_slab( - name, - mod ..":" .. name, - node_copy.groups, - node_copy.tiles, - S("@1 Stair", node_copy.description), - S("@1 Slab", node_copy.description), - node_copy.sounds - ) - end - if minetest.get_modpath("moreblocks") then - stairsplus:register_all(mod, name, mod..":"..name, node_copy) - end -end - dofile(modpath.."/blood_thorn.lua") dofile(modpath.."/fungiwood.lua") dofile(modpath.."/tunnel_tube.lua") @@ -66,3 +29,4 @@ dofile(modpath.."/tower_cap.lua") dofile(modpath.."/torchspine.lua") dofile(modpath.."/spindlestem.lua") +dofile(modpath.."/sapling_growth_conditions.lua") \ No newline at end of file diff --git a/df_trees/locale/df_trees.de.tr b/df_trees/locale/df_trees.de.tr index 8ab76db..5363bcd 100644 --- a/df_trees/locale/df_trees.de.tr +++ b/df_trees/locale/df_trees.de.tr @@ -24,6 +24,10 @@ Dead Blood Thorn Stem= ### doc.lua ### +@1 have an unusual biochemistry that allows them to somehow subsist on ambient heat, in violation of all known laws of thermodynamics. They grow deep underground in frigid, icy caverns that should by all rights be volcanic.= + +@1 wood, in addition to being a beautiful blue hue, retains the odd heat-draining ability of living icecaps and is able to quickly freeze nearby water solid.= + #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE A torchspine alternates between active and quiescent phases and emits dim light when active. They can be harvested for torches, and their embers sprout into new torchspines when placed on flammable surfaces.=Eine Fackel wechselt zwischen aktiver und ruhender Phase und gibt schwaches Licht ab, wenn sie aktiv ist. Sie können für Fackeln geerntet werden, und ihre Glut sprießt auf brennbaren Oberflächen zu neuen Fackelstacheln. @@ -63,12 +67,6 @@ Living extract from the cap of a yellow Spindlestem.=Lebender Extrakt aus der Ka #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE Massive but squat, mature goblin cap mushrooms are the size of small cottages.=Massive, aber gedrungene, reife Koboldkappenpilze haben die Größe kleiner Hütten. -#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE -Nether cap wood, in addition to being a beautiful blue hue, retains the odd heat-draining ability of living nether caps and is able to quickly freeze nearby water solid.=Netherkappenholz ist nicht nur ein wunderschöner blauer Farbton, sondern behält auch die seltsame Wärmeableitungsfähigkeit lebender Netherkappen bei und kann in der Nähe befindliche Wasserfeststoffe schnell einfrieren. - -#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE -Nether caps have an unusual biochemistry that allows them to somehow subsist on ambient heat, in violation of all known laws of thermodynamics. They grow deep underground in frigid, icy caverns that should by all rights be volcanic.=Netherkappen haben eine ungewöhnliche Biochemie, die es ihnen ermöglicht, unter Verstoß gegen alle bekannten Gesetze der Thermodynamik von Umgebungswärme zu leben. Sie wachsen tief unter der Erde in kalten, eisigen Höhlen, die auf jeden Fall vulkanisch sein sollten. - #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE Red Spindlestems are a sign of nearby iron deposits - or perhaps Goblin Caps. Their glowing symbiotes can be extracted as a long-lived light source, though the glow is weak.=Rote Spindelstämme sind ein Zeichen für nahegelegene Eisenvorkommen - oder vielleicht Goblin Caps. Ihre leuchtenden Symbioten können als langlebige Lichtquelle extrahiert werden, obwohl das Leuchten schwach ist. @@ -153,22 +151,12 @@ Goblin Cap Stem= #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE Goblin Cap Stem Planks=Goblin Cap Stem Planken -### init.lua ### - -#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE -@1 Slab=@1 Platte -#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE -@1 Stair=@1 Treppe - ### nether_cap.lua ### -Nether Cap= -#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE -Nether Cap Gills=Nether Cap Kiemen -#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE -Nether Cap Planks=Nether Cap Planken -Nether Cap Spawn= -Nether Cap Stem= +@1 Gills= +@1 Planks= +@1 Spawn= +@1 Stem= ### spindlestem.lua ### @@ -231,3 +219,18 @@ Tunnel Tube Fruiting Body=Tunnelrohr-Fruchtkörper #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE Tunnel Tube Plies=Tunnelrohrlagen Tunnel Tube Spawn= + + +##### not used anymore ##### + + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Nether cap wood, in addition to being a beautiful blue hue, retains the odd heat-draining ability of living nether caps and is able to quickly freeze nearby water solid.=Netherkappenholz ist nicht nur ein wunderschöner blauer Farbton, sondern behält auch die seltsame Wärmeableitungsfähigkeit lebender Netherkappen bei und kann in der Nähe befindliche Wasserfeststoffe schnell einfrieren. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Nether caps have an unusual biochemistry that allows them to somehow subsist on ambient heat, in violation of all known laws of thermodynamics. They grow deep underground in frigid, icy caverns that should by all rights be volcanic.=Netherkappen haben eine ungewöhnliche Biochemie, die es ihnen ermöglicht, unter Verstoß gegen alle bekannten Gesetze der Thermodynamik von Umgebungswärme zu leben. Sie wachsen tief unter der Erde in kalten, eisigen Höhlen, die auf jeden Fall vulkanisch sein sollten. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Nether Cap Gills=Nether Cap Kiemen +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Nether Cap Planks=Nether Cap Planken diff --git a/df_trees/locale/df_trees.it.tr b/df_trees/locale/df_trees.it.tr index 8327365..5829ac3 100644 --- a/df_trees/locale/df_trees.it.tr +++ b/df_trees/locale/df_trees.it.tr @@ -19,6 +19,10 @@ Dead Blood Thorn Stem=Gambo di spina del sangue morta ### doc.lua ### +@1 have an unusual biochemistry that allows them to somehow subsist on ambient heat, in violation of all known laws of thermodynamics. They grow deep underground in frigid, icy caverns that should by all rights be volcanic.= + +@1 wood, in addition to being a beautiful blue hue, retains the odd heat-draining ability of living icecaps and is able to quickly freeze nearby water solid.= + #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE A torchspine alternates between active and quiescent phases and emits dim light when active. They can be harvested for torches, and their embers sprout into new torchspines when placed on flammable surfaces.=Una torcia alterna le fasi attiva e quiescente ed emette una luce fioca quando è attiva. Possono essere raccolti per le torce e le loro braci germogliano in nuove spine delle torce quando vengono posizionate su superfici infiammabili. @@ -58,12 +62,6 @@ Living extract from the cap of a yellow Spindlestem.=Estratto vivo dal cappello #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE Massive but squat, mature goblin cap mushrooms are the size of small cottages.=I funghi goblin sono grandi ma tozzi e maturi, hanno le dimensioni di piccoli cottage. -#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE -Nether cap wood, in addition to being a beautiful blue hue, retains the odd heat-draining ability of living nether caps and is able to quickly freeze nearby water solid.=Il legno del cappuccio inferiore, oltre ad essere una bella tonalità blu, conserva la strana capacità di drenaggio del calore dei tappi inferiori viventi ed è in grado di congelare rapidamente l'acqua solida vicina. - -#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE -Nether caps have an unusual biochemistry that allows them to somehow subsist on ambient heat, in violation of all known laws of thermodynamics. They grow deep underground in frigid, icy caverns that should by all rights be volcanic.=I cappucci inferiori hanno una biochimica insolita che consente loro di sopravvivere in qualche modo al calore ambientale, in violazione di tutte le leggi conosciute della termodinamica. Crescono in profondità nel sottosuolo in caverne gelide che dovrebbero a tutti gli effetti essere vulcaniche. - #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE Red Spindlestems are a sign of nearby iron deposits - or perhaps Goblin Caps. Their glowing symbiotes can be extracted as a long-lived light source, though the glow is weak.=I Red Spindlestems sono un segno di depositi di ferro vicini - o forse Goblin Caps. I loro simbionti luminosi possono essere estratti come fonte di luce a lunga durata, anche se il bagliore è debole. @@ -144,20 +142,12 @@ Goblin Cap Spawn=Prole di cappello di folletto Goblin Cap Stem=Gambo di cappello di folletto Goblin Cap Stem Planks=Assi di gambo di cappello di folletto -### init.lua ### - -#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE -@1 Slab=@1 Lastra -#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE -@1 Stair=@1 Scala - ### nether_cap.lua ### -Nether Cap=Cappello del Nether -Nether Cap Gills=Lamelle di cappello del Nether -Nether Cap Planks=Assi di cappello del Nether -Nether Cap Spawn=Prole di cappello del Nether -Nether Cap Stem=Gambo di cappello del Nether +@1 Gills=Lamelle di @1 +@1 Planks=Assi di @1 +@1 Spawn=Prole di @1 +@1 Stem=Gambo di @1 ### spindlestem.lua ### @@ -207,3 +197,14 @@ Tunnel Tube=Tubo di galleria Tunnel Tube Fruiting Body=Corpo fruttifero del tubo di galleria Tunnel Tube Plies=Strati di tubo di galleria Tunnel Tube Spawn=Prole di tubo di galleria + + +##### not used anymore ##### + + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Nether cap wood, in addition to being a beautiful blue hue, retains the odd heat-draining ability of living nether caps and is able to quickly freeze nearby water solid.=Il legno del cappuccio inferiore, oltre ad essere una bella tonalità blu, conserva la strana capacità di drenaggio del calore dei tappi inferiori viventi ed è in grado di congelare rapidamente l'acqua solida vicina. + +#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE +Nether caps have an unusual biochemistry that allows them to somehow subsist on ambient heat, in violation of all known laws of thermodynamics. They grow deep underground in frigid, icy caverns that should by all rights be volcanic.=I cappucci inferiori hanno una biochimica insolita che consente loro di sopravvivere in qualche modo al calore ambientale, in violazione di tutte le leggi conosciute della termodinamica. Crescono in profondità nel sottosuolo in caverne gelide che dovrebbero a tutti gli effetti essere vulcaniche. + diff --git a/df_trees/locale/template.txt b/df_trees/locale/template.txt index 2ea1dda..cc5d27a 100644 --- a/df_trees/locale/template.txt +++ b/df_trees/locale/template.txt @@ -19,6 +19,10 @@ Dead Blood Thorn Stem= ### doc.lua ### +@1 have an unusual biochemistry that allows them to somehow subsist on ambient heat, in violation of all known laws of thermodynamics. They grow deep underground in frigid, icy caverns that should by all rights be volcanic.= + +@1 wood, in addition to being a beautiful blue hue, retains the odd heat-draining ability of living icecaps and is able to quickly freeze nearby water solid.= + A torchspine alternates between active and quiescent phases and emits dim light when active. They can be harvested for torches, and their embers sprout into new torchspines when placed on flammable surfaces.= Aside from the artistic applications of its particularly dark color, black cap wood is a long-burning fuel source that's as good as coal for some applications. Black cap gills are oily and make for excellent torch fuel.= @@ -44,10 +48,6 @@ Living extract from the cap of a yellow Spindlestem.= Massive but squat, mature goblin cap mushrooms are the size of small cottages.= -Nether cap wood, in addition to being a beautiful blue hue, retains the odd heat-draining ability of living nether caps and is able to quickly freeze nearby water solid.= - -Nether caps have an unusual biochemistry that allows them to somehow subsist on ambient heat, in violation of all known laws of thermodynamics. They grow deep underground in frigid, icy caverns that should by all rights be volcanic.= - Red Spindlestems are a sign of nearby iron deposits - or perhaps Goblin Caps. Their glowing symbiotes can be extracted as a long-lived light source, though the glow is weak.= Spindlestems are too big to easily pluck by hand but too small to be called a proper tree. Nevertheless, they are a common and useful resource for underground travelers - particularly their glowing caps.= @@ -107,18 +107,12 @@ Goblin Cap Spawn= Goblin Cap Stem= Goblin Cap Stem Planks= -### init.lua ### - -@1 Slab= -@1 Stair= - ### nether_cap.lua ### -Nether Cap= -Nether Cap Gills= -Nether Cap Planks= -Nether Cap Spawn= -Nether Cap Stem= +@1 Gills= +@1 Planks= +@1 Spawn= +@1 Stem= ### spindlestem.lua ### diff --git a/df_trees/mod.conf b/df_trees/mod.conf index af4d486..f29022f 100644 --- a/df_trees/mod.conf +++ b/df_trees/mod.conf @@ -1,4 +1,4 @@ name = df_trees description = Adds various types of underground fungal "trees". Light kills their saplings, they only grow in the dark. -depends = default -optional_depends = doc, moreblocks, stairs, vessels, basic_materials, farming, doors, beds, df_farming \ No newline at end of file +depends = df_dependencies +optional_depends = doc, basic_materials, df_farming, mapgen_helper, looped_node_sound \ No newline at end of file diff --git a/df_trees/nether_cap.lua b/df_trees/nether_cap.lua index 9a3c455..0470225 100644 --- a/df_trees/nether_cap.lua +++ b/df_trees/nether_cap.lua @@ -1,37 +1,43 @@ -local S = df_trees.S +local S = minetest.get_translator(minetest.get_current_modname()) + +local nethercap_name = df_dependencies.nethercap_name --stem minetest.register_node("df_trees:nether_cap_stem", { - description = S("Nether Cap Stem"), + description = S("@1 Stem", nethercap_name), _doc_items_longdesc = df_trees.doc.nether_cap_desc, _doc_items_usagehelp = df_trees.doc.nether_cap_usage, tiles = {"dfcaverns_nether_cap_stem.png"}, is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, puts_out_fire = 1, cools_lava = 1, freezes_water = 1, nether_cap = 1}, - sounds = df_trees.sounds.wood, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, puts_out_fire = 1, cools_lava = 1, freezes_water = 1, nether_cap = 1, handy=1,axey=1, building_block=1, material_wood=1}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 0.7, + _mcl_hardness = 0.7, }) --cap minetest.register_node("df_trees:nether_cap", { - description = S("Nether Cap"), + description = nethercap_name, _doc_items_longdesc = df_trees.doc.nether_cap_desc, _doc_items_usagehelp = df_trees.doc.nether_cap_usage, tiles = {"dfcaverns_nether_cap.png"}, is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, puts_out_fire = 1, cools_lava = 1, freezes_water = 1, nether_cap = 1}, - sounds = df_trees.sounds.nethercap_wood, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, puts_out_fire = 1, cools_lava = 1, freezes_water = 1, nether_cap = 1, handy=1,axey=1, building_block=1, material_wood=1}, + sounds = df_dependencies.sound_wood({footstep = {name = df_dependencies.soundfile_snow_footstep, gain = 0.2},}), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, }) --gills minetest.register_node("df_trees:nether_cap_gills", { - description = S("Nether Cap Gills"), + description = S("@1 Gills", nethercap_name), _doc_items_longdesc = df_trees.doc.nether_cap_desc, _doc_items_usagehelp = df_trees.doc.nether_cap_usage, tiles = {"dfcaverns_nether_cap_gills.png"}, is_ground_content = false, light_source = 6, - groups = {snappy = 3, leafdecay = 3, leaves = 1, puts_out_fire = 1, cools_lava = 1, freezes_water = 1, nether_cap = 1}, - sounds = df_trees.sounds.leaves, + groups = {snappy = 3, leafdecay = 1, leaves = 1, puts_out_fire = 1, cools_lava = 1, freezes_water = 1, nether_cap = 1,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1}, + sounds = df_dependencies.sound_leaves(), drawtype = "plantlike", paramtype = "light", drop = { @@ -46,10 +52,13 @@ minetest.register_node("df_trees:nether_cap_gills", { } } }, - after_place_node = df_trees.after_place_leaves, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes + _mcl_blast_resistance = 0.1, + _mcl_hardness = 0.1, }) -df_trees.register_leafdecay({ +df_dependencies.register_leafdecay({ trunks = {"df_trees:nether_cap"}, -- don't need stem nodes here leaves = {"df_trees:nether_cap_gills"}, radius = 1, @@ -71,22 +80,24 @@ minetest.register_craft({ }) minetest.register_node("df_trees:nether_cap_wood", { - description = S("Nether Cap Planks"), + description = S("@1 Planks", nethercap_name), _doc_items_longdesc = df_trees.doc.nether_cap_desc, _doc_items_usagehelp = df_trees.doc.nether_cap_usage, paramtype2 = "facedir", place_param2 = 0, tiles = {"dfcaverns_nether_cap_wood.png"}, is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, wood = 1, freezes_water = 1}, - sounds = df_trees.sounds.wood, + groups = {choppy = 2, oddly_breakable_by_hand = 2, wood = 1, freezes_water = 1, handy=1,axey=1,building_block=1, material_wood=1}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, }) -df_trees.register_all_stairs("nether_cap_wood") +df_dependencies.register_all_stairs_and_fences("nether_cap_wood") -- sapling minetest.register_node("df_trees:nether_cap_sapling", { - description = S("Nether Cap Spawn"), + description = S("@1 Spawn", nethercap_name), _doc_items_longdesc = df_trees.doc.nether_cap_desc, _doc_items_usagehelp = df_trees.doc.nether_cap_usage, drawtype = "plantlike", @@ -104,18 +115,17 @@ minetest.register_node("df_trees:nether_cap_sapling", { fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} }, groups = {snappy = 2, dig_immediate = 3, - attached_node = 1, sapling = 1, light_sensitive_fungus = 11}, - sounds = df_trees.sounds.leaves, + attached_node = 1, sapling = 1, light_sensitive_fungus = 11, dig_immediate=3,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1}, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.1, + _mcl_hardness = 0.1, on_construct = function(pos) - local node_below_name = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name - if minetest.get_item_group(node_below_name, "cools_lava") == 0 or minetest.get_item_group(node_below_name, "nether_cap") > 0 then - return + if df_trees.nether_cap_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.nether_cap_delay_multiplier*df_trees.config.tree_min_growth_delay, + df_trees.config.nether_cap_delay_multiplier*df_trees.config.tree_max_growth_delay)) end - - minetest.get_node_timer(pos):start(math.random( - df_trees.config.nether_cap_delay_multiplier*df_trees.config.tree_min_growth_delay, - df_trees.config.nether_cap_delay_multiplier*df_trees.config.tree_max_growth_delay)) end, on_destruct = function(pos) minetest.get_node_timer(pos):stop() @@ -162,12 +172,12 @@ df_trees.spawn_nether_cap_vm = function(vi, area, data) subterrane.giant_mushroom(vi, area, data, c_stem, c_cap, c_gills, stem_height, cap_radius) end -local water = df_trees.node_names.water_source -local river_water = df_trees.node_names.river_water_source -local ice = df_trees.node_names.ice -local water_flowing = df_trees.node_names.water_flowing -local river_water_flowing = df_trees.node_names.river_water_flowing -local snow = df_trees.node_names.snow +local water = df_dependencies.node_name_water_source +local river_water = df_dependencies.node_name_river_water_source +local ice = df_dependencies.node_name_ice +local water_flowing = df_dependencies.node_name_water_flowing +local river_water_flowing = df_dependencies.node_name_river_water_flowing +local snow = df_dependencies.node_name_snow minetest.register_abm{ label = "water freezing", diff --git a/df_trees/sapling_growth_conditions.lua b/df_trees/sapling_growth_conditions.lua new file mode 100644 index 0000000..846ea29 --- /dev/null +++ b/df_trees/sapling_growth_conditions.lua @@ -0,0 +1,52 @@ +-- these methods should indicate whether a sapling placed at pos should bother attempting to grow. +-- check soil conditions and biome here, for example. + +local stone_with_coal = df_dependencies.node_name_stone_with_coal +local coalblock = df_dependencies.node_name_coalblock +local is_coal = function(name) + return name == stone_with_coal or name == coalblock +end + +df_trees.black_cap_growth_permitted = function(pos) + local below_name = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name + return minetest.get_item_group(below_name, "soil") > 0 or is_coal(below_name) +end + +df_trees.blood_thorn_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "sand") > 0 +end + +df_trees.fungiwood_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end + +df_trees.goblin_cap_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end + +df_trees.nether_cap_growth_permitted = function(pos) + local below_name = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name + return (minetest.get_item_group(below_name, "cools_lava") > 0 or minetest.get_item_group(below_name, "ice") > 0) + and minetest.get_item_group(below_name, "nether_cap") == 0 +end + +df_trees.spindlestem_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end + +df_trees.spore_tree_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end + +df_trees.torchspine_growth_permitted = function(pos) + local below_name = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name + return minetest.get_item_group(below_name, "flammable") > 0 or is_coal(below_name) +end + +df_trees.tower_cap_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end + +df_trees.tunnel_tube_growth_permitted = function(pos) + return minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") > 0 +end \ No newline at end of file diff --git a/df_trees/schematics/goblin_cap_big_hut.lua b/df_trees/schematics/goblin_cap_big_hut.lua index c04ca15..a63c2bf 100644 --- a/df_trees/schematics/goblin_cap_big_hut.lua +++ b/df_trees/schematics/goblin_cap_big_hut.lua @@ -1,42 +1,37 @@ local n1 = { name = "air", prob = 0 } -- external air local n2 = { name = "df_trees:goblin_cap" } -local n3 = {name = "stairs:slab_goblin_cap_stem_wood", param2 = 2} -- porch top +local n3 = {name = df_dependencies.node_name_slab_goblin_cap_stem_wood, param2 = 2} -- porch top local n4 = { name = "df_trees:goblin_cap_gills" } local n6 = { name = "df_trees:goblin_cap_stem", force_place=true } -- walls local n7 = { name = "df_trees:goblin_cap_stem_wood", force_place=true } -- internal floor -local n8 = { name = "doors:door_wood_a", force_place=true } -local n9 = { name = "doors:hidden", force_place=true } -local n10 = { name = "default:furnace", param2 = 3, force_place=true } +local n8 = { name = df_dependencies.node_name_door_wood_a or "air", force_place=true } +local n9 = { name = df_dependencies.node_name_door_hidden or "air", force_place=true } +local n10 = { name = df_dependencies.node_name_furnace, param2 = 3, force_place=true } local n11 = { name = "air", force_place=true } -- internal air -local n12 = { name = "beds:bed_bottom", force_place=true } +local n12 = { name = df_dependencies.node_name_bed_bottom or "air", force_place=true } local n13 = { name = "df_trees:goblin_cap_stem", prob = 198, force_place=true } -- possible window holes -local n16 = { name = "default:chest", param2 = 3, force_place=true } -local n17 = { name = "beds:bed_top", force_place=true } -local n18 = { name = "default:torch_wall", param2 = 4, force_place=true } +local n16 = { name = df_dependencies.node_name_chest, param2 = 3, force_place=true } +local n17 = { name = df_dependencies.node_name_bed_top or "air", force_place=true } +local n18 = { name = df_dependencies.node_name_torch_wall, param2 = 4, force_place=true } local n19 = { name = "df_trees:goblin_cap_stem" } -- base -local n20 = {name = "stairs:stair_goblin_cap_stem_wood", param2 = 1 } -local n21 = {name = "stairs:stair_goblin_cap_stem_wood", param2 = 3 } -local n22 = {name = "stairs:slab_goblin_cap_stem_wood", param2 = 22} - - +local n20 = {name = df_dependencies.node_name_stair_goblin_cap_stem_wood, param2 = 1 } +local n21 = {name = df_dependencies.node_name_stair_goblin_cap_stem_wood, param2 = 3 } +local n22 = {name = df_dependencies.node_name_slab_goblin_cap_stem_wood, param2 = 22} if minetest.get_modpath("vessels") then n18 = { name = "df_trees:glowing_bottle_red", force_place=true} end -if not minetest.get_modpath("doors") then - -- replace the door with air - n8 = n11 - n9 = n11 -end -if not minetest.get_modpath("beds") then - --replace the bed with air - n12 = n11 - n17 = n11 +if not df_dependencies.node_name_stair_goblin_cap_stem_wood then + -- replace stairs with air + n3 = n1 + n20 = n1 + n21 = n1 + n22 = n1 end -return { +local schematic = { yslice_prob = {}, size = {y = 9, x = 11, z = 11}, center_pos = {x=5, y=2, z=5}, @@ -251,3 +246,9 @@ return { n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, } } + +for index, node in ipairs(schematic.data) do + assert(node.name ~= nil, "undefined node name for index " .. tostring(index) .. " in goblin_cap_big_hut schematic data") +end + +return schematic \ No newline at end of file diff --git a/df_trees/schematics/goblin_cap_bigger_hut.lua b/df_trees/schematics/goblin_cap_bigger_hut.lua index 9be6270..43bfe8b 100644 --- a/df_trees/schematics/goblin_cap_bigger_hut.lua +++ b/df_trees/schematics/goblin_cap_bigger_hut.lua @@ -5,41 +5,29 @@ local n4 = { name = "df_trees:goblin_cap_gills" } local n5 = { name = "df_trees:goblin_cap_stem", force_place = true } -- walls, force place these local n6 = { name = "df_trees:goblin_cap_stem", prob = 198, force_place=true } -- possible window holes local n7 = { name = "df_trees:goblin_cap_stem_wood", force_place=true } -- internal floor -local n8 = { name = "default:furnace", param2 = 2, force_place=true } +local n8 = { name = df_dependencies.node_name_furnace, param2 = 2, force_place=true } local n9 = { name = "air", force_place=true } -- internal air -local n10 = { name = "default:torch_wall", param2 = 3, force_place = true } -local n12 = {name = "stairs:slab_goblin_cap_stem_wood", param2 = 2} -- porch top -local n13 = { name = "doors:door_wood_a", param2 = 3, force_place = true } -local n14 = { name = "doors:hidden", param2 = 3, force_place = true } +local n10 = { name = df_dependencies.node_name_torch_wall, param2 = 3, force_place = true } +local n12 = {name = df_dependencies.node_name_slab_goblin_cap_stem_wood, param2 = 2} -- porch top +local n13 = { name = df_dependencies.node_name_door_wood_a or "air", param2 = 3, force_place = true } +local n14 = { name = df_dependencies.node_name_door_hidden or "air", param2 = 3, force_place = true } local n15 = n9 -- internal air, but could be a vessel shelf -local n16 = { name = "beds:bed_top", param2 = 3, force_place = true } -local n17 = { name = "beds:bed_bottom", param2 = 3, force_place = true } -local n18 = { name = "default:chest", force_place = true } -local n19 = { name = "default:torch_wall", param2 = 2, force_place = true } -local n20 = {name = "stairs:stair_goblin_cap_stem_wood" } -local n21 = {name = "stairs:stair_goblin_cap_stem_wood", param2 = 2 } -local n22 = {name = "stairs:slab_goblin_cap_stem_wood", param2 = 22} +local n16 = { name = df_dependencies.node_name_bed_top or "air", param2 = 3, force_place = true } +local n17 = { name = df_dependencies.node_name_bed_bottom or "air", param2 = 3, force_place = true } +local n18 = { name = df_dependencies.node_name_chest, force_place = true } +local n19 = { name = df_dependencies.node_name_torch_wall, param2 = 2, force_place = true } +local n20 = {name = df_dependencies.node_name_stair_goblin_cap_stem_wood } +local n21 = {name = df_dependencies.node_name_stair_goblin_cap_stem_wood, param2 = 2 } +local n22 = {name = df_dependencies.node_name_slab_goblin_cap_stem_wood, param2 = 22} -if minetest.get_modpath("vessels") then +if df_dependencies.node_name_shelf then -- replace torches with glowing bottles, add vessel shelf n10 = { name = "df_trees:glowing_bottle_red", force_place=true} n19 = n10 - n15 = { name = "vessels:shelf", param2 = 3, force_place = true } + n15 = { name = df_dependencies.node_name_shelf, param2 = 3, force_place = true } end -if not minetest.get_modpath("doors") then - -- replace the door with air - n13 = n9 - n14 = n9 -end -if not minetest.get_modpath("beds") then - --replace the bed with air - n16 = n9 - n17 = n9 -end - - -return { +local schematic = { yslice_prob = {}, size = {y = 10, x = 13, z = 13}, center_pos = {x=6, y=2, z=6}, @@ -318,3 +306,9 @@ return { n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, n1, } } + +for index, node in ipairs(schematic.data) do + assert(node.name ~= nil, "undefined node name for index " .. tostring(index) .. " in goblin_cap_bigger_hut schematic data") +end + +return schematic \ No newline at end of file diff --git a/df_trees/settingtypes.txt b/df_trees/settingtypes.txt index 78ea24d..d760af9 100644 --- a/df_trees/settingtypes.txt +++ b/df_trees/settingtypes.txt @@ -7,5 +7,4 @@ dfcaverns_black_cap_delay_multiplier (black_cap growth delay multiplier) float 1 dfcaverns_nether_cap_delay_multiplier (nether_cap growth delay multiplier) float 1 dfcaverns_goblin_cap_delay_multiplier (goblin_cap growth delay multiplier) float 1 dfcaverns_tower_cap_delay_multiplier (tower_cap growth delay multiplier) float 1 -dfcaverns_blood_thorn_growth_interval (blood_thorn growth ABM interval) int 12 -dfcaverns_blood_thorn_growth_chance (blood_thorn growth ABM chance) int 83 +dfcaverns_blood_thorn_delay_multiplier (blood_thorn growth delay multiplier) float 1 \ No newline at end of file diff --git a/df_trees/sounds/dfcaverns_torchspine_ignite.ogg b/df_trees/sounds/dfcaverns_torchspine_ignite.ogg new file mode 100644 index 0000000..3935bff Binary files /dev/null and b/df_trees/sounds/dfcaverns_torchspine_ignite.ogg differ diff --git a/df_trees/sounds/dfcaverns_torchspine_loop.ogg b/df_trees/sounds/dfcaverns_torchspine_loop.ogg new file mode 100644 index 0000000..8c7e81b Binary files /dev/null and b/df_trees/sounds/dfcaverns_torchspine_loop.ogg differ diff --git a/df_trees/sounds/license.txt b/df_trees/sounds/license.txt index 68c4707..99381db 100644 --- a/df_trees/sounds/license.txt +++ b/df_trees/sounds/license.txt @@ -1,2 +1,5 @@ dfcaverns_fungus_footstep are from https://freesound.org/people/jakeh111/sounds/60853/ under CC-BY-SA 3.0 in 2008 by jakeh111 -dfcaverns_spore_tree_pitter_patter are from https://freesound.org/people/martinimeniscus/sounds/199332/ by martinimeniscus under the CC0 public domain license \ No newline at end of file +dfcaverns_spore_tree_pitter_patter are from https://freesound.org/people/martinimeniscus/sounds/199332/ by martinimeniscus under the CC0 public domain license + +dfcaverns_torchspine_loop is from https://freesound.org/people/PegasusCZ/sounds/569332/ by PegasusCZ under the CC0 public domain license +dfcaverns_torchspine_ignite is from https://freesound.org/people/deleted_user_4772965/sounds/256510/ by Patrick Hunt5 under the CC0 public domain license \ No newline at end of file diff --git a/df_trees/spindlestem.lua b/df_trees/spindlestem.lua index d318dcd..a37b52e 100644 --- a/df_trees/spindlestem.lua +++ b/df_trees/spindlestem.lua @@ -1,12 +1,22 @@ -local S = df_trees.S +local S = minetest.get_translator(minetest.get_current_modname()) -local vessels = minetest.get_modpath("vessels") +local glass_bottle = df_dependencies.node_name_glass_bottle -- pre-declare local get_spindlestem_cap_type -- Copied from subterrane's features.lua -- Figured that was nicer than adding a dependency for just this little bit + +local function copy_pointed_thing(pointed_thing) + return { + type = pointed_thing.type, + above = pointed_thing.above and vector.copy(pointed_thing.above), + under = pointed_thing.under and vector.copy(pointed_thing.under), + ref = pointed_thing.ref, + } +end + local stem_on_place = function(itemstack, placer, pointed_thing) local pt = pointed_thing -- check if pointing at a node @@ -43,8 +53,24 @@ local stem_on_place = function(itemstack, placer, pointed_thing) end -- add the node and remove 1 item from the itemstack - minetest.add_node(pt.above, {name = itemstack:get_name(), param2 = new_param2}) - if not minetest.settings:get_bool("creative_mode", false) then + local newnode= {name = itemstack:get_name(), param2 = new_param2, param1=0} + local oldnode= minetest.get_node(pt.above) + minetest.add_node(pt.above, newnode) + + -- Run script hook + local take_item = true + for _, callback in ipairs(core.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + local place_to_copy = vector.copy(pt.above) + local newnode_copy = {name=newnode.name, param1=newnode.param1, param2=newnode.param2} + local oldnode_copy = {name=oldnode.name, param1=oldnode.param1, param2=oldnode.param2} + local pointed_thing_copy = copy_pointed_thing(pointed_thing) + if callback(place_to_copy, newnode_copy, placer, oldnode_copy, itemstack, pointed_thing_copy) then + take_item = false + end + end + + if not minetest.is_creative_enabled(placer:get_player_name()) and take_item then itemstack:take_item() end return itemstack @@ -63,8 +89,8 @@ minetest.register_node("df_trees:spindlestem_stem", { _doc_items_longdesc = df_trees.doc.spindlestem_desc, _doc_items_usagehelp = df_trees.doc.spindlestem_usage, is_ground_content = false, - groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, spindlestem = 1}, - sounds = df_trees.sounds.wood, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, spindlestem = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), tiles = { "dfcaverns_tower_cap.png", }, @@ -80,6 +106,8 @@ minetest.register_node("df_trees:spindlestem_stem", { } }, on_place = stem_on_place, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) minetest.register_craft({ @@ -90,14 +118,15 @@ minetest.register_craft({ local register_spindlestem_type = function(item_suffix, colour_name, colour_code, light_level, extract_color_group) local cap_item = "df_trees:spindlestem_cap_"..item_suffix + local cap_item_harvested = "df_trees:spindlestem_cap_harvested_"..item_suffix - minetest.register_node(cap_item, { + local cap_def = { description = S("@1 Spindlestem Cap", colour_name), is_ground_content = false, _doc_items_longdesc = df_trees.doc["spindlestem_cap_"..item_suffix.."_desc"], _doc_items_usagehelp = df_trees.doc["spindlestem_cap_"..item_suffix.."_usage"], - groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, spindlestem = 1}, - sounds = df_trees.sounds.wood, + groups = {wood = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, spindlestem = 1, not_in_creative_inventory = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), tiles = { "dfcaverns_tower_cap.png^[multiply:#"..colour_code, "dfcaverns_spindlestem_cap.png^[multiply:#"..colour_code, @@ -120,6 +149,8 @@ local register_spindlestem_type = function(item_suffix, colour_name, colour_code {-0.1875+disp, -0.3125, -0.1875+disp, 0.3125+disp, -0.1875, 0.3125+disp}, } }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, drop = { -- Maximum number of items to drop @@ -127,19 +158,19 @@ local register_spindlestem_type = function(item_suffix, colour_name, colour_code -- Choose max_items randomly from this list items = { { - items = {cap_item, "df_trees:spindlestem_seedling"}, -- Items to drop + items = {cap_item_harvested, "df_trees:spindlestem_seedling"}, -- Items to drop rarity = 2, -- Probability of dropping is 1 / rarity }, { - items = {cap_item, "df_trees:spindlestem_seedling", "df_trees:spindlestem_seedling"}, -- Items to drop + items = {cap_item_harvested, "df_trees:spindlestem_seedling", "df_trees:spindlestem_seedling"}, -- Items to drop rarity = 2, -- Probability of dropping is 1 / rarity }, { - items = {cap_item, "df_trees:spindlestem_seedling", "df_trees:spindlestem_seedling", "df_trees:spindlestem_seedling"}, -- Items to drop + items = {cap_item_harvested, "df_trees:spindlestem_seedling", "df_trees:spindlestem_seedling", "df_trees:spindlestem_seedling"}, -- Items to drop rarity = 2, -- Probability of dropping is 1 / rarity }, { - items = {cap_item}, -- Items to drop + items = {cap_item_harvested}, -- Items to drop rarity = 1, -- Probability of dropping is 1 / rarity }, }, @@ -177,22 +208,34 @@ local register_spindlestem_type = function(item_suffix, colour_name, colour_code minetest.get_node_timer(pos):start(delay-elapsed) end end, - }) + } + + local cap_def_harvested = {} + for key, val in pairs(cap_def) do + cap_def_harvested[key] = val + end + cap_def_harvested.groups = {} + for key, val in pairs(cap_def.groups) do + cap_def_harvested.groups[key] = val + end + cap_def_harvested.drop = nil -- harvested caps shouldn't drop spawn + cap_def_harvested.on_timer = nil -- harvested caps shouldn't grow, just in case a timer and node metadata are set up where it's placed + cap_def_harvested.groups.not_in_creative_inventory = nil + + minetest.register_node(cap_item, cap_def) + minetest.register_node(cap_item_harvested, cap_def_harvested) minetest.register_craft({ type = "fuel", - recipe = cap_item, + recipe = cap_item_harvested, burntime = 10, }) - - local c_stem = minetest.get_content_id("df_trees:spindlestem_stem") - local c_cap = minetest.get_content_id(cap_item) - if vessels and light_level > 0 then - local tex = "dfcaverns_vessels_glowing_liquid.png^[multiply:#"..colour_code.."^vessels_glass_bottle.png" + if glass_bottle and light_level > 0 then + local tex = "dfcaverns_vessels_glowing_liquid.png^[multiply:#"..colour_code.."^"..df_dependencies.texture_glass_bottle local new_light = light_level + math.floor((minetest.LIGHT_MAX-light_level)/2) - local groups = {vessel = 1, dig_immediate = 3, attached_node = 1} + local groups = {vessel = 1, dig_immediate = 3, attached_node = 1, material_glass = 1, destroy_by_lava_flow=1} if extract_color_group then groups[extract_color_group] = 1 end @@ -213,23 +256,25 @@ local register_spindlestem_type = function(item_suffix, colour_name, colour_code fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} }, groups = groups, - sounds = df_trees.sounds.glass, + sounds = df_dependencies.sound_glass(), light_source = new_light, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, }) minetest.register_craft( { output = "df_trees:glowing_bottle_"..item_suffix.." 3", type = "shapeless", recipe = { - "vessels:glass_bottle", - "vessels:glass_bottle", - "vessels:glass_bottle", - cap_item, + glass_bottle, + glass_bottle, + glass_bottle, + cap_item_harvested, } }) minetest.register_craft( { - output = "vessels:glass_bottle", + output = glass_bottle, type = "shapeless", recipe = { "df_trees:glowing_bottle_"..item_suffix, @@ -245,7 +290,7 @@ minetest.register_node("df_trees:spindlestem_seedling", { tiles = { "dfcaverns_tower_cap.png", }, - groups = {snappy = 3, flammable = 2, plant = 1, attached_node = 1, light_sensitive_fungus = 11, digtron_on_place=1}, + groups = {snappy = 3, flammable = 2, plant = 1, attached_node = 1, light_sensitive_fungus = 11, digtron_on_place=1, dig_immediate=3,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -258,13 +303,14 @@ minetest.register_node("df_trees:spindlestem_seedling", { {-0.0625 + 0.125, -0.5, -0.125 + 0.125, 0.125 + 0.125, -0.375, 0.0625 + 0.125}, } }, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, on_place = stem_on_place, on_construct = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") == 0 then - return + if df_trees.spindlestem_growth_permitted(pos) then + minetest.get_node_timer(pos):start(growth_delay()) end - minetest.get_node_timer(pos):start(growth_delay()) end, on_destruct = function(pos) minetest.get_node_timer(pos):stop() @@ -274,25 +320,28 @@ minetest.register_node("df_trees:spindlestem_seedling", { if df_farming and df_farming.kill_if_sunlit(pos) then return end - - local cap_item = minetest.get_name_from_content_id(get_spindlestem_cap_type(pos)) - local node = minetest.get_node(pos) - minetest.set_node(pos, {name=cap_item, param2 = node.param2}) - local meta = minetest.get_meta(pos) - local disp = {x=3, y=3, z=3} - local nearby = minetest.find_nodes_in_area(vector.add(pos, disp), vector.subtract(pos, disp), {"group:spindlestem"}) - local count = #nearby - local height = math.random(1,3) - if count > 10 then height = height + 2 end -- if there are a lot of nearby spindlestems, grow taller - if height > 0 then - local delay = growth_delay() - meta:set_int("spindlestem_to_grow", height) - meta:set_int("spindlestem_delay", delay) - minetest.get_node_timer(pos):start(delay) - end + df_trees.spawn_spindlestem(pos) end, }) +df_trees.spawn_spindlestem = function(pos) + local cap_item = minetest.get_name_from_content_id(get_spindlestem_cap_type(pos)) + local node = minetest.get_node(pos) + minetest.set_node(pos, {name=cap_item, param2 = node.param2}) + local disp = {x=3, y=3, z=3} + local nearby = minetest.find_nodes_in_area(vector.add(pos, disp), vector.subtract(pos, disp), {"group:spindlestem"}) + local count = #nearby + local height = math.random(1,3) + if count > 10 then height = height + 2 end -- if there are a lot of nearby spindlestems, grow taller + if height > 0 then + local delay = growth_delay() + local meta = minetest.get_meta(pos) + meta:set_int("spindlestem_to_grow", height) + meta:set_int("spindlestem_delay", delay) + minetest.get_node_timer(pos):start(delay) + end +end + register_spindlestem_type("white", S("White"), "FFFFFF", 0) register_spindlestem_type("red", S("Red"), "FFC3C3", 3, "color_red") register_spindlestem_type("green", S("Green"), "C3FFC3", 4, "color_green") @@ -336,6 +385,10 @@ local c_green = minetest.get_content_id("df_trees:spindlestem_cap_green") local c_cyan = minetest.get_content_id("df_trees:spindlestem_cap_cyan") local c_golden = minetest.get_content_id("df_trees:spindlestem_cap_golden") +local iron_nodes = df_dependencies.data_iron_containing_nodes +local copper_nodes = df_dependencies.data_copper_containing_nodes +local mese_nodes = df_dependencies.data_mese_containing_nodes + get_spindlestem_cap_type = function(pos) if minetest.find_node_near(pos, 15, "group:tower_cap") then return c_white @@ -344,9 +397,9 @@ get_spindlestem_cap_type = function(pos) return c_red end - local iron = minetest.find_node_near(pos, 5, df_trees.iron_containing_nodes) - local copper = minetest.find_node_near(pos, 5, df_trees.copper_containing_nodes) - local mese = minetest.find_node_near(pos, 5, df_trees.mese_containing_nodes) + local iron = minetest.find_node_near(pos, 5, iron_nodes) + local copper = minetest.find_node_near(pos, 5, copper_nodes) + local mese = minetest.find_node_near(pos, 5, mese_nodes) local possibilities = {} if mese then table.insert(possibilities, c_golden) end diff --git a/df_trees/spore_tree.lua b/df_trees/spore_tree.lua index 614dcdc..dd8dd93 100644 --- a/df_trees/spore_tree.lua +++ b/df_trees/spore_tree.lua @@ -6,7 +6,7 @@ -- Max trunk height 5 -- depth 2-3 -local S = df_trees.S +local S = minetest.get_translator(minetest.get_current_modname()) minetest.register_node("df_trees:spore_tree", { description = S("Spore Tree Stem"), @@ -15,8 +15,10 @@ minetest.register_node("df_trees:spore_tree", { tiles = {"dfcaverns_spore_tree_top.png", "dfcaverns_spore_tree_top.png", "dfcaverns_spore_tree.png"}, paramtype2 = "facedir", is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, - sounds = df_trees.sounds.wood, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 2, + _mcl_hardness = 2, on_place = minetest.rotate_node, }) @@ -37,11 +39,13 @@ minetest.register_node("df_trees:spore_tree_wood", { place_param2 = 0, tiles = {"dfcaverns_spore_tree_wood.png"}, is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, - sounds = df_trees.sounds.wood, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 3, + _mcl_hardness = 2, }) -df_trees.register_all_stairs("spore_tree_wood") +df_dependencies.register_all_stairs_and_fences("spore_tree_wood", {burntime = 6}) minetest.register_craft({ type = "fuel", @@ -76,7 +80,7 @@ minetest.register_node("df_trees:spore_tree_hyphae", { waving = 1, tiles = {"dfcaverns_spore_tree.png"}, is_ground_content = false, - groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, spore_tree_hyphae = 1}, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, spore_tree_hyphae = 1,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=30}, walkable = false, climbable = true, @@ -90,9 +94,12 @@ minetest.register_node("df_trees:spore_tree_hyphae", { {-0.5, -0.0625, -0.0625, 0.5, 0.0625, 0.0625}, } }, - sounds = df_trees.sounds.leaves, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, - after_place_node = df_trees.after_place_leaves, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes }) minetest.register_node("df_trees:spore_tree_fruiting_body", { @@ -102,9 +109,11 @@ minetest.register_node("df_trees:spore_tree_fruiting_body", { waving = 1, tiles = {"dfcaverns_spore_tree.png"}, is_ground_content = false, - groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, spore_tree_hyphae = 1}, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, spore_tree_hyphae = 1,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=100}, walkable = false, climbable = true, + _mcl_blast_resistance = 0.7, + _mcl_hardness = 0.7, drawtype = "nodebox", paramtype = "light", @@ -130,12 +139,13 @@ minetest.register_node("df_trees:spore_tree_fruiting_body", { } } }, - sounds = df_trees.sounds.leaves, + sounds = df_dependencies.sound_leaves(), - after_place_node = df_trees.after_place_leaves, + after_place_node = df_dependencies.after_place_leaves, + place_param2 = 1, -- Prevent leafdecay for placed nodes }) -df_trees.register_leafdecay({ +df_dependencies.register_leafdecay({ trunks = {"df_trees:spore_tree"}, leaves = {"df_trees:spore_tree_hyphae", "df_trees:spore_tree_fruiting_body"}, radius = 3, @@ -160,16 +170,17 @@ minetest.register_node("df_trees:spore_tree_sapling", { fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} }, groups = {snappy = 2, dig_immediate = 3, flammable = 2, - attached_node = 1, sapling = 1, light_sensitive_fungus = 11}, - sounds = df_trees.sounds.leaves, + attached_node = 1, sapling = 1, light_sensitive_fungus = 11, dig_immediate=3,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, on_construct = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") == 0 then - return + if df_trees.spore_tree_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.spore_tree_delay_multiplier*df_trees.config.tree_min_growth_delay, + df_trees.config.spore_tree_delay_multiplier*df_trees.config.tree_max_growth_delay)) end - minetest.get_node_timer(pos):start(math.random( - df_trees.config.spore_tree_delay_multiplier*df_trees.config.tree_min_growth_delay, - df_trees.config.spore_tree_delay_multiplier*df_trees.config.tree_max_growth_delay)) end, on_destruct = function(pos) minetest.get_node_timer(pos):stop() @@ -330,7 +341,9 @@ minetest.register_node("df_trees:spore_tree_ladder", { selection_box = { type = "wallmounted", }, - groups = {choppy = 2, oddly_breakable_by_hand = 3, flammable = 2}, + groups = {choppy = 2, oddly_breakable_by_hand = 3, flammable = 2, handy=1,axey=1, attached_node=1, deco_block=1, dig_by_piston=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, legacy_wallmounted = true, - sounds = df_trees.sounds.wood, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 1, + _mcl_hardness = 1, }) diff --git a/df_trees/torchspine.lua b/df_trees/torchspine.lua index 585db4e..0f28da0 100644 --- a/df_trees/torchspine.lua +++ b/df_trees/torchspine.lua @@ -1,9 +1,23 @@ -local S = df_trees.S +local S = minetest.get_translator(minetest.get_current_modname()) + +local torchspine_min_delay = df_trees.config.blood_thorn_delay_multiplier*df_trees.config.tree_min_growth_delay +local torchspine_max_delay = df_trees.config.blood_thorn_delay_multiplier*df_trees.config.tree_max_growth_delay + +local looped_node_sound_modpath = minetest.get_modpath("looped_node_sound") -- Rather than make this whole mod depend on subterrane just for this, I copied and pasted a chunk of stalactite code. local x_disp = 0.125 local z_disp = 0.125 +local function copy_pointed_thing(pointed_thing) + return { + type = pointed_thing.type, + above = pointed_thing.above and vector.copy(pointed_thing.above), + under = pointed_thing.under and vector.copy(pointed_thing.under), + ref = pointed_thing.ref, + } +end + local stal_on_place = function(itemstack, placer, pointed_thing) local pt = pointed_thing -- check if pointing at a node @@ -40,8 +54,24 @@ local stal_on_place = function(itemstack, placer, pointed_thing) end -- add the node and remove 1 item from the itemstack + local newnode= {name = itemstack:get_name(), param2 = new_param2, param1=0} + local oldnode= minetest.get_node(pt.above) minetest.add_node(pt.above, {name = itemstack:get_name(), param2 = new_param2}) - if not minetest.settings:get_bool("creative_mode", false) then + + -- Run script hook + local take_item = true + for _, callback in ipairs(core.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + local place_to_copy = vector.copy(pt.above) + local newnode_copy = {name=newnode.name, param1=newnode.param1, param2=newnode.param2} + local oldnode_copy = {name=oldnode.name, param1=oldnode.param1, param2=oldnode.param2} + local pointed_thing_copy = copy_pointed_thing(pointed_thing) + if callback(place_to_copy, newnode_copy, placer, oldnode_copy, itemstack, pointed_thing_copy) then + take_item = false + end + end + + if not minetest.is_creative_enabled(placer:get_player_name()) and take_item then itemstack:take_item() end return itemstack @@ -52,14 +82,57 @@ local stal_box_2 = {{-0.125+x_disp, -0.5, -0.125+z_disp, 0.125+x_disp, 0.5, 0.12 local stal_box_3 = {{-0.25+x_disp, -0.5, -0.25+z_disp, 0.25+x_disp, 0.5, 0.25+z_disp}} local stal_box_4 = {{-0.375+x_disp, -0.5, -0.375+z_disp, 0.375+x_disp, 0.5, 0.375+z_disp}} -local torch_node = df_trees.node_names.torch +local torchspine_list = {"df_trees:torchspine_1","df_trees:torchspine_2","df_trees:torchspine_3","df_trees:torchspine_4"} +local grow_torchspine = function(pos) + local param2 = minetest.get_node(pos).param2 + + if param2 > 3 then + return -- tipped over, don't grow + end + + local node_above = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) + local node_above_def = minetest.registered_nodes[node_above.name] + if not node_above_def.buildable_to then + -- don't grow, but do continue cycling the torch state + minetest.swap_node(pos, {name = "df_trees:torchspine_1", param2 = param2}) + minetest.get_node_timer(pos):start(math.random(torchspine_min_delay, torchspine_max_delay)) + return + end + + local pos_base = vector.new(pos) + local height = 1 + for i = 1,3 do + pos_base.y = pos_base.y-1 + if minetest.get_item_group(minetest.get_node(pos_base).name, "df_trees_torchspine") > 0 then + height = height + 1 + else + break + end + end + if height >= 4 then + -- don't grow, but do continue cycling the torch state + minetest.swap_node(pos, {name = "df_trees:torchspine_1", param2 = param2}) + minetest.get_node_timer(pos):start(math.random(torchspine_min_delay, torchspine_max_delay)) + return + end + + -- place a taller torchspine + pos.y = pos.y + 1 + minetest.get_node_timer(pos):start(math.random(torchspine_min_delay, torchspine_max_delay)) + for i = 1, height+1 do + minetest.swap_node(pos, {name=torchspine_list[i], param2 = param2}) + pos.y = pos.y - 1 + end +end + +local torch_node = df_dependencies.node_name_torch minetest.register_node("df_trees:torchspine_1", { description = S("Torchspine Tip"), _doc_items_longdesc = df_trees.doc.torchspine_desc, _doc_items_usagehelp = df_trees.doc.torchspine_usage, tiles = {"dfcaverns_torchspine_0.5.png", "dfcaverns_torchspine_1.5.png", "dfcaverns_torchspine_1.png"}, - groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1, fall_damage_add_percent = 100}, + groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1, fall_damage_add_percent = 100, df_trees_torchspine = 1, pickaxey=1, building_block=1, material_stone=1}, drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -69,20 +142,36 @@ minetest.register_node("df_trees:torchspine_1", { type = "fixed", fixed = stal_box_1, }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + on_place = stal_on_place, on_punch = function(pos, node, puncher) if puncher:get_wielded_item():get_name() == torch_node then minetest.swap_node(pos, {name = "df_trees:torchspine_1_lit", param2 = node.param2}) end end, + + on_timer = function(pos) + local above_def = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name] + if above_def and above_def.buildable_to then + minetest.swap_node(pos, {name="df_trees:torchspine_1_lit", param2=minetest.get_node(pos).param2}) + minetest.sound_play({pos = pos}, {name="dfcaverns_torchspine_ignite"}, true) + end + minetest.get_node_timer(pos):start(math.random(torchspine_min_delay, torchspine_max_delay)) + end, + + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, }) minetest.register_node("df_trees:torchspine_1_lit", { description = S("Torchspine Tip"), _doc_items_longdesc = df_trees.doc.torchspine_desc, _doc_items_usagehelp = df_trees.doc.torchspine_usage, - tiles = {df_trees.textures.gold_block, "dfcaverns_torchspine_1.5.png", "dfcaverns_torchspine_1_lit.png"}, - groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1, torch = 1, fall_damage_add_percent = 150, smokey = 4}, + tiles = {df_dependencies.texture_gold_block, "dfcaverns_torchspine_1.5.png", "dfcaverns_torchspine_1_lit.png"}, + groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1, torch = 1, fall_damage_add_percent = 150, smokey = 4, df_trees_torchspine = 1,pickaxey=1, building_block=1, material_stone=1,set_on_fire=3}, drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -93,15 +182,35 @@ minetest.register_node("df_trees:torchspine_1_lit", { type = "fixed", fixed = stal_box_1, }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + on_place = stal_on_place, + + on_timer = function(pos) + grow_torchspine(pos) + end, + + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, }) +if looped_node_sound_modpath then + looped_node_sound.register({ + node_list = {"df_trees:torchspine_1_lit"}, + sound = "dfcaverns_torchspine_loop", + max_gain = 0.5, + gain_per_node = 0.05, + }) +end + minetest.register_node("df_trees:torchspine_2", { description = S("Torchspine"), _doc_items_longdesc = df_trees.doc.torchspine_desc, _doc_items_usagehelp = df_trees.doc.torchspine_usage, tiles = {"dfcaverns_torchspine_1.5.png", "dfcaverns_torchspine_2.5.png", "dfcaverns_torchspine_2.png"}, - groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1, fall_damage_add_percent = 50}, + groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1, fall_damage_add_percent = 50, df_trees_torchspine = 1,pickaxey=1, building_block=1, material_stone=1}, drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -110,6 +219,9 @@ minetest.register_node("df_trees:torchspine_2", { type = "fixed", fixed = stal_box_2, }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + drop = { max_items = 1, items = { @@ -127,7 +239,7 @@ minetest.register_node("df_trees:torchspine_3", { _doc_items_longdesc = df_trees.doc.torchspine_desc, _doc_items_usagehelp = df_trees.doc.torchspine_usage, tiles = {"dfcaverns_torchspine_2.5.png", "dfcaverns_torchspine_3.5.png", "dfcaverns_torchspine_3.png"}, - groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1}, + groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1, df_trees_torchspine = 1,pickaxey=1, building_block=1, material_stone=1}, drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -136,6 +248,9 @@ minetest.register_node("df_trees:torchspine_3", { type = "fixed", fixed = stal_box_3, }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + drop = { max_items = 1, items = { @@ -157,7 +272,7 @@ minetest.register_node("df_trees:torchspine_4", { _doc_items_longdesc = df_trees.doc.torchspine_desc, _doc_items_usagehelp = df_trees.doc.torchspine_usage, tiles = {"dfcaverns_torchspine_3.5.png", "dfcaverns_torchspine_4.5.png", "dfcaverns_torchspine_4.png"}, - groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1}, + groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1, df_trees_torchspine = 1,pickaxey=1, building_block=1, material_stone=1}, drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -166,6 +281,9 @@ minetest.register_node("df_trees:torchspine_4", { type = "fixed", fixed = stal_box_4, }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + drop = { max_items = 1, items = { @@ -186,7 +304,7 @@ minetest.register_node("df_trees:torchspine_ember", { _doc_items_longdesc = df_trees.doc.torchspine_desc, _doc_items_usagehelp = df_trees.doc.torchspine_usage, tiles = {"dfcaverns_torchspine_0.5.png",}, - groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1}, + groups = {oddly_breakable_by_hand = 1, subterrane_stal_align = 1, flow_through = 1,pickaxey=1, building_block=1, material_stone=1,set_on_fire=1}, drawtype = "nodebox", paramtype = "light", light_source = 2, @@ -200,7 +318,25 @@ minetest.register_node("df_trees:torchspine_ember", { {-0.0625 + x_disp, -0.5, -0.125 + z_disp, 0.125 + x_disp, -0.375, 0.0625 + z_disp}, } }, + _mcl_blast_resistance = 10, + _mcl_hardness = 1, + on_place = stal_on_place, + + on_construct = function(pos) + if df_trees.torchspine_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random(torchspine_min_delay, torchspine_max_delay)) + end + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + end, + + on_timer = function(pos) + minetest.swap_node(pos, {name="df_trees:torchspine_1", param2=minetest.get_node(pos).param2}) + minetest.get_node_timer(pos):start(math.random(torchspine_min_delay, torchspine_max_delay)) + minetest.sound_play({pos = pos}, {name="dfcaverns_torchspine_ignite"}, true) + end, }) df_trees.spawn_torchspine = function(pos) @@ -256,83 +392,20 @@ df_trees.spawn_torchspine_vm = function(vi, area, data, data_param2, height, lit local index = vi + area.ystride*i data[index] = list[height-i] data_param2[index] = param2 - end + end + + local pos = area:position(vi) + pos.y = pos.y+height-1 + local node = minetest.get_node(pos) + minetest.get_node_timer(pos):start(math.random()*3000) end --- overriding node groups using override_item doesn't appear to work with ABMs: --- https://github.com/minetest/minetest/issues/5518 -local coal_def = minetest.registered_nodes[df_trees.node_names.stone_with_coal] -local coal_block_def = minetest.registered_nodes[df_trees.node_names.coalblock] -if coal_def then - coal_def.groups.coal = 1 - minetest.register_node(":"..df_trees.node_names.stone_with_coal, coal_def) -end -coal_block_def.groups.coal = 1 -minetest.register_node(":"..df_trees.node_names.coalblock, coal_block_def) - -minetest.register_abm{ - label = "torchspine germinating", - nodenames = {"df_trees:torchspine_ember"}, - neighbors = {"group:flammable", "group:coal"}, - interval = 30, - chance = 10, - catch_up = true, - action = function(pos) - local below_name = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name - if minetest.get_item_group(below_name, "flammable") > 0 or minetest.get_item_group(below_name, "coal") > 0 then - minetest.swap_node(pos, {name="df_trees:torchspine_1", param2=minetest.get_node(pos).param2}) - end +minetest.register_lbm({ + label = "Start timers for torchspine nodes that used to depend on the ABM", + name = "df_trees:start_torchspine_timers", + nodenames = {"df_trees:torchspine_ember", "df_trees:torchspine_1", "df_trees:torchspine_1_lit"}, + run_at_every_load = false, + action = function(pos, node) + minetest.get_node_timer(pos):start(math.random(torchspine_min_delay, torchspine_max_delay)) end, -} -minetest.register_abm{ - label = "torchspine lighting", - nodenames = {"df_trees:torchspine_1"}, - interval = 30, - chance = 10, - catch_up = true, - action = function(pos) - local above_def = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name] - if above_def and above_def.buildable_to then - minetest.swap_node(pos, {name="df_trees:torchspine_1_lit", param2=minetest.get_node(pos).param2}) - end - end, -} -local torchspine_list = {"df_trees:torchspine_1","df_trees:torchspine_2","df_trees:torchspine_3","df_trees:torchspine_4"} -minetest.register_abm{ - label = "torchspine growing", - nodenames = {"df_trees:torchspine_1_lit"}, - interval = 37, - chance = 10, - catch_up = true, - action = function(pos) - local height = 0 - local param2 = minetest.get_node(pos).param2 - local dest_list = {{x=pos.x, y=pos.y+1, z=pos.z},pos,{x=pos.x, y=pos.y-1, z=pos.z},{x=pos.x, y=pos.y-2, z=pos.z},{x=pos.x, y=pos.y-3, z=pos.z}} - local source_list = { - minetest.get_node(dest_list[1]).name, - minetest.get_node(dest_list[2]).name, - minetest.get_node(dest_list[3]).name, - minetest.get_node(dest_list[4]).name, - minetest.get_node(dest_list[5]).name - } - local target_def = minetest.registered_nodes[source_list[1]] - if target_def and target_def.buildable_to then - for i = 2,4 do - if minetest.get_item_group(source_list[i+1], "flammable") > 0 or minetest.get_item_group(source_list[i+1], "coal") > 0 then - height = i - break - elseif source_list[i+1] ~= torchspine_list[i] then - height = 0 - break - end - end - end - if height == 0 then - minetest.swap_node(pos, {name="df_trees:torchspine_1", param2=param2}) - return - end - for i = 1, height do - minetest.swap_node(dest_list[i], {name=torchspine_list[i], param2=param2}) - end - end, -} +}) diff --git a/df_trees/tower_cap.lua b/df_trees/tower_cap.lua index 265300c..c39200d 100644 --- a/df_trees/tower_cap.lua +++ b/df_trees/tower_cap.lua @@ -1,4 +1,4 @@ -local S = df_trees.S +local S = minetest.get_translator(minetest.get_current_modname()) --stem minetest.register_node("df_trees:tower_cap_stem", { @@ -7,8 +7,10 @@ minetest.register_node("df_trees:tower_cap_stem", { _doc_items_usagehelp = df_trees.doc.tower_cap_usage, tiles = {"dfcaverns_tower_cap.png"}, is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, tower_cap = 1}, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, tower_cap = 1, tower_cap_trunk = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) --cap @@ -18,8 +20,10 @@ minetest.register_node("df_trees:tower_cap", { _doc_items_usagehelp = df_trees.doc.tower_cap_usage, tiles = {"dfcaverns_tower_cap.png"}, is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, tower_cap = 1}, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, tower_cap = 1, tower_cap_trunk = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, sounds = df_trees.node_sound_tree_soft_fungus_defaults(), + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) --gills @@ -29,8 +33,8 @@ minetest.register_node("df_trees:tower_cap_gills", { _doc_items_usagehelp = df_trees.doc.tower_cap_usage, tiles = {"dfcaverns_tower_cap_gills.png"}, is_ground_content = false, - groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, tower_cap = 1}, - sounds = df_trees.sounds.leaves, + groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1, tower_cap = 1,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30, compostability=30}, + sounds = df_dependencies.sound_leaves(), drawtype = "plantlike", paramtype = "light", drop = { @@ -45,10 +49,12 @@ minetest.register_node("df_trees:tower_cap_gills", { } } }, - after_place_node = df_trees.after_place_leaves, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + after_place_node = df_dependencies.after_place_leaves, }) -df_trees.register_leafdecay({ +df_dependencies.register_leafdecay({ trunks = {"df_trees:tower_cap"}, -- don't need stem nodes here leaves = {"df_trees:tower_cap_gills"}, radius = 1, @@ -58,14 +64,7 @@ df_trees.register_leafdecay({ minetest.register_craft({ output = 'df_trees:tower_cap_wood 4', recipe = { - {'df_trees:tower_cap'}, - } -}) - -minetest.register_craft({ - output = 'df_trees:tower_cap_wood 4', - recipe = { - {'df_trees:tower_cap_stem'}, + {'group:tower_cap_trunk'}, } }) @@ -77,11 +76,13 @@ minetest.register_node("df_trees:tower_cap_wood", { place_param2 = 0, tiles = {"dfcaverns_tower_cap_wood.png"}, is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, - sounds = df_trees.sounds.wood, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 3, + _mcl_hardness = 2, }) -df_trees.register_all_stairs("tower_cap_wood") +df_dependencies.register_all_stairs_and_fences("tower_cap_wood", {burntime = 7}) minetest.register_craft({ type = "fuel", @@ -129,16 +130,17 @@ minetest.register_node("df_trees:tower_cap_sapling", { fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} }, groups = {snappy = 2, dig_immediate = 3, flammable = 2, - attached_node = 1, sapling = 1, light_sensitive_fungus = 11}, - sounds = df_trees.sounds.leaves, + attached_node = 1, sapling = 1, light_sensitive_fungus = 11, dig_immediate=3,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, on_construct = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") == 0 then - return + if df_trees.tower_cap_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.tower_cap_delay_multiplier*df_trees.config.tree_min_growth_delay, + df_trees.config.tower_cap_delay_multiplier*df_trees.config.tree_max_growth_delay)) end - minetest.get_node_timer(pos):start(math.random( - df_trees.config.tower_cap_delay_multiplier*df_trees.config.tree_min_growth_delay, - df_trees.config.tower_cap_delay_multiplier*df_trees.config.tree_max_growth_delay)) end, on_destruct = function(pos) minetest.get_node_timer(pos):stop() diff --git a/df_trees/tunnel_tube.lua b/df_trees/tunnel_tube.lua index 3a5d9fc..07369e6 100644 --- a/df_trees/tunnel_tube.lua +++ b/df_trees/tunnel_tube.lua @@ -6,7 +6,7 @@ -- Max trunk height 8 -- depth 2-3 -local S = df_trees.S +local S = minetest.get_translator(minetest.get_current_modname()) minetest.register_node("df_trees:tunnel_tube", { description = S("Tunnel Tube"), @@ -17,9 +17,11 @@ minetest.register_node("df_trees:tunnel_tube", { drawtype = "nodebox", is_ground_content = false, paramtype = "light", - groups = {choppy = 3, tree = 1, oddly_breakable_by_hand=1, flammable = 2}, - sounds = df_trees.sounds.wood, + groups = {choppy = 3, tree = 1, oddly_breakable_by_hand=1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), on_place = minetest.rotate_node, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, node_box = { type = "fixed", @@ -43,8 +45,8 @@ minetest.register_node("df_trees:tunnel_tube_slant_bottom", { mesh = "tunnel_tube_slant.obj", paramtype = "light", drop = "df_trees:tunnel_tube", - groups = {choppy = 3, tree = 1, oddly_breakable_by_hand=1, flammable = 2}, - sounds = df_trees.sounds.wood, + groups = {choppy = 3, tree = 1, oddly_breakable_by_hand=1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), on_place = minetest.rotate_node, selection_box = { type = "fixed", @@ -60,7 +62,8 @@ minetest.register_node("df_trees:tunnel_tube_slant_bottom", { {-0.5, 0.0, -0.875, 0.5, 0.5, 0.125}, }, }, - + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) minetest.register_node("df_trees:tunnel_tube_slant_top", { @@ -74,8 +77,8 @@ minetest.register_node("df_trees:tunnel_tube_slant_top", { mesh = "tunnel_tube_slant_2.obj", paramtype = "light", drop = "df_trees:tunnel_tube", - groups = {choppy = 3, tree = 1, oddly_breakable_by_hand=1, flammable = 2}, - sounds = df_trees.sounds.wood, + groups = {choppy = 3, tree = 1, oddly_breakable_by_hand=1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), on_place = minetest.rotate_node, selection_box = { type = "fixed", @@ -91,6 +94,8 @@ minetest.register_node("df_trees:tunnel_tube_slant_top", { {-0.5, 0.0, -0.375, 0.5, 0.5, 0.625}, }, }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) minetest.register_node("df_trees:tunnel_tube_slant_full", { @@ -104,8 +109,8 @@ minetest.register_node("df_trees:tunnel_tube_slant_full", { mesh = "tunnel_tube_slant_full.obj", paramtype = "light", drop = "df_trees:tunnel_tube", - groups = {choppy = 3, tree = 1, oddly_breakable_by_hand=1, flammable = 2}, - sounds = df_trees.sounds.wood, + groups = {choppy = 3, tree = 1, oddly_breakable_by_hand=1, flammable = 2, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = df_dependencies.sound_wood(), on_place = minetest.rotate_node, selection_box = { type = "fixed", @@ -121,6 +126,8 @@ minetest.register_node("df_trees:tunnel_tube_slant_full", { {-0.5, 0, -1.25, 0.5, 0.5, -0.25}, }, }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, }) --Wood @@ -133,7 +140,7 @@ minetest.register_craft({ -- Paper minetest.register_craft({ - output = df_trees.node_names.paper .. " 3", + output = df_dependencies.node_name_paper .. " 3", type = "shapeless", recipe = {'df_trees:tunnel_tube', 'bucket:bucket_water'}, replacements = {{"bucket:bucket_water", "bucket:bucket_empty"}}, @@ -147,11 +154,13 @@ minetest.register_node("df_trees:tunnel_tube_wood", { place_param2 = 0, tiles = {"dfcaverns_tunnel_tube_wood_top.png", "dfcaverns_tunnel_tube_wood_top.png", "dfcaverns_tunnel_tube_wood_side.png"}, is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, - sounds = df_trees.sounds.wood, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, handy=1,axey=1, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 10, + _mcl_hardness = 2, }) -df_trees.register_all_stairs("tunnel_tube_wood") +df_dependencies.register_all_stairs_and_fences("tunnel_tube_wood", {burntime = 9}) minetest.register_craft({ type = "fuel", @@ -171,11 +180,42 @@ minetest.register_craft({ -- TNT ----------------------------------------------------------------------------------------------------------- + +local gunpowder = df_dependencies.node_name_gunpowder +local tnt_ignite_sound = df_dependencies.soundfile_tnt_ignite +local tnt_boom = df_dependencies.tnt_boom + if df_trees.config.enable_tnt then local tnt_radius = tonumber(minetest.settings:get("tnt_radius") or 3) * 2/3 local tnt_def = {radius = tnt_radius, damage_radius = tnt_radius * 2} - local torch_item = df_trees.node_names.torch + local torch_item = df_dependencies.node_name_torch + + local drop_items = { + max_items = 1, + items = { + { + items = {'df_trees:tunnel_tube_sapling'}, + rarity = 2, + }, + } + } + if gunpowder then + drop_items.max_items = 3 + table.insert(drop_items.items, { + items = {'df_trees:tunnel_tube_sapling', gunpowder}, + rarity = 2, + }) + table.insert(drop_items.items, { + items = {'df_trees:tunnel_tube_sapling', gunpowder .. ' 2'}, + rarity = 2, + }) + end + + local on_burn = function(pos) + minetest.swap_node(pos, {name = "df_trees:tunnel_tube_fruiting_body_burning"}) + minetest.registered_nodes["df_trees:tunnel_tube_fruiting_body_burning"].on_construct(pos) + end minetest.register_node("df_trees:tunnel_tube_fruiting_body", { description = S("Tunnel Tube Fruiting Body"), @@ -184,26 +224,12 @@ if df_trees.config.enable_tnt then tiles = {"dfcaverns_tunnel_tube.png^[multiply:#b09090"}, paramtype2 = "facedir", is_ground_content = false, - groups = {choppy = 3, oddly_breakable_by_hand=1, flammable = 2, tnt = 1,}, - sounds = df_trees.sounds.wood, + groups = {choppy = 3, oddly_breakable_by_hand=1, flammable = 2, tnt = 1, handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30}, + sounds = df_dependencies.sound_wood(), on_place = minetest.rotate_node, - drop = { - max_items = 3, - items = { - { - items = {'df_trees:tunnel_tube_sapling'}, - rarity = 2, - }, - { - items = {'df_trees:tunnel_tube_sapling', 'tnt:gunpowder'}, - rarity = 2, - }, - { - items = {'df_trees:tunnel_tube_sapling', 'tnt:gunpowder 2'}, - rarity = 2, - }, - }, - }, + drop = drop_items, + _mcl_blast_resistance = 12, + _mcl_hardness = 2, on_punch = function(pos, node, puncher) if puncher:get_wielded_item():get_name() == torch_item then @@ -213,25 +239,22 @@ if df_trees.config.enable_tnt then end end, on_blast = function(pos, intensity) + minetest.swap_node(pos, {name="air"}) minetest.after(0.1, function() - tnt.boom(pos, tnt_def) + tnt_boom(pos, tnt_def) end) end, mesecons = {effector = {action_on = function(pos) - tnt.boom(pos, tnt_def) + minetest.swap_node(pos, {name="air"}) + tnt_boom(pos, tnt_def) end } }, - on_burn = function(pos) - minetest.swap_node(pos, {name = "df_trees:tunnel_tube_fruiting_body_burning"}) - minetest.registered_nodes["df_trees:tunnel_tube_fruiting_body_burning"].on_construct(pos) - end, - on_ignite = function(pos, igniter) - minetest.swap_node(pos, {name = "df_trees:tunnel_tube_fruiting_body_burning"}) - minetest.registered_nodes["df_trees:tunnel_tube_fruiting_body_burning"].on_construct(pos) - end, + on_burn = on_burn, + on_ignite = on_burn, + _on_burn = on_burn, }) minetest.register_node("df_trees:tunnel_tube_fruiting_body_burning", { @@ -243,14 +266,21 @@ if df_trees.config.enable_tnt then groups = {not_in_creative_inventory = 1,}, light_source = 5, drop = "", - sounds = df_trees.sounds.wood, + sounds = df_dependencies.sound_wood(), + _mcl_blast_resistance = 0, + _mcl_hardness = 2, on_timer = function(pos, elapsed) - tnt.boom(pos, tnt_def) + minetest.swap_node(pos, {name="air"}) + tnt_boom(pos, tnt_def) + end, + on_blast = function(pos) + minetest.swap_node(pos, {name="air"}) + minetest.after(0.1, function() + tnt_boom(pos, tnt_def) + end) end, - -- unaffected by explosions - on_blast = function() end, on_construct = function(pos) - minetest.sound_play("tnt_ignite", {pos = pos}) + minetest.sound_play(tnt_ignite_sound, {pos = pos}) minetest.get_node_timer(pos):start(4) end, }) @@ -262,9 +292,11 @@ else tiles = {"dfcaverns_tunnel_tube.png^[multiply:#b09090"}, paramtype2 = "facedir", is_ground_content = false, - groups = {choppy = 3, oddly_breakable_by_hand=1, flammable = 2}, - sounds = df_trees.sounds.wood, + groups = {choppy = 3, oddly_breakable_by_hand=1, flammable = 2,handy=1, hoey=1, shearsy=1, swordy=1, deco_block=1, dig_by_piston=1, fire_encouragement=15, fire_flammability=30}, + sounds = df_dependencies.sound_wood(), on_place = minetest.rotate_node, + _mcl_blast_resistance = 12, + _mcl_hardness = 2, drop = { max_items = 3, @@ -306,17 +338,19 @@ minetest.register_node("df_trees:tunnel_tube_sapling", { fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} }, groups = {snappy = 2, dig_immediate = 3, flammable = 2, - attached_node = 1, sapling = 1, light_sensitive_fungus = 11}, - sounds = df_trees.sounds.leaves, + attached_node = 1, sapling = 1, light_sensitive_fungus = 11, dig_immediate=3,dig_by_piston=1,destroy_by_lava_flow=1,deco_block=1, compostability=30}, + sounds = df_dependencies.sound_leaves(), + _mcl_blast_resistance = 10, + _mcl_hardness = 0.2, on_construct = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "soil") == 0 then - return + if df_trees.tunnel_tube_growth_permitted(pos) then + minetest.get_node_timer(pos):start(math.random( + df_trees.config.tunnel_tube_delay_multiplier*df_trees.config.tree_min_growth_delay, + df_trees.config.tunnel_tube_delay_multiplier*df_trees.config.tree_max_growth_delay)) end - minetest.get_node_timer(pos):start(math.random( - df_trees.config.tunnel_tube_delay_multiplier*df_trees.config.tree_min_growth_delay, - df_trees.config.tunnel_tube_delay_multiplier*df_trees.config.tree_max_growth_delay)) end, + on_destruct = function(pos) minetest.get_node_timer(pos):stop() end, diff --git a/df_underworld_items/ancient_lanterns.lua b/df_underworld_items/ancient_lanterns.lua new file mode 100644 index 0000000..a2782f2 --- /dev/null +++ b/df_underworld_items/ancient_lanterns.lua @@ -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, +-- } +--}) \ No newline at end of file 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 bf0be4b..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"), @@ -6,13 +6,15 @@ minetest.register_node("df_underworld_items:glow_amethyst", { _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}, - sounds = default.node_sound_glass_defaults(), + 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 diff --git a/df_underworld_items/dependencies.lua b/df_underworld_items/dependencies.lua deleted file mode 100644 index 7208d1d..0000000 --- a/df_underworld_items/dependencies.lua +++ /dev/null @@ -1,10 +0,0 @@ -df_underworld_items.abm_neighbors = {} - --- common nodes that can be found next to pit plasma, triggering matter degradation --- don't trigger on air, that's for sparkle generation -df_underworld_items.abm_neighbors.pit_plasma = {"group:stone", "df_underworld_items:glow_amethyst", "group:lava", "group:water"} - --- This stuff should only be used during initialization -minetest.after(0, function() - df_underworld_items.node_name = nil -end) \ No newline at end of file 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 6f16210..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, @@ -18,16 +18,21 @@ local glowstone_def = { }, }, is_ground_content = false, - groups = {cracky=3}, - sounds = default.node_sound_glass_defaults(), + 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, } -if minetest.get_modpath("tnt") then +local tnt_boom = df_dependencies.tnt_boom +if tnt_boom then glowstone_def.on_dig = function(pos, node, digger) - tnt.boom(pos, {radius=3}) + 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) \ No newline at end of file diff --git a/df_underworld_items/glowing_pit_plasma.lua b/df_underworld_items/glowing_pit_plasma.lua index 07d7618..f12af38 100644 --- a/df_underworld_items/glowing_pit_plasma.lua +++ b/df_underworld_items/glowing_pit_plasma.lua @@ -1,4 +1,6 @@ -local S = df_underworld_items.S +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"), @@ -17,7 +19,7 @@ minetest.register_node("df_underworld_items:pit_plasma", { }, }, - groups={pit_plasma=1, pit_plasma_resistant=1}, + 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, @@ -36,6 +38,8 @@ minetest.register_node("df_underworld_items:pit_plasma", { 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", { @@ -65,7 +69,7 @@ minetest.register_node("df_underworld_items:pit_plasma_flowing", { }, }, }, - groups={pit_plasma=1, pit_plasma_resistant=1}, + 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, @@ -85,6 +89,8 @@ minetest.register_node("df_underworld_items:pit_plasma_flowing", { 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 @@ -127,7 +133,7 @@ if df_underworld_items.config.destructive_pit_plasma then minetest.register_abm({ label = "glowing pit matter degradation", nodenames = {"group:pit_plasma"}, - neighbors = df_underworld_items.abm_neighbors.pit_plasma, + neighbors = df_dependencies.abm_pit_plasma_neighbors, interval = 2, chance = 30, catch_up = false, @@ -144,7 +150,7 @@ if df_underworld_items.config.destructive_pit_plasma 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="default:lava_source"}) + minetest.set_node(test_pos, {name=lava_source}) end else minetest.set_node(test_pos, {name="air"}) diff --git a/df_underworld_items/hunter_statue.lua b/df_underworld_items/hunter_statue.lua index 669d741..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"), @@ -13,6 +13,9 @@ if minetest.get_modpath("hunter_statue") and df_underworld_items.config.underwor 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 diff --git a/df_underworld_items/init.lua b/df_underworld_items/init.lua index 0f2dc15..d660e76 100644 --- a/df_underworld_items/init.lua +++ b/df_underworld_items/init.lua @@ -1,11 +1,9 @@ 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") -dofile(modpath.."/dependencies.lua") dofile(modpath.."/doc.lua") dofile(modpath.."/crystals_amethyst.lua") @@ -14,4 +12,9 @@ dofile(modpath.."/slade.lua") dofile(modpath.."/hunter_statue.lua") dofile(modpath.."/glowing_pit_plasma.lua") -dofile(modpath.."/puzzle_seal.lua") \ No newline at end of file +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 diff --git a/df_underworld_items/locale/df_underworld_items.de.tr b/df_underworld_items/locale/df_underworld_items.de.tr index e370d4b..7031666 100644 --- a/df_underworld_items/locale/df_underworld_items.de.tr +++ b/df_underworld_items/locale/df_underworld_items.de.tr @@ -1,6 +1,10 @@ # textdomain: df_underworld_items +### ancient_lanterns.lua ### + +Ancient Lantern= + ### crystals_amethyst.lua ### #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE @@ -38,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 ### @@ -54,6 +62,10 @@ Glowing Pit Plasma=Glühendes Grubenplasma #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE Guardian Statue=Wächterstatue +### puzzle_chest.lua ### + +Puzzle Chest= + ### puzzle_seal.lua ### #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE @@ -62,10 +74,6 @@ Active Slade Breacher=Aktiver Slade Breacher Breach in the Slade=Brich den Slade ein #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE Inscribed Slade Block=Beschrifteter Slade-Block -#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE -Slade Block Slab=Slade Block Platte -#WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE -Slade Block Stair=Slade Block Treppe Slade Capstone= Slade Puzzle Seal= #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE @@ -78,7 +86,18 @@ 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 -Slade Stair= -Slade Wall= diff --git a/df_underworld_items/locale/df_underworld_items.it.tr b/df_underworld_items/locale/df_underworld_items.it.tr index b01f486..cc46b35 100644 --- a/df_underworld_items/locale/df_underworld_items.it.tr +++ b/df_underworld_items/locale/df_underworld_items.it.tr @@ -1,6 +1,10 @@ # textdomain: df_underworld_items +### ancient_lanterns.lua ### + +Ancient Lantern= + ### crystals_amethyst.lua ### #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE @@ -38,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 ### @@ -52,6 +60,10 @@ Glowing Pit Plasma= #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE Guardian Statue=Statua del guardiano +### puzzle_chest.lua ### + +Puzzle Chest= + ### puzzle_seal.lua ### #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE @@ -60,8 +72,6 @@ Active Slade Breacher=Attivo Slade Breacher Breach in the Slade=Violazione nello Slade #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE Inscribed Slade Block=Inscritto Slade Block -Slade Block Slab= -Slade Block Stair= Slade Capstone= Slade Puzzle Seal= Turn= @@ -74,6 +84,8 @@ Slade Brick= Slade Sand= #WARNING: AUTOTRANSLATED BY GOOGLE TRANSLATE Slade Seal=Sigillo Slade -Slade Slab= -Slade Stair= Slade Wall= + +### slade_drill.lua ### + +Slade Drill= diff --git a/df_underworld_items/locale/template.txt b/df_underworld_items/locale/template.txt index e0844ce..200eb9f 100644 --- a/df_underworld_items/locale/template.txt +++ b/df_underworld_items/locale/template.txt @@ -1,6 +1,10 @@ # textdomain: df_underworld_items +### ancient_lanterns.lua ### + +Ancient Lantern= + ### crystals_amethyst.lua ### Glowing Amethyst Block= @@ -27,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 ### @@ -40,13 +48,15 @@ Glowing Pit Plasma= Guardian Statue= +### puzzle_chest.lua ### + +Puzzle Chest= + ### puzzle_seal.lua ### Active Slade Breacher= Breach in the Slade= Inscribed Slade Block= -Slade Block Slab= -Slade Block Stair= Slade Capstone= Slade Puzzle Seal= Turn= @@ -58,6 +68,8 @@ Slade Block= Slade Brick= Slade Sand= Slade Seal= -Slade Slab= -Slade Stair= Slade Wall= + +### slade_drill.lua ### + +Slade Drill= diff --git a/df_underworld_items/mod.conf b/df_underworld_items/mod.conf index 9f964e0..b55a106 100644 --- a/df_underworld_items/mod.conf +++ b/df_underworld_items/mod.conf @@ -1,4 +1,4 @@ name = df_underworld_items description = Various node types used by the dfcaverns mapgen mod for its underworld layer. -depends = default -optional_depends = doc, radiant_damage, mesecons_mvps, tnt, stairs, hunter_statue +depends = df_dependencies +optional_depends = doc, radiant_damage, mesecons_mvps, hunter_statue diff --git a/df_underworld_items/models/LICENSE.txt b/df_underworld_items/models/LICENSE.txt new file mode 100644 index 0000000..f7064b9 --- /dev/null +++ b/df_underworld_items/models/LICENSE.txt @@ -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 + 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/ \ No newline at end of file diff --git a/df_underworld_items/models/dfcaverns_chest_open.obj b/df_underworld_items/models/dfcaverns_chest_open.obj new file mode 100644 index 0000000..72ba175 --- /dev/null +++ b/df_underworld_items/models/dfcaverns_chest_open.obj @@ -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 diff --git a/df_underworld_items/puzzle_chest.lua b/df_underworld_items/puzzle_chest.lua new file mode 100644 index 0000000..2579f98 --- /dev/null +++ b/df_underworld_items/puzzle_chest.lua @@ -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, +}) diff --git a/df_underworld_items/puzzle_seal.lua b/df_underworld_items/puzzle_seal.lua index b197ccb..28cd619 100644 --- a/df_underworld_items/puzzle_seal.lua +++ b/df_underworld_items/puzzle_seal.lua @@ -1,7 +1,11 @@ -local S = df_underworld_items.S +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 @@ -11,11 +15,16 @@ if invulnerable then end end -local slade_groups = {stone=1, level=3, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1, cracky = 3, not_in_creative_inventory=1} +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) @@ -39,33 +48,78 @@ local ensure_meta = function(pos) end local colour_groups = { - "color_black", -- 0 - "color_red", -- 1 - "color_orange", -- 2 - "color_yellow", -- 3 - "color_green", -- 4 - "color_blue", -- 5 - "color_violet", -- 6 - "color_white"} -- 7 + {"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 +} -local test_key = function(pos) +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 key_group = colour_groups[key[keyval]+1] local item = inv:get_stack("main", i+1) - if minetest.get_item_group(item:get_name(), key_group) == 0 then + if not item_represents_number(item:get_name(), key[keyval]) then valid = false break end @@ -73,6 +127,7 @@ local test_key = function(pos) 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 @@ -93,6 +148,7 @@ end --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]" @@ -100,13 +156,21 @@ local get_formspec = function(pos, unlocked) .."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 @@ -119,12 +183,15 @@ local get_formspec = function(pos, unlocked) -- .."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[]" - .."list[current_player;main;0,1.25;8,3;8]container_end[]" - return formspec + ..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) + 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 @@ -188,7 +255,7 @@ local puzzle_seal_def = { paramtype2 = "facedir", light_source = 8, groups = slade_groups, - sounds = default.node_sound_stone_defaults({ footstep = { name = "bedrock2_step", gain = 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}, @@ -199,6 +266,8 @@ local puzzle_seal_def = { }, 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) @@ -238,6 +307,8 @@ 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, @@ -247,9 +318,9 @@ local digging_seal_def = { 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 = default.LIGHT_MAX, - groups = {immortal=1, stone=1, level=3, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1, not_in_creative_inventory=1}, - sounds = default.node_sound_stone_defaults({ footstep = { name = "bedrock2_step", gain = 1 } }), + 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}, @@ -259,6 +330,8 @@ local digging_seal_def = { 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, @@ -301,8 +374,15 @@ 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="default:lava_source"}) + 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 @@ -320,8 +400,10 @@ local digging_seal_def = { 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 - tnt.boom(pos, {radius=3}) - minetest.set_node(pos, {name="default:lava_source"}) + 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"}) @@ -348,6 +430,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) 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) @@ -367,8 +450,10 @@ local inscription_block_def = { }, paramtype2 = "facedir", groups = slade_groups, - sounds = default.node_sound_stone_defaults({ footstep = { name = "bedrock2_step", gain = 1 } }), + 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, @@ -405,8 +490,10 @@ local capstone_def = { paramtype2 = "facedir", groups = slade_groups, light_source = 8, - sounds = default.node_sound_stone_defaults({ footstep = { name = "bedrock2_step", gain = 1 } }), + 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, @@ -418,7 +505,6 @@ minetest.register_node("df_underworld_items:slade_capstone", capstone_def) -- Schematics local n1 = { name = "df_underworld_items:slade_block" } -local n5 = { name = "default:meselamp" } local n6 = { name = "air", prob = 0 } -- ceiling pieces to leave in place local n8 = { name = "df_underworld_items:puzzle_seal" } local n3 = { name = "air"} @@ -435,38 +521,33 @@ 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"} -if minetest.get_modpath("stairs") then - local stair_groups = {level = 3, mese_radiation_shield=1, pit_plasma_resistant=1, slade=1, cracky = 3} - if invulnerable then - stair_groups.immortal = 1 - end +df_dependencies.register_stairs("slade_block") - stairs.register_stair_and_slab( - "slade_block", - "df_underworld_items:slade_block", - stair_groups, - {"dfcaverns_slade_block.png"}, - S("Slade Block Stair"), - S("Slade Block Slab"), - default.node_sound_stone_defaults({ footstep = { name = "bedrock2_step", gain = 1 } }) - ) - - if invulnerable then - for name, def in pairs(minetest.registered_nodes) do - if name:sub(1,7) == "stairs:" and name:sub(-11) == "slade_block" then +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 - - n2 = { name = "stairs:stair_slade_block", param2 = 3 } - n4 = { name = "stairs:stair_slade_block", param2 = 1 } - n7 = { name = "stairs:stair_slade_block", param2 = 2 } - n9 = { name = "stairs:stair_slade_block" } - n10 = { name = "stairs:slab_slade_block", param2 = 21 } - n11 = { name = "stairs:slab_slade_block", param2 = 1 } 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 = { 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 5f84fb1..87adb7c 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") @@ -15,16 +15,20 @@ local add_immortality = function(slade_def) 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 = {cracky=3, stone=1, level=3, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1}, - sounds = default.node_sound_stone_defaults({ footstep = { name = "bedrock2_step", gain = 1 } }), + 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 > 3.0 then + if intensity >= 1.0 then minetest.set_node(pos, {name="df_underworld_items:slade_sand"}) minetest.check_for_falling(pos) end @@ -32,6 +36,8 @@ local slade_def = { } 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) @@ -40,15 +46,23 @@ local slade_brick_def = { _doc_items_longdesc = df_underworld_items.doc.slade_desc, _doc_items_usagehelp = df_underworld_items.doc.slade_usage, tiles = {"dfcaverns_slade_brick.png"}, - groups = { cracky=3, stone=1, level=3, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1}, - sounds = default.node_sound_stone_defaults({ footstep = { name = "bedrock2_step", gain = 1 } }), + 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", @@ -66,25 +80,26 @@ local slade_wall_def = { tiles = {"dfcaverns_slade_brick.png"}, walkable = true, is_ground_content = false, - groups = { cracky=3, stone=1, level=3, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1}, - sounds = default.node_sound_stone_defaults({ footstep = { name = "bedrock2_step", gain = 1 } }), + 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, level = 2, falling_node = 1, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1}, - sounds = default.node_sound_gravel_defaults({ - footstep = {name = "default_gravel_footstep", gain = 0.45}, - }), + 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 = { @@ -92,9 +107,11 @@ local slade_block_def = { _doc_items_longdesc = df_underworld_items.doc.slade_desc, _doc_items_usagehelp = df_underworld_items.doc.slade_usage, tiles = {"dfcaverns_slade_block.png"}, - groups = {cracky=3, stone=1, level=3, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1}, - sounds = default.node_sound_stone_defaults({ footstep = { name = "bedrock2_step", gain = 1 } }), + 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) @@ -108,9 +125,11 @@ local slade_seal_def = { _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 = {cracky=3, stone=1, level=3, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1}, - sounds = default.node_sound_stone_defaults({ footstep = { name = "bedrock2_step", gain = 1 } }), + 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 @@ -118,7 +137,15 @@ if invulnerable then 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", @@ -140,33 +167,18 @@ minetest.register_abm{ -- Register stair and slab -if minetest.get_modpath("stairs") then - local stair_groups = {level = 3, mese_radiation_shield=1, pit_plasma_resistant=1, slade=1} - if invulnerable then - stair_groups.immortal = 1 - end - stair_groups.cracky = 3 - - stairs.register_stair_and_slab( - "slade_brick", - "df_underworld_items:slade_brick", - stair_groups, - {"dfcaverns_slade_brick.png"}, - S("Slade Stair"), - S("Slade Slab"), - default.node_sound_stone_defaults({ footstep = { name = "bedrock2_step", gain = 1 } }) - ) - - if invulnerable then - for name, def in pairs(minetest.registered_nodes) do - if name:sub(1,7) == "stairs:" and name:sub(-11) == "slade_brick" then - minetest.override_item(name, {can_dig = server_diggable_only}) - end +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 \ No newline at end of file diff --git a/df_underworld_items/slade_drill.lua b/df_underworld_items/slade_drill.lua new file mode 100644 index 0000000..f3f7dc7 --- /dev/null +++ b/df_underworld_items/slade_drill.lua @@ -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) \ No newline at end of file diff --git a/df_underworld_items/sounds/dfcaverns_puzzle_chest_close.ogg b/df_underworld_items/sounds/dfcaverns_puzzle_chest_close.ogg new file mode 100644 index 0000000..15933ed Binary files /dev/null and b/df_underworld_items/sounds/dfcaverns_puzzle_chest_close.ogg differ diff --git a/df_underworld_items/sounds/dfcaverns_puzzle_chest_open.ogg b/df_underworld_items/sounds/dfcaverns_puzzle_chest_open.ogg new file mode 100644 index 0000000..f75104f Binary files /dev/null and b/df_underworld_items/sounds/dfcaverns_puzzle_chest_open.ogg differ 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 0000000..d81473b Binary files /dev/null and b/df_underworld_items/sounds/dfcaverns_slade_drill.ogg differ diff --git a/df_underworld_items/sounds/license.txt b/df_underworld_items/sounds/license.txt index 8027b80..c4efe8f 100644 --- a/df_underworld_items/sounds/license.txt +++ b/df_underworld_items/sounds/license.txt @@ -15,4 +15,9 @@ dfcaverns_seal_unlocked.ogg - from https://freesound.org/people/juskiddink/sound 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 \ No newline at end of file +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 \ No newline at end of file diff --git a/df_underworld_items/textures/dfcaverns_chest_dial_0.png b/df_underworld_items/textures/dfcaverns_chest_dial_0.png new file mode 100644 index 0000000..363285a Binary files /dev/null and b/df_underworld_items/textures/dfcaverns_chest_dial_0.png differ diff --git a/df_underworld_items/textures/dfcaverns_chest_dial_1.png b/df_underworld_items/textures/dfcaverns_chest_dial_1.png new file mode 100644 index 0000000..e86ea51 Binary files /dev/null and b/df_underworld_items/textures/dfcaverns_chest_dial_1.png differ diff --git a/df_underworld_items/textures/dfcaverns_chest_dial_2.png b/df_underworld_items/textures/dfcaverns_chest_dial_2.png new file mode 100644 index 0000000..8c2b163 Binary files /dev/null and b/df_underworld_items/textures/dfcaverns_chest_dial_2.png differ diff --git a/df_underworld_items/textures/dfcaverns_chest_dial_3.png b/df_underworld_items/textures/dfcaverns_chest_dial_3.png new file mode 100644 index 0000000..7c14631 Binary files /dev/null and b/df_underworld_items/textures/dfcaverns_chest_dial_3.png differ diff --git a/df_underworld_items/textures/dfcaverns_chest_dial_4.png b/df_underworld_items/textures/dfcaverns_chest_dial_4.png new file mode 100644 index 0000000..5075c7e Binary files /dev/null and b/df_underworld_items/textures/dfcaverns_chest_dial_4.png differ diff --git a/df_underworld_items/textures/dfcaverns_chest_dial_5.png b/df_underworld_items/textures/dfcaverns_chest_dial_5.png new file mode 100644 index 0000000..fb0a1f0 Binary files /dev/null and b/df_underworld_items/textures/dfcaverns_chest_dial_5.png differ diff --git a/df_underworld_items/textures/dfcaverns_chest_dial_6.png b/df_underworld_items/textures/dfcaverns_chest_dial_6.png new file mode 100644 index 0000000..468b37f Binary files /dev/null and b/df_underworld_items/textures/dfcaverns_chest_dial_6.png differ diff --git a/df_underworld_items/textures/dfcaverns_chest_dial_7.png b/df_underworld_items/textures/dfcaverns_chest_dial_7.png new file mode 100644 index 0000000..d4d0ebf Binary files /dev/null and b/df_underworld_items/textures/dfcaverns_chest_dial_7.png differ diff --git a/df_underworld_items/textures/dfcaverns_chest_lock_colours.png b/df_underworld_items/textures/dfcaverns_chest_lock_colours.png new file mode 100644 index 0000000..c07ce27 Binary files /dev/null and b/df_underworld_items/textures/dfcaverns_chest_lock_colours.png differ diff --git a/df_underworld_items/textures/dfcaverns_chest_lock_plate.png b/df_underworld_items/textures/dfcaverns_chest_lock_plate.png new file mode 100644 index 0000000..bb94bda Binary files /dev/null and b/df_underworld_items/textures/dfcaverns_chest_lock_plate.png differ diff --git a/df_underworld_items/textures/dfcaverns_chest_mask_interior.png b/df_underworld_items/textures/dfcaverns_chest_mask_interior.png new file mode 100644 index 0000000..f47686e Binary files /dev/null and b/df_underworld_items/textures/dfcaverns_chest_mask_interior.png differ diff --git a/df_underworld_items/textures/dfcaverns_chest_mask_side.png b/df_underworld_items/textures/dfcaverns_chest_mask_side.png new file mode 100644 index 0000000..7e8c274 Binary files /dev/null and b/df_underworld_items/textures/dfcaverns_chest_mask_side.png differ diff --git a/df_underworld_items/textures/dfcaverns_chest_mask_top.png b/df_underworld_items/textures/dfcaverns_chest_mask_top.png new file mode 100644 index 0000000..c15e8b4 Binary files /dev/null and b/df_underworld_items/textures/dfcaverns_chest_mask_top.png differ diff --git a/df_underworld_items/textures/dfcaverns_lantern_mask.png b/df_underworld_items/textures/dfcaverns_lantern_mask.png new file mode 100644 index 0000000..1b4570b Binary files /dev/null and b/df_underworld_items/textures/dfcaverns_lantern_mask.png differ diff --git a/df_underworld_items/textures/dfcaverns_slade_drill.png b/df_underworld_items/textures/dfcaverns_slade_drill.png new file mode 100644 index 0000000..2edae29 Binary files /dev/null and b/df_underworld_items/textures/dfcaverns_slade_drill.png differ diff --git a/df_underworld_items/textures/puzzle dial.xcf b/df_underworld_items/textures/puzzle dial.xcf new file mode 100644 index 0000000..e03194c Binary files /dev/null and b/df_underworld_items/textures/puzzle dial.xcf differ diff --git a/hunter_statue/init.lua b/hunter_statue/init.lua index 92f733a..a14fa09 100644 --- a/hunter_statue/init.lua +++ b/hunter_statue/init.lua @@ -2,6 +2,9 @@ local S = minetest.get_translator(minetest.get_current_modname()) hunter_statue = {} +-- override this to allow achievements to be recorded without requiring a dependency +hunter_statue.player_punched = function(node_name, pos, player) end + local statue_box = { type = "fixed", fixed = { @@ -13,7 +16,7 @@ local fourtyfivedegrees = math.pi/4 local sixtydegrees = math.pi/3 local default_sounds -if default and default.node_sound_stone_defaults then +if minetest.get_modpath("default") then default_sounds = default.node_sound_stone_defaults() end @@ -37,6 +40,7 @@ local test_array = { -- knockback = 16 -- tnt_vulnerable = false -- tnt_debris = +-- hunters_allowed_here = -- function(pos) -- other_overrides = --} @@ -59,7 +63,7 @@ hunter_statue.register_hunter_statue = function(node_name, statue_def) if statue_def.tnt_vulnerable then def.on_blast = function(pos, intensity) - if intensity > 3.0 then + if intensity >= 1.0 then minetest.set_node(pos, {name= statue_def.tnt_debris or "air"}) minetest.check_for_falling(pos) end @@ -74,6 +78,7 @@ hunter_statue.register_hunter_statue = function(node_name, statue_def) local knockback = statue_def.knockback or 16 local damage = statue_def.damage or 8 + local hunters_allowed_here = statue_def.hunters_allowed_here minetest.register_node(node_name, def) @@ -117,6 +122,7 @@ hunter_statue.register_hunter_statue = function(node_name, statue_def) nearest_player:add_velocity(vector.multiply(vector.direction(pos, nearest_pos), knockback)) nearest_player:set_hp(math.max(nearest_player:get_hp() - damage*armour_multiplier, 0)) minetest.sound_play({name="hunter_statue_thud"}, {pos = nearest_pos}) + hunter_statue.player_punched(node_name, pos, nearest_player) return end local player_dir = vector.direction(pos, nearest_pos) @@ -124,24 +130,26 @@ hunter_statue.register_hunter_statue = function(node_name, statue_def) local new_pos = vector.round(vector.add(pos, player_dir)) for _, add_pos in ipairs(test_array) do local test_base = vector.add(new_pos, add_pos) - local test_base_node = minetest.get_node(test_base) - local test_base_node_def = minetest.registered_nodes[test_base_node.name] - if test_base_node_def and test_base_node_def.buildable_to then - local test_above = vector.add(test_base, {x=0, y=1, z=0}) - local test_above_node = minetest.get_node(test_above) - local test_above_node_def = minetest.registered_nodes[test_above_node.name] - if test_above_node_def and test_above_node_def.buildable_to then - local test_below = vector.add(test_base, {x=0, y=-1, z=0}) - local test_below_node = minetest.get_node(test_below) - local test_below_node_def = minetest.registered_nodes[test_below_node.name] - if test_below_node_def and test_below_node_def.walkable then - minetest.set_node(pos, {name="air"}) -- old location - minetest.set_node(test_above, {name="air"}) -- some kind of filler node? - node.param2 = new_facedir - minetest.set_node(test_base, node) - minetest.check_for_falling({x=pos.x, y=pos.y+1, z=pos.z}) - minetest.sound_play({name="hunter_statue_brick_step"}, {pos = pos, gain = 0.5}) - return + if hunters_allowed_here == nil or hunters_allowed_here(test_base) then + local test_base_node = minetest.get_node(test_base) + local test_base_node_def = minetest.registered_nodes[test_base_node.name] + if test_base_node_def and test_base_node_def.buildable_to then + local test_above = vector.add(test_base, {x=0, y=1, z=0}) + local test_above_node = minetest.get_node(test_above) + local test_above_node_def = minetest.registered_nodes[test_above_node.name] + if test_above_node_def and test_above_node_def.buildable_to then + local test_below = vector.add(test_base, {x=0, y=-1, z=0}) + local test_below_node = minetest.get_node(test_below) + local test_below_node_def = minetest.registered_nodes[test_below_node.name] + if test_below_node_def and test_below_node_def.walkable then + minetest.set_node(pos, {name="air"}) -- old location + minetest.set_node(test_above, {name="air"}) -- some kind of filler node? + node.param2 = new_facedir + minetest.set_node(test_base, node) + minetest.check_for_falling({x=pos.x, y=pos.y+1, z=pos.z}) + minetest.sound_play({name="hunter_statue_brick_step"}, {pos = pos, gain = 0.5}) + return + end end end end diff --git a/ice_sprites/init.lua b/ice_sprites/init.lua index 2c4d093..38a3ba1 100644 --- a/ice_sprites/init.lua +++ b/ice_sprites/init.lua @@ -1,3 +1,5 @@ +ice_sprites = {} + local modname = minetest.get_current_modname() local S = minetest.get_translator(modname) @@ -6,10 +8,13 @@ local ice_sprite_usage local ice_sprite_bottle_desc local ice_sprite_bottle_usage +local node_name_glass_bottle = df_dependencies.node_name_glass_bottle +local node_name_firefly = df_dependencies.node_name_fireflies + if minetest.get_modpath("doc") then ice_sprite_desc = S("Ice sprites are mysterious glowing insect-like creatures that appear to be made partly of crystallized water.") - if minetest.get_modpath("vessels") then - if minetest.get_modpath("fireflies") then + if node_name_glass_bottle then + if node_name_firefly then ice_sprite_usage = S("Ice sprites can be caught with nets and placed in bottles as sources of light and freezing cold.") end ice_sprite_bottle_desc = S("A bottle containing a captured ice sprite.") @@ -46,6 +51,8 @@ minetest.register_node("ice_sprites:ice_sprite", { }, light_source = 6, floodable = true, + _mcl_blast_resistance = 0.1, + _mcl_hardness = 0.1, on_place = function(itemstack, placer, pointed_thing) local player_name = placer:get_player_name() local pos = pointed_thing.above @@ -79,9 +86,11 @@ minetest.register_node("ice_sprites:hidden_ice_sprite", { pointable = false, diggable = false, buildable_to = true, - drop = "", + drop = "ice_sprites:ice_sprite", groups = {not_in_creative_inventory = 1}, floodable = true, + _mcl_blast_resistance = 0.1, + _mcl_hardness = 0.1, on_place = function(itemstack, placer, pointed_thing) local player_name = placer:get_player_name() local pos = pointed_thing.above @@ -104,7 +113,12 @@ minetest.register_node("ice_sprites:hidden_ice_sprite", { }) -- ice sprite in a bottle -if minetest.get_modpath("vessels") then +if node_name_glass_bottle then + +local glass_sounds +if minetest.get_modpath("df_dependencies") then + glass_sounds = df_dependencies.sound_glass +end minetest.register_node("ice_sprites:ice_sprite_bottle", { description = S("Ice Sprite in a Bottle"), @@ -127,12 +141,14 @@ minetest.register_node("ice_sprites:ice_sprite_bottle", { light_source = 9, is_ground_content = false, walkable = false, - groups = {dig_immediate = 3, attached_node = 1, puts_out_fire = 1, cools_lava = 1, freezes_water = 1}, + groups = {dig_immediate = 3, attached_node = 1, puts_out_fire = 1, cools_lava = 1, freezes_water = 1, material_glass=1}, selection_box = { type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25} }, - sounds = default.node_sound_glass_defaults(), + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = glass_sounds(), on_rightclick = function(pos, node, player, itemstack, pointed_thing) local lower_pos = {x = pos.x, y = pos.y + 1, z = pos.z} if minetest.is_protected(pos, player:get_player_name()) or @@ -151,7 +167,7 @@ minetest.register_node("ice_sprites:ice_sprite_bottle", { end if ice_sprite_pos then - minetest.set_node(pos, {name = "vessels:glass_bottle"}) + minetest.set_node(pos, {name = node_name_glass_bottle}) minetest.set_node(ice_sprite_pos, {name = "ice_sprites:ice_sprite"}) minetest.get_node_timer(ice_sprite_pos):start(1) end @@ -161,6 +177,6 @@ minetest.register_node("ice_sprites:ice_sprite_bottle", { minetest.register_craft( { type = "shapeless", output = "ice_sprites:ice_sprite_bottle", - recipe = {"ice_sprites:ice_sprite", "vessels:glass_bottle"} + recipe = {"ice_sprites:ice_sprite", node_name_glass_bottle} }) end diff --git a/ice_sprites/mod.conf b/ice_sprites/mod.conf index fd347ab..94a6385 100644 --- a/ice_sprites/mod.conf +++ b/ice_sprites/mod.conf @@ -1,4 +1,4 @@ name = ice_sprites description = Glowing blue firefly-like nodes depends = -optional_depends = fireflies, vessels, doc \ No newline at end of file +optional_depends = df_dependencies, doc \ No newline at end of file diff --git a/looped_node_sound/init.lua b/looped_node_sound/init.lua new file mode 100644 index 0000000..3feb267 --- /dev/null +++ b/looped_node_sound/init.lua @@ -0,0 +1,121 @@ +looped_node_sound = {} + +--looped_node_sound.register({ +-- node_list = {}, +-- sound = , +-- radius = , +-- cycle_time =, +-- gain_per_node =, +-- max_gain =, +-- max_hear_distance =, +--}) + +looped_node_sound.register = function(def) + local handles = {} + local timer = 0 + + -- Parameters + local radius = def.radius or 8 -- node search radius around player + local cycle = def.cycle_time or 3 -- Cycle time for sound updates + assert(def.node_list, "[looped_sound_node] register function called without a node_list in its definition") + assert(def.sound, "[looped_sound_node] register function called without a sound in its definition") + local node_list = def.node_list + local sound = def.sound + local gain_per_node = def.gain_per_node or 0.125 + local gain_max = def.max_gain or 1.0 + local max_hear_distance = def.max_hear_distance or 32 + + -- Update sound for player + local function update_player_sound(player) + local player_name = player:get_player_name() + -- Search for nodes in radius around player + local ppos = player:get_pos() + local areamin = vector.subtract(ppos, radius) + local areamax = vector.add(ppos, radius) + local fpos, num = minetest.find_nodes_in_area( + areamin, + areamax, + node_list + ) + -- Total number of nodes in radius + local total = 0 + for _, count in pairs(num) do + total = total + count + end + -- Stop previous sound + if handles[player_name] then + minetest.sound_stop(handles[player_name]) + end + -- If nodes + if total > 0 then + -- Find centre of node positions + local fposmid = fpos[1] + -- If more than 1 node + if #fpos > 1 then + local fposmin = areamax + local fposmax = areamin + for i = 1, #fpos do + local fposi = fpos[i] + if fposi.x > fposmax.x then + fposmax.x = fposi.x + end + if fposi.y > fposmax.y then + fposmax.y = fposi.y + end + if fposi.z > fposmax.z then + fposmax.z = fposi.z + end + if fposi.x < fposmin.x then + fposmin.x = fposi.x + end + if fposi.y < fposmin.y then + fposmin.y = fposi.y + end + if fposi.z < fposmin.z then + fposmin.z = fposi.z + end + end + fposmid = vector.divide(vector.add(fposmin, fposmax), 2) + end + -- Play sound + local handle = minetest.sound_play(sound, { + pos = fposmid, + to_player = player_name, + gain = math.min(total * gain_per_node, gain_max), + max_hear_distance = max_hear_distance, + loop = true -- In case of lag + }) + -- Store sound handle for this player + if handle then + handles[player_name] = handle + else + handles[player_name] = nil + end + else + handles[player_name] = nil + end + end + + -- Cycle for updating players sounds + minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer < cycle then + return + end + + timer = 0 + local players = minetest.get_connected_players() + for n = 1, #players do + update_player_sound(players[n]) + end + end) + + -- Stop sound and clear handle on player leave + minetest.register_on_leaveplayer(function(player) + local player_name = player:get_player_name() + if handles[player_name] then + minetest.sound_stop(handles[player_name]) + handles[player_name] = nil + end + end) +end \ No newline at end of file diff --git a/looped_node_sound/license.txt b/looped_node_sound/license.txt new file mode 100644 index 0000000..400b1d2 --- /dev/null +++ b/looped_node_sound/license.txt @@ -0,0 +1,16 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2012-2016 celeron55, Perttu Ahola +Copyright (C) 2012-2016 Various Minetest developers and contributors +Copyright (C) 2022 FaceDeer, pulled code out of the default game fire mod and made generic + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +See the GNU Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html diff --git a/looped_node_sound/mod.conf b/looped_node_sound/mod.conf new file mode 100644 index 0000000..49af6d9 --- /dev/null +++ b/looped_node_sound/mod.conf @@ -0,0 +1,4 @@ +name = looped_node_sound +description = A simple API for causing nodes to appear to be emitting a looped sound +depends = +optional_depends = \ No newline at end of file diff --git a/mine_gas/init.lua b/mine_gas/init.lua index 1356aa2..c946879 100644 --- a/mine_gas/init.lua +++ b/mine_gas/init.lua @@ -39,7 +39,7 @@ minetest.register_node("mine_gas:gas", { post_effect_color = {a = 20, r = 20, g = 20, b = 250}, tiles = {"mine_gas.png^[opacity:28"}, use_texture_alpha = "blend", - groups = {not_in_creative_inventory=1, ropes_can_extend_into=1}, + groups = {not_in_creative_inventory=1, ropes_can_extend_into=1, not_solid=1, not_opaque=1}, paramtype = "light", drop = {}, sunlight_propagates = true, @@ -50,11 +50,13 @@ minetest.register_node("mine_gas:gas_seep", { description = S("Gas Seep"), _doc_items_longdesc = seep_desc, _doc_items_usagehelp = seep_usage, - tiles = {"default_stone.png^default_mineral_coal.png^[combine:16x80:0,-16=crack_anylength.png"}, - groups = {cracky = 3}, - drop = 'default:coal_lump', - sounds = default.node_sound_stone_defaults(), + tiles = {df_dependencies.texture_stone.."^"..df_dependencies.texture_mineral_coal.."^[combine:16x80:0,-16=crack_anylength.png"}, + groups = {cracky = 3, pickaxey=1, building_block=1, material_stone=1}, + drop = df_dependencies.node_name_coal_lump, + sounds = df_dependencies.sound_stone(), is_ground_content = true, + _mcl_blast_resistance = 5, + _mcl_hardness = 3, }) minetest.register_on_dignode(function(pos, oldnode, digger) @@ -120,6 +122,8 @@ minetest.register_abm({ end, }) +local soundfile_cool_lava = df_dependencies.soundfile_cool_lava + minetest.register_abm({ label = "mine_gas:gas snuffing torches", nodenames = {"group:torch"}, @@ -136,24 +140,26 @@ minetest.register_abm({ end minetest.set_node(pos, {name="mine_gas:gas"}) minetest.sound_play( - "default_cool_lava", + soundfile_cool_lava, {pos = pos, max_hear_distance = 16, gain = 0.1} ) end end, }) -if minetest.get_modpath("tnt") then +local tnt_boom = df_dependencies.tnt_boom + +if tnt_boom then minetest.register_abm({ label = "mine_gas:gas ignition", - nodenames = {"group:torch", "group:igniter"}, + nodenames = {"group:torch", "group:igniter", "group:fire"}, -- checking for ignition sources because there will be fewer than there are gas nodes neighbors = {"mine_gas:gas"}, interval = 1.0, chance = 1, catch_up = true, action = function(pos, node) if minetest.find_node_near(pos, 1, "air") then - tnt.boom(pos, {radius=1, damage_radius=6}) + tnt_boom(pos, {radius=1, damage_radius=6}) -- One in a hundred explosions will spawn a gas wisp if math.random() < 0.01 then minetest.set_node(pos, {name="mine_gas:gas_wisp"}) @@ -172,6 +178,7 @@ local orthogonal = { {x=-1,y=0,z=0}, } +local stone_with_coal = df_dependencies.node_name_stone_with_coal minetest.register_lbm({ label = "shut down gas seeps near lava", name = "mine_gas:shut_down_lava_adjacent", @@ -180,7 +187,7 @@ minetest.register_lbm({ action = function(pos, node) minetest.after(math.random()*60, function() if minetest.find_node_near(pos, 30, "group:lava") then - minetest.set_node(pos, {name="default:stone_with_coal"}) + minetest.set_node(pos, {name=stone_with_coal}) end end) end, diff --git a/mine_gas/mod.conf b/mine_gas/mod.conf index df1730e..dfd8d6f 100644 --- a/mine_gas/mod.conf +++ b/mine_gas/mod.conf @@ -1,4 +1,4 @@ name = mine_gas description = An explosive, asphyxiating heavier-than-air gas to add hazards to caves -depends = default +depends = df_dependencies optional_depends = tnt, doc \ No newline at end of file diff --git a/mine_gas/wisp.lua b/mine_gas/wisp.lua index fd4e42a..2b0f2ac 100644 --- a/mine_gas/wisp.lua +++ b/mine_gas/wisp.lua @@ -41,6 +41,8 @@ minetest.register_node("mine_gas:gas_wisp", { drop = {}, sunlight_propagates = true, on_blast = function() end, -- unaffected by explosions + _mcl_blast_resistance = 3600000, + _mcl_hardness = 0, }) minetest.register_abm({ diff --git a/oil/init.lua b/oil/init.lua index 8927b22..0a6cf8c 100644 --- a/oil/init.lua +++ b/oil/init.lua @@ -11,6 +11,10 @@ end local oil_sounds = {footstep = {name = "oil_oil_footstep", gain = 0.2}} +local water_source = df_dependencies.node_name_water_source +local water_flowing = df_dependencies.node_name_water_flowing +local bucket_empty = df_dependencies.node_name_bucket_empty + minetest.register_node("oil:oil_source", { description = S("Oil"), _doc_items_longdesc = oil_desc, @@ -57,8 +61,10 @@ minetest.register_node("oil:oil_source", { liquid_alternative_source = "oil:oil_source", liquid_viscosity = 1, post_effect_color = {a = 250, r = 0, g = 0, b = 0}, - groups = {liquid = 3}, + groups = {liquid = 1, dig_by_piston=1}, sounds = oil_sounds, + _mcl_blast_resistance = 100, + _mcl_hardness = -1, }) minetest.register_node("oil:oil_flowing", { @@ -107,8 +113,10 @@ minetest.register_node("oil:oil_flowing", { liquid_alternative_source = "oil:oil_source", liquid_viscosity = 1, post_effect_color = {a = 250, r = 0, g = 0, b = 0}, - groups = {liquid = 3, not_in_creative_inventory = 1}, + groups = {liquid = 1, not_in_creative_inventory = 1, dig_by_piston=1}, sounds = oil_sounds, + _mcl_blast_resistance = 100, + _mcl_hardness = -1, }) minetest.register_craft({ @@ -124,7 +132,7 @@ if minetest.get_modpath("dynamic_liquid") then minetest.register_abm({ label = "oil:oil floats", nodenames = {"oil:oil_source"}, - neighbors = {"default:water_source"}, + neighbors = {water_source}, interval = 1.0, chance = 1, catch_up = true, @@ -132,7 +140,7 @@ if minetest.get_modpath("dynamic_liquid") then local next_pos = {x=pos.x, y=pos.y+1, z=pos.z} local next_node = minetest.get_node(next_pos) local above_name = next_node.name - if above_name == "default:water_source" then + if above_name == water_source then minetest.swap_node(next_pos, {name="oil:oil_source"}) minetest.swap_node(pos, next_node) else @@ -145,7 +153,7 @@ if minetest.get_modpath("dynamic_liquid") then next_pos.z = next_pos.z + displacement end next_node = minetest.get_node(next_pos) - if next_node.name == "default:water_source" then + if next_node.name == water_source then if above_name ~= "air" then -- we're not on the surface, so try any lateral movement minetest.swap_node(next_pos, {name="oil:oil_source"}) @@ -169,14 +177,14 @@ if minetest.get_modpath("dynamic_liquid") then minetest.register_abm({ label = "oil:oil settles", nodenames = {"oil:oil_source"}, - neighbors = {"default:water_flowing"}, + neighbors = {water_flowing}, interval = 1.0, chance = 1, catch_up = true, action = function(pos, node) local next_pos = {x=pos.x, y=pos.y-1, z=pos.z} local next_node = minetest.get_node(next_pos) - if next_node.name == "default:water_flowing" then + if next_node.name == water_flowing then minetest.swap_node(next_pos, {name="oil:oil_source"}) minetest.swap_node(pos, next_node) end @@ -185,8 +193,8 @@ if minetest.get_modpath("dynamic_liquid") then end -if minetest.get_modpath("bucket") then - bucket.register_liquid( +if df_dependencies.bucket_register_liquid then + df_dependencies.bucket_register_liquid( "oil:oil_source", "oil:oil_flowing", "oil:oil_bucket", @@ -198,7 +206,7 @@ if minetest.get_modpath("bucket") then type = "fuel", recipe = "oil:oil_bucket", burntime = 370, -- same as coalblock - replacements = {{"oil:oil_bucket", "bucket:bucket_empty"}}, + replacements = {{"oil:oil_bucket", bucket_empty}}, }) if minetest.get_modpath("basic_materials") then @@ -207,7 +215,7 @@ if minetest.get_modpath("bucket") then output = "basic_materials:paraffin", recipe = "oil:oil_bucket", cooktime = 5, - replacements = {{"oil:oil_bucket", "bucket:bucket_empty"}}, + replacements = {{"oil:oil_bucket", bucket_empty}}, }) end end \ No newline at end of file diff --git a/oil/mod.conf b/oil/mod.conf index e262a4e..762bc1e 100644 --- a/oil/mod.conf +++ b/oil/mod.conf @@ -1,4 +1,4 @@ name = oil description = Oil liquid type -depends = default -optional_depends = dynamic_liquid, bucket, doc, basic_materials \ No newline at end of file +depends = df_dependencies +optional_depends = dynamic_liquid, doc, basic_materials \ No newline at end of file diff --git a/pit_caves/init.lua b/pit_caves/init.lua index 3e308fb..46d291f 100644 --- a/pit_caves/init.lua +++ b/pit_caves/init.lua @@ -1,3 +1,5 @@ +pit_caves = {} + local modpath = minetest.get_modpath(minetest.get_current_modname()) local S = minetest.get_translator(minetest.get_current_modname()) @@ -28,6 +30,11 @@ if minetest.get_modpath("default") then end end +local log_location +if minetest.get_modpath("mapgen_helper") and mapgen_helper.log_location_enabled then + log_location = mapgen_helper.log_first_location +end + local ignore if minetest.get_modpath("chasms") then -- the chasms mod already sets up a method to allow chasms to avoid overwriting stalactites and whatnot, @@ -65,6 +72,8 @@ local get_pit = function(pos) return {location = location, depth = depth, top = top} end +pit_caves.get_nearest_pit = get_pit + local perlin_params = { offset = 0, scale = 1, @@ -137,6 +146,7 @@ minetest.register_on_generated(function(minp, maxp, seed) data[vi] = c_gravel else data[vi] = c_air + if log_location then log_location("pit_cave", vector.new(x,y,z)) end end end end @@ -218,4 +228,4 @@ minetest.register_chatcommand("find_pit_caves", { return false, S("You need the server privilege to use this command.") end end, -}) +}) \ No newline at end of file