88 lines
3 KiB
Java
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;
|
|
}
|
|
}
|