Shapeless Arcane Crafting Handler(无序奥法合成)

基本信息

属性 值
类型 NEI Recipe Handler
源码类 com.gtnewhorizons.aspectrecipeindex.nei.arcaneworkbench.ShapelessArcaneRecipeHandler
基类 ShapedArcaneRecipeHandler
Overlay ID thaumcraft.arcane.shapeless
界面名 aspectrecipeindex.shapeless_arcane_crafting.title = “Shapeless Arcane Crafting”
底层配方类型 Thaumcraft ShapelessArcaneRecipe
IMC 关联物品 Thaumcraft:blockTable:15(奥法工作台,handler 高度 144)

功能:无序奥法合成配方。布局、vis 展示、研究控件、背景全部复用 Shaped Arcane Crafting Handler,只覆写材料布局与三个加载方法。

与有序版本的差异

伪造成有序版

ArcaneShapelessCachedRecipe 调父类构造时传入:

  • width = Math.max(recipe.getInput().size(), 3)
  • height = recipe.getInput().size() / 3 + 1

即把无序列表按 3 列切块,再交给父类当有序处理。源码注释解释这样做的原因:“Math in these looks a little weird to show similarity to other method above.”

覆写 setIngredients

不使用父类的 y * width + x 双层循环,而是单层遍历 items.length,坐标用:

  • XPOS[x % 3]
  • YPOS[x / 3]

跳过规则也不同:只跳过 null 和 NEIServerUtils.extractRecipeItems(items[x]) 长度为 0 的项。第 4 参数仍是 items[x] instanceof ItemStack。

第 4 个构造函数(Object[] input, ItemStack output, boolean, AspectList)在当前源码中没有任何调用点,是留给外部/子类使用的重载。

加载路径

方法 差异
loadCraftingRecipes(String, Object...) outputId == "item" 时调自己的 loadCraftingRecipes(ItemStack)(不转发父类),与有序版不同
loadCraftingRecipes(ItemStack) 产物匹配方式与有序版相同
loadUsageRecipes(ItemStack) 同样用匿名子类,但判定用 containsWithNBT 而非 contains

containsWithNBT 与 contains 的区别在于是否把 NBT 计入物品相等性——无序配方需要 NBT 敏感匹配。

vis 与材料

与有序版完全一致:vis 走 getOtherStacks()(基准 Y 122,间距 19,居中单行,元素物品 metadata 1),真实材料走 getIngredients()。

相关条目