]> git.lizzy.rs Git - autotool.git/blob - init.lua
Merge pull request #1 from Minetest-j45/master
[autotool.git] / init.lua
1 autotool = {}
2
3 local function check_tool(stack, node_groups, old_best_time)
4         local toolcaps = stack:get_tool_capabilities()
5         if not toolcaps then return end
6         local best_time = old_best_time
7         for group, groupdef in pairs(toolcaps.groupcaps) do
8                 local level = node_groups[group]
9                 if level then
10                         local this_time = groupdef.times[level]
11                         if this_time and this_time < best_time then
12                                 best_time = this_time
13                         end
14                 end
15         end
16         return best_time < old_best_time, best_time
17 end
18
19 local function find_best_tool(nodename)
20         local player = minetest.localplayer
21         local inventory = minetest.get_inventory("current_player")
22         local node_groups = minetest.get_node_def(nodename).groups
23         local new_index = player:get_wield_index()
24         local is_better, best_time = false, math.huge
25         is_better, best_time = check_tool(player:get_wielded_item(), node_groups, best_time)
26         if inventory.hand then
27                 is_better, best_time = check_tool(inventory.hand[1], node_groups, best_time)
28         end
29         for index, stack in ipairs(inventory.main) do
30                 is_better, best_time = check_tool(stack, node_groups, best_time)
31                 if is_better then
32                         new_index = index
33                 end
34         end
35         return new_index, best_time
36 end
37
38 function autotool.select_best_tool(nodename)
39         local new_index, best_time = find_best_tool(nodename)
40         minetest.localplayer:set_wield_index(new_index)
41         return best_time
42 end
43
44 local new_index, old_index, pointed_pos, best_time
45
46 minetest.register_on_punchnode(function(pos, node)
47         if minetest.settings:get_bool("autotool") then
48                 pointed_pos = pos
49                 old_index = old_index or minetest.localplayer:get_wield_index()
50                 new_index, best_time = find_best_tool(node.name)
51         end
52 end)
53
54 minetest.register_globalstep(function()
55         local player = minetest.localplayer
56         if not new_index then return end
57         if minetest.settings:get_bool("autotool") then
58                 local pt = minetest.get_pointed_thing()
59                 if pt and pt.type == "node" and vector.equals(minetest.get_pointed_thing_position(pt), pointed_pos) and player:get_control().dig then
60                         player:set_wield_index(new_index)
61                         if best_time == 0 then
62                                 minetest.dig_node(pointed_pos)
63                         end
64                         return
65                 end
66         end
67         player:set_wield_index(old_index)
68         new_index, old_index, pointed_pos, best_time = nil
69 end)
70
71 minetest.register_cheat("AutoTool", "Inventory", "autotool")