数据生成器
数据生成器可以通过程序生成模组的资源和数据。开发者能够在代码中定义文件内容并自动生成文件,无需操心具体格式细节。
原创说明图,依据 Forge 1.21.x 官方文档 绘制。
数据生成系统由主类 net.minecraft.data.Main 加载。可以传入不同的命令行参数,定制收集哪些模组的数据、考虑哪些已有文件等。负责数据生成的类是 net.minecraft.data.DataGenerator。MDK 的 build.gradle 默认配置添加了用于运行数据生成器的 runData 任务。
已有文件
对数据生成过程未生成的纹理或其他数据文件的引用,都必须指向系统上已有的文件。这可确保引用的纹理位于正确位置,从而发现并修正拼写错误。
ExistingFileHelper 负责验证这些数据文件是否存在,可通过 GatherDataEvent#getExistingFileHelper 获取实例。
--existing <folderpath> 参数允许将指定文件夹及其子文件夹用于文件存在性验证。--existing-mod <modid> 参数还允许使用已加载模组的资源进行验证。默认情况下,ExistingFileHelper 只能访问原版数据包和资源。
生成器模式
数据生成器可通过命令行参数配置四种数据生成模式,并通过 GatherDataEvent#include*** 方法检查:
| 模式 | 用途 | 参数和检查方法 |
|---|---|---|
| 客户端资源 | 生成 assets 中仅客户端使用的文件,如方块/物品模型、方块状态 JSON、语言文件等。 |
--client,#includeClient |
| 服务端数据 | 生成 data 中仅服务端使用的文件,如配方、进度、标签等。 |
--server,#includeServer |
| 开发工具 | 运行开发工具,如 SNBT 与 NBT 互转等。 | --dev,#includeDev |
| 报告 | 导出所有已注册的方块、物品、命令等。 | --reports,#includeReports |
使用 --all 可包含全部生成器。
数据提供者
数据提供者是实际定义将生成和提供哪些数据的类。所有数据提供者都实现 DataProvider。Minecraft 为大多数资源和数据提供了抽象实现,模组开发者只需继承并重写指定方法。
创建数据生成器时,GatherDataEvent 在模组事件总线上触发,可从事件获取 DataGenerator。使用 DataGenerator#addProvider 创建并注册数据提供者。
客户端资源
LanguageProvider:生成语言字符串,实现#addTranslations。SoundDefinitionsProvider:生成 sounds.json,实现#registerSounds。ModelProvider<?>:生成模型,实现#registerModels。其中ItemModelProvider用于物品模型,BlockModelProvider用于方块模型。BlockStateProvider:生成方块状态 JSON 及其方块和物品模型,实现#registerStatesAndModels。
服务端数据
以下类位于 net.minecraftforge.common.data 包:
GlobalLootModifierProvider:生成全局战利品修饰器,实现#start。DatapackBuiltinEntriesProvider:生成数据包注册表对象,在构造函数中传入RegistrySetBuilder。
以下类位于 net.minecraft.data 包:
loot.LootTableProvider:生成战利品表,在构造函数中传入LootTableProvider$SubProviderEntry。recipes.RecipeProvider:生成配方及其解锁进度,实现#buildRecipes。tags.TagsProvider:生成标签,实现#addTags。advancements.AdvancementProvider:生成进度,在构造函数中传入AdvancementSubProvider。
原文:Data Generators。