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

fix(review): 终审修复波 — F1 af._dir8→kill._heading_to(潜伏崩溃), I1 rejected移动恢复清零, I2 updater线程安全注钉, M8 bootstrap→PbotError

wuzilong 1 месяц назад
Родитель
Сommit
6dfdc1ab1a

+ 6 - 5
pipeline_bot/pipeline/bootstrap.py

@@ -12,6 +12,7 @@ import requests
 
 from pbot.codec.bitbuf import decode6, encode6
 from pbot.config import Account, RoleSpec
+from pbot.errors import PbotError
 from pbot.game.session import enter_world
 from pbot.login.box_client import enter_game_client, login
 from pbot.login.zone_ports import fetch_zone_ports
@@ -46,7 +47,7 @@ def _pick_latest_zone_tuple() -> tuple[float, str, int]:
     r = s.get(SERVERLIST_URL, timeout=20)
     m = re.search(r"\{.*\}", r.text, re.DOTALL)
     if not m:
-        raise RuntimeError("区列表拉取失败")
+        raise PbotError(detail="区列表拉取失败")
     data = typed_json(json.loads(m.group(0)))  # pyright: ignore[reportAny]
     best: list[tuple[float, str, int]] = []
 
@@ -67,7 +68,7 @@ def _pick_latest_zone_tuple() -> tuple[float, str, int]:
 
     walk(data)
     if not best:
-        raise RuntimeError("无已开新区")
+        raise PbotError(detail="无已开新区")
     return max(best)
 
 
@@ -128,7 +129,7 @@ def _delete_all_roles(zone: ZoneId, jwt: str, uid: int,
             except TransportError as e:
                 _LOG.warning("端口 %d 连接失败: %s", port, e)
         if conn is None:
-            raise RuntimeError("删角: 登录服全端口连接失败")
+            raise PbotError(detail="删角: 登录服全端口连接失败")
         try:
             roles = _fetch_role_list(conn, zone, jwt, uid)
             lst = roles if isinstance(roles, list) else []
@@ -166,7 +167,7 @@ def _fetch_role_list(conn: GatewayConnection, zone: ZoneId, jwt: str,
         if f.msg_id == 529:
             key32 = decode6(f.body).split(b"/")[0]
     if not key32:
-        raise RuntimeError("拉列表: 无 SC529")
+        raise PbotError(detail="拉列表: 无 SC529")
     _ = conn.send_frame(104, 0, 0, 0, 0, encode6(key32), tail=1)
     sid = 0
     for f in conn.recv_frames(4):
@@ -226,7 +227,7 @@ def bootstrap_session(user: str, password: str, woma_minutes: float,
         # 的旧角色) — 新手流水线要求全新角色, 静默换角属错误会话, 交操作员裁决
         msg = (f"角色不符: 请求={role} 实际={real_name} — 账号在该区已有其他角色,"
                f"请先删角(--reset 流程)或指定该角色名")
-        raise RuntimeError(msg)
+        raise PbotError(detail=msg)
 
     stop: list[bool] = [False]
     conn, world, updater = enter_world(zone, real_name, ticket_key,

+ 2 - 1
pipeline_bot/pipeline/tasks/t02_biqi_kill20.py

@@ -82,7 +82,8 @@ def _try_spawn(ctx: PipelineContext, af: AutoFightBehavior,
     if dist > _SPAWN_TALK_DIST:
         if now - last.get("step_t", 0.0) < 0.7:
             return True
-        d = af._dir8(me.x, me.y, snpc.x, snpc.y)  # noqa: SLF001
+        from pbot.bot.kill import _heading_to
+        d = _heading_to(me.x, me.y, snpc.x, snpc.y)
         dx, dy = WDIRS[d]
         stride = 2 if dist > 4 else 1
         mn = protocol_map_name(me.map_id, me.map_name)

+ 13 - 6
pipeline_bot/scripts/run_juece13_wugong_autofight.py

@@ -21,13 +21,17 @@ import sys
 import time
 
 sys.path.insert(0, "scripts")
-from run_juece13_mine_farthest import (  # noqa: E402
-    DIR_VECS, MirWalkExecutor, setup_logging, banner,
+import requests
+from run_juece13_mine_farthest import (
+    DIR_VECS,
+    banner,
+    setup_logging,
 )
-from run_juece13_wugong_farthest import (  # noqa: E402
-    CAVE_MAP, CaveEnterBehavior, _cave_walls, find_farthest,
+from run_juece13_wugong_farthest import (
+    CAVE_MAP,
+    CaveEnterBehavior,
+    _cave_walls,
 )
-import requests
 
 from pbot.bot.behavior import Behavior, TickResult
 from pbot.bot.pathfind import LearnedGrid, astar
@@ -318,7 +322,10 @@ class AutoFightBehavior(Behavior):
                 if self.rejected % 8 == 0:
                     moved = (world.me.x, world.me.y) != \
                         self._anchor_stuck_pos
-                    if not moved:
+                    if moved:
+                        # 恢复移动 = 风暴已解, 清残留计数(否则跨场次误触发弃目标)
+                        self.rejected = 0
+                    else:
                         self._stuck_silence_until = now + 4.0
                         if self.rejected >= 16:
                             _LOG.warning("[锚点卡死] 拉回 %d 次位置不变 — "

+ 2 - 0
pipeline_bot/src/pbot/game/heal.py

@@ -66,6 +66,8 @@ def _read_heal_state(conn: GatewayConnection, world: WorldMirror,
     return _state_from_panels(world)
 
 
+# 线程安全前提(终审 I2 钉死): WorldUpdater 无可变会话态(仅 SC634 宽限
+# 时间戳), 与心跳线程共享单例安全 — 若未来给 Updater 加会话态须改每调用实例
 _UPDATER = WorldUpdater()