-minetest.register_globalstep(function()
+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)
if not minetest.settings:get_bool("autodupe") then return end
local player = minetest.localplayer
if not player then return end
- local airs = minetest.find_nodes_near(player:get_pos(), 5, "air")
+ local airs = minetest.find_nodes_near(player:get_pos(), 5, "air", true)
for _, p in ipairs(airs) do
- local invstr = "nodemeta:" .. p.x .. "," .. p.y .. "," .. p.z
- if minetest.get_inventory(invstr) then
- local invact = InventoryAction("drop")
+ if not inv_empty(p) then
+ local invstr = node_inv_str(p)
+ local invact = InventoryAction("move")
invact:from(invstr, "src", 1)
- invact:set_count(0)
+ invact:to("current_player", "main", get_free_inv_slot())
invact:apply()
end
end
- local furnaces = minetest.find_nodes_near(player:get_pos(), 5, "mcl_furnaces:furnace")
+ local furnaces = minetest.find_nodes_near(player:get_pos(), 5, "mcl_furnaces:furnace", true)
local dug_any = false
local index = player:get_wield_index()
for _, p in ipairs(furnaces) do
- local inv = minetest.get_inventory("nodemeta:" .. p.x .. "," .. p.y .. "," .. p.z)
- if inv and inv.src and inv.src[1]:get_name() ~= "" then
+ local inv = minetest.get_inventory(node_inv_str(p))
+ if not inv_empty(p) then
if not dug_any then
autotool.select_best_tool("mcl_furnaces:furnace")
dug_any = true
player:set_wield_index(index)
minetest.close_formspec("")
end
-end)
+end)
minetest.register_cheat("AutoDupe", "World", "autodupe")