Dota 2 桌宠(DSH 插件)
在你的 DeepSeek Harness 界面上养一只 Dota 2 英雄。动作不是贴图,是从本机 Dota 2 的模型文件里读出来、离线烘成帧的真实游戏动作(待机 / 跑动 / 攻击 / 突袭 / 黑暗契约 / 暗影之舞 / 死亡 / 胜利),再配好账号,让它按你最近常用的英雄出场。
Powered by Source 2 Viewer (ValveResourceFormat)。 内置动作帧与饰品数据都由它从本机游戏文件解析导出;Source 2 格式没有官方文档,这些能力全部来自社区逆向。
社区做法的调研笔记见
docs/research-source2-models.md。
安装
# 在你的 dsh profile 里(设置 → 插件 → 安装,或直接 pnpm add)
pnpm add dsh-dota2-pet
装好后在 profile 的 package.json 里把它加进 dsh.profile.bundles,重启 DSH 生效:
{
"dsh": { "profile": { "bundles": ["…", "dsh-dota2-pet"] } }
}
配置账号(必须,一次即可)
设置 → DOTA2 桌宠 → 账号,填你的**好友码(账号 ID)**或 Steam64,回车查询。不需要 API key。
能拿到:昵称、头像、段位(如"远古 IV")、近 N 天胜负、最常玩的英雄(可一键让他上场当桌宠)。 数据源 OpenDota,由插件的宿主半代理请求并缓存 10 分钟。
段位取自 OpenDota 的
rank_tier;OpenDota 不提供精确天梯分,所以界面上不猜数字。
本机 Dota 2 检索
插件会按顺序找你的游戏目录:
- 你在设置里手填的路径
- Windows 注册表
HKCU\Software\Valve\Steam\SteamPath、HKLM\...\Valve\Steam\InstallPath - 常见 Steam 安装位置 × 全盘符
- 每个 Steam 根目录的
steamapps\libraryfolders.vdf与config\libraryfolders.vdf - 全盘兜底扫
steamapps\common\dota 2 beta,并用appmanifest_570.acf交叉验证
判定标准只有一条:pak01_dir.vpk 真的能打开。找不到可以手填路径重试。检测结果与内置素材状态都能在设置页看到。
操作
| 操作 | 效果 |
|---|---|
| 左键拖动 | 移动位置(位置会记住) |
| 左键单击 | 随机做一个动作 + 说一句台词 |
| 右键 | 菜单:说句话 / 该英雄全部动作(按分类列出)/ 放大缩小 / 贴到桌面 / 藏起来 |
| 滚轮 | 缩放 |
| 双击 | 收起桌宠 |
贴到桌面(Windows 增强)
DSH 插件本身只能渲染在 DSH 窗口内。Windows 上插件会额外拉起一个 WPF 置顶、无边框、真透明、不进任务栏的窗口(powershell.exe,系统自带,无需额外运行时),桌宠就真的浮在桌面上,DSH 最小化也还在。
入口:设置 → DOTA2 桌宠 → 贴到桌面,或右键菜单。
素材说明

包内自带离线烘焙的动作帧(3 个英雄共 786 帧,约 17 MB),所以没装 Dota 2 也能用:
| 英雄 | 动作 | 帧数 |
|---|---|---|
| 斯拉克 slark | 待机 / 跑动 / 攻击 / 突袭 / 黑暗契约 / 暗影之舞 / 死亡 / 胜利(8 个) | 256 |
| 司夜刺客 nyx_assassin | 待机 / 跑动 / 攻击 / 尖刺外壳 / 掘地出土 / 死亡 / 胜利(7 个) | 266 |
| 食人魔魔法师 ogre_magi | 待机 / 跑动 / 攻击 / 火焰护盾 / 引燃 / 死亡 / 胜利(7 个) | 264 |
每个动作烘两个朝向,帧率按游戏内动作时长反推,所以播出来的节奏和游戏里一致。加英雄只需再跑一次 tools/bake(做法见这里),前端与桌面窗口的菜单会自动跟着变。
为什么只内置三个英雄,而不是全部英雄 + 全部饰品
实测估算(抽样导出后外推,方法见 tools/bake):
| 项目 | 数量 | 单位体积(中位) | 外推 |
|---|---|---|---|
| 英雄本体模型 | 133 个 | 1.27 MB | ≈ 0.17 GB |
| 英雄默认部件 | 1,110 个 | 67 KB | ≈ 0.07 GB |
| 全部饰品模型 | 9,629 个 | 49 KB(均值 64 KB) | ≈ 0.45–0.59 GB |
| 模型资产合计 | ~10,900 个文件 | ≈ 0.7 GB | |
| 若改为预烘动作帧 | 129 英雄 × ~260 帧 | ≈ 5.7 MB/英雄 | ≈ 0.7 GB |
约 700 MB,是"100 MB 就改成本机读取"这条线的 7 倍,而且 GitHub 对单文件 100 MB、仓库 1 GB 也有硬限制, 上千个二进制文件会让 clone 变得很重。更关键的是:Valve 的游戏素材不允许再分发。
所以本插件的路线是:只内置少量烘焙帧保证开箱可用,其余一律运行时读你本机的 Dota 2—— 只读、不复制、不落盘,也不上传任何游戏素材。
- 检测到本机 Dota 2 后,插件只读游戏文件、不复制、不落盘,后续版本会接入本机载入画面与英雄头像
- 动作与技能对应关系直接读自游戏:
ACT_DOTA_CAST_ABILITY_1→ 黑暗契约、ACT_DOTA_SLARK_POUNCE→ 突袭、ACT_DOTA_SHADOW_DANCE_STATUE→ 暗影之舞 - 素材体积想再小:把烘焙的
--bake-size从 220 调到 180 左右即可(帧数不变、像素数约减半)
版本与发布
遵循语义化版本;每个版本都在 CHANGELOG.md 里写清"新增/修复/变更",并打 vX.Y.Z 标签。
npm run check # 语法检查(index.js / client.js / lib/find-dota.mjs)
npm test # 离线冒烟测试,不需要 DSH 在跑、不需要装 Dota 2
git tag -a v0.1.1 -m "v0.1.1"
git push origin main --tags
npm publish # prepublishOnly 会自动跑 check + test
CI(.github/workflows/ci.yml)在 Linux 与 Windows × Node 20/22 上跑同样的检查,另外校验:
package.json的dsh.bundle.patch/dsh.client是否有效、files列出的路径是否都存在- 内置动作帧的完整性(每个动作的帧数与
manifest.json一一对应,缺帧直接失败)
想把插件上架 DSH 插件市场:往 awesome-dsh-plugin 提一个 PR 加一条目录(市场与 dshmarket.com 会自动收录,通常一天内生效)。
许可
MIT(见 LICENSE)。Dota 2 及其素材版权归 Valve 所有;本插件只在你本机的游戏文件上做读取与渲染,不再分发游戏素材——仓库里的动作帧是由 tools/bake 在你本机游戏上离线渲染得到的。
No comments yet. Be the first to write one.