Fix autocrafter destroying replacement items (#72)
This commit is contained in:
parent
9395013cde
commit
2f97a367f3
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user