From a2b5624666ec7b1e899f4f9620bf9e4a516ee7f2 Mon Sep 17 00:00:00 2001 From: cale Date: Wed, 23 Nov 2016 19:06:38 +0100 Subject: [PATCH] added new furnace system --- mods/default/craftitems.lua | 7 + mods/default/functions.lua | 13 ++ mods/default/nodes.lua | 4 +- mods/default/tools.lua | 14 -- mods/furnace/anvil.lua | 27 +++ mods/furnace/furnace.lua | 244 ++++++++++++++++++++++++++ mods/furnace/init.lua | 331 +----------------------------------- 7 files changed, 298 insertions(+), 342 deletions(-) create mode 100644 mods/furnace/anvil.lua create mode 100644 mods/furnace/furnace.lua diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index 7f1995c..d036144 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -49,3 +49,10 @@ minetest.register_craftitem("default:twig", { description = "Twig", inventory_image = "default_twig.png", }) + +-- blade + +minetest.register_craftitem("default:blade", { + description = "Blade", + inventory_image = "default_blade.png", +}) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 849c9b3..f1aaa27 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -37,6 +37,19 @@ function default.drop_items(pos, oldnode, oldmetadata, digger) end end +function default.drop_inv(names) + return (function (pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + meta:from_table(oldmetadata) + local inv = meta:get_inventory() + for _, n in ipairs(names) do + for i = 1, inv:get_size(n) do + default.drop_item(pos,inv:get_stack(n, i)) + end + end + end) +end + function default.register_fence(name,def) def.description = def.description or minetest.registered_nodes[def.material].description .. " Fence" def.tiles = def.tiles or minetest.registered_nodes[def.material].tiles diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index a7db5a3..05db422 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -216,8 +216,8 @@ minetest.register_node("default:treasure_chest", { drop = "default:box", after_dig_node = function(pos, oldnode, oldmetadata, digger) local items = default.treasure_chest_items - minetest.add_item(pos, {name = items[math.random(#items)], count = math.random(1,3)}) - minetest.add_item(pos, {name = items[math.random(#items)], count = math.random(1,3)}) + minetest.add_item(pos, {name = items[math.random(#items)], count = math.random(1, 3)}) + minetest.add_item(pos, {name = items[math.random(#items)], count = math.random(1, 3)}) end }) diff --git a/mods/default/tools.lua b/mods/default/tools.lua index a66fe3f..7d297e2 100644 --- a/mods/default/tools.lua +++ b/mods/default/tools.lua @@ -110,20 +110,6 @@ minetest.register_tool("default:shovel", { } }) --- blade - -minetest.register_tool("default:blade", { - description = "Blade", - inventory_image = "default_blade.png", - tool_capabilities = { - max_drop_level=3, - groupcaps= { - leaves={times={[1]=0.50}, uses=1000, maxlevel=1} - }, - damage_groups = {fleshy=5}, - } -}) - -- copper minetest.register_tool("default:pick_copper", { diff --git a/mods/furnace/anvil.lua b/mods/furnace/anvil.lua new file mode 100644 index 0000000..c3cbe01 --- /dev/null +++ b/mods/furnace/anvil.lua @@ -0,0 +1,27 @@ +furnace.anvil.materials = {} + +function furnace.anvil.register_material(name, def) + furnace.anvil.materials[name] = def +end + +furnace.anvil.register_material("iron", { + items = { + plate = "furnace:iron_plate", + rod = "furnace:iron_rod", + blade = "default:blade" + } +}) + +furnace.anvil.register_material("copper", { + items = { + plate = "furnace:copper_plate", + rod = "furnace:copper_rod" + } +}) + +furnace.anvil.register_material("gold", { + items = { + plate = "furnace:gold_plate", + rod = "furnace:gold_rod" + } +}) diff --git a/mods/furnace/furnace.lua b/mods/furnace/furnace.lua new file mode 100644 index 0000000..f093416 --- /dev/null +++ b/mods/furnace/furnace.lua @@ -0,0 +1,244 @@ +-- functions + +function furnace.register_recipe(def) + table.insert(furnace.recipes, def) -- add fuel to list +end + +function furnace.register_fuel(def) + table.insert(furnace.fuels, def) -- add recipe to list +end + +function furnace.get_recipe(item) + -- search recipe for item + for i,recipe in ipairs(furnace.recipes) do + if recipe.output == item then + return recipe -- return recipe for item + end + end + return nil -- no recipe found +end + +-- formspec + +local furnace_form = "size[8,9]" +local furnace_form = furnace_form..default.gui_colors +local furnace_form = furnace_form..default.gui_bg + +local furnace_form = furnace_form.."list[current_name;main;1.5,0.5;2,2;]" +local furnace_form = furnace_form..default.itemslot_bg(1.5, 0.5, 2, 2) +local furnace_form = furnace_form.."list[current_name;fuel;2,3;1,1;]" +local furnace_form = furnace_form..default.itemslot_bg(2, 3, 1, 1) +local furnace_form = furnace_form.."list[current_name;output;5,1;2,2;]" +local furnace_form = furnace_form..default.itemslot_bg(5, 1, 2, 2) + +local furnace_form = furnace_form.."label[1.5,0;Input:]" +local furnace_form = furnace_form.."label[5,0.5;Output:]" + +local furnace_form = furnace_form.."list[current_player;main;0,4.85;8,1;]" +local furnace_form = furnace_form..default.itemslot_bg(0,4.85,8,1) +local furnace_form = furnace_form.."list[current_player;main;0,6.08;8,3;8]" +local furnace_form = furnace_form..default.itemslot_bg(0,6.08,8,3) +local furnace_form = furnace_form.."listring[current_name;main]" +local furnace_form = furnace_form.."listring[current_name;output]" +local furnace_form = furnace_form.."listring[current_player;main]" + +-- register block + +minetest.register_node("furnace:furnace", { + description = "Furnace", + tiles = {"default_stonebrick.png", "default_stonebrick.png", "default_stonebrick.png", "default_stonebrick.png","default_stonebrick.png","furnace_stone_front.png"}, + groups = {cracky = 2}, + paramtype2 = "facedir", + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec",furnace_form) + meta:set_string("infotext", "Furnace"); + meta:set_int("fuel", 0); + + local inv = meta:get_inventory() + inv:set_size("main", 2*2) + inv:set_size("output", 2*2) + inv:set_size("fuel", 1) + end, + after_dig_node = default.drop_inv({"main", "output", "fuel"}), +}) + +minetest.register_abm({ + nodenames = {"furnace:furnace"}, + neighbors = {}, + interval = 2.0, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local meta = minetest.get_meta(pos) -- get meta + local inv = meta:get_inventory() -- get inventory + local fuel = meta:get_int("fuel") -- get fuel level + + -- check if fuel slot contains fuel + for i,fuel_def in ipairs(furnace.fuels) do + if inv:contains_item("fuel", {name = fuel_def.item}) then + fuel = fuel + fuel_def.fuel + inv:remove_item("fuel", {name = fuel_def.item}) + break + end + end + + for i,recipe in ipairs(furnace.recipes) do + if inv:contains_item("main", {name = recipe.input}) then + inv:add_item("output", {name = recipe.output}) -- add output to inventory + inv:remove_item("main", {name = recipe.input}) -- remove input + meta:set_int("fuel", fuel-1) -- decrease fuel level + break + end + end + + -- update infotext + meta:set_string("infotext", "Furnace\n Fuel : " .. tostring(fuel)) + + -- update meta + meta:set_int("fuel", fuel) + end, +}) + +-- fuel + +furnace.register_fuel({ + item = "default:coalblock", + fuel = 100 +}) + +furnace.register_fuel({ + item = "default:coal_lump", + fuel = 10 +}) + +furnace.register_fuel({ + item = "default:coal_dust", + fuel = 1 +}) + + +-- recipes + +furnace.register_recipe({ + pattern = "furnace:pattern_rod", + input = "default:stone_with_iron", + output = "furnace:iron_rod", +}) + +furnace.register_recipe({ + input = "default:stone_with_copper", + output = "furnace:copper_rod", +}) + +furnace.register_recipe({ + input = "default:stone_with_gold", + output = "furnace:gold_rod", +}) + +furnace.register_recipe({ + input = "default:sand", + output = "default:glass", +}) + +-- items + +minetest.register_craftitem("furnace:iron_rod", { + description = "Iron Rod", + inventory_image = "furnace_iron_rod.png", +}) + +minetest.register_craftitem("furnace:copper_rod", { + description = "Copper Rod", + inventory_image = "furnace_copper_rod.png", +}) + +minetest.register_craftitem("furnace:gold_rod", { + description = "Gold Rod", + inventory_image = "furnace_gold_rod.png", +}) + +minetest.register_craftitem("furnace:diamond_rod", { + description = "Diamond Rod", + inventory_image = "furnace_diamond_rod.png", +}) + +minetest.register_craftitem("furnace:iron_plate", { + description = "Iron Plate", + inventory_image = "furnace_iron_plate.png", +}) + +minetest.register_craftitem("furnace:gold_plate", { + description = "Gold Plate", + inventory_image = "furnace_gold_plate.png", +}) + +minetest.register_craftitem("furnace:copper_plate", { + description = "Copper Plate", + inventory_image = "furnace_copper_plate.png", +}) + +-- blocks + +minetest.register_node("furnace:iron_block", { + description = "Iron Block", + tiles = {"furnace_iron_block.png"}, + groups = {cracky = 1}, +}) + +minetest.register_node("furnace:gold_block", { + description = "Gold Block", + tiles = {"furnace_gold_block.png"}, + groups = {cracky = 1}, +}) + +minetest.register_node("furnace:copper_block", { + description = "Copper Block", + tiles = {"furnace_copper_block.png"}, + groups = {cracky = 1}, +}) + + +-- crafting + +minetest.register_craft({ + output = "furnace:furnace", + recipe = { + {"default:stonebrick", "default:stonebrick", "default:stonebrick"}, + {"default:stonebrick", "", "default:stonebrick"}, + {"default:stonebrick", "default:stonebrick", "default:stonebrick"}, + } +}) + +minetest.register_craft({ + output = "furnace:iron_block", + type = "shapeless", + recipe = {"default:frame", "furnace:iron_plate", "furnace:iron_plate", "furnace:iron_plate", "furnace:iron_plate", "furnace:iron_plate", "furnace:iron_plate"} +}) + +minetest.register_craft({ + output = "furnace:gold_block", + type = "shapeless", + recipe = {"default:frame", "furnace:gold_plate", "furnace:gold_plate", "furnace:gold_plate", "furnace:gold_plate", "furnace:gold_plate", "furnace:gold_plate"} +}) + +minetest.register_craft({ + output = "furnace:copper_block", + type = "shapeless", + recipe = {"default:frame", "furnace:copper_plate", "furnace:copper_plate", "furnace:copper_plate", "furnace:copper_plate", "furnace:copper_plate", "furnace:copper_plate"} +}) + +minetest.register_node("furnace:steel_frame", { + description = "Steel Frame", + tiles = {"furnace_steel_frame.png", "furnace_steel_frame_detail.png"}, + drawtype = "glasslike_framed_optional", + paramtype = "light", + groups = {choppy = 2}, +}) + + +minetest.register_craft({ + output = "furnace:diamond_rod", + recipe = { + {"furnace:iron_rod", "default:diamond"}, + } +}) diff --git a/mods/furnace/init.lua b/mods/furnace/init.lua index 7fad0f2..d72fa1f 100644 --- a/mods/furnace/init.lua +++ b/mods/furnace/init.lua @@ -1,330 +1,9 @@ furnace = {} furnace.recipes = {} +furnace.fuels = {} +furnace.anvil = {} -function furnace.register_recipe(def) - table.insert(furnace.recipes, def) -end +local modpath = minetest.get_modpath("furnace") -function furnace.get_recipe(item) - for i,recipe in ipairs(furnace.recipes) do - if recipe.output == item then - return recipe - end - end - return nil -end - -local furnace_form = "size[8,9]" -local furnace_form = furnace_form..default.gui_colors -local furnace_form = furnace_form..default.gui_bg -local furnace_form = furnace_form.."list[current_name;main;2,0.3;4,4;]" -local furnace_form = furnace_form..default.itemslot_bg(2,0.3,4,4) -local furnace_form = furnace_form.."list[current_player;main;0,4.85;8,1;]" -local furnace_form = furnace_form..default.itemslot_bg(0,4.85,8,1) -local furnace_form = furnace_form.."list[current_player;main;0,6.08;8,3;8]" -local furnace_form = furnace_form..default.itemslot_bg(0,6.08,8,3) -local furnace_form = furnace_form.."listring[current_name;main]" -local furnace_form = furnace_form.."listring[current_player;main]" - -minetest.register_node("furnace:furnace", { - description = "Furnace", - tiles = {"default_stonebrick.png", "default_stonebrick.png", "default_stonebrick.png", "default_stonebrick.png","default_stonebrick.png","furnace_stone_front.png"}, - groups = {cracky = 2}, - paramtype2 = "facedir", - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec",furnace_form) - meta:set_string("infotext", "Furnace"); - local inv = meta:get_inventory() - inv:set_size("main", 4*4) - end, - after_dig_node = default.drop_items, -}) - -minetest.register_abm({ - nodenames = {"furnace:furnace"}, - neighbors = {"group:pattern"}, - interval = 10.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local mymeta = minetest.get_meta(pos) - pos.y = pos.y - 1 - if minetest.get_node(pos).name == "lava:lava_source" or minetest.get_node(pos).name == "default:coalblock_glowing" then - local dir = vector.multiply(minetest.facedir_to_dir(minetest.get_node({x = pos.x, y= pos.y+1, z=pos.z}).param2), -1) - local patternpos = vector.add(pos, dir) - - local pattern = minetest.get_node(patternpos).name - local myinv = mymeta:get_inventory() - - for i,recipe in ipairs(furnace.recipes) do - if pattern == recipe.pattern - and myinv:contains_item("main", {name = recipe.input}) then - minetest.get_meta(patternpos):get_inventory():add_item("main", {name = recipe.output}) - myinv:remove_item("main", {name = recipe.input}) - break - end - end - end - end, -}) - -furnace.register_recipe({ - pattern = "furnace:pattern_rod", - input = "default:stone_with_iron", - output = "furnace:iron_rod", -}) - -furnace.register_recipe({ - pattern = "furnace:pattern_rod", - input = "default:stone_with_copper", - output = "furnace:copper_rod", -}) - -furnace.register_recipe({ - pattern = "furnace:pattern_rod", - input = "default:stone_with_gold", - output = "furnace:gold_rod", -}) - -furnace.register_recipe({ - pattern = "furnace:pattern_blade", - input = "default:stone_with_iron", - output = "default:blade", -}) - -furnace.register_recipe({ - pattern = "furnace:pattern_plate", - input = "default:stone_with_iron", - output = "furnace:iron_plate", -}) - -furnace.register_recipe({ - pattern = "furnace:pattern_plate", - input = "default:stone_with_copper", - output = "furnace:copper_plate", -}) - -furnace.register_recipe({ - pattern = "furnace:pattern_plate", - input = "default:stone_with_gold", - output = "furnace:gold_plate", -}) - -furnace.register_recipe({ - pattern = "furnace:pattern_plate", - input = "default:sand", - output = "default:glass", -}) - -local pattern_form = "size[8,9]" -local pattern_form = pattern_form..default.gui_colors -local pattern_form = pattern_form..default.gui_bg -local pattern_form = pattern_form.."list[current_name;main;0,0.3;8,4;]" -local pattern_form = pattern_form..default.itemslot_bg(0,0.3,8,4) -local pattern_form = pattern_form.."list[current_player;main;0,4.85;8,1;]" -local pattern_form = pattern_form..default.itemslot_bg(0,4.85,8,1) -local pattern_form = pattern_form.."list[current_player;main;0,6.08;8,3;8]" -local pattern_form = pattern_form..default.itemslot_bg(0,6.08,8,3) -local pattern_form = pattern_form.."listring[current_name;main]" -local pattern_form = pattern_form.."listring[current_player;main]" - -minetest.register_node("furnace:pattern_rod", { - description = "Pattern for a Rod", - tiles = {"furnace_pattern_rod.png", "default_wooden_planks.png"}, - groups = {snappy = 3, pattern = 1}, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec",pattern_form) - meta:set_string("infotext", "Pattern"); - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end, - after_dig_node = default.drop_items, - on_punch = function(pos, node, player, pointed_thing) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - for i = 1, inv:get_size("main") do - local stack = inv:get_stack("main", i) - if not stack:is_empty() then - local p = { x = pos.x + math.random(0, 5)/5 - 0.5, - y = pos.y+1, - z = pos.z + math.random(0, 5)/5 - 0.5 - } - minetest.add_item(p, stack) - end - end - minetest.set_node(pos, {name="furnace:pattern_blade"}) - end, -}) - -minetest.register_node("furnace:pattern_blade", { - description = "Pattern for a blade", - tiles = {"furnace_pattern_blade.png", "default_wooden_planks.png"}, - groups = {snappy = 3, pattern = 1}, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec",pattern_form) - meta:set_string("infotext", "Pattern"); - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end, - after_dig_node = default.drop_items, - on_punch = function(pos, node, player, pointed_thing) - - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - for i = 1, inv:get_size("main") do - local stack = inv:get_stack("main", i) - if not stack:is_empty() then - local p = { x = pos.x + math.random(0, 5)/5 - 0.5, - y = pos.y+1, - z = pos.z + math.random(0, 5)/5 - 0.5 - } - minetest.add_item(p, stack) - end - end - - minetest.set_node(pos, {name="furnace:pattern_plate"}) - end, - drop = "furnace:pattern_rod", -}) - -minetest.register_node("furnace:pattern_plate", { - description = "Pattern for a plate", - tiles = {"furnace_pattern_plate.png", "default_wooden_planks.png"}, - groups = {snappy = 3, pattern = 1}, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec",pattern_form) - meta:set_string("infotext", "Pattern"); - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end, - after_dig_node = default.drop_items, - on_punch = function(pos, node, player, pointed_thing) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - for i = 1, inv:get_size("main") do - local stack = inv:get_stack("main", i) - if not stack:is_empty() then - local p = { x = pos.x + math.random(0, 5)/5 - 0.5, - y = pos.y+1, - z = pos.z + math.random(0, 5)/5 - 0.5 - } - minetest.add_item(p, stack) - end - end - minetest.set_node(pos, {name="furnace:pattern_rod"}) - end, - drop = "furnace:pattern_rod", -}) - -minetest.register_craftitem("furnace:iron_rod", { - description = "Iron Rod", - inventory_image = "furnace_iron_rod.png", -}) - -minetest.register_craftitem("furnace:copper_rod", { - description = "Copper Rod", - inventory_image = "furnace_copper_rod.png", -}) - -minetest.register_craftitem("furnace:gold_rod", { - description = "Gold Rod", - inventory_image = "furnace_gold_rod.png", -}) - -minetest.register_craftitem("furnace:diamond_rod", { - description = "Diamond Rod", - inventory_image = "furnace_diamond_rod.png", -}) - -minetest.register_craftitem("furnace:iron_plate", { - description = "Iron Plate", - inventory_image = "furnace_iron_plate.png", -}) - -minetest.register_craftitem("furnace:gold_plate", { - description = "Gold Plate", - inventory_image = "furnace_gold_plate.png", -}) - -minetest.register_craftitem("furnace:copper_plate", { - description = "Copper Plate", - inventory_image = "furnace_copper_plate.png", -}) - --- blocks - -minetest.register_node("furnace:iron_block", { - description = "Iron Block", - tiles = {"furnace_iron_block.png"}, - groups = {cracky = 1}, -}) - -minetest.register_node("furnace:gold_block", { - description = "Gold Block", - tiles = {"furnace_gold_block.png"}, - groups = {cracky = 1}, -}) - -minetest.register_node("furnace:copper_block", { - description = "Copper Block", - tiles = {"furnace_copper_block.png"}, - groups = {cracky = 1}, -}) - - --- crafting - -minetest.register_craft({ - output = "furnace:furnace", - recipe = { - {"default:stonebrick", "default:stonebrick", "default:stonebrick"}, - {"default:stonebrick", "", "default:stonebrick"}, - {"default:stonebrick", "default:stonebrick", "default:stonebrick"}, - } -}) - -minetest.register_craft({ - output = "furnace:pattern_rod", - recipe = { - {"default:stonebrick", "", "default:stonebrick"}, - {"default:stonebrick", "default:stonebrick", "default:stonebrick"}, - {"default:wood", "default:wood", "default:wood"}, - } -}) - -minetest.register_craft({ - output = "furnace:iron_block", - type = "shapeless", - recipe = {"default:frame", "furnace:iron_plate", "furnace:iron_plate", "furnace:iron_plate", "furnace:iron_plate", "furnace:iron_plate", "furnace:iron_plate"} -}) - -minetest.register_craft({ - output = "furnace:gold_block", - type = "shapeless", - recipe = {"default:frame", "furnace:gold_plate", "furnace:gold_plate", "furnace:gold_plate", "furnace:gold_plate", "furnace:gold_plate", "furnace:gold_plate"} -}) - -minetest.register_craft({ - output = "furnace:copper_block", - type = "shapeless", - recipe = {"default:frame", "furnace:copper_plate", "furnace:copper_plate", "furnace:copper_plate", "furnace:copper_plate", "furnace:copper_plate", "furnace:copper_plate"} -}) - -minetest.register_node("furnace:steel_frame", { - description = "Steel Frame", - tiles = {"furnace_steel_frame.png", "furnace_steel_frame_detail.png"}, - drawtype = "glasslike_framed_optional", - paramtype = "light", - groups = {choppy = 2}, -}) - - -minetest.register_craft({ - output = "furnace:diamond_rod", - recipe = { - {"furnace:iron_rod", "default:diamond"}, - } -}) +dofile(modpath.."/furnace.lua") +dofile(modpath.."/anvil.lua")