|
|
发表于 2026-10-16 14:50:26
|
显示全部楼层
我也遇到这个问题了,AI跑了一下就定位了
红条骑士团 · 银雷主炮炮口特效异常 —— 定位与补丁
项目 内容
MOD 红条骑士团(Red_stripe)0.8
游戏 Starsector 0.98a
复现舰船 银雷 rs_Tr_6_Inle(控制台 addship rs_Tr_6_Inle_Standerd 1)
涉及文件 src/data/scripts/weapons/InleMainGunBeanEffect.java 第 165–172 行
性质 纯视觉问题(不影响伤害与存档),但炮口会被一团屏幕级的紫色光环覆盖
1. 现象
银雷主炮开火(充能 + 照射)时,炮口出现一团巨大的淡紫色空心光环(贴图就是 graphics/fx/RS_flare1.png),并且持续向中心收缩,尺寸可达大半个屏幕;整个开火过程一直存在、不断刷新。除此之外,炮口本该有的三层小光晕(A 贴炮口、B/C 随充能前移)实际完全看不到。
2. 根因
RS_BoxBasedUtil 的这个重载,第 3 个参数是初始尺寸、第 2 个参数才是位置:
java
addOnceSprite(SpriteAPI sprite, Vector2f loc, Vector2f sizeStart, Vector2f sizeEnd,
float angle, Color color, boolean additive, float in, float full, float out)
而 advance() 中三层炮口光晕的调用把位置传进了 sizeStart 槽位:
java
// 现状(BUG)
data.scripts.utils.RS_BoxBasedUtil.addOnceSprite(flareSprite(), beam.getFrom(), offset,
(Vector2f)(new Vector2f(FLARE_A)).scale(...), Facing, new Color(225,110,250, 125), true, ...);
// ^loc = 炮口 ^sizeStart = 炮口世界坐标 ^sizeEnd = 本意尺寸 100×50
offset 是炮口的世界坐标(第 149–150 行由 beam.getFrom() 沿武器朝向外推 30px 算出,数值是几千像素级),却被当作初始尺寸;
于是这层贴图从"几千像素"起步,在 in + full + out(0.10–0.35 秒)内线性缩到本意尺寸 ~100×50;
由于它每帧都新增一层、且 additive = true 叠加,屏幕上始终同时存在若干层数千像素的紫色环 —— 就是那团不断向内塌缩的大光环;
附带副作用:B/C 两层"随充能前移 300 / 600 px"也失效了,因为位置被写死为 beam.getFrom()。
自证与旁证
源码原注释写的是 // A光晕 - 尺寸和位置不变,offset 明明是算出来的位置(muzzleLocation);
编译产物字节码中三处调用都绑定到 addOnceSprite:(SpriteAPI;Vector2f;Vector2f;Vector2f;F...)V,参数压栈顺序为 flareSprite() → offset → FLARE_A×随机 → FLARE_A×随机(修复前 offset 落在 sizeStart);
同 MOD 其它武器都是正确写法:DeoLacrimasmovereEveryFrameEffect、ProorizoEveryFrameEffect 用 (sprite, ship, offset, size) 锚点重载,Moci_RS_VOW_Magnum_EveryFrame 用 (sprite, loc, size, size) —— 只有银雷主炮这三处绑错了重载。 |
|