进度提供器

进度生成

构造新的 AdvancementProvider 并提供 AdvancementSubProvider,即可为模组生成进度。进度可以手动创建并提供,也可以方便地使用 Advancement$Builder 创建。必须将提供者添加到 DataGenerator。

ForgeAdvancementProvider 使用 AdvancementGenerator 构建进度;需至少添加一个条件,requirements 是可选组合设置,完成后通过 save 将进度交给 writer。

原创说明图,依据 Forge 1.21.x 官方文档 绘制。

注意:Forge 提供了 AdvancementProvider 的扩展 ForgeAdvancementProvider,能更好地集成进度生成。因此本文使用它及其子提供者接口 ForgeAdvancementProvider$AdvancementGenerator。

// 在模组事件总线上
@SubscribeEvent
public void gatherData(GatherDataEvent event) {
  event.getGenerator().addProvider(
    event.includeServer(), // 仅在生成服务端数据时运行
    output -> new ForgeAdvancementProvider(
      output, event.getLookupProvider(), event.getExistingFileHelper(),
      List.of(subProvider1, subProvider2, /*...*/) // 生成进度的子提供者
    )
  );
}

ForgeAdvancementProvider$AdvancementGenerator

ForgeAdvancementProvider$AdvancementGenerator 负责生成进度,其方法接收注册表查找器、写入器(Consumer<Advancement>)和已有文件帮助器。

// 在 ForgeAdvancementProvider$AdvancementGenerator 的子类中,或作为 lambda 引用
@Override
public void generate(HolderLookup.Provider registries, Consumer<Advancement> writer, ExistingFileHelper existingFileHelper) {
  // 在此构建进度
}

Advancement$Builder

Advancement$Builder 方便地创建待生成的 Advancement,可定义父进度、显示信息、完成后的奖励及解锁要求。创建进度只需指定要求。

以下方法虽非全部必需,但值得了解:

方法 说明
parent 设置直接关联的父进度;可指定进度名称,或指定由开发者生成的进度本身。
display 设置聊天、弹窗和进度界面中显示的信息。
rewards 设置完成进度后获得的奖励。
addCriterion 向进度添加条件。
requirements 指定是否所有条件都必须为真,或至少一个为真;另有重载可混合使用这些操作。

准备好构建 Advancement$Builder 后,调用 #save,传入写入器、进度注册名,以及用于检查指定父进度是否存在的文件帮助器。

// 在 ForgeAdvancementProvider$AdvancementGenerator#generate(registries, writer, existingFileHelper) 中
Advancement example = Advancement.Builder.advancement()
  .addCriterion("example_criterion", triggerInstance) // 进度解锁方式
  .save(writer, name, existingFileHelper); // 将数据添加到 builder

原文:Advancement Generation。