diff options
-rw-r--r-- | README | 2 | ||||
-rw-r--r-- | init.lua | 64 | ||||
-rw-r--r-- | mod.conf | 3 | ||||
-rw-r--r-- | settingtypes.txt | 1 |
4 files changed, 70 insertions, 0 deletions
@@ -0,0 +1,2 @@ +# autotool +A dragonfire CSM to automatically select the best tool for digging a node diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..a2b8328 --- /dev/null +++ b/init.lua @@ -0,0 +1,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") diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..911814d --- /dev/null +++ b/mod.conf @@ -0,0 +1,3 @@ +name = autotool +author = Fleckenstein +description = A dragonfire CSM to automatically select the best tool for digging a node diff --git a/settingtypes.txt b/settingtypes.txt new file mode 100644 index 0000000..4de72e7 --- /dev/null +++ b/settingtypes.txt @@ -0,0 +1 @@ +autotool (AutoTool) bool false |