[Parity][world/render][S1][H] 怪物击退误用 MonMode 9 (S2) 而非 13 (KB) 并在下一 tick 复位 S2,且 MONSTER_MODE_TO_CLIP 将 13 错映为 rn #566

Closed
opened 2026-10-02 11:42:38 +00:00 by troytt · 1 comment
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#5 — [S1][H] F5 怪物击退用的是 MonMode 9(S2),应为 13(KB);而且 9 被当成"移动模式"复位,真正的 S2 动画永远播不出来

  • 位置:src/client/world/client-world.ts:1868(UnitMove knockback → 9)、1540(tick 中 2/9/15 到达后复位成 1);src/client/world/client-unit.ts:265(applyMove knockback → 9);src/client/session/online-session.ts:1547-1555(不在移动时把 2/9/15 复位成 1)、1775(渲染 mode:knockback → 9)
  • 原版:monmode.txt #9 = S2、#13 = KB、#15 = RN;plrmode.txt #19 = KB(V-data)。0x69/0x6B 的 cmd 0x0E/0x0F 映射到 mode 9(S2),这一点与 D2MOO MonsterMsg.cpp:130-150 的表一致(V-src)。
  • 实测:0x67 cmd 0x14(击退)→ 怪物 mode 9。
  • 影响:怪物被击退时播 S2(通常是特殊技能动画),而不是 KB。服务器下发的真 S2(monstats2 mS2=1 的约 60 种怪:fallen1–5、秃鹫、蝙蝠魔、Diablo、doomknight3、九头蛇、陷阱等)会在下一次 session tick 被当成"已停止的移动"复位成 NU,看不到。
  • 建议:怪物击退改为 13;"移动模式"集合只保留 WL(2)/RN(15)(另加 KB 13 的到达复位)。另外修正 MONSTER_CMD_TO_MODE 的注释(0x0C/0D 写成 "SQ",实为 S1;0x0E/0F 写成 "KB",实为 S2;0x14 写成 "S2",实为 KB)。
  • 已有 issue:—

来源审计项:render#8 — [S2][F][H] MONSTER_MODE_TO_CLIP 是重复定义且有错(13→rn,14 xx 未走 monseq);尸体 / clip / group 兜底链

  • 位置:src/client/scene/world-renderer.ts:266-283;兜底在 :600-613、:626
  • 代码:
    13: 'rn', 14: 'xx', 15: 'rn',
    const group = art.groups[groupIndex] ?? art.groups[art.standOffset + direction] ?? art.groups[0]
    
  • 原版:V-data monmode.txt #13 knockback:token GH、code KB(击退用 GH 动画);#14 sequence:token xx(序列模式应按 monseq.txt 解析出实际 mode 和帧);#15 run RN。项目里 common/units/plr-mode.ts 已有 MON_MODES,这里又重复写了一份,而且 13 写错了。
  • 影响:
    • mode 13 播跑步动画。另外 client-world / online-session 把怪物击退写成 mode 9(S2),见第 5 节,所以实际现象是"击退播 S2"。
    • mode 14 → 'xx' → 找不到 clip,落到 nu(静默)。
    • 尸体在 dd / dt / nu 之间自动挑选;clip 缺失时落到 wl / nu;group 缺失时落到站立组或第 0 组。这些都会掩盖烘焙缺失(这类兜底违反 AGENTS.md §3)。
  • 建议:直接使用 MON_MODES[mode].token;mode 14 走 monseq;clip / group 缺失时 reportMissingArt 并且不画。
  • 已有 issue:兜底部分与 #540(缺美术时静默回退)相关;13/14 的映射错误是新问题
> **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#5` — [S1][H] F5 怪物击退用的是 MonMode 9(S2),应为 13(KB);而且 9 被当成"移动模式"复位,真正的 S2 动画永远播不出来 - 位置:`src/client/world/client-world.ts:1868`(UnitMove knockback → 9)、`1540`(tick 中 2/9/15 到达后复位成 1);`src/client/world/client-unit.ts:265`(`applyMove` knockback → 9);`src/client/session/online-session.ts:1547-1555`(不在移动时把 2/9/15 复位成 1)、`1775`(渲染 mode:knockback → 9) - 原版:`monmode.txt` #9 = S2、#13 = KB、#15 = RN;`plrmode.txt` #19 = KB(V-data)。0x69/0x6B 的 cmd 0x0E/0x0F 映射到 mode 9(S2),这一点与 D2MOO `MonsterMsg.cpp:130-150` 的表一致(V-src)。 - 实测:0x67 cmd 0x14(击退)→ 怪物 mode 9。 - 影响:怪物被击退时播 S2(通常是特殊技能动画),而不是 KB。服务器下发的真 S2(monstats2 `mS2=1` 的约 60 种怪:fallen1–5、秃鹫、蝙蝠魔、Diablo、doomknight3、九头蛇、陷阱等)会在下一次 session tick 被当成"已停止的移动"复位成 NU,看不到。 - 建议:怪物击退改为 13;"移动模式"集合只保留 WL(2)/RN(15)(另加 KB 13 的到达复位)。另外修正 `MONSTER_CMD_TO_MODE` 的注释(0x0C/0D 写成 "SQ",实为 S1;0x0E/0F 写成 "KB",实为 S2;0x14 写成 "S2",实为 KB)。 - 已有 issue:— ### 来源审计项:`render#8` — [S2][F][H] `MONSTER_MODE_TO_CLIP` 是重复定义且有错(13→rn,14 xx 未走 monseq);尸体 / clip / group 兜底链 - 位置:`src/client/scene/world-renderer.ts:266-283`;兜底在 `:600-613`、`:626` - 代码: ```ts 13: 'rn', 14: 'xx', 15: 'rn', const group = art.groups[groupIndex] ?? art.groups[art.standOffset + direction] ?? art.groups[0] ``` - 原版:V-data `monmode.txt` #13 knockback:token **GH**、code KB(击退用 GH 动画);#14 sequence:token xx(序列模式应按 `monseq.txt` 解析出实际 mode 和帧);#15 run RN。项目里 `common/units/plr-mode.ts` 已有 `MON_MODES`,这里又重复写了一份,而且 13 写错了。 - 影响: - mode 13 播跑步动画。另外 client-world / online-session 把怪物击退写成 mode 9(S2),见第 5 节,所以实际现象是"击退播 S2"。 - mode 14 → 'xx' → 找不到 clip,落到 `nu`(静默)。 - 尸体在 dd / dt / nu 之间自动挑选;clip 缺失时落到 wl / nu;group 缺失时落到站立组或第 0 组。这些都会掩盖烘焙缺失(这类兜底违反 AGENTS.md §3)。 - 建议:直接使用 `MON_MODES[mode].token`;mode 14 走 monseq;clip / group 缺失时 `reportMissingArt` 并且不画。 - 已有 issue:兜底部分与 #540(缺美术时静默回退)相关;13/14 的映射错误是新问题
Author
Owner

Fixed and verified in commit cc0756de2e.

  • Full typecheck clean across all 7 projects.
  • Comprehensive parity test suite passing (timing-modes-parity.test.ts).
  • Merged and pushed to main.
Fixed and verified in commit cc0756de2ecbfbed474b7d92cb842bde1de9ac7c. - Full typecheck clean across all 7 projects. - Comprehensive parity test suite passing (timing-modes-parity.test.ts). - Merged and pushed to main.
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#566
No description provided.