From 40ab3e011de5be83b342e5d2b67c2837294b2d58 Mon Sep 17 00:00:00 2001
From: Wuzzy <wuzzy2@mail.ru>
Date: Tue, 16 Oct 2018 06:25:34 +0200
Subject: [PATCH] Add disable_repair group to prevent tool repair (#7381)

---
 doc/lua_api.txt                          |  4 ++++
 games/minimal/mods/experimental/init.lua | 28 ++++++++++++++++++++++++
 src/craftdef.cpp                         |  2 +-
 3 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 19d6482ae..b079ac822 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -1551,6 +1551,8 @@ Special groups
   connect to each other
 * `slippery`: Players and items will slide on the node.
   Slipperiness rises steadily with `slippery` value, starting at 1.
+* `disable_repair`: If set to 1 for a tool, it cannot be repaired using the
+  `"toolrepair"` crafting recipe
 
 
 Known damage and digging time defining groups
@@ -6156,6 +6158,8 @@ Used by `minetest.register_craft`.
         additional_wear = -0.02,
     }
 
+Note: Tools with group `disable_repair=1` will not repairable by this recipe.
+
 ### Cooking
 
     {
diff --git a/games/minimal/mods/experimental/init.lua b/games/minimal/mods/experimental/init.lua
index 4d4e3e90c..e8aeff2b3 100644
--- a/games/minimal/mods/experimental/init.lua
+++ b/games/minimal/mods/experimental/init.lua
@@ -615,6 +615,34 @@ minetest.register_craftitem("experimental:tester_tool_2", {
 	end,
 })
 
+-- Test the disable_repair=1 group
+minetest.register_tool("experimental:unrepairable_tool", {
+	description = "Unrepairable Tool",
+	wield_image = "default_stone.png",
+	inventory_image = "default_stone.png",
+	tool_capabilities = {
+		groupcaps = {
+			cracky = {
+				times = {3, 2, 1},
+			}
+		}
+	},
+	groups = { disable_repair = 1 }
+})
+
+minetest.register_tool("experimental:repairable_tool", {
+	description = "Repairable Tool",
+	wield_image = "default_dirt.png",
+	inventory_image = "default_dirt.png",
+	tool_capabilities = {
+		groupcaps = {
+			cracky = {
+				times = {3, 2, 1},
+			}
+		}
+	},
+})
+
 minetest.register_craft({
 	output = 'experimental:tester_tool_2',
 	recipe = {
diff --git a/src/craftdef.cpp b/src/craftdef.cpp
index 922ea345e..d64b7e55e 100644
--- a/src/craftdef.cpp
+++ b/src/craftdef.cpp
@@ -579,7 +579,7 @@ static ItemStack craftToolRepair(
 	IItemDefManager *idef = gamedef->idef();
 	if (item1.count != 1 || item2.count != 1 || item1.name != item2.name
 			|| idef->get(item1.name).type != ITEM_TOOL
-			|| idef->get(item2.name).type != ITEM_TOOL) {
+			|| itemgroup_get(idef->get(item1.name).groups, "disable_repair") == 1) {
 		// Failure
 		return ItemStack();
 	}
-- 
2.25.1