|
|
读取已有存档,到“载入阶段 33”时抛出异常,载入中断并返回主菜单。错误发生在核心势力数据校验阶段,尚未进入正常的大地图运行。
日志关键内容:
java.lang.RuntimeException:
Fighter wing with id [star_dock_vk_wasp_2_wing]
not found for faction [sotf_dustkeepers_burnouts]
at com.fs.starfarer.api.impl.campaign.CoreLifecyclePluginImpl.verifyFactionData(CoreLifecyclePluginImpl.java:566)
at com.fs.starfarer.api.impl.campaign.CoreLifecyclePluginImpl.verifyFactionData(CoreLifecyclePluginImpl.java:544)
at com.fs.starfarer.api.impl.campaign.CoreLifecyclePluginImpl.onGameLoad(CoreLifecyclePluginImpl.java:521)
已经检查到的情况
- 星坞版本为 0.26.1,Mod ID 为 star_dock_hullmods。
- 两份检查过的存档中,都存在 star_dock_vk_wasp_2_wing。
- 每份存档中,该 ID 均出现两次,全部位于势力的 knownFighters 列表:<st>star_dock_vk_wasp_2_wing</st>
- 未发现该具体 ID 在舰船配置等其他位置被引用。
- 目前无法确定最初是哪次操作生成了这个动态联队,也无法确定是哪个脚本将其加入势力名单。报错涉及 SOTF 势力,并不能直接证明是 SOTF 写入的。
相关代码检查与怀疑原因
根据本地字节码检查:
1. VirtualWingSpecs 会按需生成并注册 star_dock_vk_<source>_<count>_wing 形式的动态联队。
2. USERS 和回收逻辑主要跟踪舰船 ShipVariantAPI 引用;reclaim 注销动态联队时,没有同步处理势力战机名单。
3. reviveFromVariants 从舰船配置恢复动态联队,无法覆盖“只有势力名单还保留引用”的情况。
4. 现有 PlayerOnlyGuard.scrubFaction 处理了舰船插件名单,但没有覆盖 knownFighters / priorityFighters。
因此,怀疑过程是:
动态联队被生成 → 其 ID 被某条路径加入势力名单 → 名单写入存档 → 动态定义被回收或重启后未恢复 → 核心读档校验发现悬空引用并报错。
目前只能确认“存档有引用、读档时无定义”,尚不能区分具体是回收导致,还是重启后缺少恢复。
建议排查方向
- 在已有 beforeGameSave() 中,处理势力 knownFighters 和 priorityFighters 中不应持久保存的星坞动态联队引用。
- 在 reclaim 注销定义前,同步处理势力对该动态 ID 的引用。
- 清理范围限定为星坞自身合法的动态 ID,并保留真实舰船仍在使用的临时联队功能。
- 检查动态规格继承的势力发现/蓝图池标签,确认是否会导致临时联队被再次收录。
- 已经损坏的存档可能需要单独迁移或定点清理;普通 onGameLoad 或首帧清扫可能晚于此次核心校验失败的位置。 |
|