Botty 实战全解:用像素识别打造一个 24 小时无人值守的 D2R 自动刷宝 Bot
Botty 实战全解用像素识别打造一个 24 小时无人值守的 D2R 自动刷宝 Bot【免费下载链接】bottyD2R Pixel Bot项目地址: https://gitcode.com/gh_mirrors/bo/bottyBotty 是一款面向《暗黑破坏神2重制版》下称 D2R的无人值守自动刷宝脚本。它不读游戏内存而是持续截屏、用像素匹配识别地面物品、NPC 与路线节点把进本、击杀、捡物、回城收装的完整循环接管过来。你早上启动一次晚上收获战利品即可。本文从环境搭设讲到核心机制、参数调优与排障全部基于项目仓库内的真实文件路径。 先想清楚为什么传统宏在 D2R 里走不通宏脚本的工作方式是固定动作序列第 1 秒按传送第 2 秒平砍循环往复。问题在于 D2R 的画面会变化——怪刷在哪个角落、地上掉的是符文还是垃圾、角色血条掉到几成宏一概不感知卡住就是卡住。Botty 走的是另一条路线它把 D2R 窗口当作一个持续更新的图像源每一帧截图都拿去和预置模板做匹配识别出我现在在哪、地上有什么、该往哪走再据此决定下一步操作。简单说它不是替你按键而是看画面再决定按什么键。这种方式有两个直接好处。第一它不碰游戏内存行为和一个操作很快的真人没有本质区别第二导航依赖视觉地标而非写死的坐标画面轻微偏移或版本微调时更不容易整体失效。一句话总结宏是背谱演奏Botty 是看现场演奏。 环境搭建从克隆仓库到看见热键表游戏侧的三个硬性前提启动之前D2R 本体需要满足三点缺一个都会让识别精度掉到不可用游戏语言必须是英语物品识别整套依赖英文名匹配中文界面直接失效使用 720p 窗口模式脚本按这个分辨率校准了全部模板坐标自动设置F9也会按它调整关掉一切会插手你显示效果的外部程序比如 HDR 或显卡驱动的自动画质调节否则截图颜色会漂移匹配分数跟着往下掉。代码侧只需三步克隆仓库并建立运行环境git clone https://gitcode.com/gh_mirrors/bo/botty cd botty conda env create -f environment.yml # 按项目声明依赖建环境 conda activate botty python src/main.py # 启动入口启动后终端会打印一张热键表日常操作就靠这几颗键F7 从备份恢复 D2R 设置F8 备份当前设置F9 自动调整 D2R 设置F10 开关图形调试器F11 启动或暂停 BotF12 强制停止。建议先把这张表截图存下来排障时你会反复用到 F11 和 F10。一句话总结英语、720p、无干扰加上三行命令机器就准备好了。 最短跑通路径一个角色刷一次 Pindle跑通第一次比读懂全部文档更重要按这个顺序走先打开 D2R停在英雄选择界面确认你要用的角色处于选中状态。角色需要在脚本设定的难度下可正常进入第三、四或五幕城镇——脚本会自己从城镇发起游戏不需要你手动进本。回到 Botty 控制台按一次 F9它会自动写入 D2R 的图形与操作设置极少数情况下亮度仍需手动微调。微调完按 F10 打开图形调试器验证进入游戏走到第五幕窗口里应该能看到带蓝色圆圈和分数值的模板识别结果分数明显高于 0.9 才算设置到位。一切正常后按 F11 启动。注意一个细节首局游戏脚本会输入/nopickup命令走路经过的地面物品默认不捡只有主动显示物品扫描时才允许拾取——这是防止走路角色误捡垃圾的保险不用手动干预。全程 F12 可随时强制叫停。一句话总结英雄选择界面 → F9 设置 → F10 验证 → F11 开跑四步完成第一次实战。 它为什么不会迷路像素识别的三层结构模板库整套游戏被拆成了几千张小照片src/template_finder.py 启动时会扫描 assets/templates/、assets/npc/ 等目录把每张 PNG 读入内存并按名字索引。之后每一帧截图都用 OpenCV 的模板匹配去和这些小照片比对匹配到第五幕传送门模板就知道该点它匹配到 Qual-Kehk 的立绘就触发对话流程。物品识别是同一套机制——物品名牌区域被切出来后与预录物品图比对再结合 OCR 读取属性。调试模式下这张机制图一目了然节点图把地图变成该走哪条边的问题assets/templates/trav/nodes/ 这类目录存放的是路径节点图。以崔凡克议会为例整张地图被拆成一串编号节点每个节点绑定了到达这里后该看哪个模板、往哪走、何时攻击的决策。src/pather.py 里的 Location 枚举定义了全部关键位置——从各幕城镇、仓库、传送点到每个 Boss 的入场、安全距离、出口。角色每前进一段脚本就重新匹配当前画面、在节点图上推进一格。导航因此变成查表 视觉确认而不是记坐标。坐标系统与 HUD 遮罩先排除干扰再谈精度画面里同时存在游戏世界和自己的界面血条、技能图标、药水栏每帧都在动如果一并参与匹配误报会非常多。Botty 的解法是一张 HUD 遮罩assets/hud_mask.png 即这张遮罩本身把界面区域从识别域中挖掉只让场景内容参与模板匹配和找最近非界面像素这类判断。与此同时src/screen.py 里维护着四层坐标Monitor 坐标以第一块显示器左上角为原点Screen 坐标以窗口为原点Absolute 坐标以屏幕中心也就是角色脚底为原点Relative 坐标则相对于某个已匹配模板。截图捕获带 40ms 缓存避免重复抓取鼠标动作坐标在四层之间自动换算多显示器布局也能稳定工作。一句话总结模板库提供记忆节点图提供地图遮罩和坐标层负责把干扰项从识别里剔除——三者叠加才构成可靠的视觉导航。⚙️ 参数调优真正值得动手的只有四组全部配置集中在 config/params.ini但新手只需要动下面几处其余保持默认。路线与 Build告诉 Bot 刷什么、谁在刷[general] difficultyhell ; 地狱难度 [routes] orderrun_pindle, run_eldritch_shenk ; 循环执行的路线 [char] typelight_sorc ; 角色 Build决定整套操作逻辑order可选 run_trav、run_pindle、run_eldritch、run_eldritch_shenk、run_nihlathak需传送、run_arcane需传送、run_diablo需传送仅锤丁randomize_runs1可打乱顺序。type决定加载哪个 Build 实现仓库已支持闪电法、冰爆法、新星法、九头蛇法、锤丁、天拳丁、陷阱刺、野蛮人、三种死灵和通用 Basic对应实现在 src/char/ 下。其中 char 段的casting_frames容易被忽略它按你的施法速度帧数决定每次施法后的等待时长数值偏小会打断施法、偏大则拖慢节奏建议按官方帧率断点表核对后再填。保命网把最坏情况变成自动回家chicken0.35 ; 血量低于 35% 自动回城 take_health_potion0.8 ; 血量高于 80% 才喝药避免过量 max_consecutive_fails5 ; 连续失败 5 次后停手chicken/merc_chicken控制玩家和佣兵各自的安全线max_game_length_s限制单局时长超时尝试重开新游戏彻底失败则重启 D2Rrestart_d2r_when_stuck1让卡死时自动拉起游戏info_screenshots1会在卡住、回城、超时、背包满时各存一张带时间戳的截图到 log 目录事后排查全靠它。这些参数组合起来就是无人值守四个字的技术含义任何单次意外都不该中断整晚的运行。custom.ini升级脚本不用重抄配置Botty 支持用一个 config/custom.ini 覆盖 params.ini 中的任意字段升级新版本时只带走这一个文件即可不必把旧版的修改重新移植[general] nameMyCustomName [routes] orderrun_pindle, run_eldritch一句话总结路线、Build、保命网三组参数决定它刷什么、怎么打、出事怎么办custom.ini 决定你升级时省多少事。 BNIP 拾取规则用一行语句决定捡什么地面物品拾取由 BNIPBotty NIP扩展自 Njaguar 的物品解析器驱动规则写在 config/default.nip把自定义 .nip 放进 config/bnip/ 目录即可替换默认文件。语法上你只需要认识几类条件[Name] Lumrune [Name] Zodrune ; 符文按字母序区间一次覆盖 Lum 到 Zod [Name] Scrolloftownportal ; 点名拾取传送门卷轴相比原始 NIPBNIP 有三个实用增强。[allres]直接匹配全抗性数值写[type] amulet [quality] unique [allres] 30就能只捡玛拉[idname]支持按暗金/套装名匹配比如[idname] thestoneofjordan代价是强制先鉴定想留未鉴定件要留意毒伤不再折算直接读原始值[poisonmindam] 5 [poisonmaxdam] 10即可精确命中5-10 点 1 秒毒伤。另外Discord 战利品通知可以在规则前加静默比如[type] ring避免普通戒指刷屏。一句话总结拾取策略全部外置成文本规则改一行 .nip 比改一行 Python 快得多也安全得多。 Bot 停下来不动了三个排查方向按出现概率从高到低排第一识别分数不够。先按 F10 进图形调试器开一局走到第五幕看模板识别分数和地面物品名牌。场景模板分数应稳定在 0.9 以上应被拾取的物品若没有红圈标记说明是亮度或图形设置漂移——回 F9 重跑自动设置并确认没有 HDR 之类程序在中间插一手。第二配置与角色错位。核对 config/params.ini 的type是否和实际 Build 一致、casting_frames是否匹配施法速度、各技能热键是否真的绑到了对应左右技能位。热键错位不会报错只会表现为该放的技能没放这类问题用 F10 观察动作时序最直观。第三状态无法恢复。连续失败超过max_consecutive_fails后 Bot 会主动停手此时去 log/screenshots 翻最近几张信息截图基本能定位到卡住的画面把restart_d2r_when_stuck设为 1 可以让它自行重启游戏继续配合break_length_m定时休息也能降低长时间运行的累积故障风险。一句话总结F10 看分数对不对对 settings 查热键翻截图看卡在哪——多数死机都能在这三步内定位。 想改代码三个入口的分工读源码不必通读记住三条主线即可。流程主线在 src/bot.py核心是一个状态机状态从 initialization、hero_selection、town 到各路线pindle、shenk、trav、nihlathak、arcane、diablo再回到 town跑完 end_run、end_game 收尾。src/main.py 则额外拉起死亡监控与健康监控两个线程一旦检测到死亡或回城就重启 Bot 线程——无人值守的兜底逻辑就在这里。Build 扩展线在 src/char/每个 Build 是一个继承 IChar 的类实现自己的技能循环与走位新职业照抄现有实现填热键逻辑即可。数据扩展线在资源目录想多捡一种物品截一张该物品名牌的图放进 assets/ 对应目录再把文件名加进配置即可路径节点、NPC 模板同理。development.md 里有关于新增物品和运行测试pytest的具体说明。一句话总结流程看 bot.py 状态机新 Build 进 src/char新物品和节点进 assets 资源目录。先跑通一次 Pindle 循环确认设置无误再逐条叠加路线、调保命参数、写自己的 .nip 规则。【免费下载链接】bottyD2R Pixel Bot项目地址: https://gitcode.com/gh_mirrors/bo/botty创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考