]> git.lizzy.rs Git - autotool.git/commitdiff
Initial Commit
authorElias Fleckenstein <eliasfleckenstein@web.de>
Fri, 11 Dec 2020 16:19:20 +0000 (17:19 +0100)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Fri, 11 Dec 2020 16:19:20 +0000 (17:19 +0100)
README [new file with mode: 0644]
init.lua [new file with mode: 0644]
mod.conf [new file with mode: 0644]
settingtypes.txt [new file with mode: 0644]

diff --git a/README b/README
new file mode 100644 (file)
index 0000000..3158467
--- /dev/null
+++ b/README
@@ -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 (file)
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 (file)
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 (file)
index 0000000..4de72e7
--- /dev/null
@@ -0,0 +1 @@
+autotool (AutoTool) bool false