diff --git a/autocrafter.lua b/autocrafter.lua index 4a898f5..f500c77 100644 --- a/autocrafter.lua +++ b/autocrafter.lua @@ -22,22 +22,12 @@ local function get_craft(pos, inventory, hash) local hash = hash or minetest.hash_node_position(pos) local craft = autocrafterCache[hash] if not craft then - if inventory:is_empty("recipe") then - set_infotext(pos, nil) - return - end local recipe = inventory:get_list("recipe") local output, decremented_input = minetest.get_craft_result({method = "normal", width = 3, items = recipe}) craft = {recipe = recipe, consumption=count_index(recipe), output = output, decremented_input = decremented_input} autocrafterCache[hash] = craft - set_infotext(pos, "Autocrafter: " .. output.item:get_name()) - end - -- only return crafts that have an actual result - if not craft.output.item:is_empty() then - return craft - else - set_infotext(pos, "Autocrafter: unknown recipe") end + return craft end local function start_crafter(pos) @@ -78,6 +68,11 @@ local function after_recipe_change(pos, inventory) end end + craft = craft or get_craft(pos, inventory, hash) + local output_item = craft.output.item + set_infotext(pos, "Autocrafter: " .. output_item:get_name()) + inventory:set_stack("output", 1, output_item) + start_crafter(pos) end @@ -119,6 +114,12 @@ local function run_autocrafter(pos, elapsed) local inventory = meta:get_inventory() local craft = get_craft(pos, inventory) + -- only use crafts that have an actual result + if craft.output.item:is_empty() then + set_infotext(pos, "Autocrafter: unknown recipe") + return false + end + for step = 1, math.floor(elapsed/craft_time) do local continue = autocraft(inventory, craft) if not continue then return false end @@ -146,6 +147,8 @@ local function set_formspec(meta, enabled) meta:set_string("formspec", "size[8,11]".. "list[context;recipe;0,0;3,3;]".. + "image[3,1;1,1;gui_hb_bg.png^[colorize:#141318:255]".. + "list[context;output;3,1;1,1;]".. "image_button[3,2;1,1;pipeworks_button_" .. state .. ".png;" .. state .. ";;;false;pipeworks_button_interm.png]" .. "list[context;src;0,3.5;8,3;]".. "list[context;dst;4,0;4,3;]".. @@ -162,6 +165,19 @@ local function add_virtual_item(inv, listname, index, stack) inv:set_stack(listname, index, stack_copy) end +local function on_output_change(pos, inventory, stack) + if not stack then + inventory:set_list("output", {}) + inventory:set_list("recipe", {}) + else + local input = minetest.get_craft_recipe(stack:get_name()) + if not input.items or input.type ~= "normal" then return end + inventory:set_list("recipe", input.items) + add_virtual_item(inventory, "output", 1, stack) + end + after_recipe_change(pos, inventory) +end + minetest.register_node("pipeworks:autocrafter", { description = "Autocrafter", drawtype = "normal", @@ -190,6 +206,7 @@ minetest.register_node("pipeworks:autocrafter", { inv:set_size("src", 3*8) inv:set_size("recipe", 3*3) inv:set_size("dst", 4*3) + inv:set_size("output", 1) end, on_receive_fields = function(pos, formname, fields, sender) local meta = minetest.get_meta(pos) @@ -227,10 +244,12 @@ minetest.register_node("pipeworks:autocrafter", { add_virtual_item(inv, listname, index, stack) after_recipe_change(pos, inv) return 0 - else - after_inventory_change(pos, inv) - return stack:get_count() + elseif listname == "output" then + on_output_change(pos, inv, stack) + return 0 end + after_inventory_change(pos, inv) + return stack:get_count() end, allow_metadata_inventory_take = function(pos, listname, index, stack, player) update_autocrafter(pos) @@ -239,23 +258,33 @@ minetest.register_node("pipeworks:autocrafter", { inv:set_stack(listname, index, ItemStack("")) after_recipe_change(pos, inv) return 0 - else - after_inventory_change(pos, inv) - return stack:get_count() + elseif listname == "output" then + on_output_change(pos, inv, nil) + return 0 end + after_inventory_change(pos, inv) + return stack:get_count() end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) update_autocrafter(pos) local inv = minetest.get_meta(pos):get_inventory() local stack = inv:get_stack(from_list, from_index) stack:set_count(count) + + if to_list == "output" then + on_output_change(pos, inv, stack) + return 0 + elseif from_list == "output" then + on_output_change(pos, inv, nil) + return 0 + end + if from_list == "recipe" then inv:set_stack(from_list, from_index, ItemStack("")) end if to_list == "recipe" then add_virtual_item(inv, to_list, to_index, stack) end - if from_list == "recipe" or to_list == "recipe" then after_recipe_change(pos, inv) return 0