机器容器与 TileEntity 补丁

基本信息

本 mod 不注册任何方块。以下 6 个补丁全部打在 Witchery 本体的方块 / TileEntity / 物品类上,作用是改 GUI 标题、改槽位判定、改配方查找与区块加载行为。

# 目标类 补丁类型 Mixin 组
1 TileEntityWitchesOven @Overwrite × 2 + @Inject × 2 WITCHERY
2 TileEntityDistillery @ModifyExpressionValue + @Inject WITCHERY
3 TileEntitySpinningWheel @Inject × 2 WITCHERY
4 TileEntityPoppetShelf @Inject + @WrapWithCondition WITCHERY
5 ItemLeonardsUrn @Inject WITCHERY
6 BlockBaseContainer @Inject WITCHERY_DISABLE_CONTAINER_BLOCKS

这些机器的多方块尺寸 / 工作流程 / 产出均由 Witchery 决定, Witchery 不在本 wiki 收录范围(见 分类页),本页只记本 mod 的改动。

1. 巫师烤炉 TileEntityWitchesOven

GUI 标题(TileEntityWitchesOvenMixin.java:44-47): getInventoryName / func_145825_b 在 HEAD 被取消并返回 StatCollector.translateToLocal("gui.witcheryextras.witchesoven.title")。

区块刷新(TileEntityWitchesOvenMixin.java:34-42): 在 updateEntity 里、对 World.markBlockForUpdate(III)V 调用之后注入。

两个 @Overwrite(remap = false)——把原版的配方表换成本 mod 自建的表:

方法 行 行为
canSmelt() TileEntityWitchesOvenMixin.java:53-83 遍历 OvenRecipes.getRecipeMap(),要求 r.jars <= 实际罐数 且输入匹配;再校验输出槽
smeltItem() TileEntityWitchesOvenMixin.java:89-119 同样先查本 mod 配方表,命中后才走原版 FurnaceRecipes.smelting() 取熔炼产物

烤炉槽位索引(从 @Overwrite 代码读出):

索引 用途
furnaceItemStacks[0] 输入
furnaceItemStacks[2] 输出
furnaceItemStacks[4] 罐子(jars 计数来源)

配方表见 巫师烤炉配方。

📌 变量名易混淆(非缺陷):smeltItem() 第 108-109 行同时存在 itemStack(输出槽引用)与 itemstack(配方产物)两个变量,仅首字母大小写不同。 itemStack.stackSize += itemstack.stackSize; 在熔炼产物 stackSize == 1 时 等价于 N → N+1,行为正确,但可读性极差,容易被误改。

2. 蒸馏器 TileEntityDistillery

槽位插入判定(TileEntityDistilleryMixin.java:19-26):

@ModifyExpressionValue(
        method = { "isItemValidForSlot", "func_94041_b" },
        at = @At(value = "CONSTANT", args = "intValue=3"),
        require = 1, allow = 1)
private int witcheryextras$fixSlotInsertion(int original) {
    return 2;
}

把 isItemValidForSlot 中的常量 3 改为 2。 源码注释写明「Manually specify obfuscation mapping, and require that exactly one hits. The mixin AP can’t find it automatically for some reason」—— require = 1, allow = 1 表示必须恰好命中 1 处,多于或少于 1 处都会让 mixin 应用失败。

⚠️ 这是一处收紧:判定上界由 3 降到 2。 源码未解释其意图,不要臆断为「扩容」。

GUI 标题(TileEntityDistilleryMixin.java:28-31): gui.witcheryextras.distilleryidle.title。

3. 纺车 TileEntitySpinningWheel

原料扣除逻辑整体重写(TileEntitySpinningWheelMixin.java:24-42): 在 updateIfContained(ArrayList<ItemStack> available, int slot, CallbackInfo ci) 的 HEAD 注入并 cancel(),即完全接管原方法。新逻辑:

  1. slots[slot] 为空 → 直接 cancel()(无操作)
  2. 遍历 available,找到 isItemEqual(slots[slot]) 的那一项:
    • slots[slot].stackSize -= available.get(i).stackSize
    • stackSize <= 0 则 slots[slot] = null
    • available.remove(i) 后 cancel() 并返回

源码用 /* - */ // --this.slots[slot].stackSize; / /* + */ 注释保留了被替换掉的 原写法(减 1),对比可见本 mod 改为按 available 中实际数量整批扣除。

GUI 标题(TileEntitySpinningWheelMixin.java:44-47): gui.witcheryextras.spinningwheel.title。

4. 附魔人偶架 TileEntityPoppetShelf(区块加载开关)

受配置 allowPoppetShelfChunkLoading 控制(见 配置项):

补丁 行 行为
@Inject initiate TileEntityPoppetShelfMixin.java:18-28 在 TileEntityBase.initiate() 调用之后(shift = At.Shift.AFTER)取消 → allowPoppetShelfChunkLoading = false 时不开始区块加载
@WrapWithCondition invalidate TileEntityPoppetShelfMixin.java:30-41 包住 Log.warning(String) → 关卡时一并静音该警告

关闭区块加载后,物品栏里人偶架方块的 tooltip 会变红提示 (core/util/TooltipHandler.java:16-31,纯客户端 ItemTooltipEvent):

  • 关闭:红色 This block has chunkloading disabled
  • 开启:绿色 This block has chunkloading enabled

⚠️ tooltip 文案没有中文翻译,zh_CN.lang 里无对应键。

5. 伦纳德之瓮 ItemLeonardsUrn

仅 GUI 标题(ItemLeonardsUrnMixin.java:16-18): gui.witcheryextras.leonardsurn.title。 目标写作 ItemLeonardsUrn.InventoryLeonardsUrn.class(内部类)。

6. 银缸 BlockBaseContainer(整块禁用)

/// Disables creative tab, block and TE registration
@Inject(method = "setBlockName", at = @At("HEAD"), cancellable = true)
private void witcheryextras$setBlockName(String blockName, CallbackInfoReturnable<Block> cir) {
    if (AsmConfig.disableSilverVat && blockName.equals("witchery:silvervat")) {
        cir.setReturnValue(super.setBlockName(blockName));
    }
}

(BlockBaseContainerMixin.java:23-29)

disableSilverVat = true 时,在 setBlockName 的 HEAD 提前返回 super.setBlockName(blockName) 并 setReturnValue 取消后续逻辑—— 银缸方块因此不完成注册(连带创意标签与 TileEntity)。

匹配字符串是 "witchery:silvervat",Witchery 域 + 银缸名。

⚠️ 该 Mixin 类被无条件应用(Mixins.WITCHERY_DISABLE_CONTAINER_BLOCKS), 拦截的是 BlockBaseContainer 这个基类的方法,只对名字恰为 witchery:silvervat 的方块生效。

📌 源码残留:Mixins.java:58 有一行悬空注释 // configs handle individual blocks to disable, 但 AsmConfig 里只有 disableSilverVat 一个相关开关,并无"逐个方块"的机制。

GUI 标题键一览

4 个键全部由本 mod 注入,全部取自 assets/witcheryextras/lang/:

键 en_US zh_CN
gui.witcheryextras.witchesoven.title Witches Oven ⚠️ Witches Oven(未翻译)
gui.witcheryextras.distilleryidle.title Distillery ⚠️ Distillery(未翻译)
gui.witcheryextras.spinningwheel.title Spinning Wheel ⚠️ Spinning Wheel(未翻译)
gui.witcheryextras.leonardsurn.title Leonard's Urn ⚠️ Leonard's Urn(未翻译)

zh_CN.lang 里这 4 行直接复制了英文原文,中文环境下 GUI 标题仍显示英文。

关联