3 local function prepare_item_collect(pos)
4 minetest.localplayer:set_pos(vector.subtract(pos, vector.new(0, 1, 0)))
7 local function node_inv_str(pos)
8 return "nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z
11 local function inv_empty(pos)
12 local inv = minetest.get_inventory(node_inv_str(pos))
13 return not inv or not inv.src or inv.src[1]:get_name() == ""
16 local function get_free_inv_slot()
17 for index, stack in ipairs(minetest.get_inventory("current_player").main) do
18 if stack:get_name() == "" then
25 function autodupe.needed(index)
26 local player = minetest.localplayer
27 local ppos = player:get_pos()
28 local furnaces = minetest.find_nodes_near(ppos, 5, "mcl_furnaces:furnace", true)
29 local found_furnace = false
30 for _, fpos in ipairs(furnaces) do
31 if inv_empty(fpos) then
33 local invstr = node_inv_str(fpos)
34 local invact = InventoryAction("move")
35 invact:from("current_player", "main", index)
36 invact:to(invstr, "src", 1)
38 minetest.interact("activate", {type = "nothing"})
43 if not found_furnace then
44 local airs = minetest.find_nodes_near(ppos, 5, "air", false)
45 for _, apos in ipairs(airs) do
46 if inv_empty(apos) then
47 if minetest.switch_to_item("mcl_furnaces:furnace") then
48 minetest.place_node(apos)
49 prepare_item_collect(apos)
57 local function dupe_furnaces()
59 for index, stack in ipairs(minetest.get_inventory("current_player").main) do
60 if stack:get_name() == "mcl_furnaces:furnace" then
68 autodupe.needed(furnace_index)
72 function autodupe.cleanup()
73 if not dupe_furnaces() then
76 local player = minetest.localplayer
77 local ppos = player:get_pos()
78 local furnaces = minetest.find_nodes_near(ppos, 5, "mcl_furnaces:furnace", true)
79 for _, fpos in ipairs(furnaces) do
80 prepare_item_collect(fpos)
81 autotool.select_best_tool("mcl_furnaces:furnace")
82 minetest.dig_node(fpos)
88 minetest.register_globalstep(function(dtime)
89 if not minetest.settings:get_bool("autodupe") then return end
90 local player = minetest.localplayer
91 if not player then return end
92 local airs = minetest.find_nodes_near(player:get_pos(), 5, "air", true)
93 for _, p in ipairs(airs) do
94 if not inv_empty(p) then
95 local invstr = node_inv_str(p)
96 local invact = InventoryAction("move")
97 invact:from(invstr, "src", 1)
98 invact:to("current_player", "main", get_free_inv_slot())
102 local furnaces = minetest.find_nodes_near(player:get_pos(), 5, "mcl_furnaces:furnace", true)
103 local dug_any = false
104 local index = player:get_wield_index()
105 for _, p in ipairs(furnaces) do
106 local inv = minetest.get_inventory(node_inv_str(p))
107 if not inv_empty(p) then
109 autotool.select_best_tool("mcl_furnaces:furnace")
116 player:set_wield_index(index)
117 minetest.close_formspec("")
121 minetest.register_cheat("AutoDupe", "World", "autodupe")