用户:MashKJo/1.21.1模组开发教程/4.数据生成:修订间差异
< 用户:MashKJo | 1.21.1模组开发教程
(创建页面,内容为“数据生成(Data Generation,简称DataGen)是Minecraft原版的一种通过代码生成资源包、数据包JSON的一种机制。鉴于手写JSON很繁琐且比较容易出错,数据生成对于大型Mod而言几乎是必需的。且数据生成也有良好的跨版本迁移性(如果资源包或数据包的结构或JSON格式随着版本迁移发生了变化的话)。 @SubscribeEvent public static void onGatherData(GatherDataEvent event) {…”) |
(// Edit via Wikiplus) |
||
| (未显示同一用户的1个中间版本) | |||
| 第6行: | 第6行: | ||
CompletableFuture<HolderLookup.Provider> lookupProvider = event.getLookupProvider(); | CompletableFuture<HolderLookup.Provider> lookupProvider = event.getLookupProvider(); | ||
ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); | ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); | ||
event.addProvider(new XXXProvider(...)); | event.addProvider(new XXXProvider(...)); | ||
} | } | ||
| 第23行: | 第23行: | ||
} | } | ||
然后就可以在数据生成事件监听器中添加DatapackBuiltinEntriesProvider的实例了: | |||
event.addProvider(output, lookupProvider, new RegistrySetBuilder().add(Registries.ENCHANTMENT, ModEnchantments::bootstrap), Set.of(TutorialMod.MODID)); | event.addProvider(new DatapackBuiltinEntriesProvider(output, lookupProvider, new RegistrySetBuilder().add(Registries.ENCHANTMENT, ModEnchantments::bootstrap), Set.of(TutorialMod.MODID))); | ||
//第三个参数接受一个RegistrySetBuilder,这里就是向该DataProvider添加数据的地方了,也可以add更多;最后一个参数是参与数据生成的模组的modid集合。 | //第三个参数接受一个RegistrySetBuilder,这里就是向该DataProvider添加数据的地方了,也可以add更多;最后一个参数是参与数据生成的模组的modid集合。 | ||
运行runData任务,即可在输出目录(默认为<code>src/generated/resources</code>)下看到自动生成的资源文件了。输出目录可以在build.gradle中更改。 | 运行runData任务,即可在输出目录(默认为<code>src/generated/resources</code>)下看到自动生成的资源文件了。输出目录可以在build.gradle中更改。 | ||
2025年9月5日 (五) 21:18的最新版本
数据生成(Data Generation,简称DataGen)是Minecraft原版的一种通过代码生成资源包、数据包JSON的一种机制。鉴于手写JSON很繁琐且比较容易出错,数据生成对于大型Mod而言几乎是必需的。且数据生成也有良好的跨版本迁移性(如果资源包或数据包的结构或JSON格式随着版本迁移发生了变化的话)。
@SubscribeEvent
public static void onGatherData(GatherDataEvent event) {
PackOutput output = event.getGenerator().getPackOutput();
CompletableFuture<HolderLookup.Provider> lookupProvider = event.getLookupProvider();
ExistingFileHelper existingFileHelper = event.getExistingFileHelper();
event.addProvider(new XXXProvider(...));
}
我们监听GatherDataEvent,然后event.addProvider()向DataGenerator添加若干DataProvider实例。不同的资源种类有不同的DataProvider实现类,写法也不同,Minecraft原版和NeoForge也提供了不少DataProvider实现类,我们只需先继承对应的实现类,覆写关键方法即可。如若要数据生成配方,只需继承原版的RecipeProvider类,覆写方法#buildRecipes即可。
大部分数据包资源没有专门的DataProvider实现类,如何数据生成它们呢?答案是用一个特殊的实现类:DatapackBuiltinEntriesProvider。例如,如若我们要数据生成附魔,首先先新建一个类ModEnchantments:
public class ModEnchantments {
public static final ResourceKey<Enchantment> EXAMPLE_ENCHANTMENT = ResourceKey.create(Registries.ENCHANTMENT, ResourceLocation.fromNamespaceAndPath(TutorialMod.MODID, "example_enchantment"));
public static void bootstrap(BootstrapContext<Enchantment> context) {
//从这里的BootstrapContext,我们可以得到不同数据包注册项的HolderGetter,得以访问其中的注册对象。
context.register(EXAMPLE_ENCHANTMENT, new Enchantment(...));
}
}
然后就可以在数据生成事件监听器中添加DatapackBuiltinEntriesProvider的实例了:
event.addProvider(new DatapackBuiltinEntriesProvider(output, lookupProvider, new RegistrySetBuilder().add(Registries.ENCHANTMENT, ModEnchantments::bootstrap), Set.of(TutorialMod.MODID))); //第三个参数接受一个RegistrySetBuilder,这里就是向该DataProvider添加数据的地方了,也可以add更多;最后一个参数是参与数据生成的模组的modid集合。
运行runData任务,即可在输出目录(默认为src/generated/resources)下看到自动生成的资源文件了。输出目录可以在build.gradle中更改。