aboutsummaryrefslogtreecommitdiff
path: root/init.lua
blob: a2b8328f9bfbcfad1bc8251ab7565811e8dab09a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
autotool = {}

local function check_tool(stack, node_groups, old_best_time)
	local toolcaps = stack:get_tool_capabilities()
	if not toolcaps then return end
	local best_time = old_best_time
	for group, groupdef in pairs(toolcaps.groupcaps) do
		local level = node_groups[group]
		if level then
			local this_time = groupdef.times[level]
			if this_time < best_time then
				best_time = this_time
			end
		end
	end
	return best_time < old_best_time, best_time
end

local function find_best_tool(nodename)
	local player = minetest.localplayer
	local inventory = minetest.get_inventory("current_player")
	local node_groups = minetest.get_node_def(nodename).groups
	local new_index = player:get_wield_index()
	local is_better, best_time = false, math.huge
	is_better, best_time = check_tool(player:get_wielded_item(), node_groups, best_time)
	is_better, best_time = check_tool(inventory.hand[1], node_groups, best_time)
	for index, stack in ipairs(inventory.main) do
		is_better, best_time = check_tool(stack, node_groups, best_time)
		if is_better then
			new_index = index
		end
	end
	return new_index
end

function autotool.select_best_tool(nodename)
	minetest.localplayer:set_wield_index(find_best_tool(nodename))
end

local new_index, old_index, pointed_pos

minetest.register_on_punchnode(function(pos, node)
	if minetest.settings:get_bool("autotool") then
		pointed_pos = pos
		old_index = old_index or minetest.localplayer:get_wield_index()
		new_index = find_best_tool(node.name)
	end
end)

minetest.register_globalstep(function()
	local player = minetest.localplayer
	if not new_index then return end
	if minetest.settings:get_bool("autotool") then
		local pt = minetest.get_pointed_thing()
		if pt and pt.type == "node" and vector.equals(minetest.get_pointed_thing_position(pt), pointed_pos) and player:get_control().dig then
			player:set_wield_index(new_index)
			return
		end
	end
	player:set_wield_index(old_index)
	new_index, old_index, pointed_pos = nil
end)

minetest.register_cheat("AutoTool", "Inventory", "autotool")