Bladeren bron

添加命名牌的相关配方

LTCatt 6 jaren geleden
bovenliggende
commit
91878d593e

+ 1 - 0
src/main/java/com/hexdragon/enchrebirth/EnchRebirth.java

@@ -9,6 +9,7 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
 public class EnchRebirth {
     public EnchRebirth() {
         IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
+        RegMain.RECIPES.register(modEventBus);
         RegMain.BLOCKS.register(modEventBus);
         RegMain.ITEMS.register(modEventBus);
         RegMain.CONTAINERS.register(modEventBus);

+ 0 - 1
src/main/java/com/hexdragon/enchrebirth/block/grindstone/GrindstoneContainerRe.java

@@ -108,7 +108,6 @@ public class GrindstoneContainerRe extends Container {
     // TODO : 打开砂轮物品栏时关闭游戏,会在重新上线后掉落包括输入和输出预览的全部物品(看起来是从服务端触发的,破坏方块什么的都不会出这个问题)
     // TODO : GUI 左侧的图片对应换成渲染的 3D 物品模型
     // TODO : 添加方块的使用音效
-    // TODO : 添加一个特殊配方,将命名过的命名牌与任意非命名牌的物品合成,即可重命名物品
 
     // 对砂轮的单个物品进行预处理:例如移除非诅咒附魔、重置修复消耗等
     private ItemStack prepareNewItem(ItemStack stack) {

+ 57 - 0
src/main/java/com/hexdragon/enchrebirth/item/name_tag/NameTagRenameRecipe.java

@@ -0,0 +1,57 @@
+package com.hexdragon.enchrebirth.item.name_tag;
+
+import com.hexdragon.enchrebirth.registry.RegMain;
+import net.minecraft.inventory.CraftingInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+import net.minecraft.item.crafting.IRecipeSerializer;
+import net.minecraft.item.crafting.SpecialRecipe;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.text.ITextComponent;
+import net.minecraft.world.World;
+
+// 将命名牌与任意其他物品合成,可以消耗一个命名牌将其重命名
+// TODO : 似乎命名牌的这个特殊配方注册失败了,虽然有注册代码但是连新建实例都没触发过
+public class NameTagRenameRecipe extends SpecialRecipe {
+    public NameTagRenameRecipe(ResourceLocation idIn) { super(idIn); }
+    public IRecipeSerializer<?> getSerializer() {return RegMain.recipeNameTagRename.get();}
+
+    // 检查物品是否符合该配方
+    public boolean matches(CraftingInventory inv, World worldIn) {
+        int nameTagFound = 0, totalFound = 0;
+        for (int i = 0; i < inv.getSizeInventory(); ++i) {
+            ItemStack itemstack = inv.getStackInSlot(i);
+            if (itemstack.isEmpty()) continue;
+            totalFound += 1;
+            if (itemstack.getItem() == Items.NAME_TAG) nameTagFound += 1;
+        }
+        // 有两个物品,其中一个为命名牌
+        return nameTagFound == 1 && totalFound == 2;
+    }
+
+    // 获取配方结果
+    public ItemStack getCraftingResult(CraftingInventory inv) {
+        // 获取目标物品与新名称
+        ItemStack target = null;
+        ITextComponent newName = null;
+        for (int i = 0; i < inv.getSizeInventory(); ++i) {
+            ItemStack itemstack = inv.getStackInSlot(i);
+            if (itemstack.isEmpty()) continue;
+            if (itemstack.getItem() == Items.NAME_TAG) {
+                newName = itemstack.getDisplayName();
+            } else {
+                target = itemstack.copy();
+            }
+        }
+        // 设置名称并返回
+        if (target == null || newName == null) return ItemStack.EMPTY;
+        target.setDisplayName(newName);
+        return target;
+    }
+
+    // 配方占用的格子数
+    public boolean canFit(int width, int height) {
+        return width * height >= 2;
+    }
+
+}

+ 7 - 0
src/main/java/com/hexdragon/enchrebirth/registry/RegMain.java

@@ -5,11 +5,14 @@ import com.hexdragon.enchrebirth.block.anvil.AnvilContainerRe;
 import com.hexdragon.enchrebirth.block.anvil.AnvilTileEntity;
 import com.hexdragon.enchrebirth.block.anvil.NetheriteAnvil;
 import com.hexdragon.enchrebirth.block.grindstone.GrindstoneContainerRe;
+import com.hexdragon.enchrebirth.item.name_tag.NameTagRenameRecipe;
 import net.minecraft.block.Block;
 import net.minecraft.block.Blocks;
 import net.minecraft.entity.player.PlayerInventory;
 import net.minecraft.inventory.container.ContainerType;
 import net.minecraft.item.Item;
+import net.minecraft.item.crafting.IRecipeSerializer;
+import net.minecraft.item.crafting.SpecialRecipeSerializer;
 import net.minecraft.network.PacketBuffer;
 import net.minecraft.state.IntegerProperty;
 import net.minecraft.tileentity.TileEntityType;
@@ -46,6 +49,10 @@ public class RegMain {
     public static final RegistryObject<TileEntityType<AnvilTileEntity.ChippedNetheriteAnvilTileEntity>> tileEntityChippedNetheriteAnvil = TILE_ENTITIES.register("chipped_netherite_anvil", () -> TileEntityType.Builder.create(AnvilTileEntity.ChippedNetheriteAnvilTileEntity::new, blockChippedNetheriteAnvil.get()).build(null));
     public static final RegistryObject<TileEntityType<AnvilTileEntity.DamagedNetheriteAnvilTileEntity>> tileEntityDamagedNetheriteAnvil = TILE_ENTITIES.register("damaged_netherite_anvil", () -> TileEntityType.Builder.create(AnvilTileEntity.DamagedNetheriteAnvilTileEntity::new, blockDamagedNetheriteAnvil.get()).build(null));
 
+    // 特殊配方
+    public static final DeferredRegister<IRecipeSerializer<?>> RECIPES = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, Main.MODID);
+    public static final RegistryObject<SpecialRecipeSerializer<NameTagRenameRecipe>> recipeNameTagRename = RECIPES.register("name_tag_rename", () -> new SpecialRecipeSerializer<>(NameTagRenameRecipe::new));
+
     // BlockState
     public static final IntegerProperty blockStateMaterial = IntegerProperty.create("material", 0, 1);
 

+ 20 - 0
src/main/resources/data/enchrebirth/recipes/name_tag.json

@@ -0,0 +1,20 @@
+{
+  "type": "minecraft:crafting_shaped",
+  "pattern": [
+    "  #",
+    " X ",
+    "X  "
+  ],
+  "key": {
+    "#": {
+      "item": "minecraft:string"
+    },
+    "X": {
+      "item": "minecraft:paper"
+    }
+  },
+  "result": {
+    "item": "minecraft:name_tag",
+    "count": 1
+  }
+}