s6652289-StackmasterFix icon

StackmasterFix

[AI-generated] Client-only patch for Stackmaster: its expedition-kit shortcut (Alt+click a build piece) took materials from a detached snapshot, so chests were never debited (item duplication). Redirects the withdrawal to the live container.

CHANGELOG

Changelog

1.1.0

剔除冗余功能:上游 Stackmaster 1.1.5 已自行修好「合成/升级不扣料」,本补丁不再介入那一半。

  • 依据(只读上游源码 + 官方包 metadata 核对)
    • 1.1.5 changelog 首条声明该修复,并写明已在游戏内验证 (prepared withdrawals are recaptured from each selected owned Container.GetInventory() rather than from detached ZDO inventory snapshots …)。
    • NearbyResources.cs:1288Container.GetInventory() 活库存,:1294-1313 用它重建 mutableHandleruntimeStacks执行期对象就是活库存:1673-1681 另有 ReferenceEquals(runtime.Inventory, runtime.Container.Container.GetInventory()) 的 fail-closed 身份校验(注释直指 "grants a free crafted item"),并配 ExactResourceDebit 精确账本与逆序回滚。
    • ⇒ 本补丁针对 ExecuteWithRollback 的 transpiler 已退化为恒等替换,属纯冗余。
  • 移除ExecuteWithRollback 的 transpiler + 写回 postfix 分支、FixCraftingFromStorage 配置项、以及 NearbyResourceService 的类型查找。 DLL 内已确认 FixCraftingFromStorageExecuteWithRollback 零引用
  • 保留ExpeditionKitAction.ExecuteAtomic(远征包)。1.1.5 没有修这条路径 —— 它仍走 CaptureForExpedition → Discover(…, resourceReadOnly: true) 的 detached ZDO 快照, 而 crafting 专用的 TryCaptureOwnedPlan/mutableCapture 从未被它调用。故这一半原样保留。
  • 依赖JStack424-Stackmaster 1.1.4 → 1.1.5(不升会让 r2modman 要求把已升的上游降回去)。
  • 日志改进:transpiler 不再拿「指令总数」当方法指纹(上游一改 IL 就会退化成 未知方法(指令数 N),纯误导),改用 Harmony 注入的 __originalMethod 直接取方法名。
  • 阈值变化FixExpeditionKit=false 时补丁不再尝试挂载,直接打日志说明并退出(等同于未安装)。

DLL 重新编译:16,896 字节,sha256 da4e8133d5e5b8ef991cc6f366f8e64ed31022d1d02bd27b0f497c8af1f5342e

1.0.0

  • 首个版本。修复上游 JStack424-Stackmaster 1.1.4 的「用箱子材料合成/升级不扣料(复制)」问题。
  • 根因:Stackmaster 为了「不拿所有权也能读箱子」,把容器的序列化库存从 ZDO 解进一个 临时 Inventorynew Inventory(true)ContainerHandle.ResourceInventory), 但写入路径复用了同一个 capture ⇒ ExecuteWithRollback 实际是扣在只读副本上。 临时 Inventory 永不触发 Inventory.Changed() ⇒ 不会调用 Container.Save() ⇒ ZDO 里材料一点没少,而模组的自检在同一个副本上量差值必然判定成功 ⇒ 玩家白拿成品。
  • 修法:transpiler 把写入方法里的 RuntimeResourceStack.get_Inventory / get_Item 整体重定向到真实容器的活库存与活物品对象;事务成功后强制 Container.Save() + ZDOMan.ForceSendZDO。拿不到安全写入权时 fail-closed(取消操作,不放行复制)。
  • 覆盖:NearbyResourceService.ExecuteWithRollback(合成/升级/建造)与 ExpeditionKitAction.ExecuteAtomic(建造菜单 Alt+左键拉取远征包)。
  • 实测(2026-09-19):修复后逐笔扣减量与配方需求精确吻合 (建造 20/10/2 = 32、合成 −3、另一组 4/1 = 5),且合成事务内首次出现 Container.OnContainerChangedContainer.Save(修复前为 0 条)。
  • 配置项:FixCraftingFromStorageFixExpeditionKitVerbose(均默认开)。