Просмотр исходного кода

feat(t02): 落地比奇即点【点我刷怪】(不论报错) — 视野有远怪时无怪5s永不触发, 院落清空后角色跑远而落点NPC从未被点(spawn6实证)

wuzilong 1 месяц назад
Родитель
Сommit
c3859e9972
1 измененных файлов с 24 добавлено и 3 удалено
  1. 24 3
      pipeline_bot/pipeline/tasks/t02_biqi_kill20.py

+ 24 - 3
pipeline_bot/pipeline/tasks/t02_biqi_kill20.py

@@ -18,7 +18,6 @@ import json
 import re
 import time
 
-from pbot.world.actor import Npc
 from pipeline.ctx import PipelineContext, TaskResult
 
 TASK_TITLE = "T2 比奇大城杀怪20"
@@ -101,6 +100,28 @@ def _try_spawn(ctx: PipelineContext, af, last: dict) -> bool:
     return True
 
 
+def _spawn_on_land(ctx: PipelineContext, af, last: dict,
+                   tag: str = "") -> None:
+    """落地即点一次【点我刷怪】: 走到 NPC → 开对话 → 点确认 → 立即返回。
+
+    不论服务器报"已有怪物"还是其他错误都无碍 — 点完即继续正常杀怪
+    (2026-10-01 用户定案: 落地必点, 不等无怪窗口)。视野推送范围大于
+    贴身杀怪圈, "无怪5秒"条件在有远怪时永不成立, 曾致院落清空后角色
+    跑远追怪而落点旁的刷怪 NPC 从未被点(spawn6 实证)。
+    """
+    from pbot.bot.runner import pump
+
+    world = ctx.world
+    deadline = time.time() + 25.0
+    while time.time() < deadline:
+        _ = pump(ctx.conn, world, ctx.updater, 0.1)
+        _ = _try_spawn(ctx, af, last)
+        if last.get("dlg_clicked"):
+            ctx.log.info("[%s·落地刷怪] 已点过一次 — 继续杀怪", tag)
+            return
+    ctx.log.info("[%s·落地刷怪] 25s 未完成(NPC不在视野?) — 继续杀怪", tag)
+
+
 def run_task(ctx: PipelineContext) -> TaskResult:
     """进比奇(renwu 链) → AutoFight 轮次杀满 20 只; 无怪点刷怪 NPC。"""
     import sys
@@ -150,12 +171,12 @@ def run_task(ctx: PipelineContext) -> TaskResult:
         need = KILL_TARGET - total
         af = AutoFightBehavior(sid=ctx.sid, map_name=BIQI_MAP, walls=walls,
                                farthest_fn=None, kill_goal=need)
-        # 无怪刷怪监督循环: 替代 run() 的裸驱动, 在 AutoFight 决策外围
-        # 注入"视野无怪 15s → 点刷怪 NPC"逻辑(有怪时 AutoFight 自己接管)
+        # 落地即点一次刷怪(不论报错) + 无怪5s再点: 双保险
         af.on_enter(ctx.conn, ctx.world)
         time.sleep(3.0)  # 落地静置: 洗 M2 移动超速计数(spawn5 实证)
         _ = pump(ctx.conn, ctx.world, ctx.updater, 0.5)
         last: dict[str, float | bool] = {"no_mon_t": 0.0, "spawn_cd": 0.0}
+        _spawn_on_land(ctx, af, last, tag=f"T2第{rnd}轮")
         deadline = time.time() + max(600.0, need * 60.0)
         while time.time() < deadline:
             _ = pump(ctx.conn, ctx.world, ctx.updater, 0.05)