From ff76655d4dedaf11419cbc8c505c46cee509f617 Mon Sep 17 00:00:00 2001 From: troytt <47798984@qq.com> Date: Sat, 3 Oct 2026 08:13:18 +0000 Subject: [PATCH] feat(plugins): implement top-level plugin architecture, toolbar plugin modal menu, and kill-stats plugin migration --- README.md | 15 +- play.html | 16 +- plugins/README.md | 99 +++ plugins/index.ts | 8 + stats.html => plugins/kill-stats/index.html | 12 +- plugins/kill-stats/index.ts | 169 +++++ .../kill-stats}/kill-stats-model.ts | 4 +- .../kill-stats}/kill-stats-store.ts | 0 .../kill-stats}/kill-stats-view.ts | 16 +- .../kill-stats}/kill-tracker.ts | 225 ++++-- .../kill-stats}/monster-kill-classes.ts | 2 +- plugins/kill-stats/page-main.ts | 75 ++ .../kill-stats}/stats-i18n.ts | 12 +- .../kill-stats}/stats-page.ts | 59 +- src/client/README.md | 13 +- src/client/i18n/lang.ts | 19 +- src/client/main.ts | 46 +- src/client/plugin-host/api.ts | 443 ++++++++++++ src/client/plugin-host/plugin-config-store.ts | 384 ++++++++++ src/client/plugin-host/plugin-host.ts | 664 ++++++++++++++++++ src/client/plugin-host/plugin-menu-i18n.ts | 72 ++ src/client/plugin-host/plugin-menu-model.ts | 174 +++++ src/client/plugin-host/plugin-menu.ts | 617 ++++++++++++++++ src/client/stats/stats-main.ts | 57 -- src/client/toolbar/toolbar.ts | 134 +++- src/client/ui/dom-overlay.ts | 15 + src/client/ui/hud-manager.ts | 5 + tests/arch/boundaries.test.ts | 286 +++++++- tests/client/plugin-host/plugin-host.test.ts | 386 ++++++++++ tests/client/settings-toolbar-view.test.ts | 6 +- .../tier1-feature-coverage.test.ts | 12 +- .../tier2-boundary-corner.test.ts | 7 +- .../tier4-real-world-scenarios.test.ts | 23 +- tests/issue-504-exocet-fonts.test.ts | 13 +- .../kill-stats}/kill-stats-model.test.ts | 4 +- .../kill-stats}/kill-stats-online.test.ts | 14 +- .../kill-stats}/kill-stats-view.test.ts | 4 +- .../kill-stats}/kill-tracker.test.ts | 166 ++++- .../kill-stats/memory-repository.ts | 6 +- .../kill-stats}/monster-kill-classes.test.ts | 14 +- tests/plugins/registry.test.ts | 231 ++++++ tools/verify-kill-stats-browser.ts | 44 +- tools/verify-plugin-menu-browser.ts | 579 +++++++++++++++ tsconfig.client.json | 3 +- tsconfig.json | 2 +- vite.config.ts | 20 +- vitest.config.ts | 2 +- 47 files changed, 4888 insertions(+), 289 deletions(-) create mode 100644 plugins/README.md create mode 100644 plugins/index.ts rename stats.html => plugins/kill-stats/index.html (96%) create mode 100644 plugins/kill-stats/index.ts rename {src/client/stats => plugins/kill-stats}/kill-stats-model.ts (99%) rename {src/client/stats => plugins/kill-stats}/kill-stats-store.ts (100%) rename {src/client/stats => plugins/kill-stats}/kill-stats-view.ts (98%) rename {src/client/stats => plugins/kill-stats}/kill-tracker.ts (77%) rename {src/common/units => plugins/kill-stats}/monster-kill-classes.ts (97%) create mode 100644 plugins/kill-stats/page-main.ts rename {src/client/stats => plugins/kill-stats}/stats-i18n.ts (92%) rename {src/client/stats => plugins/kill-stats}/stats-page.ts (96%) create mode 100644 src/client/plugin-host/api.ts create mode 100644 src/client/plugin-host/plugin-config-store.ts create mode 100644 src/client/plugin-host/plugin-host.ts create mode 100644 src/client/plugin-host/plugin-menu-i18n.ts create mode 100644 src/client/plugin-host/plugin-menu-model.ts create mode 100644 src/client/plugin-host/plugin-menu.ts delete mode 100644 src/client/stats/stats-main.ts create mode 100644 src/client/ui/dom-overlay.ts create mode 100644 tests/client/plugin-host/plugin-host.test.ts rename tests/{client => plugins/kill-stats}/kill-stats-model.test.ts (99%) rename tests/{client => plugins/kill-stats}/kill-stats-online.test.ts (94%) rename tests/{client => plugins/kill-stats}/kill-stats-view.test.ts (99%) rename tests/{client => plugins/kill-stats}/kill-tracker.test.ts (80%) rename tests/{client => plugins}/kill-stats/memory-repository.ts (95%) rename tests/{common => plugins/kill-stats}/monster-kill-classes.test.ts (89%) create mode 100644 tests/plugins/registry.test.ts create mode 100644 tools/verify-plugin-menu-browser.ts diff --git a/README.md b/README.md index 014a8bf..4a9ac09 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ - **1:1 原生网络协议兼容**:完整实现 BNCS(战网登录/聊天,端口 `6112`)、MCP(Realm 角色管理/建房加房,端口 `6113`)与 D2GS(Huffman 压缩帧、167 个 S2C 操作码、C2S 指令及物品比特流,端口 `4000`),浏览器客户端可通过轻量 TCP-to-WebSocket 桥直接连入原版 C++ **PvPGN + D2GS (1.13c)** 战网服务器。 - **种子驱动的确定性 DRLG 地图重建**:1:1 复刻 `D2Common.dll` 64 位进位乘法随机数 (`0x6FDAA9E0`) 与三大 DRLG 拓扑算法(Preset 预设、Maze 地牢迷宫、Outdoors 野外生成),客户端仅凭 D2GS 下发的 32 位 `mapSeed` 即可在浏览器端还原与 C++ 服务端逐格一致的瓦片地图与碰撞网格。 - **WebGL2 高性能等距渲染与离线资产管线**:通过 Node.js 离线烘焙管线 (`src/baker`) 将原版 MPQ 中的 DT1/DS1 瓦片、DC6/DCC 角色与怪物动画、COF 复合图层、PL2 调色板与 TBL 字符串表预编译为静态图集与二进制包,配合 Service Worker 增量缓存与 WebGL2 合批渲染实现 60fps 流畅体验。 -- **严格的模块化架构隔离**:全仓按原版 DLL 职责划分为五大核心代码模块与独立工具集,由多套独立 `tsconfig.*.json` 与架构边界测试(`tests/arch/boundaries.test.ts`)强制保障零跨层污染。 +- **严格的模块化架构隔离**:全仓按原版 DLL 职责划分为五大核心代码模块、顶层可拔插扩展目录(`plugins/`)与独立工具集,由多套独立 `tsconfig.*.json` 与架构边界测试(`tests/arch/boundaries.test.ts`)强制保障零跨层污染。 --- @@ -19,7 +19,8 @@ | :--- | :--- | :--- | :--- | :--- | | [`src/common`](./src/common) | `D2Common.dll` `Storm.dll` `D2Lang.dll` | 纯 TypeScript (`ES2022`),零 DOM / 零 Node.js 依赖 | MPQ 与原生二进制格式解析器 (DC6/DCC/DT1/DS1/COF/PL2/TBL)、`D2DataRegistry` 数据表中心、1.13c DRLG 随机地图生成算法、64 位 `D2Rng` 与烘焙校验契约 (`pack-contract`) | [src/common/README.md](./src/common/README.md) | | [`src/netproto`](./src/netproto) | `D2Net.dll` `Bnclient.dll` `D2MCPClient.dll` `Fog.dll` | 纯协议栈模块,零外部模块依赖,唯一入口 `src/netproto/index.ts` | BNCS (`6112`) / MCP (`6113`) / D2GS (`4000`) 二进制协议编解码、XSHA-1 与 CheckRevision 认证、Fog.dll Huffman 解压、167 个 S2C 操作码解析、物品比特流与 WebSocket/TCP 传输层抽象 | [src/netproto/README.md](./src/netproto/README.md) | -| [`src/client`](./src/client) | `D2Client.dll` `D2Gfx.dll` `D2Win.dll` `D2Launch.dll` | 纯浏览器客户端 (`DOM` + `WebGL2`),零 Node / 零 `server` / 零 `baker` 依赖 | 双页面入口 `play.html`(游戏主入口)与 `stats.html`(独立怪物击杀统计页)、战网登录/选人/大厅前端界面、`OnlineSession` 与 `ClientWorld` 状态镜像、实时怪物击杀追踪与 IndexedDB G-counter 统计 (`stats/`)、种子驱动的实时 DRLG 地图重建、移动预测与内插、WebGL2 渲染器、全套经典 HUD 面板与抓包检查器 | [src/client/README.md](./src/client/README.md) | +| [`src/client`](./src/client) | `D2Client.dll` `D2Gfx.dll` `D2Win.dll` `D2Launch.dll` | 纯浏览器客户端 (`DOM` + `WebGL2`),零 Node / 零 `server` / 零 `baker` / 零 `plugins` 依赖 | 游戏主入口 `play.html`、战网登录/选人/大厅前端界面、`OnlineSession` 与 `ClientWorld` 状态镜像、非侵入式插件宿主 (`plugin-host/`)、种子驱动的实时 DRLG 地图重建、移动预测与内插、WebGL2 渲染器、全套经典 HUD 面板与抓包检查器 | [src/client/README.md](./src/client/README.md) | +| [`plugins/`](./plugins) | 客户端外挂扩展生态 | 浏览器扩展层 (`DOM`),仅依赖 `src/common`、`src/netproto` 与 `src/client/plugin-host/api.ts`,插件间严格物理隔离 | 独立于核心客户端的可拔插辅助扩展(如 `plugins/kill-stats/` 实时怪物击杀统计与独立页面 `plugins/kill-stats/index.html`),支持通过顶部工具栏 **Plugins** 菜单动态启停与快捷按钮配置 | [plugins/README.md](./plugins/README.md) | | [`src/server`](./src/server) | `D2Game.dll` | 纯确定性模拟 (`ES2022` + `WebWorker`),禁 DOM / 禁 Node / 禁非确定性随机与时钟 | 25fps (40ms/tick) 权威游戏循环、1.13c 战斗伤害与抗性管线、7 职业 221 个技能执行器、投射物与光环引擎、怪物 AI 与房间流式激活、TC 掉落管线与 `.d2s` 存档读写 | [src/server/README.md](./src/server/README.md) | | [`src/baker`](./src/baker) | 离线资源构建管线 | 纯 Node.js CLI 环境 (`types: ["node"]`),禁 DOM / 禁 `client` / 禁 `server` | 从原版 1.13c MPQ 归档中提取并烘焙瓦片图集 (`tiles`)、角色/怪物/NPC 实体 (`entities`)、投射物 (`missiles`)、覆盖层 (`overlays`)、HUD/前端 UI、动画表 (`animdata`) 与 SHA-256 资产清单 (`asset-manifest.json`) | [src/baker/README.md](./src/baker/README.md) | | [`tools/`](./tools) | 开发者与 QA 工具集 | Node.js / Playwright CLI | 无头协议测试机器人 (`d2-bot.ts`)、`.d2cap` 抓包离线重放器 (`netproto-replay.ts`)、`.d2s` 存档全解锁工具 (`d2s-unlock.ts`)、全谱系 136 关卡浏览器审计 (`audit-levels-browser.ts`) 与 DRLG 差分对比工具 | [tools/README.md](./tools/README.md) | @@ -37,8 +38,14 @@ ┌─────────────┐ ┌──────────────┐ ┌─────────────────────────┐ │ src/baker │ │ src/server │◄──┤ src/client │ │ (Node CLI) │ │ (D2Game Sim) │ │ (Browser WebGL2 Client) │ -└─────────────┘ └──────────────┘ └─────────────────────────┘ - *(注:src/client 与 src/server 之间完全解耦,仅各自依赖 src/common 与 src/netproto)* +└─────────────┘ └──────────────┘ └────────────┬────────────┘ + ▲ + │ (plugin-host/api.ts only) + ┌────────────┴────────────┐ + │ plugins/ │ + │ (Isolated Extensions) │ + └─────────────────────────┘ + *(注:src/client 与 src/server 之间完全解耦;plugins/* 仅依赖 plugin-host/api.ts、src/common 与 src/netproto)* ``` --- diff --git a/play.html b/play.html index 1d0f1cb..d4becc6 100644 --- a/play.html +++ b/play.html @@ -158,12 +158,22 @@ cursor: pointer; } + .d2-toolbar__btn:disabled { + opacity: 0.45; + cursor: not-allowed; + } + .d2-toolbar__btn--active { background: linear-gradient(180deg, #524020 0%, #2e2310 100%); border-color: #d4b46a; color: #fff5d6; } + .d2-toolbar__btn--warn { + border-color: #d4882a; + color: #ffb84d; + } + .d2-toolbar__diag { position: absolute; top: 32px; @@ -446,6 +456,10 @@
- +