[Parity][input/skills][S1][R/F] F1–F8 技能热键被捕获阶段空表拦截失效、绑定未持久化且 0x7B 被误解码为 ActiveSkill #585
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?
来源审计项:
motion-input#5— [S1][R/F] 5. F1–F8 技能热键在游戏内完全失效:命令映射器吞键,绑定表又从不填充command-mapper.ts:168(skillHotkeysMap)、:211-216(bindSkillHotkey,全仓没有调用方,已用 tsrch 确认)、:738-758(F1–F8 分支即使没有绑定也return true);main.ts:897-900(handled 为真时在捕获阶段e.stopImmediatePropagation());ui/hud-manager.ts:1412-1415(hotkeys.triggerFunctionKey(key),监听器在:1431以冒泡阶段注册,永远收不到这个事件)if (/^F[1-8]$/.test(keyUpper)) { … const binding = this.skillHotkeys.get(keyUpper); if (binding) {…} return true }decode0x7BAssignSkillHotkey(netproto/d2gs/s2c/skills.ts:136-150)把 0x7B 解成type: 'ActiveSkill', unitId: slot,丢掉了热键指派的语义。所以即使不再吞键,也拿不到服务器下发的指派。来源审计项:
inv-skills#10— [S2][R] F 键技能绑定只存在本地 Map:不随角色保存、不发给服务器;0x7B 被误解码成"当前技能切换"src/client/ui/hotkeys.ts:226(readonly bindings = new Map<...>())。src/client/ui/hotkeys.ts:375-386(bindHotkey/setHotkey):只写 Map,不清除同一技能在其他键上的旧绑定。src/netproto/d2gs/s2c/skills.ts:135-150,0x7B 被解码为{ type: 'ActiveSkill', unitId: slot, ... }。src/client/world/client-world.ts:2174-2186。this.bindings.set(fKey.toUpperCase(), { side, skillId })D2Game/src/GAME/Clients.cpp:427-433,D2GAME_PACKETS_SendPacket0x7B_6FC3F720(pClient, i, nSkill, nHand, nItemGUID))。D2Game/src/PLAYER/PlrMsg.cpp:3590-3612,D2MOO 命名为Rcv0x51_BindHotkeyToSkill,9 字节,高 16 位为热键号)。client-world.ts会把热键分配当成左右键技能切换;selfId===0时还会把 selfId 设为热键槽号。仓库自带的服务器不发 0x7B,所以目前不会触发,接入按原版协议实现的服务器时会暴露。bindings。来源审计项:
net-world#17— [S3][R] F17 0x7B(技能热键)被当成"设置当前技能",slot 被塞进 unitIdsrc/netproto/d2gs/s2c/skills.ts:135-150;src/client/world/client-world.ts:2174-2187Clients.cpp:427-439,SCmd.cpp:2144-2155)(V-src)。0x7B 只是热键绑定。unitId === 0分支。SkillHotkey{slot, skill, hand, itemId},存进热键表。