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()。
相关条目
- Shaped Arcane Crafting Handler - 父类,含 vis 布局与背景细节
- Wand Crafting Handler - 同一父类的另一个子类
- Arcane Workbench 覆盖 - 槽位映射依赖本 handler 的
XPOS/YPOS - IMC 注册消息 - 奥法工作台催化剂注册