非数据包配方

非数据包配方

并非所有配方都足够简单或已迁移到数据驱动方式。有些子系统仍需要在代码中打补丁,才能支持添加新配方。

非数据包配方扩展入口对照:酿造使用 BrewingRecipeRegistry 与 IBrewingRecipe,铁砧使用 Forge 总线上的 AnvilUpdateEvent,织布机通过 BannerPattern 及关联标签和物品扩展。

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

酿造配方

酿造是少数仍存在于代码中的配方之一。容器、容器配方和药水混合在 PotionBrewing 的引导过程中添加。为了扩展该系统,Forge 允许在 FMLCommonSetupEvent 中调用 BrewingRecipeRegistry#addRecipe 添加酿造配方。

警告:BrewingRecipeRegistry#addRecipe 不是线程安全的,必须通过 #enqueueWork 在同步工作队列中调用。

默认实现接收输入配料、催化剂配料和输出堆。也可以提供 IBrewingRecipe 实例执行转换。

IBrewingRecipe

IBrewingRecipe 是一个类似 Recipe 的接口,检查输入和催化剂是否有效,并在有效时提供对应输出,分别通过 #isInput、#isIngredient 和 #getOutput 实现。输出方法可访问输入和催化剂堆以构造结果。

重要:在 ItemStack 或 CompoundTag 之间复制数据时,务必使用各自的 #copy 创建独立实例。

目前没有像原版那样添加额外药水容器或药水混合的包装器,需要添加新的 IBrewingRecipe 实现来复制此行为。

铁砧配方

铁砧接收受损输入及材料或类似输入,减少输出结果的损伤,因此其系统不易数据驱动。但由于铁砧配方可视为在玩家具有所需经验等级时,将输入和一定数量材料转化为输出,可以通过 AnvilUpdateEvent 构建类似配方的系统。事件接收输入和材料,让开发者指定输出、经验等级消耗和材料用量;取消事件也可以阻止任何输出。

// 检查左右物品是否正确;为真时设置输出、等级消耗和材料数量
public void updateAnvil(AnvilUpdateEvent event) {
  if (event.getLeft().is(...) && event.getRight().is(...)) {
    event.setOutput(...);
    event.setCost(...);
    event.setMaterialCost(...);
  }
}

更新事件必须附加到 Forge 事件总线。

织布机配方

织布机将染料和图案(来自织布机或物品)应用于旗帜。旗帜和染料必须分别是 BannerItem 和 DyeItem,但可创建自定义图案并应用。通过注册 BannerPattern 创建图案。

重要:位于 minecraft:no_item_required 标签中的图案会作为织布机选项显示。不在该标签中的图案必须有对应的 BannerPatternItem 和关联标签才能使用。

private static final DeferredRegister<BannerPattern> REGISTER = DeferredRegister.create(Registries.BANNER_PATTERN, "examplemod");

// 接收要通过网络发送的图案名称
public static final RegistryObject<BannerPattern> EXAMPLE_PATTERN = REGISTER.register("example_pattern", () -> new BannerPattern("examplemod:ep"));

译注:原文将注册结果声明为 BannerPattern;DeferredRegister#register 返回 RegistryObject,这里已更正。

原文:Non-Datapack Recipes。