本帖最后由 Scrooge 于 2026-4-20 10:30 编辑
报错:
- 40018628 [Thread-2] INFO com.fs.starfarer.api.impl.campaign.fleets.EconomyFleetRouteManager - Added trade fleet route from Athulf 到 Nortia
- 40029598 [Thread-2] INFO pigeonpun.bionicalteration.inventory.ba_inventoryhandler - Finish compress
- 40142180 [Thread-2] INFO pigeonpun.bionicalteration.inventory.ba_inventoryhandler - Finish compress
- 40721508 [Thread-2] INFO pigeonpun.bionicalteration.inventory.ba_inventoryhandler - Finish compress
- 41087743 [Thread-2] INFO pigeonpun.bionicalteration.inventory.ba_inventoryhandler - Finish compress
- 41100648 [Thread-2] INFO pigeonpun.bionicalteration.inventory.ba_inventoryhandler - Finish compress
- 41215201 [Thread-2] INFO pigeonpun.bionicalteration.inventory.ba_inventoryhandler - Finish compress
- 41314003 [Thread-2] ERROR starship_legends.ModPlugin - Format specifier '%s'
- java.base/java.util.Formatter.format(Unknown Source)
- java.base/java.util.Formatter.format(Unknown Source)
- java.base/java.lang.String.format(Unknown Source)
- com.fs.starfarer.ui.newui.String.addPara(Unknown Source)
- com.fs.starfarer.ui.newui.String.addPara(Unknown Source)
- starship_legends.events.OwnCrewBarEvent.optionSelected(OwnCrewBarEvent.java:957)
- starship_legends.events.OwnCrewBarEvent.init(OwnCrewBarEvent.java:758)
- com.fs.starfarer.api.impl.campaign.intel.bar.BarEventDialogPlugin.init(BarEventDialogPlugin.java:31)
- com.fs.starfarer.api.impl.campaign.rulecmd.missions.BarCMD.optionSelected(BarCMD.java:355)
- com.fs.starfarer.ui.newui.o0Oo$1.o00000(Unknown Source)
- com.fs.starfarer.ui.newui.OoOO.actionPerformed(Unknown Source)
- com.fs.starfarer.ui.n.buttonPressed(Unknown Source)
- com.fs.starfarer.ui.int.new(Unknown Source)
- com.fs.starfarer.ui.int.processInput(Unknown Source)
- com.fs.starfarer.ui.W.o00000(Unknown Source)
- com.fs.starfarer.BaseGameState.traverse(Unknown Source)
- com.fs.state.AppDriver.begin(Unknown Source)
- com.fs.starfarer.combat.CombatMain.main(Unknown Source)
- com.fs.starfarer.StarfarerLauncher.o00000(Unknown Source)
- com.fs.starfarer.StarfarerLauncher$1.run(Unknown Source)
- java.base/java.lang.Thread.run(Unknown Source)
复制代码
反编译class检查,问题代码:
- public void init(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
- try {
- super.init(dialog, memoryMap);
- this.done = false;
- if (this.ship == null || this.ship.getVariant() != null && this.subEvent == starship_legends.events.OwnCrewBarEvent.OptionId.REMOVE_DMOD && DModManager.getNumDMods(this.ship.getVariant()) == 0) {
- this.subEvent = starship_legends.events.OwnCrewBarEvent.OptionId.INVALID;
- }
- if (this.subEvent != starship_legends.events.OwnCrewBarEvent.OptionId.INVALID) {
- dialog.getVisualPanel().showFleetMemberInfo(this.ship);
- this.chooseStrings();
- TextPanelAPI var10000 = dialog.getTextPanel();
- String var10001 = this.ship.getShipName();
- var10000.addPara("你去到 " + var10001 + " " + this.officerTypeStr + "中凑热闹. 一些级别较低的军官似乎对他们的老板在休憩时光中加入感到不安 但在你买了一轮酒并声称可以暂时忽视舰上的规矩 后放松了下来.");
- }
- this.optionSelected((String)null, this.subEvent);
- } catch (Exception e) {
- ModPlugin.reportCrash(e);
- }
- }
复制代码
AI分析结论:
这段代码就是导致你上次崩溃的**核心位置**(OwnCrewBarEvent.init 方法)。
### 问题出在哪里(精确分析)
错误发生在这一行附近:
```java
TextPanelAPI var10000 = dialog.getTextPanel();
String var10001 = this.ship.getShipName();
var10000.addPara("你去到 " + var10001 + " " + this.officerTypeStr + "中凑热闹. 一些级别较低的军官似乎对他们的老板在休憩时光中加入感到不安 但在你买了一轮酒并声称可以暂时忽视舰上的规矩 后放松了下来.");
```
然后紧接着调用 `this.optionSelected(...)`,里面又会继续 `addPara`(崩溃栈显示在第 957 行)。
**根本原因**:
这个中文字符串是**硬编码**在 mod 里的(或来自不完整的中文汉化)。
Starship Legends 在构造对话文本时,使用了类似 `String.format("... %s ...", 参数)` 的方式,但汉化后的字符串里**缺少对应的格式占位符**(比如 `%s` 被直接替换成了固定文字,却没有调整后面的参数数量),或者 `officerTypeStr`、`shipName` 等变量在某些情况下为 `null`,导致格式化失败,抛出 **Format specifier '%s'** 异常。
你提供的这段是 **decompiled**(反编译)后的代码,里面已经混入了中文翻译,但翻译质量/完整性有问题(尤其是 `officerTypeStr` 这个变量很可能在某些船员类型下没有被正确赋值)。
### 推荐修复方案(从易到难)
1. **最推荐:更新 Starship Legends + 汉化补丁**
这个 bug 在中文环境下很常见,通常是老版本汉化没跟上 mod 更新导致的。
- 去 **fossic.org** 的星舰传奇专帖,下载**最新版 Starship Legends + 最新汉化**(优先找 2025 或 2026 年更新的版本)。
- 完全覆盖安装(先备份旧 mod 文件夹)。
- 重启游戏后,再去酒吧测试。
2. **临时切换语言规避**
在游戏启动器里把界面语言改成 **English**,然后加载存档去酒吧。
如果英文下不崩,基本确认是汉化冲突。等汉化更新后再切回中文。
3. **手动简单修复(如果你愿意编辑文件)**
- 找到路径:`mods/Starship Legends/data/strings/` 或 `data/config/starship_legends/`(也可能在 jar 里)。
- 搜索包含“你去到”或“凑热闹”的文件(通常是 .json 或 .csv 汉化文件)。
- 把那段长中文字符串**临时改短**,比如改成:
`"你去到 " + this.ship.getShipName() + " 的船员中凑热闹。"`
(去掉后面复杂的部分,避免潜在的格式问题)
- 保存后重启测试。
(注意:如果字符串在 jar 里,需要解压 jar 修改后再打包回去,比较麻烦。)
4. **彻底方案**
- 暂时**禁用 Starship Legends**,确认是否只剩这个 mod 出问题。
- 如果你装了很多修改酒吧事件的 mod(比如 Nexerelin、某些任务 mod),可以尝试逐个禁用测试冲突。
### 额外建议
- 这个事件是“和自己舰船的船员一起喝酒”相关的 bar event。崩溃时你很可能点进了这个选项。
- 以后遇到类似酒吧/对话崩溃,先把语言切英文,能大大降低概率。
- 确认你的 **Starsector 版本** 和 **Starship Legends 具体版本**(mod_info.json 里能看到),新版通常对中文支持更好。
你现在可以先试 **更新 mod + 切换英文** 这两步,看看是否还崩。
如果更新后还是有问题,把新的崩溃 log(或你修改后的代码)再贴给我,我继续帮你看具体哪一行需要调整。
这个 mod 的中文适配一直有点小毛病,但更新通常就能解决。坚持一下,很快就能修好!
|