非数据包配方
并非所有配方都足够简单或已迁移到数据驱动方式。有些子系统仍需要在代码中打补丁,才能支持添加新配方。
原创说明图,依据 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,这里已更正。