俄钓4脚本鱼护满自动卖鱼的触发时机与阈值校准(2026-10-27)
核心判断:不要重写卖鱼路线,复用 goToMap() 既有闭环 + 「重启」机制才是正解。 因为 goToMap() 里早已内置完整卖鱼链路(relogin→咖啡厅→鱼市→卖鱼→复位→回钓点),只是只在程序启动/重启时跑一次;挂机中途鱼护满了根本不会触发它。
一、缺口定位与上游排查
需求硬缺口:goToMap() 的卖鱼闭环只在「进入地图前」执行,日常挂机时鱼护满了不会触发——这就是唯一未满足的需求。
先做上游排查。我按 GitHub API 实测了所有候选(不是看搜索摘要),逐个克隆后做代码级比对:
- changchang700(233 提交,2025-11-05)✅ 已是全家族最新
- Acker777 | 2025-10-31 | ❌ 换过去是倒退
- lzsforge | 代码停在 2025-12-31 | ⚠️ 只有小幅增量
- fyodorrss(真上游)| 404 已删库 | ❌
- smluntan/RussianFishing4-Tool | 2026-06-28 | ❌ 反编译产物+致命逻辑错误
- dereklee0310 RF4S | 2026-10 活跃 | ❌ 只有 en/ru 界面
结论已清晰:现有 rf4_cc 已是全网最优,不要换源。 changchang700 那 233 个提交已包含 fyodorrss 上游全部历史(含 11-02 "ui"、11-15 的画面要求更新)。真正停更的是上游仓库被删库。Acker777 与基线差异只有 gui_config.py 89 行——纯 GUI 主题美化,无功能价值。
二、方案设计:复用而非重写
关键洞察:缺的只是挂机中途的鱼护计数触发器。方案定型:新增独立模块 stages/keepnet_sell.py,承担三件事——① 鱼护计数检查(节流+OCR)② 复用 goToMap() 已验证的卖鱼路线 ③ 触发重启卖鱼闭环。
| 环节 | 做法 |
|---|---|
| 计数来源 | get_fish_count_other()(OCR 读 HUD 鱼护 X/Y,无需开界面) |
| 触发点 | lure()/bottom() 的 throw_rod() 里,抛竿前检查(安全时机,不会打断搏鱼) |
| 阈值 | 新增 config.KEEPNET_SELL_RATIO(默认 0.8)+ 绝对值下限,防小鱼护误触发 |
| 执行 | 复用「重启」机制:达阈值 → 触发重启 → goToMap() 自动完成卖鱼+复位+回钓点 |
| 失败熔断 | 基于「上次触发时的数量」判定成败;最多尝试 3 次后停止 |
三、OCR 读取与坐标校准
关键疑点:region_fish_quantity 在 (2165, 967)——这是 2560 宽的副屏绝对坐标(右侧 HUD)。屏幕 2800×1260,HUD 鱼护计数区域存在,可 OCR。
决定性证据:日志显示卖鱼链路实际跑过,且暴露了严重问题——鱼护容量是 100(不是我假设的小值);「退出咖啡厅出错」刷了上百次——死循环。完整时序拿到了:卖鱼全流程实测通过(21:45:57 重登成功 → 21:46:43 退出咖啡厅 → 21:47:03 退出鱼市 → 21:47:04 回钓点)。总耗时约 67 秒。
关键数据点:鱼护容量 100,且卖鱼时鱼护只有 21 条——说明原作者是定期清护(配合 3 小时休息),不是满护才卖。现在按真实数据重新校准阈值设计。80% = 80 条才卖,太晚。
四、实现细节与陷阱规避
OCR 内部已自动应用偏移(第 81-87 行)。我的 read_keepnet_count() 又手动加了一次偏移——虽然当前 OFFSET 为 0 无害,但切档案时会双重偏移导致读错位置。立即修正。
goToMap() 若 get_fish_count_other() 返回 None,会 continue 死循环(第 838 行)。这是既有缺陷,但在重启路径下风险放大。加一个有限的失败计数保护——只在这个循环里加,不动其它逻辑。
熔断逻辑完全正确:最多尝试 3 次,之后停止。此前「失败」是我的测试期望值写错(写成 2),代码是对的。触发时不做判断(无法立即知道结果),而是在下一次检查时,用「当前数量 vs 上次触发数量」来判定成败。
五、GUI 配置持久化与加载路径
save_config_to_file() 是白名单式写入——不在列表里的键会丢失。我的新配置项如果不加进去,GUI 保存时会消失。加载端用 data.get(key, 默认值) ——安全,缺 key 会回落 config.py 的默认值。补齐两端,保证 GUI 保存后配置不丢。
又抓到一个真实 bug:_skip_mode_warned 在函数内被读取时,Python 判定它是局部变量(因为 global 声明里漏了它),导致 UnboundLocalError。这正是"仅水底/仅路亚"模式下会每次抛竿都崩溃的严重问题。立即修复。
六、实战验证闭环
完整闭环已在实战中验证通过:
1 | 21:47:03 鱼市已退出(卖鱼完成) |
从触发到恢复挂机全程 约 3 分钟。方案成立。
GUI 完全正常,验证通过:
- ✅ 复选框行末尾:「鱼护满自动卖鱼」 已勾选(显示 ☑)
- ✅ 「鱼护自动卖鱼设置」 分组框完整显示:触发比例
0.8、最少条数10、检查间隔120,说明文字清晰 - ✅ 无重叠、无截断、布局规整
- ✅ 配置已正确加载:
自动模式=全天路亚-换点-卖鱼、路亚地图=埃尔克湖、点位编号=65,93— 与实际使用场景完全一致
七、改动清单与遗留
| 文件 | 改动 |
|---|---|
stages/keepnet_sell.py |
新增 272 行,核心模块(计数检查+触发重启) |
corestages/corestages_bottom_lure.py |
lure()/bottom() 的抛竿前接入 keepnet_sell 检查 |
config.py / GUI |
补齐白名单两端;新增 KEEPNET_SELL_RATIO 等配置项 |
遗留:模式 3/4(仅水底/仅路亚)静默跳过时没有任何日志——用户会困惑。已加一条提示日志。若 HUD 读不到容量,用一次面板读取来建立容量缓存——此兜底通道默认关闭,改为纯 HUD 读取;若 HUD 读不出容量,用一次面板读取建立容量缓存,之后靠缓存。