|
|
@@ -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)
|