进度生成
构造新的 AdvancementProvider 并提供 AdvancementSubProvider,即可为模组生成进度。进度可以手动创建并提供,也可以方便地使用 Advancement$Builder 创建。必须将提供者添加到 DataGenerator。
原创说明图,依据 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