+autodupe = {}
+
+local function prepare_item_collect(pos)
+ minetest.localplayer:set_pos(vector.subtract(pos, vector.new(0, 1, 0)))
+end
+
+local function node_inv_str(pos)
+ return "nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z
+end
+
+local function inv_empty(pos)
+ local inv = minetest.get_inventory(node_inv_str(pos))
+ return not inv or not inv.src or inv.src[1]:get_name() == ""
+end
+
+local function get_free_inv_slot()
+ for index, stack in ipairs(minetest.get_inventory("current_player").main) do
+ if stack:get_name() == "" then
+ return index
+ end
+ end
+ return 1
+end
+
+function autodupe.needed(index)
+ local player = minetest.localplayer
+ local ppos = player:get_pos()
+ local furnaces = minetest.find_nodes_near(ppos, 5, "mcl_furnaces:furnace", true)
+ local found_furnace = false
+ for _, fpos in ipairs(furnaces) do
+ if inv_empty(fpos) then
+ found_furnace = true
+ local invstr = node_inv_str(fpos)
+ local invact = InventoryAction("move")
+ invact:from("current_player", "main", index)
+ invact:to(invstr, "src", 1)
+ invact:apply()
+ minetest.interact("activate", {type = "nothing"})
+ break
+ end
+ end
+
+ if not found_furnace then
+ local airs = minetest.find_nodes_near(ppos, 5, "air", false)
+ for _, apos in ipairs(airs) do
+ if inv_empty(apos) then
+ if minetest.switch_to_item("mcl_furnaces:furnace") then
+ minetest.place_node(apos)
+ prepare_item_collect(apos)
+ end
+ return
+ end
+ end
+ end
+end
+
+local function dupe_furnaces()
+ local furnace_index
+ for index, stack in ipairs(minetest.get_inventory("current_player").main) do
+ if stack:get_name() == "mcl_furnaces:furnace" then
+ if furnace_index then
+ return true
+ end
+ furnace_index = index
+ end
+ end
+ if furnace_index then
+ autodupe.needed(furnace_index)
+ end
+end
+
+function autodupe.cleanup()
+ if not dupe_furnaces() then
+ return false
+ end
+ local player = minetest.localplayer
+ local ppos = player:get_pos()
+ local furnaces = minetest.find_nodes_near(ppos, 5, "mcl_furnaces:furnace", true)
+ for _, fpos in ipairs(furnaces) do
+ prepare_item_collect(fpos)
+ autotool.select_best_tool("mcl_furnaces:furnace")
+ minetest.dig_node(fpos)
+ return false
+ end
+ return true
+end
+
+minetest.register_globalstep(function(dtime)