MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针

如果在编辑的过程中遇到了什么问题,可以去讨论板提问。

为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证

MCBBS Wiki GitHub群组已上线!

您可以在回声洞中发表吐槽!

服务器状态监控。点击进入

本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>

用户:MashKJo/1.21.1模组开发教程/4.数据生成:修订间差异

来自MCBBS Wiki
跳到导航 跳到搜索
(// Edit via Wikiplus)
(// Edit via Wikiplus)
 
第23行: 第23行:
  }
  }


然后就可以在数据生成事件监听器中添加DatapackBuiltInEntriesProvider的实例了:
然后就可以在数据生成事件监听器中添加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中更改。