package net.minecraft.world.item.crafting; import com.mojang.datafixers.util.Pair; import net.minecraft.core.HolderLookup; import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.Registries; import net.minecraft.tags.EnchantmentTags; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.ItemEnchantments; import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; public class RepairItemRecipe extends CustomRecipe { public RepairItemRecipe(CraftingBookCategory category) { super(category); } @Nullable private static Pair getItemsToCombine(CraftingInput craftingInput) { if (craftingInput.ingredientCount() != 2) { return null; } else { ItemStack itemStack = null; for (int i = 0; i < craftingInput.size(); i++) { ItemStack itemStack2 = craftingInput.getItem(i); if (!itemStack2.isEmpty()) { if (itemStack != null) { return canCombine(itemStack, itemStack2) ? Pair.of(itemStack, itemStack2) : null; } itemStack = itemStack2; } } return null; } } private static boolean canCombine(ItemStack stack1, ItemStack stack2) { return stack2.is(stack1.getItem()) && stack1.getCount() == 1 && stack2.getCount() == 1 && stack1.has(DataComponents.MAX_DAMAGE) && stack2.has(DataComponents.MAX_DAMAGE) && stack1.has(DataComponents.DAMAGE) && stack2.has(DataComponents.DAMAGE); } public boolean matches(CraftingInput input, Level level) { return getItemsToCombine(input) != null; } public ItemStack assemble(CraftingInput input, HolderLookup.Provider registries) { Pair pair = getItemsToCombine(input); if (pair == null) { return ItemStack.EMPTY; } else { ItemStack itemStack = pair.getFirst(); ItemStack itemStack2 = pair.getSecond(); int i = Math.max(itemStack.getMaxDamage(), itemStack2.getMaxDamage()); int j = itemStack.getMaxDamage() - itemStack.getDamageValue(); int k = itemStack2.getMaxDamage() - itemStack2.getDamageValue(); int l = j + k + i * 5 / 100; ItemStack itemStack3 = new ItemStack(itemStack.getItem()); itemStack3.set(DataComponents.MAX_DAMAGE, i); itemStack3.setDamageValue(Math.max(i - l, 0)); ItemEnchantments itemEnchantments = EnchantmentHelper.getEnchantmentsForCrafting(itemStack); ItemEnchantments itemEnchantments2 = EnchantmentHelper.getEnchantmentsForCrafting(itemStack2); EnchantmentHelper.updateEnchantments( itemStack3, mutable -> registries.lookupOrThrow(Registries.ENCHANTMENT).listElements().filter(reference -> reference.is(EnchantmentTags.CURSE)).forEach(reference -> { int ix = Math.max(itemEnchantments.getLevel(reference), itemEnchantments2.getLevel(reference)); if (ix > 0) { mutable.upgrade(reference, ix); } }) ); return itemStack3; } } @Override public RecipeSerializer getSerializer() { return RecipeSerializer.REPAIR_ITEM; } }