修复: 净水器与水龙头残留杂质
UV 紫外线灯一直干净, 净水器与水龙头却总留一点点 —— 两条独立缺陷, 表象相同。根因靠读 ISIL 反编译定案 (dump/ascs/ 全是 throw null 空壳, 不可用)。
1. EmptyContainer 根本不清杂质
其 IL 全程没有出现过任何一个杂质 id 字面量, 只做 ModifyTag(容器 parts) 与 DisableTag("STRIP_TESTED_TAG") —— 它清的是容器里的**「水」(基液)**; 6 类杂质是各自独立的 part, 一个都不碰。
原净化补丁只有 EmptyContainer + AddPureWater(vol) 两步 → 基液换成了 100% 纯水, 杂质原样留着。而 UV 走 OnUVUsed → StripAllContaminants (逐类 RemoveContaminantFromContainer(minPercentage=0) 迭代到收敛), 根本不调 EmptyContainer —— 这正是两者表现不一致的原因。
2. AddWater 是「追加混合」而非替换
原水龙头补丁只把 grade 由 1 改成 0, 只保证新加的那一份是纯水; 容器原有杂质原封不动, 接水前残留多少仍是多少。
修复
| 补丁 | 改动 |
|---|---|
PatchPurifyToPure |
补齐第三步: EmptyContainer + AddPureWater + StripAllContaminants |
StripContaminantsOnly (新) |
从 StripAllContaminants 抽出的「只剥离不补满」分支 |
PatchFaucetPure |
Prefix 增加 GameItem __0, 改完 grade 后调 StripContaminantsOnly |
水龙头处刻意用 StripContaminantsOnly 而非 StripAllContaminants —— 后者会先补满, 原生 AddWater 就无处可加了。三者现共用同一条剥离路径。
开关默认值调整
| 键 | 默认 | 说明 |
|---|---|---|
FaucetAlwaysPure |
false (新改) | 水龙头接出 100% 纯水 |
原版设计上水龙头只接得出高品质水 (grade=1), 改出纯水属于破例, 是否启用交给玩家在配置里决定; 净水器与紫外线灯是修正原生缺陷(残留杂质), 性质不同, 保持默认开启。
配置项与补丁逻辑本身不变, 仅默认值。
验证
dotnet build -c Release: 三项目 0 警告 0 错误。- DLL 内嵌符号校验:
StripContaminantsOnly/StripAllContaminants/PatchFaucetPure/PatchPurifyToPure/FaucetWaterMarker均在;AddPureWater/EmptyContainer/GetTotalVolume/GetFreeCapacity未被误删。
资产
ProgressMod.dllInventorySorter.dllNetworkUnlockMod.dll
需重启游戏才会加载新 DLL。
完整变更: v0.6.8...v0.6.9
自 v0.6.8 以来的其它变更
- 修库存检查器打不开 (
c6661aa): NVIDIA 设计语言重构d0e0f68在openCatalog与renderInstance各加了一行$('drawer').className = 'drawer';, 把openDrawer()刚加上的show类整个覆盖 ⇒ 页面变暗但抽屉不可见。图鉴「详情」不走renderInstance故一直正常, 解释了只有库存检查器中招。 - 读路径改快照 (
487cef2):/api/mine与/api/inventory原先让 HTTP 线程同步等主线程 5s, 主线程一忙则两请求同时超时; 改为非阻塞置位 + 快照读取 (RefreshSnapshots主线程节流 120ms)。