DSP MolecularHub
分子装配枢纽把八道工序折叠进一台建筑:一座 60 格原生仓库内建 8 个脱离实体的配方槽,槽位每 tick 按配方缺口自动从仓库取料、产物自动回仓,仓库格子由分配器按配方自动规划,分拣器指向后按缺口自动广告所需输入;沿用原版制造台模型(染成青金色)与界面,宇宙矩阵阶段解锁;支持 Shift 复制/粘贴与蓝图整厂迁移。适配 DSP 0.10.35 / BepInEx 5.4 / CommonAPI 1.6.7。
By Star4wish
| Date uploaded | 2 weeks ago |
| Version | 0.2.0 |
| Download link | Star4wish-DSP_MolecularHub-0.2.0.zip |
| Downloads | 73 |
| Dependency string | Star4wish-DSP_MolecularHub-0.2.0 |
This mod requires the following mods to function
CommonAPI-CommonAPI
A modding library for Dyson Sphere Program. Currently is under development.
Preferred version: 1.6.7xiaoye97-LDBTool
Library that allows mods to add and edit Proto data. Also allows you to see Proto data, config ID's of mod Protos and change localized strings
Preferred version: 3.0.3README
分子装配枢纽(Molecular Assembly Hub)v0.2.0
中文简介:把 8 个配方槽 + 60 格仓库装进一台建筑。枢纽按配方缺口直接从仓库取料、产物自动回仓, 格子划分、格子筛选与「自动化输入限制」全部跟随配方;兼容原版分拣器、配送器与蓝图,存档内容随
.dsv一起走。English:One building that packs 8 recipe slots and a 60-grid storage. The hub pulls ingredients from its own storage on demand, returns products automatically, and keeps grid allocation, per-grid filters and the vanilla automation-input limit in sync with every recipe. Works with vanilla sorters, dispensers and blueprints, and its save data travels inside the
.dsvfile.
0.2.0(2026-11-01)仓库化改造:枢纽从「制造台类型」改为仓库类型(模型与界面外观不变)。 现在的结构是:内建 60 格仓库 + 8 个脱离实体的配方槽 + 格子分配器 —— 槽位按配方直接从仓库取料、 产物自动回仓,仓库格由分配器按配方自动划分输入/产物/预留区。0.1.x 的「内部总线」的取放料逻辑已删除(
busItems/busCounts仅保留用于读 v2 存档迁移;InterfacePoolId等为恒 -1 的历史残留字段,不再参与逻辑)。
把一台「分子装配枢纽」加进《戴森球计划》:8 个配方槽 + 内建 60 格仓库的超级制造台, 槽位之间的上下游串联(上游产物回仓、下游槽按需从仓库取)仍然成立,只是原料改由仓库中转, 不占传送带、不占分拣器。
历史版本(详见 CHANGELOG.md):0.1.10 把科技解锁成本降到 10.0K 宇宙矩阵;0.1.9 起支持配方 复制/粘贴、存档内嵌配置(
MHUBTRL1尾块);0.1.x 的「内部总线 / 接口位 /insertfix短路」架构 已在 0.2.0 作废(busItems/busCounts仅保留用于读 v2 存档迁移),相关hot-tune旧键大多失效 (holdmul/holdfloor仍生效)。
功能
- 8 个独立配方槽:制造 / 化工 / 精炼 / 冶炼配方都能放;每个槽按原版制造台 1× 速度生产(界面显示「每槽 1x」,八槽并行)。
- 内建 60 格仓库(10×6):枢纽本身按原版仓库类型注册,槽位不再各自持有原料,而是每 tick 按配方缺口直接从仓库取料。
- 自动取放料:取料时把 inc(增产点数)写进槽位
served/incServed,产物优先回仓;仓库满了产物就留在槽位里背压(不丢件、不报错),腾出格子后继续入库。 - 格子分配器(0.2.0):按配方自动规划 60 格 —— 每种输入物品各占 1 格、产物每种物品共用 1 格(多槽产同一种产物时去重)、最后保留 2 格给换配方时的旧库存;仓库切到
Filtered并逐格设筛选。 换配方时整张分配表重排、原有物品按原数量/inc 回填;放不下会整体拒绝并说明原因(例如「需要 N(输入)+ M(产物)+ 2(预留)= X 格,超过仓库 60 格」),不会破坏旧布局。 - 自动化输入限制自动跟随配方(0.2.0):分配表重排后会同步重设原版仓库的「自动化输入限制」(
StorageComponent.bans),只允许分拣器把料送进当前配方用到的筛选格:未筛选的尾格与 2 格预留区不会再被自动化塞进杂物;清空配方时限制为 0(自动化输入全停)。重排期间临时全禁、读档重建与打开仓库界面时都会重新校准,可在原版仓库界面右下角的「自动化输入限制」滑条上看到该值。 - 分拣器入库(0.2.0):分拣器指向枢纽后走原版分拣器逻辑——按仓库格筛选与「自动化输入限制」直接把料送进来,不按配方需求卡料。早先实现过「按缺口把最缺的 ≤6 种原料写进
entityNeeds广告」的方案,实机回归发现原版entityNeeds只有 6 格、会把入库卡在 6 种原料,遂默认关闭(Patches\InserterNeedsPatch.cs的InserterNeeds.NeedsEnabled = false,改回true即可恢复广告模式)。 - 配方复制 / 粘贴:
Shift复制建筑、<>剪贴板、蓝图 —— 8 槽配方都能带上;空枢纽不会被复制成"清空指令",粘贴不吞槽里的物品,未解锁配方跳过;目标不是枢纽时直接不执行,不会误改别的建筑。 - 产物快速筛选:放分拣器指向枢纽时出现原版多产物配方那样的产物图标条,可直接点选输出哪一条槽位的产物(纯 UI)。
- 自制界面(0.2.0 接管):点枢纽只打开枢纽窗口(原版仓库窗/制造台窗自动让位);标题栏新增「仓库」按钮,一键打开原版 60 格仓库界面。
- 配送器(0.2.0,可选):枢纽为仓库类型可直接装配配送器(实机已验证可装并正常投递)。
- IcarusII 调试字段(0.2.0):若安装了 IcarusII,
game_get_entity返回枢纽实体时会多一个molecularHub对象,内容与该枢纽在hub-debug.json里的条目一致(仓库格明细 / 分配表 / 各槽 served·incServed·produced / needs 表等)。未安装 IcarusII 时插件照常加载,只打一行跳过日志,功能不受影响。注入已随自检[P6-TEST]验证通过(返回体含molecularHub);游戏内 IcarusII 对话查询尚未实测。 - 视觉修正:同一实体上的多个组件不再让枢纽动画 8~9 倍速、标志乱闪;旧存档会自动清理历史遗留的孤儿装配组件。
- 缓存可热调:复制
hot-tune.example.txt为hot-tune.txt,游戏运行中改参数约 0.25 秒生效(个别键除外,见下文)。
安装
r2modman / Thunderstore 方式(推荐)
- 在 R2 的 Online 列表里安装依赖(本地 zip 导入不会自动补齐依赖,必须先装好):
xiaoye97-BepInEx(5.4.17 或更新 5.4.x)CommonAPI(1.6.7) ← 最容易漏装,缺了本 MOD 会报missing dependencies: dsp.common-api.CommonAPILDBTool(3.0.3)
- 再把本 zip 导入 R2 profile(或下载安装)。
- 启动游戏;在仓储建造页找到「分子装配枢纽」(需要宇宙矩阵科技 1993 解锁:10000 宇宙矩阵,即 10.0K)。
IcarusII是可选的,不属于依赖:装了才多出molecularHub调试字段,不装不影响本 MOD 任何功能。
r2modman 导入后 DLL 可能落在
BepInEx\plugins\DSP-DSP-MolecularHub\DSP-MolecularHub\DSP-MolecularHub.dll(多一层目录)——BepInEx 会递归扫描,能正常加载,无需手动搬。
手动安装
-
先装好上面 3 个依赖(解压到
<游戏目录>\BepInEx\...)。 -
把本压缩包解压到游戏根目录,最终结构应为:
<游戏目录>\BepInEx\plugins\DSP-MolecularHub\DSP-MolecularHub.dll <游戏目录>\BepInEx\plugins\DSP-MolecularHub\hot-tune.example.txt
兼容:戴森球计划 0.10.35、BepInEx 5.4.x(实测 5.4.17)、CommonAPI 1.6.7;本 DLL 编译引用 BepInEx.Core 5.4.21 / CommonAPI 1.6.5,在 5.4.17 运行时实测加载正常(仅 BepInEx 打一条『targets a wrong version of BepInEx (5.4.20.0)』的轻微警告,不影响功能)。
使用
- 点击枢纽打开枢纽窗口(原版仓库窗和原版制造台窗会自动关闭,避免两层窗口打架)。
- 左键槽位选配方;右键槽位打开原版制造台界面配置该槽;槽位右上角 X 清空。
- 「仓库」按钮(标题栏):打开原版 60 格仓库界面。此时原版的「筛选器 / 整理 / 容量」按钮会被拦截——
它们会清掉分配器设好的筛选格;需要临时手动动格子时,把
hot-tune.txt的debug=1打开即可放行。 - 原料行:显示配方需要的输入物品与仓库现有库存;下方提示行显示
仓库缺料:<物品名>(缺料时)或原料已齐;左键把该物品收进背包(背包满自动退回,不吞物品)。 - 产物行:左键把产物收进背包。
- 入库不再按配方种类卡料:入库走原版分拣器的筛选格/自动化输入限制,配方有几种输入就送几种(原版
entityNeeds的 6 格上限只影响已默认关闭的 needs 广告模式)。 - 复制/粘贴配方:
Shift复制建筑(连着放几台都带配方);或对着枢纽按<复制、对着另一个枢纽按>粘贴;存蓝图时配方一起存进去(旧蓝图没有配方,放下就是空枢纽)。粘贴时目标槽里的缓存物品会退回背包,未解锁的槽会被跳过。 - 堆叠:枢纽带原版多层堆叠字段(层高 5);配送器可直接装配并正常投递(实机已验证)。枢纽自身多层堆叠建造会提示「与其他物品碰撞」,0.2.0 不做多层吸附;
需要回到单层行为时用
stack=0(重启游戏)。
hot-tune 在线调参
复制 hot-tune.example.txt 为同目录 hot-tune.txt 即可在线调整(约 0.25 秒生效),文件内有全部键的说明;
删除该文件不会重置已生效的值(重启游戏后才回到编译期默认值;想立刻改回就把对应键写成默认值)。
| 键 | 默认 | 说明 |
|---|---|---|
tick |
1 | 总开关。0 = 暂停枢纽生产驱动(就地冻结,不取料/不出货) |
debug |
0 | 开发者诊断:0 = 发布版静默(默认);1 = 打开全部调试日志、把调试面板追加到枢纽窗口、并每 300 驱动 tick 写 hub-debug.json 快照。0.2.0 发布版在 UI 中已不显示调试面板,示例模板也不再列出该键 |
selftest |
0 | 开发者自检:自动建枢纽、投料、切配方跑用例(会往存档里建实体,正式游玩时别开)。示例模板中不再列出 |
stack |
1 | 多层堆叠字段开关。0 = 不写堆叠字段,回到单层(失败退路)。启动期读一次,改了要重启 |
holdmul |
4 | 旧键保留、仍生效:槽位单次取料上限 = 单次需求件数 × 该倍数(与 holdfloor 取大者) |
holdfloor |
4 | 旧键保留、仍生效:槽位单次取料上限的下限(件) |
copypaste |
1 | 配方复制/粘贴补丁。0 = 本会话不安装这组补丁。启动期读一次,改了要重启 |
animfix |
1 | 渲染前归一枢纽实体动画(修 8~9 倍速/标志乱闪) |
powerfix |
0 | 把耗电按「任一槽在工作」稳定写成工作/待机功率 |
probeanim |
0 | 开发者诊断:采样枢纽及相邻实体的标志/动画变化(会刷日志) |
probeins |
0 | 开发者诊断:采样指向枢纽的分拣器与 entityNeeds 内容 |
probestats |
0 | 开发者诊断:一次性 dump 组件池/登记统计/电力 |
注册类内容(物品 6007 / 配方 163 / 科技 1993 / 模型 666)受加载期约束,不能热调,必须重启游戏。
存档与兼容
- 枢纽的 8 槽配方与仓库内容写在
.dsv文件末尾的附加段(MHUBTRL1尾块)里:跟着存档文件走,拷到别的机器/存档目录 也一起跟随(按「星系种子 + 星球 index」匹配)。原版客户端会忽略存档尾部的附加数据(原理如此,未在纯原版环境实测),因此不装本 MOD 也应能正常读档。 - 0.2.0 起尾块为 v3:读 v2 存档时会把旧总线存货一次性迁入仓库(inc 记 0,装不下则退还玩家),新档写空数组。
- 读档用「文件尾 4MB 内倒序扫描」定位尾块,即使别的 MOD 在本 MOD 之后又追加了尾块也不会丢配置。
- 不依赖
DSPModSave:存档尾块MHUBTRL1由本 MOD 自己追加,已实测与DSPModSave1.2.2 共存。 - 插件目录默认不生成任何文件;只有
debug=1时才会写hub-debug.json状态快照(排查问题用,可随时删)。
已知限制 / 说明
- 入库按原版分拣器的筛选格与自动化输入限制进行,不再按配方种类设硬上限;needs 广告模式默认关闭(原版
entityNeeds只有 6 格)。 - 生产统计里枢纽的 8 个槽会显示成「设施[枢纽图标]×N」——原版按装配组件计数,参考速率数值是正确的(0.1.x 实测,0.2.0 未复测)。
- 旧存档首次载入会自动清理旧版本遗留的"孤儿装配组件"(只删不被任何实体认领的组件,不碰正常机器)。
- 复制/粘贴只对枢纽生效:剪贴板里没有枢纽载荷时普通制造台/仓储走原版逻辑;剪贴板是枢纽载荷而目标不是枢纽时,粘贴被静默忽略。
- 若复制/粘贴出问题:
hot-tune.txt写copypaste=0并重启游戏,可整组关闭这组补丁,其余功能不受影响。 - 若堆叠/配送器行为异常:
hot-tune.txt写stack=0并重启游戏,回到单层(0.1.x 形状)行为。 - 枢纽窗口的「仓库」界面复用了原版 60 格仓库 UI,因此原版界面里的筛选/整理/容量按钮被本 MOD 接管(
debug=1可临时放行)。 - 重入路径:快速反复「打开原版仓库窗 → 关 → 立即打开枢纽窗口」历史上触发过原生崩溃(0xc0000005);0.2.0 只回归了安全子集,遇到同类崩溃请先对照此场景。
- 1 tick = 1 游戏帧;枢纽按 tick 逐帧驱动,8 槽并行,不改变原版单槽 1× 的生产数值。
版本
- v0.2.0(2026-11-01)仓库化改造:60 格仓库 + 8 个脱离实体的配方槽 + 格子分配器 + 分拣器 needs 广告 + 点击接管与仓库按钮 + 存档 v3 + 可选多层堆叠/配送器 + IcarusII
molecularHub调试字段。 - v0.1.10(2026-10-31)解锁成本下调:宇宙矩阵 10.0M → 10.0K(研究哈希 18.0M → 18.0K)。
- v0.1.9(2026-10-19)配方复制 / 粘贴(Shift 复制建筑、
<>剪贴板、蓝图)。 - v0.1.9-r2(2026-10-21)实机反馈修复轮:复制/粘贴语义与提示、槽内物品退还、分拣器投料自愈、产物快速筛选 UI。
问题反馈:见 Thunderstore 包页面(或 r2modman 内 mod 页面)。
CHANGELOG
Changelog
0.2.0 — 2026-11-01
仓库化改造(发布):枢纽从「制造台类型」改为「仓库类型」(模型/UI 外观不变):内建 60 格原生仓库 + 8 个脱离实体的配方槽 + 格子分配器 + 分拣器 needs 广告 + 点击接管界面 + 存档 v3 + 可选多层堆叠。旧总线的取放料逻辑(bus[])、接口位、UpdateNeeds 重逻辑已删除;busItems/busCounts 仅保留用于读 v2 存档迁移,InterfacePoolId 等为恒 -1 的历史残留字段,不再参与逻辑。
升级提示:这是架构级改动。存档尾块 v2→v3,读档会自动迁移;原版客户端会忽略存档尾部的附加数据(原理如此,未在纯原版环境实测),因此不装本 MOD 也应能正常读档。hot-tune.txt 的旧键大多已失效,请改用 hot-tune.example.txt 里的新键(其中 holdmul/holdfloor 仍生效)。
P0 — 仓库实体打样(0.2.0-p0,实机验证)
WriteEnergy/EnsureStorage让枢纽带StorageComponent(10×6=60 格),isAssembler=false、assemblerId=0。- 8 个配方槽改为
entityId=0的游离装配组件(共享pcId),Init时复用/重建;原版仓储组件字段回读校验。
P1 — 取放料与去总线(0.2.0-p1,实机验证)
- 删除
HubComponent旧总线/接口位/needs 体系(3743→902 行),新增Core\HubFeeder.cs(StorageTick)。 - 每 tick 按槽位
requireCounts缺口从仓库TakeItem(inc 写入served/incServed),产物AddItem回仓,满即停(背压不丢件)。 - tick 驱动收敛为唯一一条:
UIGame._OnUpdatepostfix;删掉从未生效的FactorySystem.GameTick补丁。 [P1-INC]自检通过:槽位incServed合计=2,inc 全链路保留。- 0.2.0 实机回归修复(配方槽 UI):槽位组件是「脱离实体」的(
assemblerPool[i].entityId = 0),右键原先进原版制造台窗口会空引用(详见 P4 的两轮修复:只读镜像 +OnAssemblerIdChangePrefix 守护)。现在右键优先打开原版制造台窗口的只读镜像;实在打不开时退回自绘详情面板(配方/运行状态/进度/本槽产量/库存缺口),左键仍打开配方选择器改配方。
P2 — 格子分配器(0.2.0-p2,实机验证)
- 新增
Core\GridAllocator.cs:按配方输入/产物规划 60 格(输入每物品 1 格、产物每物品共用格、最后 2 格预留),storage.type=Filtered+ 逐格SetFilter;改配方时整表重排、物品按原 count/inc 回填,容量不足整体拒绝并给出原因。 TrySetSlotRecipe先预演分配再切配方,失败不破坏旧布局;hub-debug.json增加alloc分配表。[P2-TEST]通过:换配方物品总量守恒(差 0),超 60 格用例明确拒绝。- 策略调整(0.2.0 实机回归,用户拍板):换配方时若「旧库存装不进新布局的共享格」,不再整体拒绝,而是把多出来的那部分库存退回玩家背包(
GiveOverflowToPlayer,日志[alloc] 仓库共享格不足:已把 N 个现有库存退回玩家背包…+ UI 提示),保证配方变更总能生效且绝不丢件。真正规划不出布局(如配方类型不允许、格数超限)仍会拒绝并在 UI 提示原因。 - 仓库「自动化输入限制」按配方自动重设(0.2.0 实机回归,用户要求):分配器每次重排布局后,把原版
StorageComponent.bans设为60 - 用到的筛选格数(原版AddItem(useBan:true)——分拣器入库——只在前size-bans格找位),未筛选的尾格与预留格不再被自动化塞物品;清空配方时允许格数为 0。重排期间先bans=size挡住中途插入;打开原版仓库窗、读档重建也会重新校准(日志[alloc] 仓库自动化输入限制:实体 N 允许前 X/60 格(bans=…)),hub-debug.json的storage.bans可直接核对。
P3 — 分拣器 needs(0.2.0-p3,实机验证)
- 新增
Patches\InserterNeedsPatch.cs:SetInserterInsertTargetpostfix 给指向枢纽的分拣器置careNeeds=true, 并把枢纽需求的 ≤6 种物品写进entityNeeds(按缺口打分,库存够就不广告);读档/建造后重绑。 [P3-TEST]通过:careNeeds=True、needs=[…]。- 实机回归结论:needs 广告模式已被下面的回滚取代;改为原版分拣器入库后,混料带 → 分拣器 → 枢纽的入库路径实机正常(用户验收:分拣器输入正常)。
- 策略回滚(0.2.0 实机回归,用户拍板):needs 广告在实机上把入库卡在「最多 6 种原料」(原版
entityNeeds只有 6 格),且广告撤销时已手持物料的分拣器会悬着。现在入库完全走原版分拣器逻辑:InserterNeeds.NeedsEnabled=false,把此前置careNeeds=true的分拣器恢复为careNeeds=false、广告表清零(日志[needs] 枢纽 N:M 个分拣器恢复原版入库逻辑(careNeeds=false,广告已清空)),按原版筛选格 + 原版自动化输入限制直接输入,不再按配方需求卡料。needs 实现保留,把NeedsEnabled改回true即可恢复广告模式。
P4 — 点击接管 + 仓库按钮 + 存档 v3(0.2.0-p4 实现 / 0.2.0 修 UI 重入崩溃,实机验证)
-
点枢纽 → 打开枢纽窗口并关掉原版制造台/仓库窗(
UIGame.OnPlayerInspecteeChange/PlayerAction_Inspectpostfix)。 -
枢纽窗口标题栏加「仓库」按钮,按原版顺序打开 60 格原版仓库界面;
StorageWindowGuardPatch拦截原版筛选/整理按钮并强制type=Filtered。 -
存档尾块升级 v3:
TrailerFile.version=3(读档兼容 v2,busItems/busCounts迁移进仓库,装不下退玩家)。 -
[P4-TEST]:仓库按钮 / 接管判定 / version=3 / v2 迁移 +5 全部通过。 -
崩溃修复(0.2.0 实机回归发现):
Patches.TryTakeoverHubWindow关掉原版仓库窗之后,又用相同参数递归调用自己(TryTakeoverHubWindow(EObjectType.None, objId))→ 无限递归栈溢出 → CLR fail-fast,Windows 事件日志只留0xc0000005 / ntdll.dll,BepInEx 日志无托管堆栈。修复:点击接管只在原版事件回调里登记pendingTakeoverEntity,由下一帧UIGame._OnUpdate的ProcessPendingTakeover()统一「关原版仓库窗 → 开自绘枢纽窗」,不再在原版 UI 事件中途改 UI;新增日志[takeover] 已接管枢纽窗口:entity=…。已实机验证「开着原版仓库窗再点枢纽」不再崩溃;全工程方法体扫描未发现第二处自递归。 -
配方槽右键修复(0.2.0 实机回归发现):原来右键配方槽会临时把槽位组件的
entityId借给枢纽实体再开原版制造台窗口,脱离实体的槽位(assemblerPool[i].entityId == 0)会让原版UIAssemblerWindow.OnAssemblerIdChange里LDB.items.Select(factory.entityPool[assembler.entityId].protoId).name空引用崩溃(NullReferenceException,报错框会误指第三方 AssemblerUI 的 postfix)。修复:右键改为只读镜像——把枢纽实体临时借给该槽位组件、打开原版制造台窗口供查看配方/进度/库存,关窗时EndSlotMirror()还原(日志[mirror] 右键槽位 N → 原版制造台窗口…/[mirror] 已还原槽位 N…),改配方仍走左键UIRecipePicker。踩坑:AssemblerComponent是 struct,var c = pool[i]; c.entityId = x;只改副本,必须直接对factorySystem.assemblerPool[i].entityId赋值。 -
仓库窗关闭自动回开:点「仓库」按钮会触发原版
ShutAllFunctionWindow()连带关掉自绘枢纽窗;现在关掉原版仓库窗后自动把枢纽窗开回来(UIStorageWindow._OnClosepostfix →HubWindow.OnVanillaStorageClosed(),日志[ui] 原版仓库窗关闭 → 重新打开枢纽窗口:entity=N),仓库↔枢纽来回切不用重新点建筑。 -
仓库界面开着时枢纽窗口常驻(0.2.0 实机回归,用户要求):原版开仓库会
ShutAllFunctionWindow()把枢纽窗关掉;现在仓库界面开着期间(HubWindow.ShouldKeepOpenWithStorage),UIGame.ShutAllFunctionWindow/UIGame.ShutInventoryConflictsWindows的 postfix 直接跳过枢纽窗,枢纽 UI 不再跟着关。 -
点枢纽窗口右上角 X 连带关仓库(用户要求):
HubWindow.Close()发现原版仓库窗还开着就一并ShutStorageWindow()(日志[ui] 枢纽窗口关闭 → 连带关闭原版仓库窗口),两个窗口一起收。 -
点枢纽时制造台窗重入的 NRE(第二轮修复):只读镜像期间枢纽实体被临时借给槽位组件,此时再点同一台枢纽,原版会重开制造台窗并在
OnAssemblerIdChange里撞空引用。现在给UIAssemblerWindow.OnAssemblerIdChange加 Harmony Prefix:绑定无效(池 id 不符 /entityId<=0/entityPool[entityId].protoId<=0)时assemblerId=0、隐藏窗口并跳过原方法(日志[mirror] 拦截制造台窗重入…),有效时正常放行。已实机验证「右键槽位后再点枢纽」不再报错。 -
存读档后个别枢纽配方丢失(0.2.0 实机回归发现,已修):根因是
HubRegistry.CleanupOrphanAssemblers把「带配方、entityId=0」的游离槽位组件当旧版遗留删掉(日志[cleanup] 删除孤儿装配组件 … recipe=158/83/99…),配方随之消失;且存档原先没记槽位池下标,删一次就永久丢。修复三处:①带配方(recipeId>0)的游离组件不再删,改为保留等枢纽重连([cleanup] 保留带配方的游离装配组件:池 N recipe=…);②HubSave.slotPoolIds记录 8 个槽的assemblerPool池下标,读档按它精确重连([save] 实体 N:按存档槽位下标重连 M 个配方槽);③存档前先扫全工厂把未登记的枢纽补登,避免漏存。已实机验证连续存读档后 5 台枢纽配方全部保留。
P5 — 堆叠 + 配送器(0.2.0-p5,字段级实机验证)
HotTune.Stack(hot-tune.txt的stack=0/1)+Plugin.WriteEnergy写multiLevel=true、lapJoint=(0,5,0)、multiLevelAllowPortsOrSlots=true、multiLevelAllowRotate=false(层高按buildCollider实测 5)。- 配送器:
BuildTool_Addon对isStorage建筑即可装配,无需额外字段。 - 实机回归结论:配送器能正确装配在枢纽上并正常投递;枢纽自身往上叠会被原版判「与其他物品碰撞」(
multiLevel字段生效但不做多层吸附),用户确认保持现状即 0.2.0 预期行为,需要单层可在hot-tune.txt写stack=0后重启。 - 调试:
hot-tune.txt新增selftest、stack;hub-debug.json输出分配表/needs/分拣器/仓库格。
P6 — IcarusII 调试字段注入(0.2.0 最终构建 v0.2.0-storage,实机验证)
- 新增
Common\IcarusInject.cs:反射给 IcarusII 的EntityTool.BuildData装 Harmony postfix,命中枢纽实体时在返回体里加一个molecularHub对象(字段与hub-debug.json的枢纽条目一致:storage格明细、alloc分配表、各槽served/incServed/produced、needs广告等)。 - 全反射实现、无编译期依赖(IcarusII 的
EntityTool是 internal sealed):优先按参数名装 postfix,参数名对不上时退回__args版本;不装 IcarusII 时插件照常加载、只打一行跳过日志,IcarusII 晚加载会自动补装。 - 实机(TEST 档,IcarusII 1.0.0.0):
[icarus] BuildData postfix 已安装(IcarusII 1.0.0.0 → IcarusII.Common.Json.JsonValue),按参数名安装、未走兜底;自检反射调用BuildData触发注入[icarus] BuildData 注入:entity=564 storageId=17,[P6-TEST] 通过:返回体含 molecularHub(entity=564,长度=3766);同一用例三次运行长度 3515/3579/3766 不同,长度随仓库格与分配表内容变化;插件加载日志正常、无异常。 - 待验证:游戏内 IcarusII 对话直接查询
game_get_entity(本轮环境被 IcarusII sidecar 端口占用挡住,尚未做)。
发布整理(0.2.0 发布版)
- UI 文案精简:枢纽窗口底部说明只保留两行操作提示;删除「占用槽位 x/8 · 每槽位速度为 1x」「分拣器需求广告上限 6 种,本建筑产物不占用原料输入位置」等调试/过期说明;原料与产物面板标题简化为「原料」「产物」,去掉「外部最多 6 种 · 游戏限制」「本建筑产物,不占原料输入位」。
- 调试显示关闭:发布版枢纽窗口不再追加调试面板文本(原
debug=1时的BuildDebugPanelText追加逻辑已移除),调试/自检/探针全部保持默认关闭;hot-tune.example.txt不再列出debug/selftest/probeAnim/probeIns/probeStats(代码仍支持,供开发者排查)。 - 原料提示:缺料时显示
仓库缺料:<物品名>,齐全时显示原料已齐;不再出现「分拣器广告」相关措辞。 - 弹出提示精简:删除右键配方槽时的「只读镜像:改配方请左键」气泡;删除枢纽仓库里点筛选/禁用/整理按钮时弹出的「枢纽仓库的筛选/容量/整理由分配器接管」气泡(拦截本身保留,仅在日志里按原规则记录,
debug=1仍可放行)。 - 仓库整理:新增
.gitignore(构建产物与本地调试输出不入库)、删除编辑器残留的README.md.broken-backup;README 顶部新增中英双语简介,并配套开发文档\R2发布文案.md(Thunderstore 表单可直接粘贴的 Name/Summary/Description 中英两版)。
升级与兼容(0.1.10 → 0.2.0)
- 存档尾块 v3:读 v2 存档时把旧
busItems/busCounts一次性迁入仓库(inc=0,装不下退玩家),新档写空数组。 hot-tune.example.txt已清理:只保留有效键;旧总线键drive/rebalance/chain/productcap/chainreserve/exportintermediates/slotspeed/buscap/requestmul/requestfloor/insertfix/stackfix已删除。其中holdmul/holdfloor(默认 4/4)仍影响槽位单次取料上限,已保留在示例里;drive只剩下Plugin.cs里的日志文案;其余旧键已无作用对象,HotTune.cs里对它们的解析代码清理延后到后续版本。- 新增
stack(默认 1):可关闭多层堆叠字段、回到单层行为;启动期读一次,需重启游戏生效。
0.1.10-release — 2026-10-31
科技解锁成本下调:宇宙矩阵 10.0M → 10.0K(构建指纹 v0.1.10-release)。
- 解锁需求由游戏按
HashNeeded × ItemPoints ÷ 3600计算。0.1.9 及以前是18,000,000 × 2000 ÷ 3600 = 10,000,000(显示 10.0M 个宇宙矩阵)。 - 本版把
HubConst.HashNeeded降到18,000(ItemPoints仍为 2000):18,000 × 2000 ÷ 3600 = 10,000,科技节点显示 10.0K 个宇宙矩阵;科技的研究哈希显示同步从 18.0M 变成 18.0K(研究大幅变快)。 - 其余功能、存档格式(
MHUBTRL1尾块)、ID 规划(物品 6007 / 模型 666 / 配方 163 / 科技 1993)与 0.1.9-release 完全一致。 - 前置科技仍是 1705(引力矩阵),科技位置仍是
(72,-4);已解锁 1993 的存档不受影响。
0.1.9-release — 2026-10-28
发布定稿:关闭全部调试钩子(构建指纹 v0.1.9-release,版本号仍是 0.1.9)。
- 不再读取插件目录下的
selftest.txt,不再自动开窗;诊断采样(DiagProbe)只在 hot-tunedebug=1时运行。 CompatProbe(停用 CommonAPI 1.6.7 在 0.10.35 上必崩的ProtoSet<T>.Select后缀)属于兼容修复,发布版保留。- 行为与此前 r7 完全一致:存档 trailer(
MHUBTRL1)倒序扫描、插件目录不生成任何文件、复制粘贴全链路。 - 调试开关(可选,按需创建
<插件目录>\hot-tune.txt):debug=1打开日志;copypaste=0关闭复制粘贴补丁;insertfix=0关闭分拣器投料短路。
0.1.9-r7 — 2026-10-27
存档尾块读取兼容其它 MOD(构建指纹 v0.1.9-r7,版本号仍是 0.1.9)。别的 MOD(如品质系统 QSystem)也会往同一个 .dsv 末尾追加自己的尾块;如果它在我们的 MHUBTRL1 之后写入,我们的帧就不再位于文件最后 12 字节,旧读法会静默丢掉 8 槽配方与总线存货。现在读档改为文件尾 4MB 内倒序扫描本 MOD 魔数,并对「长度字段自洽 + JSON 可解析」双重校验,取最靠后(最新)的一个自洽帧;窗口内找不到才当作旧存档。写入逻辑不变(仍是追加 + 改写头部文件长度 + 自校验失败回滚)。独立测试 11/11(含「我们的帧 + 外来帧 + 垃圾字节」「重复追加取最新」「长度字段不自洽拒绝」等)。
顺带审计(同类越界问题):本 MOD 源码没有 entityId + 1 这类算术,所有拿游戏 id 索引 entityPool / entitySignPool / assemblerPool 的位置都有 id <= 0 || id >= pool.Length 护栏,因此不存在哨兵值溢出导致的数组越界。
0.1.9-r6 — 2026-10-27
插件目录不再生成任何额外文件(构建指纹 v0.1.9-r6,版本号仍是 0.1.9)。r5 让配置跟着存档走后,插件目录的 save\molecularhub.json 仍被双写作为降级兜底;按用户要求已彻底移除——现在只往 .dsv 末尾写附加段,插件目录不会再多出 save 文件夹或任何文件。以前生成的 save\molecularhub.json 可以直接删除,不影响任何存档数据。注意:本版起旧 DLL(r5 及以前)不再有新写入的 JSON 可用,降级前请确认。
0.1.9-r5 — 2026-10-27
枢纽配置跟着存档文件走(构建指纹 v0.1.9-r5,版本号仍是 0.1.9)。之前 8 槽配方与内部总线存货存在插件目录的 save\molecularhub.json,只把 .dsv 存档拷到别的机器/存档目录时会失效;现在改为写进存档文件本身:
- 游戏存档完成后,在
.dsv末尾追加一段隐蔽数据[json][长度]["MHUBTRL1"],并把文件头记录的总长度改成新长度——原版读档校验通过,不装本 mod 也能正常读/存。 - 读档时解析这段数据,按「星系种子 + 星球 index」把每颗星球的 8 槽配方与总线存货套回,所以拷贝存档 = 带走配置。
- 不完整/损坏的存档不会被追加;写入失败会自动回滚,存档文件不受影响。
- 存档是唯一持久化位置:配置不再在插件目录留任何文件(旧版曾写
save\molecularhub.json,自 0.1.9-r6 起已移除)。
0.1.9-r4b — 2026-10-27
补原版属性表(DescFields)。上一版描述/文案已换新,但原版建筑 tooltip 的数值行来自 ItemProto.DescFields,CommonAPI 注册的物品默认不带这张表,所以只显示描述与「制造于 / 手动制造」,看起来"没改成制造台格式"。现在补上 DescFields = [23,22,11,12]:耐久度 / 制造速度 / 工作功率 / 待机功率,顺序与原版制造台一致;「制造速度」显示 1x8(GetPropValue postfix 只改显示,且按 DescFields[index] 判定,不会误伤功率行)。构建指纹 v0.1.9-r4b,版本号仍是 0.1.9。
0.1.9-r4 — 2026-10-26
文案 / 本地化 / 发布格式轮(上一轮 5 条实机问题全部通过后的收尾)。版本号仍是 0.1.9,构建指纹 v0.1.9-r4。
- 建筑 / 物品描述改成原版制造台格式:先用一两句话讲清「这台机器解决什么问题」,具体数值(耐久、功率、速度)交给自动属性表,不再在描述里重复。
- 「制造速度」显示为
1x8:八槽并行,但生产数值仍是每槽 1×(assemblerSpeed=10000不动);通过ItemProto.GetPropValue的 postfix 只改提示显示。 - 物品描述重写为分子装配视角:「八道工序折叠进一台建筑 + 分子级内部总线直连」。
- 科技描述 / 结论改成科技风味的原理说明:分子筛拆解原料、分子轨道在八个装配腔之间搬运与键合,通道本身是分子级所以不需要传送带。
- 补齐英文并按语言回退:全部文案都有中文 / English 两套;CommonAPI 只支持 en(1033)/cn(2052)/fr(1036) 三个语言桶,其它语言原本会显示空白 —— 现在在翻译出口统一兜底:中文环境显示中文,其它任何语言显示英文。
- 打包按 r2modman / Thunderstore 格式:
manifest.json描述重写(更生动、讲清玩法),整个清单 511 字符,远低于 2556 字符的检测上限;zip 结构与 0.1.8 一致(根manifest.json/README.md/CHANGELOG.md/icon.png+BepInEx/plugins/DSP-MolecularHub/)。 - 开发文档同步更新,清理过期状态描述。
0.1.9-r3 — 2026-10-21
第二轮实机反馈修复(拆除继承 / 蓝图第 3 台 / 分拣器误标 / 空地粘贴提示 / 筛选条选择)。版本号仍是 0.1.9,构建指纹 v0.1.9-copypaste-r3。
- 修「鼠标指空地按
>也弹『已粘贴』」:根因不是粘贴补丁误判,而是原版查看焦点没清——点枢纽打开自绘窗口时我们抑制了原版制造台窗口,绕过了原版UIAssemblerWindow._OnClose里的InspectNothing(),于是inspectId一直停在上次点过的枢纽上;原版</>在光标下没有实体时会回退到 inspectId,空地按>实际粘到了那台枢纽(真的写入并弹提示)。修复:HubWindow.Close()带守卫调用InspectNothing();另外枢纽幽灵(未落地)的粘贴保持静默,不写内容也不弹提示。 - 修「拆掉设过配方的枢纽后,新枢纽继承旧配方和材料(拆 3 个继承 3 个)」:四条根因叠加——①原版拆除只回收
entityPool[id].assemblerId指向的那 1 个组件,枢纽有 9 个;②r2 之前拆除补丁签名写错(int __1= bool),清理逻辑从未执行;③实体 id 会被 LIFO 回收复用,新枢纽Init的ReuseExistingSlots把旧组件(带 recipe/served/produced)无条件收编;④JSON 存档按 entityId 合并且从不剔除已拆记录。修复:拆除补丁签名改int __0;OnRemoved退物品后删 8 槽 + 接口组件并清assemblerId;新建筑落地前CleanupStaleForNewEntity清掉同 id 的残留组件(先退款再删);ForgetSavedEntity在拆除/新建时同步删 JSON 旧记录;读档初始化前CleanupDanglingComponents清挂错实体的组件。 - 修「蓝图 / Shift 复制到第 3 台起分拣器不抓料、且继承上一台部分产物」:与上一条同源(id 复用 + 旧组件被收编)。落地前清理切断收编后,新枢纽只用自己的新组件。已建坏的枢纽不会再自我扩散;修复后重新放的建筑是干净的。
- 修「分拣器出现枢纽配方图标、点它打开独立枢纽界面」:实体 id 被回收后,注册表里的旧
HubComponent仍在每 tick 驱动那台分拣器(DriveHubs/BindEntityNeedsAll/标志压制都没有「实体是否还是枢纽」校验,RefreshHubSign直接写signs[entityId])。修复:新增HubComponent.IsAlive()(实体在、proto 仍是枢纽)+HubRegistry.DropQuiet()软摘除;DriveHubs(倒序遍历)、BindEntityNeedsAll、ForceHubSignStableCore、RefreshHubSign全部加实体校验。 - 修「分拣器产物筛选条可以出现但不能选择(左右移动后立刻弹回第一个空白项)」:原版
SetOutputEntity在目标实体没变时早退、刻意不动selectedIndex;我们的 postfix 每次都会执行,并用tryFindFilter(每帧被buildPreview.filterId重置成 0)重算选中项 → 选择被打回 0。修复:postfix 保留实例上已有的selectedFilter/selectedIndex,列表未变化时直接返回,不再覆盖玩家的选择。 - 出问题时
hot-tune.txt写copypaste=0并重启,可整组关闭复制/粘贴补丁(分拣器筛选 UI 无开关、始终可用)。
0.1.9-r2 — 2026-10-21
实机反馈修复轮(复制/粘贴 + 套用语义 + 分拣器投料)。版本号仍是 0.1.9,构建指纹 v0.1.9-copypaste-r2。
- 修复「复制非枢纽建筑也提示已复制枢纽配方 / 粘到枢纽时误套上一次的配方」:原版
BuildingParameters.SetEmpty()并不会清content,上一次复制留下的载荷会一直残留。现在在SetEmpty的 postfix 统一清洗本 MOD 载荷(P7), 复制出口(P1)复制到非枢纽时也主动清陈旧载荷;提示文案改为按"最近一次复制/粘贴是否真的命中枢纽"决定。 - 修复「粘贴不按类型」:目标是普通建筑(或枢纽幽灵)而剪贴板里是枢纽载荷时,直接不执行粘贴(静默、不弹提示), 不再退化成原版"改它那一条配方";只有剪贴板里没有枢纽载荷时,普通建筑才走原版逻辑。
- 修复「从背包/快捷栏拿出的枢纽自带配方」:关闭建造工具(P6)以及任何
SetEmpty都会清掉建造模板里的载荷。 - 修复「槽里有物品时换/清配方、拆建筑不返还物品」:
SetSlotRecipe换配方前先TakeBackItems_Assembler退还该槽全部缓存(产物/半成品/原料);拆除枢纽时 8 槽 + 接口逐槽退还,全部走原版左下角物品提示(UIItemup.Up)。 - 界面取料反馈改为原版样式:左键原料行/产物行取料不再弹一行小字,改为原版左下角物品浮动提示;清空槽位也不再弹文字。
- 修复「蓝图复制多台枢纽后只有前两台能被分拣器投料」:根因是 9 个装配组件共用同一个
entityPool[hub].assemblerId, 接口位解析会误把槽位当接口、接口位 id 不是最大时entityNeeds每帧被原版抢走、原版装配体窗口的抑制逻辑用全局静态 保存/恢复assemblerId会把它写成 0。修复:InterfaceSlotId()排除 8 槽并回填assemblerId;EnsureSlot分配失败即报错且无条件回填接口位;Init改为「先复用读档槽位 → 分配 8 槽 → 最后建接口位」(接口 id 必为最大);InsertFix门禁改用自愈解析,assemblerId<=0时不再放行原版(原版必然吞料);装配体窗口抑制改为按 entityId 的字典; 孤儿组件清理不再误删"挂在枢纽实体上的组件"。已建坏的枢纽会在下次载入 / 下次分拣器 tick 的自愈路径里被修正, 不必拆掉重造。 - 新增:分拣器建造预览的「快速筛选」UI:给枢纽放分拣器、分拣器指向枢纽后,会出现原版多产物配方那样的产物图标条, 可直接点选要输出哪一条槽位产物(纯 UI,不影响存档与生产;与原版多产物配方共用同一控件,6 个图标上限)。
- 出问题时
hot-tune.txt写copypaste=0并重启,可整组关闭复制/粘贴补丁(分拣器筛选 UI 无开关、始终可用)。
0.1.9 — 2026-10-19
配方复制 / 粘贴(A 方案:走原版 BuildingParameters.content 载荷通道)。
- 三条链路一次打通,全部不依赖 CommonAPI 的
ICopyPasteSettings(那套在 0.10.35 已失效):Shift复制建筑 → 幽灵 → 落地:BuildingParameters.CopyFromFactoryObjectpostfix 写载荷 →ApplyPrebuildParametersToEntityprefix 暂存 →AddEntityDataWithComponentspostfix 套用。</>(原版复制/粘贴建筑设置):PasteToFactoryObjectprefix 直接套用到已有枢纽。- 蓝图:载荷随
BlueprintBuilding.content存档/读档,旧蓝图(无载荷)行为不变。
- 载荷格式
MHUB1:r0,r1,...,r7(纯 ASCII,刻意避开 marker 分隔符\n);解码失败 (null / 无 magic / 字段数不对 / 数字越界)一律放行原版,普通制造台/仓储/分拣器的复制粘贴行为完全不变。 - 防丢物品:套用前逐槽
TakeBackItems_Assembler把槽内缓存物品退还玩家背包,再SetSlotRecipe(SetSlotRecipe会清 served/produced/incServed,不退就等于吞物品)。 - 解锁校验:未解锁的配方跳过该槽(粘贴不能绕过科技进度)。
- 精确覆盖:目标槽位多余的配方清 0(新增
HubComponent.ApplyRecipesExact;读档用的ImportRecipes语义不变)。 - 空枢纽不写载荷:避免“复制一个空枢纽 → 粘贴”把目标 8 槽全清空。
- 提示文案:复制/粘贴成功时显示「已复制 / 已粘贴分子装配枢纽的 8 条槽位配方」(en/zh/fr 已注册)。
- 清理:删除
HubComponent里 CommonAPIICopyPasteSettings的 4 个空壳方法(该接口在本版本不会被调用,留着误导)。 - hot-tune 新键
copypaste(默认 1):0= 本次会话不安装复制/粘贴补丁。启动期读一次,改了要重启游戏。 - 补丁隔离:
HubCopyPaste不使用[HarmonyPatch]特性(避免被Plugin.Awake的 assembly 级PatchAll扫到), 改为AccessTools.Method+ 逐点harmony.Patch,每个 patch 独立 try/catch —— 任一目标方法签名漂移只让 那一条链路降级为原版行为,不会导致整个 MOD 加载失败。 - 不新增常态日志行:安装结果/细节全部走
debug=1。
0.1.8 — 2026-10-18
对外发布版:默认静默日志(修刷屏)。
- 人类反馈发布版持续输出日志(OrbitalRing profile 一次会话 657 行,其中
[sign]434 行)。 - 新增统一日志闸门
HubLog(LogGate.cs):全部Plugin.Log.LogX(...)经它过滤。- 默认(hot-tune
debug=0):只输出 加载 2 行 + hot-tune 1 行 + 真正的 Warning/Error(合计硬上限 ≤5 行/会话); debug=1:恢复全部调试/探针/UI 交互日志([sign]额外 cap 20)。
- 默认(hot-tune
- 已门控:
[sign]、生产/缓冲/守恒/接口位探针、TransferToSlots入口、生产循环、[needs]/[R1]、[probe-*]、[visual]、[insertfix]、[F1]/[cleanup]、配方等级对齐/各制造台类型、超限提示、UI 交互(SetSlotRecipe/ 打开配方选择器/回读/打开窗口/挂事件)、收料/收产物成功日志。 [loss]守恒异常保留 Warning(计入 2 条预算),明细仅debug=1。
0.1.7 — 2026-10-18
产物消失修复 + 科技位置微调。
- 修复产物定期凭空减少:
HubComponent.RebuildInterfaceRecipe每次接口映射变化都重建produced = new int[...](清零),但快照slotLastProduced[]未清零;下一 tick 的 “分拣器取走量 = slotLastProduced - produced”把清零误判为取走,ConsumeFromStock随即从 真实库存(槽位 produced + 内部总线)扣掉对应数量 → 产物定时消失(与是否有出库分拣器无关)。 修复:形状/产物顺序不变时复用原数组;换数组时同步清零slotLastProduced;ConsumeFromStock先按真实可用量夹紧,异常时打[loss] ConsumeFromStock …;输出快照处对不上也打[loss]。 - 科技位置按人类要求改为 (72,-4)(前置引力矩阵 1705(68,0),|ΔY|=4 < 10 仍满足
UITechNode.UpdateConnDynamic画线条件;该格已核实空闲)。 - 其余与 0.1.6 一致(insertfix、科技 1993、GridIndex=2114、BuildIndex=810、tooltip 名称等)。
0.1.6 — 2026-10-18
日志/诊断打磨(功能不变)。
- insertfix 开启时,输入种类超过 6 的告警从 Warning 改为 Info,并注明“已由 insertfix 接管,分拣器仍可直接送入内部总线”, 不再误导为“送不进来”。
- 修正调试探针
needsLinkedToEntityNeeds误报:insertfix 会把entityNeeds[枢纽实体]指向 8 槽去重清单 (sorterNeeds),探针同时接受该引用,不再刷[R1] 接口位 needs/requires 断言失败错误。 - 其余行为与 0.1.5 完全一致(insertfix=1、1× 速度、科技 (72,0)+前置 1705、GridIndex=2114、BuildIndex=810)。
0.1.5 — 2026-10-18
分拣器投料修复(重点)。
- 根因(反编译实锤):原版
FactorySystem.GameTick的装配体循环按 assemblerPool 顺序写entityNeeds[entityId] = 组件.needs(Assembly-CSharp.full.cs:99082/99105)。枢纽实体有 1 个接口位 + 8 个槽位组件共用 entityId,最后处理的是槽位组件(needs 通常全 0); 分拣器 careNeeds 读entityNeeds[insertTarget](InserterComponent.InternalUpdate:54252)→ 指向枢纽的分拣器永远不抓料。原版InsertInto对装配体还硬编码只匹配requires[0..5](:217108-217177), 星环(POR) 亦 patch 了InserterComponent.InternalUpdate_*。 - 修复:Harmony Prefix(
Priority.First)FactorySystem.GameTickInserters:插入器并行派发前把所有枢纽entityNeeds[实体]重绑到 「8 槽全部 requires 去重清单」(前 6 个保持原申报顺序);PlanetFactory.InsertInto:目标是枢纽接口实体且物品属于该清单时,直接写内部总线并return false短路原版/POR;busCap满返回 0;remainInc/__result语义保持原版。
- 线程安全:总线读写加
busLock(并行插入器线程 vs 主线程 TransferToSlots)。 - hot-tune 新增
insertfix=0/1(默认 1;兼容旧键stackfix),0 = 完全回退 A/B。 - 同时包含 0.1.4 的显示修复(科技 (72,0)+前置 1705、配方 tooltip 名称)。
0.1.4 — 2026-10-18
两处显示修复。
- 科技树:位置改为
(72,0),可见前置改为 引力矩阵 1705。根因是UITechNode.UpdateConnDynamic只在「前置节点与本节点 Y 差 <10」时绘制依赖连线(Assembly-CSharp.full.cs:460692), 原 (80,4) 与 1508(80,0) 跨行只剩斜箭头;1705(68,0) 正右相邻可画完整引导线。 另外 1508 在星环 profile 里被改名为「T任务完成」,不再适合作为常规前置。成本仍为 2000 宇宙矩阵。 - 配方名:CommonAPI
RegisterRecipe短重载会自动拼产物名+"Recipe"作为 key, tooltip 显示成molecularHubNameRecipe;改为显式传 namemolecularHubName,并补注册兜底 key。
0.1.3 — 2026-10-17
科技节点可见性 + 高阶配方等级修复(兼容星环 OrbitalRing)。
- 科技 ID
4801 → 1993:根因是TechProto.page在ID>=2000时返回 1(升级科技页),UITechTree按 page 把节点分别实例化到graphGroup0/graphGroup1;原 4801 的节点在升级页, 主科技页只显示 1508→(80,4) 的依赖箭头。改回 <2000 后节点回到主科技页 (80,4)(1508 正上方)。 - 配方等级对齐黑台(制造台 Mk.IV):星环用
prefabDesc.assemblerRecipeType给不同机器分级 (Mk.IV 模型 456 → 12 物质重组),并把高阶配方重新归到这些类型;枢纽克隆 Mk.IV 的 PrefabDesc 早于星环覆写, 类型停在 4(Assemble)→ 只看到最低阶配方。现在在ProtoRegistry.onLoadingFinished与读档后 回读 Mk.IV 运行期类型并写入枢纽模型/物品 PrefabDesc;枢纽自己的配方选择器改为不按类型过滤(显示全部已解锁配方)。 生产速度不变:仍为 1×(slotSpeed=10000、drive=vanilla)。 - ⚠️ 科技 ID 变更:旧存档里该科技需要重新研究(物品/建筑/配方不受影响)。
0.1.2 — 2026-10-17
显示位置调整(按玩家反馈)。
- 科技树:科技位置改为
TechPosition = (80, 4)(原 (73,1))。 - 物品/配方选择器:网格位置改为
GridIndex = 2114(14×8 网格的 tab2 第一行第 14 列,右上角;原 2608)。 依据:UIItemPicker/UIRecipePicker的网格为 14 列×8 行(Assembly-CSharp.full.cs:427358/435390), GridIndex 解码为tab=idx/1000, row=(idx%1000)/100-1, col=idx%100-1。 - 建造菜单:
BuildIndex = 810(category 8 / child 10,即第 8 页第 10 个位置;原 404)。 依据:UIBuildMenu.StaticLoad用protos[BuildIndex/100, BuildIndex%100](数组ItemProto[16,13])。
0.1.1 — 2026-10-17
兼容性修复:科技 ID 从 1999 迁到 4801。
- 背景:同时安装「深空来敌 / DSP_Battle」时,对方也注册了科技 1999(玻色子操控),
CommonAPI 在 LDBTool PreAdd 阶段对重复科技 ID 抛
ArgumentException,游戏启动即崩溃。 - 本版把解锁科技改为 4801(避开原版 ≤1992、更多巨构 1918、深空来敌 1997-1999/6601-6608、星环 2108/3151-3153/5406-5407)。
- 物品 6007 / 模型 666 / 配方 163 不变,老存档的建筑/物品/配方不受影响。
- ⚠️ 已解锁 1999 号科技的旧存档需要重新研究 4801 号科技(科技解锁状态按科技 ID 保存,不会自动迁移)。
0.1.0 — 2026-10-17
首个公开发布版本。
新增
- 「分子装配枢纽」建筑:8 个独立配方槽(制造/化工/精炼/冶炼),槽间内部总线直连,产物自动喂给下游槽。
- 自制界面:8 槽网格(左键选配方、右键打开原版制造台、右上角 X 清空、可拖动);原料行/产物行各 8 格; 左键原料/产物收入背包(背包满自动退回总线);每槽 /min 产量。
- 缓存/速度热调:
hot-tune.txt在线生效(BepInEx 插件目录),含holdMul/holdFloor/productCap/requestMul/requestFloor/slotSpeed/drive等键。 - 旧存档自动清理:读档时清理历史遗留的“孤儿装配组件”(实体不认领的组件),修复标志闪烁与统计显示。
修复
- 指向枢纽的分拣器标志每帧 4↔6 闪烁(根因:8 个 entityId 指向分拣器的孤儿装配组件被原版 GameTick 循环写 sign)。
- 生产统计“设施”分组出现分拣器图标(同一批孤儿的
entityId被统计当成分组原型)。 - 9 个同实体装配组件的 anim/sign/needs 互相覆盖:渲染前归一,动画不再 8~9 倍速、枢纽标志稳定。
- 换配方后旧料残留导致“重设配方不生效”:清缓冲 + 外部(原版窗口)改配方也会兜底清理。
- 缓存无限增长:修正 needs 申报的 keep-mapped 自持逻辑,单物品原料总缓存回落到 ≈50。
其他
- 明确 1× 语义:
drive=vanilla单写入者,速度等价原版制造台(slotSpeed=10000)。 - 明确并 UI 提示原版“最多 6 种外部输入”的硬限制。