|
|
已经找到原因,复现方法按Q,模块就掉血,目前三艘无畏舰都这样,AI分析如下
我没有改动任何文件(提权被你拒绝了),下面是完整的检查和修复方案。
## 结论:这是 mod 里遗留的调试代码,按 Q 键就会给模块自己造成 1000 点伤害
`CjyToyBox\src\data\hullmods\CTBMotherModuleHullMod.java` 第 131–138 行:
```java
if (Keyboard.isKeyDown(Keyboard.KEY_Q)) {
if (!p) {
p = true;
Global.getCombatEngine().applyDamage(
child, child.getLocation(), 1000, DamageType.HIGH_EXPLOSIVE, 0, true, false, null);
}
} else {
p = false;
}
```
- `child` 就是「余烬-利刃」这个模块本体,伤害施加在它**自己的坐标**上,1000 点高爆,带护甲减伤。
- `p` 是防连发的边沿检测,所以**每按一次 Q 就固定扣一次**。
- `Keyboard.isKeyDown` 读的是**全局键盘**,跟你在操作哪艘船无关;模块停靠或放飞都会触发。
- 这段代码在模块船插 `CTBMotherModuleHullMod` 的监听器里,每帧执行,而该船插是 `ctb_mother_module.ship` 的 builtInMod,**每个利刃模块都带**。
所以你看到的“没接触敌人却莫名受损”,实际上是因为你在按 Q。Q 默认是排辐能键,战斗中会频繁按下。
## 已确认这段代码在发行版 jar 里
`src` 目录的时间戳是 9/18,jar 是 10/29,二者不同步,所以我直接查了字节码,而不是只信源码:
| 检查项 | 结果 |
|---|---|
| `jars\CjyToyBox.jar` → `data/hullmods/CTBMotherModuleHullMod$listener.class` | 存在 |
| 常量池含 `applyDamage` / `isKeyDown` | ✅ 都有 |
| float 常量 `1000.0f`(字节 `44 7A 00 00`) | 出现 **1 次**,偏移 **2522** |
| `bipush 16`(KEY_Q = 16) | 出现 1 次 |
即当前运行的 jar **确实带着这段调试伤害**。另外 `CjyToyBox_HSI 1.7.0.jar` 没被 `mod_info.json` 的 jars 列表加载,不用管它。
## 修复方案 A:改键位(零风险,立刻生效)
游戏内 **选项 → 控制**,把「排辐能 / Vent Flux」从 **Q** 改到别的键。调试代码只认 Q,所以改完就再也不会触发。
代价只是需要改一下肌肉记忆。想先验证判断是否成立,也可以:战斗中对着利刃模块按一下 Q,看它是不是掉一截血。
## 修复方案 B:把伤害改成 0(保留 Q 键)
需要**管理员 PowerShell**,先关游戏:
```powershell
$jar = "C:\Program Files (x86)\Starsector\mods\CjyToyBox\jars\CjyToyBox.jar"
Copy-Item -LiteralPath $jar -Destination "$jar.bak" -Force
Add-Type -AssemblyName System.IO.Compression.FileSystem
$zip = [System.IO.Compression.ZipFile]::Open($jar,'Update')
$name = 'data/hullmods/CTBMotherModuleHullMod$listener.class'
$e = $zip.GetEntry($name)
$ms = New-Object System.IO.MemoryStream
$s = $e.Open(); $s.CopyTo($ms); $s.Close()
$b = $ms.ToArray()
$b[2522]=0; $b[2523]=0; $b[2524]=0; $b[2525]=0 # 1000.0f -> 0.0f
$e.Delete()
$ne = $zip.CreateEntry($name)
$ns = $ne.Open(); $ns.Write($b,0,$b.Length); $ns.Close()
$zip.Dispose()
```
校验(应显示 `after : 00 00 00 00`):
```powershell
$zip2 = [System.IO.Compression.ZipFile]::OpenRead($jar)
$e2 = $zip2.GetEntry($name)
$ms2 = New-Object System.IO.MemoryStream; $s2=$e2.Open(); $s2.CopyTo($ms2); $s2.Close()
$b2 = $ms2.ToArray()
"after : {0:X2} {1:X2} {2:X2} {3:X2}" -f $b2[2522],$b2[2523],$b2[2524],$b2[2525]
$zip2.Dispose()
```
原理:类里 `1000.0f` 这个 float 常量只出现一次,就是那次伤害调用。把它改成 `0.0f`,`applyDamage` 仍然会被调用,但伤害为 0,不改变任何其他逻辑(停靠、放飞、修复、辐能转移全部不受影响)。
## 注意事项
1. **更新 mod 会覆盖补丁**,重新装 `CjyToyBox` 后要复查一次。
2. 作者源码里这段也还在(`src` 第 131 行),意味着下个版本很可能继续带着——建议反馈给 cjy4312,说明「`CTBMotherModuleHullMod` 里 KEY_Q 的 1000 点自伤调试代码被打包进了 release」。
3. 如果你确认自己**从不按 Q**,那这次的损伤另有来源(比如放飞/回收时落点与母舰碰撞),可以再给我一次复现描述,我按那个方向查。
要不要我改成方案 A 的思路,帮你把控制配置里的排辐能键改掉?那个是纯配置文件,不需要提权。 |
|