|
机理(都用 javap -c 在 starfarer_obf.jar 上实证): - StandardTooltipV2$12 是船插 tooltip,它恒构造 new String[10](逐个调 getDescriptionParam(0..9, …)),再把 desc 和这个数组交给 addPara;
- addPara 的分支是「参数数组非空 → String.format(text, params)」,数组恒 10 个元素 → 船插描述恒被 String.format;
- 所以 hull_mods.csv 的 desc 里裸写百分号会当场抛异常,鼠标一悬停就崩整局。日志报的字符就是「第一个非法 % 紧跟的那个字符」。
元凶:caldari_chimera_refit「加达里海军奇美拉级改装套件」,desc 结尾是 受到的护盾伤害 -4%。 → Conversion = '。'。同一批还有 7 个是雷(;×4、(×2,另 1 个也是 ;),只是你这次先悬停到奇美拉那个。第 12 轮那 8 个改装套件/增强器全部中招,只有凤凰级的感应增强器安全(它的 % 是合法占位符 {%s})。 定位没有靠猜:我写了两个工具让真 JDK 判(grep '%。' 会误判 —— %500%、%-30% 在 Java 里都是合法格式串): 全库船插描述「格式串」危险清单(真 JDK 探针,2026-10-10)生成:work\collect_format_strings.py + work\FormatProbe.java,扫描 starsector-core\data + 143 个已装 MOD 的 全部 hull_mods.csv / descriptions.csv / wing_data.csv(371 个 CSV / 2634 条含 % 的候选串)。 判据:按 10 个参数跑真 String.format(与 StandardTooltipV2$12 给船插 desc 的调用完全一致)。 抛异常 = 鼠标一悬停在那个船插上就崩游戏。 hullmod id字段抛出的字符所属 MOD状态
A_S-F_integratedRangefindersdesc效Amazigh锻船厂第三方,仍会崩
aEP_FighterArmordesc}FSF_MilitaryCorporation第三方,仍会崩
FSD_RLIntranetdesc%s(参数下标超 10 个)FarsightDrive第三方,仍会崩
indEvo_ghost_ship_plaguedesc,IndEvo第三方,仍会崩
kyeltziv_rangefinders_suojusdesc,Kyeltziv Technocracy_1.10.7_zh第三方,仍会崩
MSS_Militarizeddesc的Mayasuran Navy第三方,仍会崩
A_S-F_integratedRangefindersshort效Amazigh锻船厂第三方,short 路径未证实
vice_supercruise_enginesshort空格Emergent Threats第三方,short 路径未证实
ix_improved_supercruiseshort空格Emergent Threats-IX Revival第三方,short 路径未证实
MSS_LastStandshort空格Mayasuran Navy第三方,short 路径未证实
sce_lg_fightershort%Strike Craft Expansion第三方,short 路径未证实
XHAN_CronososTechshort标志位与转换符不匹配XhanEmpire第三方,short 路径未证实
mimikko_kasutariri_radiant_mainship_hullmodshort,mimikko098v0.762第三方,short 路径未证实
zg_zsjtzz / zg_nmxfxt / zg_sjxbctshort时知识管理者第三方,short 路径未证实
说明: - desc 字段是已证实的崩溃路径:StandardTooltipV2$12(船插 tooltip,javap -c 实证)恒把 desc 与 10 个 getDescriptionParam(...) 值交给 addPara(),而 addPara() 只要参数数组非空 就跑 String.format(),数组恒为 10 个元素 → 恒格式化。上表 desc 行 = 悬停必崩。
- short 字段的格式化路径没有证据(Emergent Threats 这类常用 MOD 的 short 有裸 % 也一直没人报崩), 所以那 8 条只当作"待观察",不要照本表去改别人的 MOD。
|