--[[ ===================================================================== ** More Ores ** By Calinou, with the help of Nore. Copyright (c) 2011-2020 Hugo Locurcio and contributors. Licensed under the zlib license. See LICENSE.md for more information. ===================================================================== --]] moreores = {} local modpath = minetest.get_modpath ("moreores") local S if minetest.get_modpath("intllib") then S = intllib.Getter() else S = function(s) return s end end moreores.S = S dofile(modpath .. "/_config.txt") -- `mg` mapgen support if minetest.get_modpath("mg") then dofile(modpath .. "/mg.lua") end -- "frame" support -- A dependency on "frame" breaks things local use_frame = false local default_stone_sounds = default.sound_stone() local default_metal_sounds = default.sound_metal() minetest.register_node ("moreores:silver_block", { description = "Silver Block", tiles = { "moreores_silver_block.png" } , is_ground_content = true, groups = { snappy=1,bendy=2,cracky=1,melty=2,level=2 } , sounds = default.sound_stone(), workbench = true , }) -- Returns the crafting recipe table for a given material and item. local function get_recipe(material, item) if item == "sword" then return { {material}, {material}, {"group:stick"}, } end if item == "shovel" then return { {material}, {"group:stick"}, {"group:stick"}, } end if item == "axe" then return { {material, material}, {material, "group:stick"}, {"", "group:stick"}, } end if item == "pick" then return { {material, material, material}, {"", "group:stick", ""}, {"", "group:stick", ""}, } end if item == "block" then return { {material, material, material}, {material, material, material}, {material, material, material}, } end if item == "lockedchest" then return { {"group:wood", "group:wood", "group:wood"}, {"group:wood", material, "group:wood"}, {"group:wood", "group:wood", "group:wood"}, } end end local function add_ore(modname, description, mineral_name, oredef) local img_base = modname .. "_" .. mineral_name local toolimg_base = modname .. "_tool_"..mineral_name local tool_base = modname .. ":" local tool_post = "_" .. mineral_name local item_base = tool_base .. mineral_name local ingot = item_base .. "_ingot" local lump_item = item_base .. "_lump" if oredef.makes.ore then minetest.register_node(modname .. ":mineral_" .. mineral_name, { description = S("@1 Ore", S(description)), tiles = {"default_stone.png^" .. modname .. "_mineral_" .. mineral_name .. ".png"}, groups = {cracky = 2}, sounds = default_stone_sounds, drop = lump_item, }) if use_frame then frame.register(modname .. ":mineral_" .. mineral_name) end end if oredef.makes.block then -- 210624 RJK: Let "moreores" blocks be workbench-able local workbench = oredef.makes.workbench if not workbench then workbench = false end local block_item = item_base .. "_block" minetest.register_node (block_item, { description = S("@1 Block", S(description)), tiles = { img_base .. "_block.png" } , groups = { snappy=1, bendy=2, cracky=1, melty=2, level=2 } , sounds = default_metal_sounds , workbench = workbench , }) minetest.register_alias(mineral_name.."_block", block_item) if oredef.makes.ingot then minetest.register_craft( { output = block_item, recipe = get_recipe(ingot, "block") }) minetest.register_craft( { output = ingot .. " 9", recipe = { {block_item}, } }) end if use_frame then frame.register(block_item) end end if oredef.makes.lump then minetest.register_craftitem(lump_item, { description = S("@1 Lump", S(description)), inventory_image = img_base .. "_lump.png", }) minetest.register_alias(mineral_name .. "_lump", lump_item) if oredef.makes.ingot then minetest.register_craft({ type = "cooking", output = ingot, recipe = lump_item, }) end if use_frame then frame.register(lump_item) end end if oredef.makes.ingot then minetest.register_craftitem(ingot, { description = S("@1 Ingot", S(description)), inventory_image = img_base .. "_ingot.png", }) minetest.register_alias(mineral_name .. "_ingot", ingot) if use_frame then frame.register(ingot) end end if oredef.makes.chest then minetest.register_craft( { output = "default:chest_locked", recipe = { {ingot}, {"default:chest"}, } }) minetest.register_craft( { output = "default:chest_locked", recipe = get_recipe(ingot, "lockedchest") }) end oredef.oredef.ore_type = "scatter" oredef.oredef.ore = modname .. ":mineral_" .. mineral_name oredef.oredef.wherein = "default:stone" minetest.register_ore(oredef.oredef) for tool_name, tooldef in pairs(oredef.tools) do local tdef = { description = "", inventory_image = toolimg_base .. tool_name .. ".png", tool_capabilities = { max_drop_level = 3, groupcaps = tooldef, }, sound = {breaks = "default_tool_breaks"}, } if tool_name == "sword" then tdef.tool_capabilities.full_punch_interval = oredef.full_punch_interval tdef.tool_capabilities.damage_groups = oredef.damage_groups tdef.description = S("@1 Sword", S(description)) end if tool_name == "pick" then tdef.tool_capabilities.full_punch_interval = oredef.full_punch_interval tdef.tool_capabilities.damage_groups = oredef.damage_groups tdef.description = S("@1 Pickaxe", S(description)) end if tool_name == "axe" then tdef.tool_capabilities.full_punch_interval = oredef.full_punch_interval tdef.tool_capabilities.damage_groups = oredef.damage_groups tdef.description = S("@1 Axe", S(description)) end if tool_name == "shovel" then tdef.full_punch_interval = oredef.full_punch_interval tdef.tool_capabilities.damage_groups = oredef.damage_groups tdef.description = S("@1 Shovel", S(description)) tdef.wield_image = toolimg_base .. tool_name .. ".png^[transformR90" end local fulltool_name = tool_base .. tool_name .. tool_post if tool_name == "hoe" and minetest.get_modpath("farming") then tdef.max_uses = tooldef.uses tdef.description = S("@1 Hoe", S(description)) farming.register_hoe(fulltool_name, tdef) end -- Hoe registration is handled above. -- There are no crafting recipes for hoes, as they have been -- deprecated from Minetest Game: -- https://github.com/minetest/minetest_game/commit/9c459e77a if tool_name ~= "hoe" then minetest.register_tool(fulltool_name, tdef) if oredef.makes.ingot then minetest.register_craft({ output = fulltool_name, recipe = get_recipe(ingot, tool_name) }) end end -- Toolranks support if minetest.get_modpath("toolranks") then minetest.override_item(fulltool_name, { original_description = tdef.description, description = toolranks.create_description(tdef.description, 0, 1), after_use = toolranks.new_afteruse}) end minetest.register_alias(tool_name .. tool_post, fulltool_name) if use_frame then frame.register(fulltool_name) end end end local oredefs = { silver = { description = "Silver", makes = {ore = true, block = true, lump = true, ingot = true, chest = true}, oredef = { clust_scarcity = moreores.silver_chunk_size ^ 3, clust_num_ores = moreores.silver_ore_per_chunk, clust_size = moreores.silver_chunk_size, y_min = moreores.silver_min_depth, y_max = moreores.silver_max_depth, }, tools = { pick = { cracky = {times = {[1] = 2.60, [2] = 1.00, [3] = 0.60}, uses = 100, maxlevel = 1}, }, hoe = { uses = 300, }, shovel = { crumbly = {times = {[1] = 1.10, [2] = 0.40, [3] = 0.25}, uses = 100, maxlevel = 1}, }, axe = { choppy = {times = {[1] = 2.50, [2] = 0.80, [3] = 0.50}, uses = 100, maxlevel = 1}, fleshy = {times = {[2] = 1.10, [3] = 0.60}, uses = 100, maxlevel = 1} }, sword = { fleshy = {times = {[2] = 0.70, [3] = 0.30}, uses = 100, maxlevel = 1}, snappy = {times = {[2] = 0.70, [3] = 0.30}, uses = 100, maxlevel = 1}, choppy = {times = {[3] = 0.80}, uses = 100, maxlevel = 0}, }, }, full_punch_interval = 1.0, damage_groups = {fleshy = 6}, }, mithril = { -- 210624 RJK: Block of this one is workbench-able description = "Mithril", makes = {ore = true, block = true, lump = true, ingot = true, chest = false, workbench = true }, oredef = { clust_scarcity = moreores.mithril_chunk_size ^ 3, clust_num_ores = moreores.mithril_ore_per_chunk, clust_size = moreores.mithril_chunk_size, y_min = moreores.mithril_min_depth, y_max = moreores.mithril_max_depth, }, tools = { pick = { cracky = {times = {[1] = 2.25, [2] = 0.55, [3] = 0.35}, uses = 200, maxlevel = 2} }, hoe = { uses = 1000, }, shovel = { crumbly = {times = {[1] = 0.70, [2] = 0.35, [3] = 0.20}, uses = 200, maxlevel = 2}, }, axe = { choppy = {times = {[1] = 1.75, [2] = 0.45, [3] = 0.45}, uses = 200, maxlevel = 2}, fleshy = {times = {[2] = 0.95, [3] = 0.30}, uses = 200, maxlevel = 1} }, sword = { fleshy = {times = {[2] = 0.65, [3] = 0.25}, uses = 200, maxlevel = 2}, snappy = {times = {[2] = 0.70, [3] = 0.25}, uses = 200, maxlevel = 2}, choppy = {times = {[3] = 0.65}, uses = 200, maxlevel = 0}, }, }, full_punch_interval = 0.45, damage_groups = {fleshy = 9}, } } -- If tin is available in the `default` mod, don't register More Ores' variant of tin local default_tin if minetest.registered_items["default:tin_ingot"] then default_tin = true else default_tin = false end if default_tin then minetest.register_alias("moreores:mineral_tin", "default:stone_with_tin") minetest.register_alias("moreores:tin_lump", "default:tin_lump") minetest.register_alias("moreores:tin_ingot", "default:tin_ingot") minetest.register_alias("moreores:tin_block", "default:tinblock") else oredefs.tin = { description = "Tin", makes = {ore = true, block = true, lump = true, ingot = true, chest = false}, oredef = { clust_scarcity = moreores.tin_chunk_size ^ 3, clust_num_ores = moreores.tin_ore_per_chunk, clust_size = moreores.tin_chunk_size, y_min = moreores.tin_min_depth, y_max = moreores.tin_max_depth, }, tools = {}, } -- Bronze has some special cases, because it is made from copper and tin minetest.register_craft({ type = "shapeless", output = "default:bronze_ingot 3", recipe = { "moreores:tin_ingot", "default:copper_ingot", "default:copper_ingot", }, }) end -- Copper rail (unique node) if minetest.get_modpath("carts") then carts:register_rail("moreores:copper_rail", { description = S("Copper Rail"), tiles = { "moreores_copper_rail.png", "moreores_copper_rail_curved.png", "moreores_copper_rail_t_junction.png", "moreores_copper_rail_crossing.png", }, inventory_image = "moreores_copper_rail.png", wield_image = "moreores_copper_rail.png", groups = carts:get_rail_groups(), }, {}) end minetest.register_craft({ output = "moreores:copper_rail 24", recipe = { {"default:copper_ingot", "", "default:copper_ingot"}, {"default:copper_ingot", "group:stick", "default:copper_ingot"}, {"default:copper_ingot", "", "default:copper_ingot"}, }, }) for orename, def in pairs(oredefs) do -- Register everything add_ore("moreores", def.description, orename, def) end