minecraft-src/net/minecraft/world/item/crafting/RepairItemRecipe.java
2025-07-04 03:15:13 +03:00

88 lines
3 KiB
Java

package net.minecraft.world.item.crafting;
import com.mojang.datafixers.util.Pair;
import net.minecraft.core.HolderLookup.Provider;
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 craftingBookCategory) {
super(craftingBookCategory);
}
@Nullable
private static Pair<ItemStack, ItemStack> getItemsToCombine(CraftingInput input) {
if (input.ingredientCount() != 2) {
return null;
} else {
ItemStack itemStack = null;
for (int i = 0; i < input.size(); i++) {
ItemStack itemStack2 = input.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 craftingInput, Level level) {
return getItemsToCombine(craftingInput) != null;
}
public ItemStack assemble(CraftingInput craftingInput, Provider provider) {
Pair<ItemStack, ItemStack> pair = getItemsToCombine(craftingInput);
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 -> provider.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<RepairItemRecipe> getSerializer() {
return RecipeSerializer.REPAIR_ITEM;
}
}