Просмотр исходного кода

砂轮的输出与策划一致

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

+ 23 - 0
src/main/java/com/hexdragon/core/item/EnchantmentHelperRe.java

@@ -0,0 +1,23 @@
+package com.hexdragon.core.item;
+
+import com.sun.istack.internal.NotNull;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.enchantment.EnchantmentHelper;
+import net.minecraft.item.ItemStack;
+
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class EnchantmentHelperRe {
+
+    // 获取物品的所有诅咒附魔
+    public static Map<Enchantment, Integer> getCurseEnchantments(@NotNull ItemStack stack) {
+        return EnchantmentHelper.getEnchantments(stack).entrySet().stream().filter((pair) -> pair.getKey().isCurse()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+    }
+
+    // 获取物品的所有非诅咒附魔
+    public static Map<Enchantment, Integer> getNonCurseEnchantments(@NotNull ItemStack stack) {
+        return EnchantmentHelper.getEnchantments(stack).entrySet().stream().filter((pair) -> !pair.getKey().isCurse()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+    }
+
+}

+ 54 - 0
src/main/java/com/hexdragon/core/item/ItemHelperRe.java

@@ -0,0 +1,54 @@
+package com.hexdragon.core.item;
+
+import net.minecraft.item.ArmorItem;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+import net.minecraftforge.common.ToolType;
+
+public class ItemHelperRe {
+
+    // 合成某个可损坏的物品大致需要的最珍贵原料数,返回值并不准确,只适合用于估计
+    public static int getDamageableItemMaterialCost(ItemStack itemStack) {
+        Item item = itemStack.getItem();
+        // 根据工具种类判断
+        int maxCost = 0;
+        for (ToolType toolType : itemStack.getToolTypes()) {
+            switch (toolType.getName()) {
+                case "axe":
+                    maxCost = Math.max(maxCost, 3); break;
+                case "hoe":
+                    maxCost = Math.max(maxCost, 2); break;
+                case "pickaxe":
+                    maxCost = Math.max(maxCost, 3); break;
+                case "shovel":
+                    maxCost = Math.max(maxCost, 1); break;
+            }
+        }
+        if (maxCost > 0) return maxCost;
+        // 根据护甲种类判断
+        if (item instanceof ArmorItem) {
+            switch (((ArmorItem) item).getEquipmentSlot().getName()) {
+                case "feet":
+                    return 4;
+                case "legs":
+                    return 7;
+                case "chest":
+                    return 8;
+                case "head":
+                    return 5;
+            }
+        }
+        // 根据 ID 判断
+        String id = item.getRegistryName().getPath();
+        if (id.contains("sword")) return 2;
+        if (id.contains("horse_armor")) return 7;
+        // 根据特定种类判断
+        if (item == Items.FLINT_AND_STEEL || item == Items.SHIELD) return 1;
+        if (item == Items.FISHING_ROD || item == Items.WARPED_FUNGUS_ON_A_STICK || item == Items.CARROT_ON_A_STICK || item.isCrossbow(itemStack))
+            return 2;
+        // 如果未找到则视作 3
+        return 3;
+    }
+
+}

+ 18 - 17
src/main/java/com/hexdragon/enchrebirth/block/GrindstoneContainerRe.java

@@ -1,5 +1,7 @@
 package com.hexdragon.enchrebirth.block;
 package com.hexdragon.enchrebirth.block;
 
 
+import com.hexdragon.core.item.EnchantmentHelperRe;
+import com.hexdragon.core.item.ItemHelperRe;
 import com.hexdragon.enchrebirth.reg.Registry;
 import com.hexdragon.enchrebirth.reg.Registry;
 import net.minecraft.block.Blocks;
 import net.minecraft.block.Blocks;
 import net.minecraft.enchantment.Enchantment;
 import net.minecraft.enchantment.Enchantment;
@@ -16,7 +18,6 @@ import net.minecraft.item.Items;
 import net.minecraft.util.IWorldPosCallable;
 import net.minecraft.util.IWorldPosCallable;
 
 
 import java.util.Map;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 
 public class GrindstoneContainerRe extends Container {
 public class GrindstoneContainerRe extends Container {
 
 
@@ -34,8 +35,7 @@ public class GrindstoneContainerRe extends Container {
         this.addSlot(new Slot(this.inputInventory, 0, 49, 19) {
         this.addSlot(new Slot(this.inputInventory, 0, 49, 19) {
             // 检查物品是否能输入:没有没拿走的输出,且接受输入
             // 检查物品是否能输入:没有没拿走的输出,且接受输入
             public boolean isItemValid(ItemStack stack) {
             public boolean isItemValid(ItemStack stack) {
-                return !(inputInventory.isEmpty() && !outputInventory.isEmpty()) &&
-                        stack.getCount() == 1 && stack.isDamageable() && stack.isEnchanted();
+                return !(inputInventory.isEmpty() && !outputInventory.isEmpty()) && stack.getCount() == 1 && stack.isDamageable();
             }
             }
         });
         });
         this.addSlot(new Slot(this.outputInventory, 0, 129, 34) {
         this.addSlot(new Slot(this.outputInventory, 0, 129, 34) {
@@ -94,10 +94,11 @@ public class GrindstoneContainerRe extends Container {
         } else {
         } else {
             // 输入不为空,输出为空:更换了一个新的输入物品,更新输出
             // 输入不为空,输出为空:更换了一个新的输入物品,更新输出
             // 输入不为空,输出为空:更新输出
             // 输入不为空,输出为空:更新输出
-            if (itemInput.getCount() == 1 && itemInput.isDamageable() && itemInput.isEnchanted()) {
-                // 要求输入为 1 个可损坏的有附魔物品
-                itemOutput1 = this.prepareNewItem(itemInput, itemInput.getDamage());
-                itemOutput2 = new ItemStack(Items.LAPIS_LAZULI, 3);
+            Map<Enchantment, Integer> DeletedEnchantments = EnchantmentHelperRe.getNonCurseEnchantments(itemInput);
+            if (DeletedEnchantments.size() >= 1) {
+                // 要求输入为有非诅咒附魔的物品
+                itemOutput1 = this.prepareNewItem(itemInput);
+                itemOutput2 = new ItemStack(Items.LAPIS_LAZULI, DeletedEnchantments.size()); // 每删除一个附魔给予一个青金石
             }
             }
         }
         }
         // 设置物品并提交更改
         // 设置物品并提交更改
@@ -106,19 +107,19 @@ public class GrindstoneContainerRe extends Container {
         this.detectAndSendChanges();
         this.detectAndSendChanges();
     }
     }
 
 
-    // 对砂轮的单个物品进行预处理:例如移除非诅咒附魔等
-    private ItemStack prepareNewItem(ItemStack stack, int damage) {
+    // 对砂轮的单个物品进行预处理:例如移除非诅咒附魔、重置修复消耗等
+    private ItemStack prepareNewItem(ItemStack stack) {
         ItemStack itemstack = stack.copy();
         ItemStack itemstack = stack.copy();
-        itemstack.removeChildTag("Enchantments");
-        itemstack.removeChildTag("StoredEnchantments");
-        if (damage > 0) {
-            itemstack.setDamage(damage);
-        } else {
-            itemstack.removeChildTag("Damage");
-        }
         itemstack.setCount(1);
         itemstack.setCount(1);
-        Map<Enchantment, Integer> map = EnchantmentHelper.getEnchantments(stack).entrySet().stream().filter((p_217012_0_) -> p_217012_0_.getKey().isCurse()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+        // 设置损伤值:消耗 0.4 个物品原料的耐久
+        int newDamage = Math.min(itemstack.getMaxDamage(),
+                itemstack.getDamage() + (int) (itemstack.getMaxDamage() / ItemHelperRe.getDamageableItemMaterialCost(itemstack) * 0.4F));
+        itemstack.setDamage(newDamage);
+        // 移除非诅咒附魔
+        itemstack.removeChildTag("Enchantments");
+        Map<Enchantment, Integer> map = EnchantmentHelperRe.getCurseEnchantments(stack);
         EnchantmentHelper.setEnchantments(map, itemstack);
         EnchantmentHelper.setEnchantments(map, itemstack);
+        // 根据附魔数重置修复消耗
         itemstack.setRepairCost(0);
         itemstack.setRepairCost(0);
         for (int i = 0; i < map.size(); ++i) {
         for (int i = 0; i < map.size(); ++i) {
             itemstack.setRepairCost(RepairContainer.getNewRepairCost(itemstack.getRepairCost()));
             itemstack.setRepairCost(RepairContainer.getNewRepairCost(itemstack.getRepairCost()));