Fix autocrafter destroying replacement items (#72)

This commit is contained in:
OgelGames 2023-06-21 14:49:34 +10:00 committed by GitHub
parent 9395013cde
commit 2f97a367f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -35,25 +35,42 @@ end
local function autocraft(inventory, craft) local function autocraft(inventory, craft)
if not craft then return false end 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 -- 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 if (not inv_index[itemname]) or inv_index[itemname] < number then return false end
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 -- 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 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)) inventory:remove_item("src", ItemStack(itemname))
end end
end end
-- craft the result into the dst inventory and add any "replacements" as well -- 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 for i = 1, 9 do
inventory:add_item("dst", craft.decremented_input.items[i]) inventory:add_item("dst", craft.decremented_input.items[i])
end end