Skip to content

Commit 9f452d0

Browse files
authored
Merge pull request #33 from EFrostBlade:feature/auto-fish-task
fix(AutoFishTask): 优化授渔以鱼轮数统计和移除鱼条静止检测
2 parents 8a44358 + 61a4aa3 commit 9f452d0

1 file changed

Lines changed: 37 additions & 43 deletions

File tree

src/tasks/AutoFishTask.py

Lines changed: 37 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class AutoFishTask(DNAOneTimeTask, BaseDNATask):
1616
def __init__(self, *args, **kwargs):
1717
super().__init__(*args, **kwargs)
1818
self.name = "自动钓鱼"
19-
self.description = "无悠闲全自动钓鱼 (作者: B站无敌大蜜瓜),如果识别不到鱼条修改配置降低面积要求"
19+
self.description = "无悠闲全自动钓鱼 (原作者: B站无敌大蜜瓜),如果识别不到鱼条修改配置降低面积要求"
2020

2121
# 默认配置(会被 configs/AutoFishTask.json 覆盖)
2222
self.default_config.update(
@@ -213,6 +213,13 @@ def phase_start(self) -> bool:
213213
logger.info("检测到fish_chance(授渔以鱼)-> 按下E键使用授渔以鱼抛竿")
214214
self.stats["chance_used"] = self.stats.get("chance_used", 0) + 1
215215
self.info_set("授渔以鱼", self.stats["chance_used"])
216+
# 上一轮的鱼被用作鱼饵,不计入轮数
217+
if self.stats["rounds_completed"] > 0:
218+
self.stats["rounds_completed"] -= 1
219+
self.info_set("完成轮数", self.stats["rounds_completed"])
220+
logger.info(
221+
f"上一轮的鱼作为鱼饵,轮数调整为: {self.stats['rounds_completed']}"
222+
)
216223
self.send_key("e", down_time=0.06)
217224
elif not has_cast_icon:
218225
logger.info("开始阶段未找到fish_cast,尝试按空格抛竿并等待fish_bite出现")
@@ -279,8 +286,6 @@ def phase_fight(self) -> bool:
279286

280287
# 硬编码的常量
281288
BAR_MISSING_TIMEOUT = 2.5 # 鱼条丢失超时
282-
BAR_STATIC_TIMEOUT = 2.5 # 鱼条静止超时
283-
MOVE_THRESHOLD = 5 # 静止判定阈值(像素)
284289
MERGE_GRACE_SECONDS = 0.20 # 合并宽限时间
285290

286291
# 运行时状态
@@ -289,8 +294,6 @@ def phase_fight(self) -> bool:
289294
last_known_icon_y_relative = 0.0
290295

291296
bar_missing_start_time = None
292-
last_bar_position = None
293-
last_bar_move_time = time.monotonic()
294297
merge_start_time = None
295298

296299
def set_hold(target_hold: bool):
@@ -330,27 +333,6 @@ def set_hold(target_hold: bool):
330333
else:
331334
bar_missing_start_time = None
332335

333-
# 检查鱼条是否静止
334-
if has_bar:
335-
if last_bar_position is None:
336-
last_bar_position = bar_center
337-
last_bar_move_time = now
338-
else:
339-
distance = (
340-
(bar_center[0] - last_bar_position[0]) ** 2
341-
+ (bar_center[1] - last_bar_position[1]) ** 2
342-
) ** 0.5
343-
if distance > MOVE_THRESHOLD:
344-
last_bar_position = bar_center
345-
last_bar_move_time = now
346-
elif now - last_bar_move_time >= BAR_STATIC_TIMEOUT:
347-
logger.info(
348-
f"鱼条静止超过 {BAR_STATIC_TIMEOUT}s -> 溜鱼结束"
349-
)
350-
return True
351-
else:
352-
last_bar_position = None
353-
354336
# 主控制逻辑:两层控制系统
355337
if has_bar and bar_rect:
356338
bar_top = bar_rect[1]
@@ -473,24 +455,36 @@ def run(self):
473455
# main loop: start -> fight -> end
474456
while True:
475457
try:
476-
# 检查是否达到目标轮数
458+
# 检查是否达到目标轮数(在phase_start之前检查,因为可能会遇到授渔以鱼导致轮数减少)
477459
if max_rounds > 0 and self.stats["rounds_completed"] >= max_rounds:
478-
elapsed_time = time.time() - self.stats["start_time"]
479-
hours = int(elapsed_time // 3600)
480-
minutes = int((elapsed_time % 3600) // 60)
481-
seconds = int(elapsed_time % 60)
482-
483-
logger.info("=" * 50)
484-
logger.info(
485-
f"✓ 已完成目标轮数: {self.stats['rounds_completed']} 轮"
486-
)
487-
logger.info(f"✓ 总耗时: {hours:02d}:{minutes:02d}:{seconds:02d}")
488-
if self.stats["rounds_completed"] > 0:
489-
avg_time = elapsed_time / self.stats["rounds_completed"]
490-
logger.info(f"✓ 平均每轮: {avg_time:.1f} 秒")
491-
logger.info("自动钓鱼任务完成!")
492-
logger.info("=" * 50)
493-
break
460+
# 需要再执行一次phase_start来检查是否有授渔以鱼
461+
# 如果有授渔以鱼,上一轮不计数,需要继续
462+
463+
# 临时检查授渔以鱼
464+
has_chance_icon, _ = self.find_fish_chance()
465+
if has_chance_icon:
466+
logger.info("检测到授渔以鱼,上一轮不计数,继续钓鱼...")
467+
# 轮数会在phase_start中自动减1
468+
else:
469+
# 确实完成了目标轮数
470+
elapsed_time = time.time() - self.stats["start_time"]
471+
hours = int(elapsed_time // 3600)
472+
minutes = int((elapsed_time % 3600) // 60)
473+
seconds = int(elapsed_time % 60)
474+
475+
logger.info("=" * 50)
476+
logger.info(
477+
f"✓ 已完成目标轮数: {self.stats['rounds_completed']} 轮"
478+
)
479+
logger.info(
480+
f"✓ 总耗时: {hours:02d}:{minutes:02d}:{seconds:02d}"
481+
)
482+
if self.stats["rounds_completed"] > 0:
483+
avg_time = elapsed_time / self.stats["rounds_completed"]
484+
logger.info(f"✓ 平均每轮: {avg_time:.1f} 秒")
485+
logger.info("自动钓鱼任务完成!")
486+
logger.info("=" * 50)
487+
break
494488

495489
if not self.phase_start():
496490
self.sleep(1.0)

0 commit comments

Comments
 (0)