数据生成
数据生成器是以编程方式生成模组的资源(asset)和数据(data)的一种方式。它允许在代码中定义这些文件的内容并自动生成它们,而不必担心细节。
数据生成器系统由主类net.minecraft.data.Main加载。可以传递不同的命令行参数来自定义收集了哪些模组的数据,考虑了哪些现有文件等。负责数据生成的类是net.minecraft.data.DataGenerator。
MDK的build.gradle中的默认配置添加了用于运行数据生成器的runData任务。
现存的文件
对未为数据生成而生成的纹理或其他数据文件的所有引用都必须引用系统上的现有文件。这是为了确保所有引用的纹理都在正确的位置,这样就可以找到并更正拼写错误。
ExistingFileHelper是负责验证这些数据文件是否存在的类。可以从GatherDataEvent#getExistingFileHelper中检索实例。
--existing <folderpath>参数允许在验证文件是否存在时使用指定的文件夹及其子文件夹。此外,--existing-mod <modid>参数允许将加载的模组的资源用于验证。默认情况下,只有普通的数据包和资源可用于ExistingFileHelper。
生成器模式
数据生成器可以配置为运行4个不同的数据生成,这些数据生成是通过命令行参数配置的,并且可以通过GatherDataEvent#include***方法进行检查。
- Client Assets- 在assets中生成仅客户端文件:f方块/物品模型、方块状态JSON、语言文件等。
- --client,- #includeClient
 
- 在
- Server Data- 在data中生成仅服务端文件:配方、进度、标签等。
- --server,- #includeServer
 
- 在
- Development Tools- 运行一些开发工具:将SNBT转换为NBT,反之亦然,等等。
- --dev,- #includeDev
 
- Reports- 转储所有已注册的方块、物品、命令等。
- --reports,- #includeReports
 
所有的生成器都可以使用--all包含在内。
数据提供者
数据提供者是实际定义将生成和提供哪些数据的类。所有数据提供者都实现DataProvider。Minecraft对大多数asset和data都有抽象实现,因此模组开发者只需要扩展和覆盖指定的方法。
当创建数据生成器时,在模组事件总线上触发GatherDataEvent,并且可以从事件中获取DataGenerator。使用DataGenerator#addProvider创建和注册数据提供者。
客户端资源(Assets)
- net.minecraftforge.common.data.LanguageProvider- 针对语言设置;实现- #addTranslations
- net.minecraftforge.common.data.SoundDefinitionsProvider- 针对- sounds.json;实现- #registerSounds
- net.minecraftforge.client.model.generators.ModelProvider<?>- 针对[模型];实现- #registerModels- ItemModelProvider- 针对物品模型
- BlockModelProvider- 针对方块模型
 
- net.minecraftforge.client.model.generators.BlockStateProvider- 针对方块状态JSON以及其方块和物品模型;实现- #registerStatesAndModels
服务端数据(Data)
这些类在net.minecraftforge.common.data包之下:
- GlobalLootModifierProvider- 针对全局战利品修改器;实现- #start
- DatapackBuiltinEntriesProvider- 针对数据包注册表对象;向构造函数传递- RegistrySetBuilder
这些类在net.minecraft.data包之下:
- loot.LootTableProvider- 针对战利品表;向构造函数传递- LootTableProvider$SubProviderEntry
- recipes.RecipeProvider- 针对[配方]以及其解锁的进度;实现- #buildRecipes
- tags.TagsProvider- 针对[标签];实现- #addTags
- advancements.AdvancementProvider- 针对[进度];向构造函数传递- AdvancementSubProvider