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]
10 local this_time = groupdef.times[level]
11 if this_time and this_time < best_time then
16 return best_time < old_best_time, best_time
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)
29 for index, stack in ipairs(inventory.main) do
30 is_better, best_time = check_tool(stack, node_groups, best_time)
35 return new_index, best_time
38 function autotool.select_best_tool(nodename)
39 minetest.localplayer:set_wield_index(find_best_tool(nodename))
42 local new_index, old_index, pointed_pos, best_time
44 minetest.register_on_punchnode(function(pos, node)
45 if minetest.settings:get_bool("autotool") then
47 old_index = old_index or minetest.localplayer:get_wield_index()
48 new_index, best_time = find_best_tool(node.name)
52 minetest.register_globalstep(function()
53 local player = minetest.localplayer
54 if not new_index then return end
55 if minetest.settings:get_bool("autotool") then
56 local pt = minetest.get_pointed_thing()
57 if pt and pt.type == "node" and vector.equals(minetest.get_pointed_thing_position(pt), pointed_pos) and player:get_control().dig then
58 player:set_wield_index(new_index)
59 if best_time == 0 then
60 minetest.dig_node(pointed_pos)
65 player:set_wield_index(old_index)
66 new_index, old_index, pointed_pos, best_time = nil
69 minetest.register_cheat("AutoTool", "Inventory", "autotool")