From 2f97a367f3225fb9db4009952ab2063f4a2471c8 Mon Sep 17 00:00:00 2001 From: OgelGames Date: Wed, 21 Jun 2023 14:49:34 +1000 Subject: [PATCH] Fix autocrafter destroying replacement items (#72) --- autocrafter.lua | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/autocrafter.lua b/autocrafter.lua index 22ff6d7..00869e1 100644 --- a/autocrafter.lua +++ b/autocrafter.lua @@ -35,25 +35,42 @@ end local function autocraft(inventory, craft) if not craft then return false end - local output_item = craft.output.item - - -- check if we have enough room in dst - if not inventory:room_for_item("dst", output_item) then return false end - local consumption = craft.consumption - local inv_index = count_index(inventory:get_list("src")) -- check if we have enough material available - for itemname, number in pairs(consumption) do + local inv_index = count_index(inventory:get_list("src")) + for itemname, number in pairs(craft.consumption) do if (not inv_index[itemname]) or inv_index[itemname] < number then return false end end + -- check if output and all replacements fit in dst + local output = craft.output.item + local out_items = count_index(craft.decremented_input.items) + out_items[output:get_name()] = (out_items[output:get_name()] or 0) + output:get_count() + local empty_count = 0 + for _,item in pairs(inventory:get_list("dst")) do + if item:is_empty() then + empty_count = empty_count + 1 + else + local name = item:get_name() + if out_items[name] then + out_items[name] = out_items[name] - item:get_free_space() + end + end + end + for _,count in pairs(out_items) do + if count > 0 then + empty_count = empty_count - 1 + end + end + if empty_count < 0 then + return false + end -- consume material - for itemname, number in pairs(consumption) do + for itemname, number in pairs(craft.consumption) do for _ = 1, number do -- We have to do that since remove_item does not work if count > stack_max inventory:remove_item("src", ItemStack(itemname)) end end - -- craft the result into the dst inventory and add any "replacements" as well - inventory:add_item("dst", output_item) + inventory:add_item("dst", output) for i = 1, 9 do inventory:add_item("dst", craft.decremented_input.items[i]) end