User Tools

Site Tools


zh_cn:tutorial:datagen_setup

数据生成入门

数据生成是 Fabric API 中的新模块,允许动态生成配方、语言文件、战利品表、进度以及几乎所有带有自定义提供器的一切。每次你修改生成数据的代码,你都会需要运行 gradle 任务 runDatagen

启用数据生成

启用数据生成 API 的方式是在使用 fabric template mod generator 创建项目时勾选 Data generation 框。

这样我们就已经创建了 gradle 任务 runDatagen,并且已经为 IDE 提供好了可以直接运行的配置,不需要使用终端。手动这么做也不会花费很长时间。

手动启用数据生成

首先打开你的项目根文件夹中的 build.gradle 文件,并在文件的某处添加以下内容:

build.gradle
//
// ... (文件剩余部分)
//
 
fabricApi {
    configureDataGeneration()
}

后来我们在项目中定义新类 ExampleModDataGenerator,实现 DataGeneratorEntrypoint.

  • 运行我们先前创建的 gradle 任务(runDatagen)时,会调用 onInitializeDataGenerator 方法。
ExampleModDataGenerator.java
import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint;
import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator;
 
public class ExampleModDataGenerator implements DataGeneratorEntrypoint {
 
    @Override
    public void onInitializeDataGenerator(FabricDataGenerator generator) {
        FabricDataGenerator.Pack pack = generator.createPack();
 
        // Adding a provider example:
        // 
        // pack.addProvider(AdvancementsProvider::new);
    }
 
}

然后我们需要在 fabric.mod.json 文件中,告诉 Fabric 这个入口点:

{
 
  // ...(文件的剩余部分)
 
  "entrypoints": {
    "fabric-datagen": [
      "com.example.ExampleModDataGenerator"
    ],
    "main": [
      "com.example.ExampleMod"
    ],
    "client": [
      "com.example.ExampleModClient"
    ]
  },
 
 
  // ...(文件的剩余部分)
 
}

我们先看看我们现在已经有的内容是否正常第一次,或者是否有任何的错误,确认无误后继续。运行 runDatagen 任务。你可以让 IDE 为你做这个,或者只需要在你的项目的根目录中打开终端并输入:

Windows
gradlew runDatagen
Linux
./gradlew runDatagen

看看结果并确认没有错误。

  • 你可以忽略:com.mojang.authlib.exceptions.InvalidCredentialsException: Status: 401,如果出现了的话。这个错误是因为我们正在运行的 Minecraft 的调试版本不会验证我们的账户。

如果你遇到错误,那么缺少或者错误的东西应该会非常清楚,但如果你无法查明,你可能需要前往 Discord 或 QQ 群中寻求帮助。

src/main 中应该会有个叫做 generated 的新文件夹。目前它会是空的,但我们生成数据(例如进度)之后,这些文件就会被保存。

IDE 实现(可选)

由于我们不会总是开启终端,因此我们可以在 Intellij IDEA 中设置一个配置,通过下拉菜单运行命令。

首先打开运行/调试配置菜单,要打开它,你可以打开“运行”按钮旁的下拉菜单,点击编辑配置..选项,也可以连续按两次 Shift 并在弹出的窗口中输入 Edit Configuration

然后点击 '+' 按钮,搜索 gradle 并选择。

运行 输入框中,输入 runDatagen。点击 确定,然后你就可以直接运行配置而不需要打开终端了。

添加提供器

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

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

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

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

private static class MyTagGenerator extends FabricTagProvider<Item> {
        public MyTagGenerator(FabricDataGenerator dataGenerator) {
            super(dataGenerator, Registries.ITEM);  // 1.19.2 之前的版本用 Registry.ITEM
        }
 
        @Override
        protected void generateTags() {
 
        }
}

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

// 创建名为“smelly_items”的物品标签。
private static final TagKey<Item> SMELLY_ITEMS = TagKey.of(RegistryKeys.ITEM, new Identifier("tutorial", "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/tutorial/tags/items/smelly_items.json”。
}

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

public class DataGeneration 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.txt · Last modified: 2024/04/15 03:10 by solidblock