Flandre923
859 words
4 minutes
15 合成表

合成表配方#

你可以在wiki中查找有关数据包制作的内容,也就是json的内容。我们这里简单的介绍几种,你可以查找原版的json学习和通过wiki学习。

创建如下的目录结构,数据包的内容在data文件夹下。而不是assets下。


resources
    ├─assets
    ├─data
    │  └─examplemod
    │      ├─advancements
    │      │  └─recipes
    │      │      └─misc
    │      └─recipes

其中的data/examplemod就是你自己的数据包了。

recipes(配方):

这个目录用于存放所有的合成、烧炼、酿造等配方。

advancements(进度):

这个目录用于存放自定义的进度,进度可以看作是游戏内的成就或者任务系统。

{
  "type": "minecraft:crafting_shaped",
  "category": "misc",
  "key": {
    "a": {
      "item": "examplemod:ruby"
    },
    "b": {
      "item": "minecraft:stick"
    }
  },
  "pattern": [
    "aaa",
    " b ",
    " b "
  ],
  "result": {
    "item": "examplemod:ruby_pickaxe"
  }
}

type: “minecraft:crafting_shaped” 表示这是一个有序合成配方。

category: “misc” 指定了配方类别,通常设置为 “misc”。

key: 包含了合成配方中使用的符号和对应的物品。在这个例子中,“a” 代表了 examplemod:ruby,“b” 代表了 minecraft:stick。

pattern: 表示3x3合成格中的物品布局。“aaa” 表示第一行三个位置都是 examplemod:ruby,” b ” 表示第二行中间是 minecraft:stick,两边是空格。

result: 指定了合成后得到的物品。这里合成的结果是 examplemod:ruby_pickaxe。

wiki

无序合成

{
  "type": "minecraft:crafting_shapeless",
  "category": "misc",
  "ingredients": [
    {
      "item": "minecraft:iron_ingot"
    },
    {
      "item": "minecraft:iron_ingot"
    },
    {
      "item": "minecraft:iron_ingot"
    }
  ],
  "result": {
    "item": "examplemod:magic_ingot"
  }
}

ingredients: 列出了合成配方所需的物品。在这个例子中,需要三个 minecraft:iron_ingot。

熔炉和其他

以熔炉为例,其他详见wiki

{
  "type": "minecraft:smelting",
  "category": "misc",
  "cookingtime": 100,
  "experience": 0.3,
  "ingredient": {
    "item": "examplemod:ruby_ore"
  },
  "result": "examplemod:ruby"
}

type: “minecraft:smelting” 表示这是一个熔炉配方。

category: “misc” 同上。

cookingtime: 烧炼所需的时间,以刻为单位。100刻等于5秒。

experience: 烧炼此物品后玩家获得的经验值。

ingredient: 需要烧炼的物品。这里需要烧炼的是 examplemod:ruby_ore。

result: 烧炼后得到的物品。这里烧炼的结果是 examplemod:ruby。

datagenerator 生成合成表#

你可以自己手写合成表,但是难免会出现错误,我们还可以使用之前讲解的数据生成的内容。



public class ModRecipeProvider extends RecipeProvider {

    //https://docs.neoforged.net/docs/datagen/server/recipes
    public ModRecipeProvider(PackOutput pPackOutput, CompletableFuture<HolderLookup.Provider> lookupProvider) {
        super(pPackOutput, lookupProvider);
    }

    @Override
    protected void buildRecipes(RecipeOutput pRecipeOutput) {
        // 有序合成
        ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.RUBY_PICKAXE.get())
                .pattern("aaa")
                .pattern(" b ")
                .pattern(" b ")
                .define('a',ModItems.RUBY.get())
                .define('b', Items.STICK)
                .unlockedBy("has_ruby",has(ModItems.RUBY.get()))
                .save(pRecipeOutput);
        // 无序合成
        ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC,ModItems.MAGIC_INGOT.get())
                .requires(Items.IRON_INGOT,3)
                .unlockedBy("has_iron_ingot",has(Items.IRON_INGOT))
                .save(pRecipeOutput);
        // 冶炼
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(ModBlocks.RUBY_ORE.get()),RecipeCategory.MISC,ModItems.RUBY.get(),0.3f,100)
                .unlockedBy("has_ruby_ore",has(ModBlocks.RUBY_ORE.get()))
                .save(pRecipeOutput);
        // 切割石头
//        SingleItemRecipeBuilder.stonecutting()
    }
}

buildRecipes这个方法在数据生成过程中被调用,用于构建和保存配方。RecipeOutput参数用于输出生成的配方数据。

ShapedRecipeBuilder.shaped创建一个有序合成配方

unlockedBy(“has_ruby”,has(ModItems.RUBY.get()))配方有一个解锁条件,要求玩家拥有ModItems.RUBY。《在你获得ruby时候右上角提示》

ShapelessRecipeBuilder。shapeless创建一个无序合成配方,用于制作MAGIC_INGOT。配方需要3个IRON_INGOT。配方有一个解锁条件,要求玩家拥有IRON_INGOT。

SimpleCookingRecipeBuilder.smelting创建一个冶炼配方,用于将RUBY_ORE冶炼成RUBY。冶炼时间为100刻,提供0.3的经验值。配方有一个解锁条件,要求玩家拥有RUBY_ORE。

gleItemRecipeBuilder.stonecutting()它将使用SingleItemRecipeBuilder来创建一个切割配方。

添加到GatherDataEvent事件中去:


@Mod.EventBusSubscriber(modid = ExampleMod.MODID,bus = Mod.EventBusSubscriber.Bus.MOD)
public class ModDataGeneratorHandler {
    @SubscribeEvent
    public static void gatherData(GatherDataEvent event){
        ExistingFileHelper efh = event.getExistingFileHelper();
        var lp = event.getLookupProvider();
        // recipe
        event.getGenerator().addProvider(
                event.includeServer(),
                (DataProvider.Factory<ModRecipeProvider>) pOutput -> new ModRecipeProvider(pOutput,lp)
        );
    }
}

rundata即可生成合成表。其他的合成表可以参考原版的实现和原版的类。

拓展阅读#

wiki

boson教程

Neoforge document

15 合成表
https://fuwari.vercel.app/posts/minecraft1_20_4/out_15-合成表/
Author
Flandre923
Published at
2024-04-14