]> git.lizzy.rs Git - autodupe.git/blob - init.lua
Add API
[autodupe.git] / init.lua
1 autodupe = {}
2
3 local function prepare_item_collect(pos)
4         minetest.localplayer:set_pos(vector.subtract(pos, vector.new(0, 1, 0)))
5 end
6
7 local function node_inv_str(pos)
8         return "nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z
9 end
10
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() == ""
14 end
15
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
19                         return index
20                 end
21         end
22         return 1
23 end
24
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
32                         found_furnace = true
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)
37                         invact:apply()
38                         minetest.interact("activate", {type = "nothing"})
39                         break
40                 end
41         end
42
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)
50                                 end
51                                 return
52                         end
53                 end
54         end
55 end
56
57 local function dupe_furnaces()
58         local furnace_index
59         for index, stack in ipairs(minetest.get_inventory("current_player").main) do
60                 if stack:get_name() == "mcl_furnaces:furnace" then
61                         if furnace_index then
62                                 return true
63                         end
64                         furnace_index = index
65                 end
66         end
67         if furnace_index then
68                 autodupe.needed(furnace_index)
69         end
70 end
71
72 function autodupe.cleanup()
73         if not dupe_furnaces() then
74                 return false
75         end
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)
83                 return false
84         end
85         return true
86 end
87
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())
99                         invact:apply()
100                 end
101         end
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
108                         if not dug_any then
109                                 autotool.select_best_tool("mcl_furnaces:furnace")
110                                 dug_any = true
111                         end
112                         minetest.dig_node(p)
113                 end
114         end
115         if dug_any then
116                 player:set_wield_index(index)
117                 minetest.close_formspec("")
118         end
119 end)
120
121 minetest.register_cheat("AutoDupe", "World", "autodupe")