[M20-P4] 实装 0x9C/0x9D 物品位流解码与背包/仓库/方块/腰带/商人/传送点交互包 #512

Closed
opened 2026-09-28 13:10:06 +00:00 by troytt · 0 comments
Owner

背景与目标

实装 1.13c 最核心的 0x9C(世界物品)与 0x9D(容器/装备物品)LSB 位流解码器,并将现有背包、私人仓库、赫拉迪克方块、腰带、商人交易、传送点与角色加点 UI 从“直接改本地内存”重构为“发送上行操作包 → 等待服务端回执更新状态”。

核心内容与 1.13c Ground Truth 对标 (D2Common.dll Items.cpp)

  1. 0x9C / 0x9D 物品位流解码器:
    • 复用 src/formats/bitstream.ts 的 LSB-first 位读取器,严格对标 1.13c D2Common 物品位流格式(对齐 D2MOO Items.cpp 并核对 1.13c 帧头与属性编码):
      • 基础段:Action、Category、GUID、物品标志位(已装备、镶嵌、已鉴定、无形、符文之语、耳朵、简易物品等)、格式版本、位置(地面 / 背包 / 装备槽 / 腰带 / 光标 / 镶嵌孔 / 仓库 / 方块 / 商店)、32-bit 4 字符类型码、坐标与凹槽数。
      • 扩展段(非 Simple 物品):物品 GUID、ilvl、品质(劣质 / 普通 / 超强 / 魔法前后缀 / 稀有与手工名及词缀 / 套装 / 暗金)、防御力、耐久度、堆叠数量、镶嵌槽与按 ItemStatCost.txt(Save Bits / Save Add / Save Param Bits)编码的属性列表。
    • 将解码结果无损映射为现有 Item / UiInventoryItem,直接复用 src/game/item-tooltip.ts 与中英双语词条渲染。
  2. 容器、装备与地面物品交互上行包:
    • 地面与光标:0x16 拾取地面物品(到背包或光标)、0x17 丢弃光标物品、0x50 丢弃金币。
    • 背包/仓库/方块:0x18 放入缓冲容器、0x19 从缓冲容器拿起、0x1F 交换容器物品、0x20 右键使用物品(药水、卷轴、书册)、0x21 堆叠、0x27 / 0x28 物品镶嵌与书页合并。
    • 装备栏:0x1A 穿戴、0x1B / 0x1C 交换/卸下、0x56 切换主副手武器(W 键)。
    • 腰带:0x23 放入、0x24 拿起、0x25 替换、0x26 快捷键喝药(1..4 键)。
  3. 城镇 NPC、商人、传送点與角色属性/技能包:
    • NPC 与商店:0x13 点击交互、0x2F 发起对话、0x30 结束对话、0x38 请求实体菜单(交易/赌博)、0x32 购买/赌博、0x33 出售、0x34 凯恩鉴定、0x35 修理、0x4F 操作私人仓库/方块按钮(含转化 Transmute)。
    • 传送点与传送门:0x49 传送点跳转、点击蓝门/红门与关卡入口跳转(0x13 + 0x09 Warp)。
    • 属性与技能点:解析下行 0x1D / 0x1E / 0x1F(字节/字/双字属性,含金币、经验、剩余点数)与 0x94(全技能等级列表);发送上行 0x3A(加属性点)、0x3B(加技能点)、0x3C(切换左右键绑定技能)。

验收标准

  • 对抓包样本中全部 0x9C / 0x9D 物品包(覆盖白装、超强、蓝装、黄装、绿装、暗金、符文之语、镶嵌物、金币、耳朵、商店商品)100% 解码通过且位游标精确对齐。
  • 实机连入 D2GS 完成:地面拾取 → 鉴定 → 穿戴/换装 → 存仓 → 赫拉迪克方块合成 → 商人买卖/修理/赌博 → 小站传送,重进游戏后服务端存档状态完全保留。
## 背景与目标 实装 1.13c 最核心的 `0x9C`(世界物品)与 `0x9D`(容器/装备物品)LSB 位流解码器,并将现有背包、私人仓库、赫拉迪克方块、腰带、商人交易、传送点与角色加点 UI 从“直接改本地内存”重构为“发送上行操作包 → 等待服务端回执更新状态”。 ## 核心内容与 1.13c Ground Truth 对标 (`D2Common.dll` `Items.cpp`) 1. **`0x9C` / `0x9D` 物品位流解码器**: - 复用 `src/formats/bitstream.ts` 的 LSB-first 位读取器,严格对标 1.13c `D2Common` 物品位流格式(对齐 D2MOO `Items.cpp` 并核对 1.13c 帧头与属性编码): - 基础段:Action、Category、GUID、物品标志位(已装备、镶嵌、已鉴定、无形、符文之语、耳朵、简易物品等)、格式版本、位置(地面 / 背包 / 装备槽 / 腰带 / 光标 / 镶嵌孔 / 仓库 / 方块 / 商店)、32-bit 4 字符类型码、坐标与凹槽数。 - 扩展段(非 Simple 物品):物品 GUID、ilvl、品质(劣质 / 普通 / 超强 / 魔法前后缀 / 稀有与手工名及词缀 / 套装 / 暗金)、防御力、耐久度、堆叠数量、镶嵌槽与按 `ItemStatCost.txt`(`Save Bits` / `Save Add` / `Save Param Bits`)编码的属性列表。 - 将解码结果无损映射为现有 `Item` / `UiInventoryItem`,直接复用 `src/game/item-tooltip.ts` 与中英双语词条渲染。 2. **容器、装备与地面物品交互上行包**: - 地面与光标:`0x16` 拾取地面物品(到背包或光标)、`0x17` 丢弃光标物品、`0x50` 丢弃金币。 - 背包/仓库/方块:`0x18` 放入缓冲容器、`0x19` 从缓冲容器拿起、`0x1F` 交换容器物品、`0x20` 右键使用物品(药水、卷轴、书册)、`0x21` 堆叠、`0x27 / 0x28` 物品镶嵌与书页合并。 - 装备栏:`0x1A` 穿戴、`0x1B / 0x1C` 交换/卸下、`0x56` 切换主副手武器(`W` 键)。 - 腰带:`0x23` 放入、`0x24` 拿起、`0x25` 替换、`0x26` 快捷键喝药(`1..4` 键)。 3. **城镇 NPC、商人、传送点與角色属性/技能包**: - NPC 与商店:`0x13` 点击交互、`0x2F` 发起对话、`0x30` 结束对话、`0x38` 请求实体菜单(交易/赌博)、`0x32` 购买/赌博、`0x33` 出售、`0x34` 凯恩鉴定、`0x35` 修理、`0x4F` 操作私人仓库/方块按钮(含转化 `Transmute`)。 - 传送点与传送门:`0x49` 传送点跳转、点击蓝门/红门与关卡入口跳转(`0x13` + `0x09` Warp)。 - 属性与技能点:解析下行 `0x1D / 0x1E / 0x1F`(字节/字/双字属性,含金币、经验、剩余点数)与 `0x94`(全技能等级列表);发送上行 `0x3A`(加属性点)、`0x3B`(加技能点)、`0x3C`(切换左右键绑定技能)。 ## 验收标准 - [ ] 对抓包样本中全部 `0x9C / 0x9D` 物品包(覆盖白装、超强、蓝装、黄装、绿装、暗金、符文之语、镶嵌物、金币、耳朵、商店商品)100% 解码通过且位游标精确对齐。 - [ ] 实机连入 D2GS 完成:地面拾取 → 鉴定 → 穿戴/换装 → 存仓 → 赫拉迪克方块合成 → 商人买卖/修理/赌博 → 小站传送,重进游戏后服务端存档状态完全保留。
troytt added this to the [M20] D2GS 纯客户端:接入 PvPGN + D2GS 1.13c 服务端联机 (1.13c Ground Truth) milestone 2026-09-28 13:10:06 +00:00
Sign in to join this conversation.
No Label
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#512
No description provided.