[Parity][frontend/netproto][S2] MCP 0x19 角色 statstring 进度值(progression)缺少右移 1 位,导致难度解锁判定翻倍错位 #738
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题描述
在解析 MCP
0x19(MCP_CHARLIST2)返回的 33 字节角色外观与状态字节串(statBytes)时,src/netproto/mcp/packets.ts与src/client/frontend/flow-state.ts直接使用statBytes[27] & 0x1f提取角色进度progression,未按 1.13cFOG_Encode14BitsToString/D2PackedClientSaveFlags规范右移 1 位(应为(statBytes[27] >>> 1) & 0x1f)。1.13c Ground Truth 根因分析
D2PackedClientSaveFlags位域定义(D2Game.dllCLIENTS_FillCharacterPreviewInfo@0x6FC32810/Clients.h):bits 0..6:状态位(0x01init,0x04hardcore,0x08dead,0x20expansion,0x40ladder)bit 7:bUnkFlag0x80bits 8..12(共 5 bits):nProgression(CLIENTSAVEFLAG_CHARACTER_PROGRESSION_BIT = 8,资料片0..15,原版0..12)bit 13:bWeaponSwitch(0x2000)Fog.#10085FOG_Encode14BitsToString/Fog.#10086FOG_Decode14BitsFromString):statBytes[26] = (nPackedValue & 0x7f) | 0x80(对应nPackedValue的bits 0..6)statBytes[27] = ((nPackedValue >>> 7) & 0x7f) | 0x80(对应nPackedValue的bits 7..13)statBytes[27]中:bit 0是nPackedValue的bit 7(bUnkFlag0x80)bits 1..5才是 5 位nProgression,即(statBytes[27] >>> 1) & 0x1fbit 6是bWeaponSwitchbit 7是非零掩码0x80影响表现
直接用
statBytes[27] & 0x1f会把(progression << 1) & 0x1f当作进度值(翻倍后对 32 取模):progression = 3,statBytes[27] = 0x86)被误判为progression = 6,前端错误解锁噩梦难度按钮;progression = 5,statBytes[27] = 0x8a)被误判为progression = 10,前端错误解锁地狱难度按钮(点击创建地狱房间会被 d2cs 拒绝);progression = 15,statBytes[27] = 0x9e)被解析为30。修复范围
src/netproto/mcp/packets.ts:parseCharStatstring中将progression修正为(actAndDiff >>> 1) & 0x1f,并基于progression计算act。src/client/frontend/flow-state.ts:getAllowedDifficultiesForSelectedCharacter回退分支修正为(statBytes[27]! >>> 1) & 0x1f,同步更新注释。src/client/frontend/statstring-avatar.ts:同步修正字节偏移 27 的位域注释。FOG_Encode14BitsToString编码与难度解锁边界。