我的世界1.20.1模组开发---6.设置物品合成表

介绍

  合成表大家应该都不陌生,在游戏中叫做Recipes(配方),这节我们就来介绍如何为我们的物品添加合成表。和添加掉落物一样,合成表的添加同样是通过json文件来实现的,我们仍然使用官方提供的类自动生成json文件。我们创建一个类并继承RecipeProvider类,并实现构造函数并重写父类的buildRecipes()方法,在这个方法中调用ShapedRecipeBuilder.shaped()或者ShapelessRecipeBuilder.shapeless()方法来设置一个合成表。通过方法的名字我们也不难发现前者是有序的合成表,后者是无序的合成表。

  RecipeProvider类

  我们创建的类要继承这个类,并实现构造函数并重写buildRecipes方法,通过调用类里面的ShapedRecipeBuilder.shaped()或者ShapelessRecipeBuilder.shapeless()方法来设置一个合成表。ShapedRecipeBuilder类是为我们创建一个合成表的Builder,调用shaped()方法后会返回一个Builder对象,接着向下继续进行配置,这样我们可以通过链式编程设置我们的合成表,最后以save()方法结束并创建合成表结束。

  下面以一个有序合成的合成表为例,这个是九个矿石合成一个方块的合成表。

//有序合成,9个物品合成一个块
        //第一个参数是合成表分类,第二个参数是要合成的物品
        ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModBlocks.BLUE_BLOCK.get())
                .pattern("###")//合成表形状
                .pattern("###")//合成表形状
                .pattern("###")//合成表形状
                .define('#', ModItems.JIUCHANZHIYUAN.get())//上面自定义合成表中符号代表的物品
                .group("test1mod")//mod分组,说明这个合成表是哪个mod里的
                .unlockedBy("has_jiuchanzhiyuan", InventoryChangeTrigger.TriggerInstance.hasItems(
                        ItemPredicate.Builder.item().of(ModItems.JIUCHANZHIYUAN.get()).build()))//设置原版游戏中合成表的解锁条件
                .save(pWriter);//结束配置并保存

  shaped()方法需要两个参数,第一个参数是合成表的类型,我们选择了杂项(这个无所谓,根据需要自己选一个),第二个参数是合成出来的物品。

  pattern()方法看名字也能猜出来就是所需物品的位置,我们可以用任意字符代表一个物品。

  define()方法是定义我们pattern()方法中的字符表示什么物品

  group()方法是表明这个合成表在哪个mod中,我们传入我们的ModId就行了。

  unlockedBy()方法是解锁原版合成表的条件。在原版中当我们捡起某种东西时,会出现一些提示告诉你能合成哪些对象了,以及对应的合成表。这个方法就是设置什么时候出现这个合成表的提示,第一个参数是一个字符串,我们随便写就可以;第二个参数是设置一个触发器,满足触发器条件时解锁游戏里的提示。(上面写的意思就是当玩家背包中有这个物品时,就会触发提示和合成表)。

  save()方法顾名思义就是设置结束,保存Builder,表示合成表已经设置好了。

  下面是一个无序合成的合成表的设置,这两个基本上涵盖了大部分我们需要的合成表,想具体了解的就去看源码吧-.-。

        //无序合成,1个块分解为9个物品
        ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC,ModItems.JIUCHANZHIYUAN.get(),9)
                .requires(ModBlocks.BLUE_BLOCK.get())
                .group("test1mod")
                .unlockedBy("has_jiuchanzhiyuan", InventoryChangeTrigger.TriggerInstance.hasItems(
                        ItemPredicate.Builder.item().of(ModItems.JIUCHANZHIYUAN.get()).build()))
                .save(pWriter);

  大部分方法和有序合成的一样,因为是无序合成的,我们只需要说明合成某个物品需要什么物品即可。所以无序的没有pattern()shaped()方法,只需要使用requires()方法设置需要的物品即可。

  最后一个了。下面是一个添加熔炉合成的配方,比如铁矿石可以烧成铁矿之类的,具体的可以看原版怎么实现的,复制过来修改就行。

//添加熔炉的合成表
        oreSmelting(pWriter, //照着写就行
                List.of(ModItems.YUANSHI.get()),//原物品
                RecipeCategory.MISC,//合成表分类
                ModItems.JIUCHANZHIYUAN.get(),//原物品烧完得到的东西
                1f,//烧完获得的经验
                130,//烧完需要的时间
                "test1mod");//mod分类还是写我们的odid就行

代码

  我们在datagen目录下新建一个ModRecipesGen类,这个类要先继承 RecipeProvider类并重写buildRecipes方法,在这个方法里添加合成表就行。

//生成合成表json文件
public class ModRecipesGen extends RecipeProvider {

    public ModRecipesGen(PackOutput pOutput) {
        super(pOutput);
    }

    @Override
    protected void buildRecipes(Consumer<FinishedRecipe> pWriter) {
        //有序合成,9个物品合成一个块
        //第一个参数是合成表分类,第二个参数是要合成的物品
        ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModBlocks.BLUE_BLOCK.get())
                .pattern("###")//合成表形状
                .pattern("###")//合成表形状
                .pattern("###")//合成表形状
                .define('#', ModItems.JIUCHANZHIYUAN.get())//上面自定义合成表中符号代表的物品
                .group("test1mod")//mod分组,说明这个合成表是哪个mod里的
                .unlockedBy("has_jiuchanzhiyuan", InventoryChangeTrigger.TriggerInstance.hasItems(
                        ItemPredicate.Builder.item().of(ModItems.JIUCHANZHIYUAN.get()).build()))
                .save(pWriter);

        //无序合成,1个块分解为9个物品
        ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC,ModItems.JIUCHANZHIYUAN.get(),9)
                .requires(ModBlocks.BLUE_BLOCK.get())
                .group("test1mod")
                .unlockedBy("has_jiuchanzhiyuan", InventoryChangeTrigger.TriggerInstance.hasItems(
                        ItemPredicate.Builder.item().of(ModItems.JIUCHANZHIYUAN.get()).build()))
                .save(pWriter);

        //添加熔炉的合成表
        oreSmelting(pWriter,
                List.of(ModItems.YUANSHI.get()),//原物品
                RecipeCategory.MISC,//合成表分类
                ModItems.JIUCHANZHIYUAN.get(),//获得的物品
                1f,//获得经验
                130,//燃烧时间
                "test1mod");//属于哪个mod
    }
}

  同样,我们需要把这个类也加到DataGenerators类里面去。

generator.addProvider(event.includeServer(), new ModRecipesGen(output));

  然后执行RunData生成数据,再RunClient进入游戏即可。

posted @ 2023-11-01 17:19  小明同学404  阅读(222)  评论(0编辑  收藏  举报