User Tools

Site Tools


zh_cn:tutorial:datagen_setup

This is an old revision of the document!


数据生成入门

数据生成是 Fabric API 中的新模块,允许动态生成配方、语言文件、战利品表、进度以及几乎所有带有自定义 provider 的一切。

实现数据生成,请在你的 build.gradle 加入以下内容:

loom {
    runs {
        // 添加一个新的 gradle 任务,会运行数据生成 API:“gradlew runDatagenClient”
        datagenClient {
            inherit client
            name "Data Generation"
            vmArg "-Dfabric-api.datagen"
            vmArg "-Dfabric-api.datagen.output-dir=${file("src/main/generated")}"
            vmArg "-Dfabric-api.datagen.strict-validation"
 
            runDir "build/datagen"
        }
    }
}
 
// 将数据生成的文件添加到 jar 中。
sourceSets {
    main {
        resources {
            srcDirs += [
                    'src/main/generated'
            ]
        }
    }
}

然后,创建一个类并继承 DataGeneratorEntrypoint,并添加到你的 fabric.mod.json 中:

public class MyModDatagen implements DataGeneratorEntrypoint {
    @Override
    public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) {
        // ...
    }
}

这会注册你的数据生成入口点,允许在运行 gradlew runDatagenClient 任务时,调用 onInitializeDataGenerator

"entrypoints": {
    "fabric-datagen": [
          "com.fabric.examplemod.MyModDatagen"
    ]
}

添加提供器

这里有一些概述,讲述如何添加提供器,关于每个提供器更加详细的信息,请阅读以下几个页面:

在这个例子中,我们会创建一个标签提供器,因为最容易理解。

首先,在你的 MyModDatagen 类中,创建新的 private static class 并继承 FabricTagProvider<T>

如有需要,可以把这个类放到单独的文件中,不过我们建议放在数据生成入口点类中。

private static class MyTagGenerator extends FabricTagProvider<Item> {
        public MyTagGenerator(FabricDataGenerator dataGenerator) {
            super(dataGenerator, Registry.ITEM);
        }
 
        @Override
        protected void generateTags() {
 
        }
}

作为示例,我们会在 generateTags() 中添加一些基本的标签:

// 创建名为“smelly_items”的物品标签。
private static final TagKey<Item> SMELLY_ITEMS = TagKey.of(Registry.ITEM_KEY, new Identifier("mymod:smelly_items"));
 
@Override
protected void generateTags() {
     // 创建一个 tag builder,我们添加粘液球、腐肉以及物品标签 minecraft:dirt 中的所有内容。
     getOrCreateTagBuilder(SMELLY_ITEMS)
              .add(Items.SLIME_BALL)
              .add(Items.ROTTEN_FLESH)
              .addOptionalTag(ItemTags.DIRT);
     // 在“generated”文件夹中,会自动生成“assets/mymod/tags/items/smelly_items.json”。
}

现在,我们需要在你的入口点类的 onInitializeDataGenerator 中的数据生成器中,注册这个提供器。

public class MyModDatagen implements DataGeneratorEntrypoint {
    @Override
    public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) {
        fabricDataGenerator.addProvider(MyTagGenerator::new);
    }
}

当我们运行 gradlew runDatagenClient,我们将会看到生成的文件形式,物品标签 json 应该存在:

smelly_items.json
{
  "replace": false,
  "values": [
    "minecraft:slime_ball",
    "minecraft:rotten_flesh",
    {
      "id": "#minecraft:dirt",
      "required": false
    }
  ]
}
zh_cn/tutorial/datagen_setup.1662271698.txt.gz · Last modified: 2022/09/04 06:08 by solidblock