LTCatt 6 лет назад
Родитель
Сommit
82acb68e78

+ 13 - 52
src/main/java/com/hexdragon/enchrebirth/block/AnvilContainerRe.java

@@ -1,5 +1,6 @@
 package com.hexdragon.enchrebirth.block;
 
+import com.hexdragon.core.item.EnchantmentHelperRe;
 import com.hexdragon.core.item.ItemHelperRe;
 import com.hexdragon.enchrebirth.registry.RegMain;
 import net.minecraft.block.AnvilBlock;
@@ -14,7 +15,6 @@ import net.minecraft.inventory.Inventory;
 import net.minecraft.inventory.container.Container;
 import net.minecraft.inventory.container.Slot;
 import net.minecraft.item.ItemStack;
-import net.minecraft.item.Items;
 import net.minecraft.tags.BlockTags;
 import net.minecraft.util.IWorldPosCallable;
 import net.minecraftforge.common.MinecraftForge;
@@ -89,7 +89,7 @@ public class AnvilContainerRe extends Container {
             // 使用原材料修复物品
 
             // 获取每个材料修复的耐久度
-            int decrDamagePerMaterial = Math.min(outputItem.getDamage(), outputItem.getMaxDamage() / ItemHelperRe.getDamageableItemMaterialCost(outputItem));
+            int decrDamagePerMaterial = Math.min(outputItem.getDamage(), (int) (outputItem.getMaxDamage() / ItemHelperRe.getDamageableItemMaterialCost(outputItem) * 0.95F));
             if (decrDamagePerMaterial <= 0) {
                 this.outputInventory.setInventorySlotContents(0, ItemStack.EMPTY);
                 return;
@@ -99,7 +99,7 @@ public class AnvilContainerRe extends Container {
             int materialCost;
             for (materialCost = 0; decrDamagePerMaterial > 0 && materialCost < middleItem.getCount(); ++materialCost) {
                 outputItem.setDamage(outputItem.getDamage() - decrDamagePerMaterial);
-                decrDamagePerMaterial = Math.min(outputItem.getDamage(), outputItem.getMaxDamage() / ItemHelperRe.getDamageableItemMaterialCost(outputItem));
+                decrDamagePerMaterial = Math.min(outputItem.getDamage(), (int) (outputItem.getMaxDamage() / ItemHelperRe.getDamageableItemMaterialCost(outputItem) * 0.95F));
             }
             this.materialCost = materialCost;
 
@@ -112,57 +112,18 @@ public class AnvilContainerRe extends Container {
         } else {
             // 使用两个相同物品进行修复
 
-            int l = inputItem.getMaxDamage() - inputItem.getDamage();
-            int i1 = middleItem.getMaxDamage() - middleItem.getDamage();
-            int j1 = i1 + outputItem.getMaxDamage() * 12 / 100;
-            int k1 = l + j1;
-            int l1 = outputItem.getMaxDamage() - k1;
-            if (l1 < 0) {
-                l1 = 0;
-            }
-
-            if (l1 < outputItem.getDamage()) {
-                outputItem.setDamage(l1);
-            }
-
-            Map<Enchantment, Integer> map1 = EnchantmentHelper.getEnchantments(middleItem);
-            boolean flag2 = false;
-            boolean flag3 = false;
-
-            for (Enchantment enchantment1 : map1.keySet()) {
-                if (enchantment1 != null) {
-                    int i2 = outputEnchantments.getOrDefault(enchantment1, 0);
-                    int j2 = map1.get(enchantment1);
-                    j2 = i2 == j2 ? j2 + 1 : Math.max(j2, i2);
-                    boolean flag1 = enchantment1.canApply(inputItem);
-                    if (this.player.abilities.isCreativeMode || inputItem.getItem() == Items.ENCHANTED_BOOK) {
-                        flag1 = true;
-                    }
-
-                    for (Enchantment enchantment : outputEnchantments.keySet()) {
-                        if (enchantment != enchantment1 && !enchantment1.isCompatibleWith(enchantment)) {
-                            flag1 = false;
-                        }
-                    }
-
-                    if (!flag1) {
-                        flag3 = true;
-                    } else {
-                        flag2 = true;
-                        if (j2 > enchantment1.getMaxLevel()) {
-                            j2 = enchantment1.getMaxLevel();
-                        }
+            // 获取修复后的 Damage
+            int dur1 = inputItem.getMaxDamage() - inputItem.getDamage();
+            int dur2 = middleItem.getMaxDamage() - middleItem.getDamage();
+            int durNew = dur1 + dur2 + outputItem.getMaxDamage() * 15 / 100 + 1; // 额外奖励 15% 耐久度
+            int newDamage = outputItem.getMaxDamage() - durNew;
+            if (newDamage < 0) newDamage = 0;
+            if (newDamage < outputItem.getDamage()) outputItem.setDamage(newDamage);
 
-                        outputEnchantments.put(enchantment1, j2);
+            // 将第二个物品的诅咒转移到第一个物品
+            Map<Enchantment, Integer> curses = EnchantmentHelperRe.getCurseEnchantments(middleItem);
+            if (curses.size() > 0) outputEnchantments.putAll(curses);
 
-                    }
-                }
-            }
-
-            if (flag3 && !flag2) {
-                this.outputInventory.setInventorySlotContents(0, ItemStack.EMPTY);
-                return;
-            }
         }
 
         // 设置新物品的附魔

+ 2 - 1
src/main/java/com/hexdragon/enchrebirth/mixin/RepairItemRecipeMixin.java

@@ -15,9 +15,10 @@ public abstract class RepairItemRecipeMixin extends SpecialRecipe {
     }
 
     // 将使用普通合成来合并两个工具时的 5% 耐久度奖励取消
+    // 返回 20 会使得耐久度再 +1,这是因为 MC 的 0 耐久度也可以用一次……
     @Redirect(method = "getCraftingResult", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;getMaxDamage()I", ordinal = 2))
     private int getMaxDamageMixin(ItemStack item) {
-        return 0;
+        return 20;
     }
 
 }