diff --git a/Spigot-API-Patches/0302-ItemStack-repair-check-API.patch b/Spigot-API-Patches/0302-ItemStack-repair-check-API.patch new file mode 100644 index 0000000000..2281b38541 --- /dev/null +++ b/Spigot-API-Patches/0302-ItemStack-repair-check-API.patch @@ -0,0 +1,59 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic +Date: Sat, 15 May 2021 22:10:50 -0700 +Subject: [PATCH] ItemStack repair check API + + +diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java +index 6dbd520182b1e7713a68baad09b7f613424ef619..e504567cf755557be8511f2c93c171572b78e722 100644 +--- a/src/main/java/org/bukkit/UnsafeValues.java ++++ b/src/main/java/org/bukkit/UnsafeValues.java +@@ -155,6 +155,16 @@ public interface UnsafeValues { + */ + public io.papermc.paper.inventory.ItemRarity getItemStackRarity(ItemStack itemStack); + ++ /** ++ * Checks if an itemstack can be repaired with another itemstack. ++ * Returns false if either argument's type is not an item ({@link Material#isItem()}). ++ * ++ * @param itemToBeRepaired the itemstack to be repaired ++ * @param repairMaterial the repair material ++ * @return true if valid repair, false if not ++ */ ++ public boolean isValidRepairItemStack(@org.jetbrains.annotations.NotNull ItemStack itemToBeRepaired, @org.jetbrains.annotations.NotNull ItemStack repairMaterial); ++ + /** + * Returns the server's protocol version. + * +diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java +index fccfae41f53a175e1a6a670c793e464456de6b60..0f8c593ae9bca46081f0b22c2d763a2699175398 100644 +--- a/src/main/java/org/bukkit/inventory/ItemStack.java ++++ b/src/main/java/org/bukkit/inventory/ItemStack.java +@@ -873,5 +873,27 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor + public io.papermc.paper.inventory.ItemRarity getRarity() { + return Bukkit.getUnsafe().getItemStackRarity(this); + } ++ ++ /** ++ * Checks if an itemstack can repair this itemstack. ++ * Returns false if {@code this} or {@code repairMaterial}'s type is not an item ({@link Material#isItem()}). ++ * ++ * @param repairMaterial the repair material ++ * @return true if it is repairable by, false if not ++ */ ++ public boolean isRepairableBy(@NotNull ItemStack repairMaterial) { ++ return Bukkit.getUnsafe().isValidRepairItemStack(this, repairMaterial); ++ } ++ ++ /** ++ * Checks if this itemstack can repair another. ++ * Returns false if {@code this} or {@code toBeRepaired}'s type is not an item ({@link Material#isItem()}). ++ * ++ * @param toBeRepaired the itemstack to be repaired ++ * @return true if it can repair, false if not ++ */ ++ public boolean canRepair(@NotNull ItemStack toBeRepaired) { ++ return Bukkit.getUnsafe().isValidRepairItemStack(toBeRepaired, this); ++ } + // Paper end + } diff --git a/Spigot-Server-Patches/0734-ItemStack-repair-check-API.patch b/Spigot-Server-Patches/0734-ItemStack-repair-check-API.patch new file mode 100644 index 0000000000..006fed82d1 --- /dev/null +++ b/Spigot-Server-Patches/0734-ItemStack-repair-check-API.patch @@ -0,0 +1,91 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic +Date: Sat, 15 May 2021 22:11:11 -0700 +Subject: [PATCH] ItemStack repair check API + + +diff --git a/src/main/java/net/minecraft/world/item/Item.java b/src/main/java/net/minecraft/world/item/Item.java +index f7758ee4aa8bbb31a80ec2e331b3fd3c55069808..7c9ef73983c2c7f4b7386a472e5a79dce7fa7ea7 100644 +--- a/src/main/java/net/minecraft/world/item/Item.java ++++ b/src/main/java/net/minecraft/world/item/Item.java +@@ -269,6 +269,7 @@ public class Item implements IMaterial { + return this.i; + } + ++ public boolean canRepair(ItemStack toBeRepaired, ItemStack repairMaterial) { return a(toBeRepaired, repairMaterial); } // Paper - OBFHELPER + public boolean a(ItemStack itemstack, ItemStack itemstack1) { + return false; + } +diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +index 697949abbe662a55fc31ad811863717e35b9d1b6..a386beea01056a7fb448596ba45342d832a4c63d 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +@@ -487,6 +487,14 @@ public final class CraftMagicNumbers implements UnsafeValues { + return io.papermc.paper.inventory.ItemRarity.values()[getItem(itemStack.getType()).getItemStackRarity(CraftItemStack.asNMSCopy(itemStack)).ordinal()]; + } + ++ @Override ++ public boolean isValidRepairItemStack(org.bukkit.inventory.ItemStack itemToBeRepaired, org.bukkit.inventory.ItemStack repairMaterial) { ++ if (!itemToBeRepaired.getType().isItem() || !repairMaterial.getType().isItem()) { ++ return false; ++ } ++ return this.getItem(itemToBeRepaired.getType()).canRepair(CraftItemStack.asNMSCopy(itemToBeRepaired), CraftItemStack.asNMSCopy(repairMaterial)); ++ } ++ + @Override + public int getProtocolVersion() { + return net.minecraft.SharedConstants.getGameVersion().getProtocolVersion(); +diff --git a/src/test/java/io/papermc/paper/util/ItemStackRepairCheckTest.java b/src/test/java/io/papermc/paper/util/ItemStackRepairCheckTest.java +new file mode 100644 +index 0000000000000000000000000000000000000000..8d9c9b3bd53d407391d4fcb7fc773153d1a7b402 +--- /dev/null ++++ b/src/test/java/io/papermc/paper/util/ItemStackRepairCheckTest.java +@@ -0,0 +1,48 @@ ++package io.papermc.paper.util; ++ ++import org.bukkit.Material; ++import org.bukkit.inventory.ItemStack; ++import org.bukkit.support.AbstractTestingBase; ++import org.junit.Test; ++ ++import static org.junit.Assert.assertFalse; ++import static org.junit.Assert.assertThrows; ++import static org.junit.Assert.assertTrue; ++ ++public class ItemStackRepairCheckTest extends AbstractTestingBase { ++ ++ @Test ++ public void testIsRepariableBy() { ++ ItemStack diamondPick = new ItemStack(Material.DIAMOND_PICKAXE); ++ ++ assertTrue("diamond pick isn't repairable by a diamond", diamondPick.isRepairableBy(new ItemStack(Material.DIAMOND))); ++ } ++ ++ @Test ++ public void testCanRepair() { ++ ItemStack diamond = new ItemStack(Material.DIAMOND); ++ ++ assertTrue("diamond can't repair a diamond axe", diamond.canRepair(new ItemStack(Material.DIAMOND_AXE))); ++ } ++ ++ @Test ++ public void testIsNotRepairableBy() { ++ ItemStack notDiamondPick = new ItemStack(Material.ACACIA_SAPLING); ++ ++ assertFalse("acacia sapling is repairable by a diamond", notDiamondPick.isRepairableBy(new ItemStack(Material.DIAMOND))); ++ } ++ ++ @Test ++ public void testCanNotRepair() { ++ ItemStack diamond = new ItemStack(Material.DIAMOND); ++ ++ assertFalse("diamond can repair oak button", diamond.canRepair(new ItemStack(Material.OAK_BUTTON))); ++ } ++ ++ @Test ++ public void testInvalidItem() { ++ ItemStack badItemStack = new ItemStack(Material.ACACIA_WALL_SIGN); ++ ++ assertFalse("acacia wall sign is repairable by diamond", badItemStack.isRepairableBy(new ItemStack(Material.DIAMOND))); ++ } ++}