[Parity][net-world][S1][H] 多重射击(Multiple Shot,skill 12)的导弹 key 写成 'multiple shot',本地施放会断线,远端施放会让事件处理抛异常 #562

Closed
opened 2026-10-02 11:42:34 +00:00 by troytt · 0 comments
Owner

1.13c 客户端保真度审计立项(基准快照:7bd1090 / main @ 77a20c7)

证据标记说明:V-data = 1.13c MPQ 数据表 (.txt / animdata.d2 / .tbl / pal.pl2);V-src = D2MOO 逆向源码;V-bin = 1.13c DLL 反汇编;K = 1.13c 公认行为。

来源审计项:net-world#1 — [S1][H] F1 多重射击(Multiple Shot,skill 12)的导弹 key 写成 'multiple shot',本地施放会断线,远端施放会让事件处理抛异常

  • 位置:src/client/world/client-world.ts:588-608(spawnMissilesForSkill 的扇形分支);抛出点 src/common/skills/missiles-data.ts:1873-1878(getMissileTxtData);断线路径 src/client/session/online-session.ts:1138-1151(forwardCommandToAdapter:send 之后在同一个 try 里调 noteOutgoingCommand,catch 后走 handleUnexpectedDisconnect)
  • 代码:skillId === 38 ? 'chargedbolt' : skillId === 67 ? 'teeth' : 'multiple shot';throw new Error(`Unknown missile "${missileName}" in Missiles.txt`)
  • 原版:Missiles.txt 里没有 multiple shot,只有 multipleshotarrow(#213) 和 multipleshotbolt(#214);Skills.txt #12 的 srvmissilea/cltmissilea 指向它们(V-data skills.txt #12、missiles.txt #213/#214)。
  • 实测:本地 noteOutgoingCommand(SkillAt) 和远端 0x4D(施法者为别的玩家、skill=12)两条路径都抛 Unknown missile "multiple shot"。本地路径上,命令其实已经发出去了,随后被 catch 当成发送失败,触发 handleUnexpectedDisconnect(..., 'error', true),会话断开;远端路径上,异常直接冒出 handleServerEvent。
  • 影响:亚马逊一用多重射击就掉线;同场景有别人用多重射击时,事件处理被打断。
  • 建议:导弹 key 改为读 Skills.txt cltmissilea(再按 cltmissileb..d 补全),不要手写;noteOutgoingCommand 移出发送用的 try/catch,视觉模拟出错不能算网络断线。
  • 已有 issue:—(#550 合入时引入,提交 4a36b69)
> **1.13c 客户端保真度审计立项**(基准快照:`7bd1090` / `main @ 77a20c7`) > 证据标记说明:`V-data` = 1.13c MPQ 数据表 (`.txt` / `animdata.d2` / `.tbl` / `pal.pl2`);`V-src` = D2MOO 逆向源码;`V-bin` = 1.13c DLL 反汇编;`K` = 1.13c 公认行为。 ### 来源审计项:`net-world#1` — [S1][H] F1 多重射击(Multiple Shot,skill 12)的导弹 key 写成 `'multiple shot'`,本地施放会断线,远端施放会让事件处理抛异常 - 位置:`src/client/world/client-world.ts:588-608`(`spawnMissilesForSkill` 的扇形分支);抛出点 `src/common/skills/missiles-data.ts:1873-1878`(`getMissileTxtData`);断线路径 `src/client/session/online-session.ts:1138-1151`(`forwardCommandToAdapter`:`send` 之后在同一个 try 里调 `noteOutgoingCommand`,catch 后走 `handleUnexpectedDisconnect`) - 代码:`skillId === 38 ? 'chargedbolt' : skillId === 67 ? 'teeth' : 'multiple shot'`;``throw new Error(`Unknown missile "${missileName}" in Missiles.txt`)`` - 原版:Missiles.txt 里没有 `multiple shot`,只有 `multipleshotarrow`(#213) 和 `multipleshotbolt`(#214);Skills.txt #12 的 `srvmissilea`/`cltmissilea` 指向它们(V-data `skills.txt` #12、`missiles.txt` #213/#214)。 - 实测:本地 `noteOutgoingCommand(SkillAt)` 和远端 0x4D(施法者为别的玩家、skill=12)两条路径都抛 `Unknown missile "multiple shot"`。本地路径上,命令其实已经发出去了,随后被 catch 当成发送失败,触发 `handleUnexpectedDisconnect(..., 'error', true)`,会话断开;远端路径上,异常直接冒出 `handleServerEvent`。 - 影响:亚马逊一用多重射击就掉线;同场景有别人用多重射击时,事件处理被打断。 - 建议:导弹 key 改为读 Skills.txt `cltmissilea`(再按 `cltmissileb..d` 补全),不要手写;`noteOutgoingCommand` 移出发送用的 try/catch,视觉模拟出错不能算网络断线。 - 已有 issue:—(#550 合入时引入,提交 4a36b69)
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: troytt/diablo2-web#562
No description provided.