Sable:装配修复

Sable:装配修复

修复了Sable组装/拆卸过程中物品复制的问题,通过防止不可清除的方块实体丢弃其内容。适用于任何模组——Keg、柜子、篮子、物品排水装置、复杂存储等。无需配置。

Bug修复

概述

Sable组装修复(Sable Assembly Fix)修复了在Sable组装/拆卸过程中,针对未实现Clearable接口的方块实体所发生的物品复制漏洞。

问题所在

Sable的SubLevelAssemblyHelper.moveBlocks()方法在组装过程中会对每个方块实体调用Clearable.tryClear()。问题在于:

  • 对于实现了Clearable的方块实体(例如箱子、漏斗)—— 正常工作,内容物会被正确清除
  • 对于未实现Clearable的方块实体(例如桌布(TableCloth)、机械臂(Mechanical Arm)、弹射器(Ejector)等)—— tryClear()是空操作,什么都不会发生
  • 方块被摧毁后其物品会掉落到世界中,但包含物品库存的NBT数据仍然存在
  • 当方块在子层级中重新创建时,NBT物品会被重新读取
  • 结果:相同的物品同时存在于地面和方块内部——造成物品复制

触发此漏洞的成本极低:

只需在物理模式与方块模式之间切换飞船(反之亦然)—— 每次转换都会触发组装/拆卸,从而复制飞船上任何非Clearable方块实体的内容物。无需昂贵的资源或复杂的设置。

工作原理

一个单一的@Redirect混入(mixin)拦截了SubLevelAssemblyHelper.moveBlocks()内部的Clearable.tryClear()调用:

  • 如果方块实体实现了Clearable → 正常通过,不做干预
  • 如果方块实体未实现Clearable → 调用level.removeBlockEntity(pos)完全移除该方块实体,防止其掉落任何内容物

受影响的方块实体(机械动力(Create)+ 附属模组)

方块实体 每次复制物品数
桌布(TableCloth) 最多4个
机械臂(Mechanical Arm) 整个持有的堆叠(例如一次64个物品)

以及任何带有库存但未实现Clearable的模组方块实体。

注意: 机械臂尤其严重——它会在一次操作中复制整个持有的堆叠。如果机械臂持有64个物品的完整堆叠,每次组装/拆卸循环你会得到64个复制的物品。 任何带有库存但未实现Clearable的模组方块实体也会受到影响。

配置

包含一个白名单系统。配置文件config/sableassemblyfix/whitelist.json会在首次启动时自动创建。

将方块实体ID添加到白名单以跳过修复(例如,如果某个模组自行处理了Clearable)。需要重启游戏才能重新加载。

依赖项

  • NeoForge >=21.1.228
  • Sable >=2.0
  • 机械动力:航空学(Create: Aeronautics) >=1.0.2

许可证

MIT