机械动力:理包机修复

机械动力:理包机修复

修复了机械动力(Create)模组中再打包机的一个复制漏洞。

Create: Re-Packager Fix

这是一个针对机械动力(Create)模组的服务端修复模组,用于修补再打包机(Re-Packager)中的一项复制漏洞。当碎片包裹(fragmented package)所携带的物品数量不足以满足其订单的合成配方时,再打包机仍会生成一个数量为 0 的包裹条目——而打包机的输出逻辑随后会将其作为一个真实的物理包裹弹出,其中包含一份完整的配方材料,从而允许攻击者无限复制配方材料。本模组通过 Mixin 修补了 PackageRepackageHelper.repackBasedOnRecipes,从根源上消除了该复制漏洞,且不影响正常的打包行为。

漏洞详情

受影响版本: Create 6.0.8 (1.20.1)、6.0.10 (1.21.1) 以及 Create Fly 移植版 (1.21.11 / 26.2)。

  • 在工厂测量计(Factory Gauge)上配置的合成安排不受物品栏校验约束——配方材料无需与请求的物品匹配(Create 仅在红石请求器(Redstone Requester)路径中检查此一致性;工厂测量计路径完全缺少此检查)。
  • 当物品栏不足时,repackBasedOnRecipes 仍会生成一个 packagesToCreate == 0 的包裹条目。
  • (核心问题)打包机的输出逻辑 PackagerBlockEntity.tick() 在检查其数量之前就复制包裹(heldBox = entry.stack.copy() 先于 count-- 执行),因此数量为 0 的包裹会被当作真实包裹弹出——空物品栏凭空产生一个包含全套配方材料的包裹,可通过工厂测量计的循环补货请求无限利用。

相关的上游议题(均仍未关闭): #8082、#8046、#8155。上游提交 3e662789 仅修复了超大型配方材料变体(copyWithCount(1));核心缺陷仍未修复。

修复方案

通过 Mixin 对 PackageRepackageHelper.repackBasedOnRecipes 进行两阶段校验修补:

  1. 先检查——验证所有配方材料是否可用(NBT 精确匹配);若缺少任何一项,则中止整个轮次且不消耗任何物品。
  2. 后消耗——仅当所有材料确认可用后,统一扣除物品栏;无部分消耗,因此玩家永远不会损失已投入的材料。
  3. 零数量防护——当 packagesToCreate == 0(物品栏甚至无法支持一次合成)时,不生成任何包裹。

所有正常行为(库存充足、多配方订单等)与原版完全一致。

特性

  • 仅服务端——客户端无需安装即可加入
  • 不影响正常的打包/再打包功能
  • 材料不足时通过常规再打包返还,而非被吞没
  • 可与其他修复模组共存

验证

向再打包机喂入异常包裹(空物品栏 + 声称合成 64 次的订单):

  • 未安装本模组:输出 1 个包含全套配方材料的包裹(复制漏洞)
  • 安装本模组:输出 0 个包裹(已修复)

测试包裹命令记录在仓库的 TEST_PACKAGES.md 文件中。