机器容器与 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(),即完全接管原方法。新逻辑:
slots[slot]为空 → 直接cancel()(无操作)- 遍历
available,找到isItemEqual(slots[slot])的那一项:slots[slot].stackSize -= available.get(i).stackSizestackSize <= 0则slots[slot] = nullavailable.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 标题仍显示英文。
关联
- 祭坛多方块补丁见 祭坛多方块结构放宽补丁
- 烤炉配方表见 巫师烤炉配方
- 区块加载开关见 配置项