[Parity][map][S2][R] 单位 / 传送门标记的种类和颜色与原版不符:缺少自己的召唤物/雇佣兵、非队友玩家、尸体、仓库;传送门画成 MaxiMap 图块;NPC 用手写城镇表 #627

Closed
opened 2026-10-02 11:42:48 +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 公认行为。

来源审计项:map#8 — [S2][R] 单位 / 传送门标记的种类和颜色与原版不符:缺少自己的召唤物/雇佣兵、非队友玩家、尸体、仓库;传送门画成 MaxiMap 图块;NPC 用手写城镇表

位置:

  • src/client/scene/world-renderer.ts:1179-1206:只收集三类。
    • 城镇 NPC:getTownNpcDescriptorByHcIdx(u.classId)。
    • 59/60 号传送门。
    • 队友玩家:u.isPartyMember。
  • src/client/ui/minimap.ts:76-89(AUTOMAP_CROSSHAIR_COLORS)。
  • minimap.ts:1036-1090:传送门 cellNo = levelId===4 ? 300 : isLocalPlayerOwner===false ? 307 : 306。
  • minimap.ts:1104-1120:
    • 未知种类一律画红色 "boss"。
    • 357/291 号怪特判为 (244,244,244)。
  • minimap.ts:1130:NPC 名字用金色,队友名字用绿色。

原版(V-bin,0x6fb11490-0x6fb1176f): 按单位类型返回颜色。颜色在 0x6fb0f090-0x6fb0f153 由 call 0x6fabd390(r,g,b) 初始化:

颜色变量 RGB
0x210 (0,0,255)
0x211 (255,0,0)
0x212 (255,0,255)
0x213 (0,255,0)
0x214 (68,112,116)
0x215 (72,160,52)
0x216 (244,244,244)
0x217 (128,128,128)
0x218 (244,244,0)
  • 玩家(type 0)
    • 自己 → 0x210 蓝色(0x6fb11715-0x6fb1171e)。
    • 同队 → 0x213 绿色。
    • 其他玩家 → 0x211 红色(0x6fb11731-0x6fb1175d)。
    • 模式 17(DD)且尸体归属匹配 → 0x212 品红,即尸体(0x6fb116ea-0x6fb11702)。
  • 怪物(type 1)
    • 模式 12(DD)或 [esi+0xc4] 的 0x200000 位 → 不画。
    • 0x6fab1760(classId, 9) 为真 → 0x216 白色,但 hcIdx 0x219-0x21b 除外。
      • 0x6fab1760 读 MonStats 记录(imul eax,0x1a8)+0xC 处的标志位。
      • 9 = MONSTATSFLAGINDEX_INTERACT(V-src MonsterTbls.h:157-168)。
      • 排除的 537-539 = ancientstatue1-3,interact=1(V-data monstats.txt #538-#540)。
    • 其他怪物走 0x6fad19f0,查宠物列表,并检查 PetType 标志 bit4 = PETTYPEFLAGINDEX_AUTOMAP(V-src D2DataTbls.h:207-212):
      • 自己的宠物 → 0x214 (68,112,116)。
      • 同队玩家的宠物 → 在 [0x6fba16b8]("AutoMap Party")打开时为 0x215 (72,160,52)。
      • PetType.automap=0 → 不画。pettype.txt 中 hireable、golem、valkyrie、skeleton 等 automap=1(V-data)。
  • 物件(type 2)
    • 59(TP)→ 0x218 黄色。
    • 60(红门)→ 0x218,但关卡 0x7d/0x7e/0x7f/0x6f/0x70/0x75(125/126/127/111/112/117)中不画(0x6fb114e6-0x6fb11522)。
    • 267(仓库)→ 颜色值 0(0x6fb114d9)。
    • objects.txt 中 TP/PP 的 AutoMap=0,仓库为 319(V-data)。

代码与原版的差异:

  • 自己的标记用 #0080FF,原版为 (0,0,255)。
  • 原版红色用于"非队友玩家";代码把红色给了 "Boss/SuperUnique",可原版根本不在自动地图上画敌对怪物。
  • 原版没有 357/291 特判。
  • 原版自己的召唤物/雇佣兵用 (68,112,116);代码 mercenary 用的是"队友宠物色" (72,160,52),而且运行时根本不传召唤物和雇佣兵。
  • 运行时不传非队友玩家、尸体、仓库。
  • NPC 只认手写的城镇 NPC 表,城外的 interact NPC(如 Cain、Qual-Kehk 等)不显示;原版的判据是 monstats.interact。
  • 传送门在原版走颜色标记路径;代码画成 MaxiMap cel 306(Seal)/ 300 / 307:
    • world-renderer 不传 isLocalPlayerOwner,所以实际上全部是 306。
    • 缺少红门在 6 个关卡的排除规则。

影响: 召唤流 / 雇佣兵玩家看不到自己的宠物标记;多人游戏看不到其他玩家和尸体;传送门显示为封印图标,颜色错误;城外 NPC 不显示。

建议:

  • world-renderer 传入全部单位,minimap 按原版函数分类:类型、模式、monstats 的 interact 标志、pettype.txt 的 automap 列、队伍关系。
  • 颜色用原版 9 色。
  • 传送门改为颜色标记,并加上红门关卡排除表。

已有 issue: —(#556 是左上角头像,#559 是怪物名牌,都不涉及自动地图)

> **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 公认行为。 ### 来源审计项:`map#8` — [S2][R] 单位 / 传送门标记的种类和颜色与原版不符:缺少自己的召唤物/雇佣兵、非队友玩家、尸体、仓库;传送门画成 MaxiMap 图块;NPC 用手写城镇表 **位置:** - `src/client/scene/world-renderer.ts:1179-1206`:只收集三类。 - 城镇 NPC:`getTownNpcDescriptorByHcIdx(u.classId)`。 - 59/60 号传送门。 - 队友玩家:`u.isPartyMember`。 - `src/client/ui/minimap.ts:76-89`(`AUTOMAP_CROSSHAIR_COLORS`)。 - `minimap.ts:1036-1090`:传送门 `cellNo = levelId===4 ? 300 : isLocalPlayerOwner===false ? 307 : 306`。 - `minimap.ts:1104-1120`: - 未知种类一律画红色 "boss"。 - 357/291 号怪特判为 (244,244,244)。 - `minimap.ts:1130`:NPC 名字用金色,队友名字用绿色。 **原版(V-bin,0x6fb11490-0x6fb1176f):** 按单位类型返回颜色。颜色在 0x6fb0f090-0x6fb0f153 由 `call 0x6fabd390(r,g,b)` 初始化: | 颜色变量 | RGB | |---|---| | 0x210 | (0,0,255) | | 0x211 | (255,0,0) | | 0x212 | (255,0,255) | | 0x213 | (0,255,0) | | 0x214 | (68,112,116) | | 0x215 | (72,160,52) | | 0x216 | (244,244,244) | | 0x217 | (128,128,128) | | 0x218 | (244,244,0) | - **玩家(type 0)** - 自己 → 0x210 蓝色(0x6fb11715-0x6fb1171e)。 - 同队 → 0x213 绿色。 - 其他玩家 → 0x211 红色(0x6fb11731-0x6fb1175d)。 - 模式 17(DD)且尸体归属匹配 → 0x212 品红,即尸体(0x6fb116ea-0x6fb11702)。 - **怪物(type 1)** - 模式 12(DD)或 [esi+0xc4] 的 0x200000 位 → 不画。 - `0x6fab1760(classId, 9)` 为真 → 0x216 白色,但 hcIdx 0x219-0x21b 除外。 - 0x6fab1760 读 MonStats 记录(`imul eax,0x1a8`)+0xC 处的标志位。 - 9 = `MONSTATSFLAGINDEX_INTERACT`(V-src `MonsterTbls.h:157-168`)。 - 排除的 537-539 = ancientstatue1-3,interact=1(V-data `monstats.txt` #538-#540)。 - 其他怪物走 `0x6fad19f0`,查宠物列表,并检查 PetType 标志 bit4 = `PETTYPEFLAGINDEX_AUTOMAP`(V-src `D2DataTbls.h:207-212`): - 自己的宠物 → 0x214 (68,112,116)。 - 同队玩家的宠物 → 在 [0x6fba16b8]("AutoMap Party")打开时为 0x215 (72,160,52)。 - PetType.automap=0 → 不画。pettype.txt 中 hireable、golem、valkyrie、skeleton 等 automap=1(V-data)。 - **物件(type 2)** - 59(TP)→ 0x218 黄色。 - 60(红门)→ 0x218,但关卡 0x7d/0x7e/0x7f/0x6f/0x70/0x75(125/126/127/111/112/117)中不画(0x6fb114e6-0x6fb11522)。 - 267(仓库)→ 颜色值 0(0x6fb114d9)。 - objects.txt 中 TP/PP 的 AutoMap=0,仓库为 319(V-data)。 代码与原版的差异: - 自己的标记用 #0080FF,原版为 (0,0,255)。 - 原版红色用于"非队友玩家";代码把红色给了 "Boss/SuperUnique",可原版根本不在自动地图上画敌对怪物。 - 原版没有 357/291 特判。 - 原版自己的召唤物/雇佣兵用 (68,112,116);代码 `mercenary` 用的是"队友宠物色" (72,160,52),而且运行时根本不传召唤物和雇佣兵。 - 运行时不传非队友玩家、尸体、仓库。 - NPC 只认手写的城镇 NPC 表,城外的 interact NPC(如 Cain、Qual-Kehk 等)不显示;原版的判据是 `monstats.interact`。 - 传送门在原版走颜色标记路径;代码画成 MaxiMap cel 306(Seal)/ 300 / 307: - world-renderer 不传 `isLocalPlayerOwner`,所以实际上全部是 306。 - 缺少红门在 6 个关卡的排除规则。 **影响:** 召唤流 / 雇佣兵玩家看不到自己的宠物标记;多人游戏看不到其他玩家和尸体;传送门显示为封印图标,颜色错误;城外 NPC 不显示。 **建议:** - world-renderer 传入全部单位,minimap 按原版函数分类:类型、模式、`monstats` 的 interact 标志、`pettype.txt` 的 automap 列、队伍关系。 - 颜色用原版 9 色。 - 传送门改为颜色标记,并加上红门关卡排除表。 **已有 issue:** —(#556 是左上角头像,#559 是怪物名牌,都不涉及自动地图)
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#627
No description provided.