祭坛多方块结构放宽补丁

基本信息

属性 值
被补丁的类 com.emoniph.witchery.blocks.BlockAltar(Witchery 本体的方块)
Mixin 文件 mixins/late/witchery/BlockAltarMixin.java
注入方法 updateMultiblock(两处)
所属 Mixin 组 Mixins.WITCHERY(Phase.LATE,不受 Baubles|Expanded 门控)
本 mod 自有方块 0

⚠️ 本 mod 不拥有任何多方块结构。 被改的是 Witchery 本体的祭坛。 祭坛的尺寸、层级、控制器方块、能否旋转拆除等全部由 Witchery 决定, 而 Witchery 不在本 wiki 收录范围(见 分类页), 因此本页只记录本 mod 施加的两处改动,不复述 Witchery 的结构定义。

改动 1:移除 TileEntity 数量上限

// Essentially removes the te > 3 check
@ModifyConstant(method = "updateMultiblock", constant = @Constant(intValue = 3, ordinal = 1), remap = false)
private int witcheryextras$removeTECheck(int original) {
    return 999;
}

(BlockAltarMixin.java:23-27)

Witchery 原版在 updateMultiblock 里对已找到的 TileEntity 数量做 > 3 判断并据此 判定祭坛不成立;本 mod 把该常量 ordinal = 1 的那次比较从 3 改成 999, 实际上取消了上限。

ordinal = 1 限定这是方法内第 2 个 intValue = 3 常量。 若 Witchery 升级后该方法内 3 的出现顺序改变,此补丁会打到错误的常量上—— 这是 @ModifyConstant + ordinal 的固有脆弱点。

改动 2:结构尺寸 9 视作 6

// validates altars with size 9
@ModifyExpressionValue(
        method = "updateMultiblock",
        at = @At(value = "INVOKE", target = "Ljava/util/ArrayList;size()I", ordinal = 1),
        remap = false)
private int witcheryextras$addMultiblockSize(int original) {
    return (original == 9) ? 6 : original;
}

(BlockAltarMixin.java:29-36)

补丁打在 ArrayList.size() 调用的第 2 处(ordinal = 1)返回值上: 当原逻辑算出的结构尺寸为 9 时,改写成 6,其余值原样透传。

即:本 mod 让 Witchery 原本会判为「尺寸 9」的那一类祭坛,按尺寸 6 的祭坛去校验。

未改动的部分

以下问题本 mod 没有触碰,不要在别处看到相关描述时误以为是它做的:

  • 祭坛的方块种类、放置规则、旋转方向、可否用镐拆除 —— 全部沿用 Witchery 原版
  • 祭坛等级与所需祭品 —— 沿用 Witchery 原版
  • 本 mod 自身没有注册任何方块 / TileEntity / 物品

关联