aboutsummaryrefslogtreecommitdiff
path: root/init.lua
diff options
context:
space:
mode:
authorElias Fleckenstein <eliasfleckenstein@web.de>2021-01-11 14:05:39 +0100
committerElias Fleckenstein <eliasfleckenstein@web.de>2021-01-11 14:05:39 +0100
commit39491e3908ef06b3731ff3e2b854780ed79363a1 (patch)
tree266fb219a2149ddbbf4ca3a754a7e234667f3e67 /init.lua
parentdf66b1fe0ce8990ce79a1c44bfefbf2cd71d7432 (diff)
downloadautodupe-39491e3908ef06b3731ff3e2b854780ed79363a1.tar.xz
Add APIHEADmaster
Diffstat (limited to 'init.lua')
-rw-r--r--init.lua107
1 files changed, 97 insertions, 10 deletions
diff --git a/init.lua b/init.lua
index d365af7..4899eed 100644
--- a/init.lua
+++ b/init.lua
@@ -1,23 +1,110 @@
-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
@@ -29,6 +116,6 @@ minetest.register_globalstep(function()
player:set_wield_index(index)
minetest.close_formspec("")
end
-end)
+end)
minetest.register_cheat("AutoDupe", "World", "autodupe")