--[[ ===================================================================== ** More Ores ** By Calinou, with the help of Nore. Copyright (c) 2011-2015 Calinou and contributors. Licensed under the zlib license. See LICENSE.md for more information. ===================================================================== --]] local S if minetest.get_modpath("intllib") then S = intllib.Getter() else S = function(s) return s end end local modpath = minetest.get_modpath("rhodochrosite") moreores_rhodochrosite_chunk_size = 11 moreores_rhodochrosite_ore_per_chunk = 3 moreores_rhodochrosite_min_depth = -31000 moreores_rhodochrosite_max_depth = -512 -- Utility functions -- ================= local default_stone_sounds = default.sound_stone() local function hoe_on_use(itemstack, user, pointed_thing, uses) local pt = pointed_thing -- Check if pointing at a node: if not pt then return end if pt.type ~= "node" then return end local under = minetest.get_node(pt.under) local pos = {x = pt.under.x, y = pt.under.y + 1, z = pt.under.z} local above = minetest.get_node(pos) -- Return if any of the nodes is not registered: if not minetest.registered_nodes[under.name] then return end if not minetest.registered_nodes[above.name] then return end -- Check if the node above the pointed thing is air: if above.name ~= "air" then return end -- Check if pointing at dirt: if minetest.get_item_group(under.name, "soil") ~= 1 then return end -- Turn the node into soil, wear out item and play sound: minetest.set_node(pt.under, {name ="farming:soil"}) minetest.sound_play("default_dig_crumbly", {pos = pt.under, gain = 0.5}) itemstack:add_wear(65535 / (uses - 1)) return itemstack end local function get_recipe(c, name) if name == "sword" then return {{c}, {c}, {"group:stick"}} end if name == "shovel" then return {{c}, {"group:stick"}, {"group:stick"}} end if name == "axe" then return {{c, c}, {c, "group:stick"}, {"", "group:stick"}} end if name == "pick" then return {{c, c, c}, {"", "group:stick", ""}, {"", "group:stick", ""}} end if name == "hoe" then return {{c, c}, {"", "group:stick"}, {"", "group:stick"}} end if name == "block" then return {{c, c, c}, {c, c, c}, {c, c, c}} end if name == "lockedchest" then return {{"group:wood", "group:wood", "group:wood"}, {"group:wood", c, "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" local ingotcraft = ingot if oredef.makes.ore then minetest.register_node(modname .. ":mineral_" .. mineral_name, { description = S("%s Ore"):format(S(description)), tiles = {"default_stone.png^" .. modname .. "_mineral_" .. mineral_name .. ".png"}, groups = {cracky = 3}, sounds = default_stone_sounds, drop = lump_item }) end if oredef.makes.block then local block_item = item_base .. "_block" minetest.register_node(block_item, { description = S("%s Block"):format(S(description)), tiles = { img_base .. "_block.png" }, groups = {snappy = 1, bendy = 2, cracky = 1, melty = 2, level= 2}, sounds = default_stone_sounds }) 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 end if oredef.makes.lump then minetest.register_craftitem(lump_item, { description = S("%s Lump"):format(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 end if oredef.makes.ingot then minetest.register_craftitem(ingot, { description = S("%s Ingot"):format(S(description)), inventory_image = img_base .. "_ingot.png", }) minetest.register_alias(mineral_name .. "_ingot", ingot) 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 } } 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("%s Sword"):format(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("%s Pickaxe"):format(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("%s Axe"):format(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("%s Shovel"):format(S(description)) end if tool_name == "hoe" then tdef.description = S("%s Hoe"):format(S(description)) local uses = tooldef.uses tooldef.uses = nil tdef.on_use = function(itemstack, user, pointed_thing) return hoe_on_use(itemstack, user, pointed_thing, uses) end end local fulltool_name = tool_base .. tool_name .. tool_post minetest.register_tool(fulltool_name, tdef) minetest.register_alias(tool_name .. tool_post, fulltool_name) if oredef.makes.ingot then minetest.register_craft({ output = fulltool_name, recipe = get_recipe(ingot, tool_name) }) end end end -- Add everything: local modname = "rhodochrosite" local oredefs = { rhodochrosite = { description = "Rhodochrosite", makes = {ore = true, block = true, lump = true, ingot = true, chest = false}, oredef = {clust_scarcity = moreores_rhodochrosite_chunk_size * moreores_rhodochrosite_chunk_size * moreores_rhodochrosite_chunk_size, clust_num_ores = moreores_rhodochrosite_ore_per_chunk, clust_size = moreores_rhodochrosite_chunk_size, y_min = moreores_rhodochrosite_min_depth, y_max = moreores_rhodochrosite_max_depth }, tools = { pick = { cracky = {times = {[1] = 2.25, [2] = 0.55, [3] = 0.35}, uses = 200, maxlevel= 1} }, hoe = { uses = 1000 }, shovel = { crumbly = {times = {[1] = 0.70, [2] = 0.35, [3] = 0.20}, uses = 200, maxlevel= 1} }, axe = { choppy = {times = {[1] = 1.75, [2] = 0.45, [3] = 0.45}, uses = 200, maxlevel= 1}, fleshy = {times = {[2] = 0.95, [3] = 0.30}, uses = 200, maxlevel= 1} }, sword = { fleshy = {times = {[2] = 0.65, [3] = 0.25}, uses = 200, maxlevel= 1}, snappy = {times = {[2] = 0.70, [3] = 0.25}, uses = 200, maxlevel= 1}, choppy = {times = {[3] = 0.65}, uses = 200, maxlevel= 0} } }, full_punch_interval = 0.45, damage_groups = {fleshy = 9}, } } for orename,def in pairs(oredefs) do add_ore(modname, def.description, orename, def) end if minetest.setting_getbool("log_mods") then minetest.log("action", S("[rhodochrosite] loaded.")) end