
Sable:装配修复
修复了Sable组装/拆卸过程中物品复制的问题,通过防止不可清除的方块实体丢弃其内容。适用于任何模组——Keg、柜子、篮子、物品排水装置、复杂存储等。无需配置。
概述
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
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。