| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- #!/usr/bin/env python3
- """diag_5012_monster_probe.py — CS5012 小地图怪物请求探针.
- 目的: 验证本服 CS5012(body=协议图名)→SC5012 响应格式(全图怪坐标 JSON).
- 背景: 本服不下发怪物 SC10, 静止怪对协议端不可见(SC11 只广播移动怪) —
- 客户端 MiniMapProxy:RequestMonsters 是合法主动查询通道.
- 用法: uv run python scripts/diag_5012_monster_probe.py -u longwu988 \
- -p Longwu1988 --zone 14570166 --name 新角色 [--seconds 60]
- """
- from __future__ import annotations
- import argparse
- import logging
- import sys
- import time
- sys.path.insert(0, "scripts")
- from run_juece13_mine_farthest import ( # noqa: E402
- MINE_MAP, MineEnterBehavior, setup_logging, banner,
- )
- from run_juece13_wugong_autofight import AutoFightBehavior # noqa: E402
- import requests
- from pbot.bot.runner import pump, run
- from pbot.config import Account
- from pbot.errors import PbotError
- from pbot.game.messages import protocol_map_name
- from pbot.game.session import enter_world
- from pbot.login.box_client import enter_game_client, login
- from pbot.transport.gateway import login_gate_with_retry
- from pbot.types import ZoneId
- _LOG = logging.getLogger("probe5012")
- def main() -> int:
- ap = argparse.ArgumentParser()
- _ = ap.add_argument("-u", "--user", required=True)
- _ = ap.add_argument("-p", "--password", required=True)
- _ = ap.add_argument("--zone", type=int, required=True)
- _ = ap.add_argument("--name", required=True)
- _ = ap.add_argument("--seconds", type=float, default=60.0)
- a = ap.parse_args()
- setup_logging()
- banner("[0] 5012 怪物雷达探针: 区=%d 角色=%s", a.zone, a.name)
- http = requests.Session()
- http.trust_env = False
- http.verify = False
- jwt, uid = login(Account(username=a.user, password=a.password))
- _ = enter_game_client(http, jwt, ZoneId(a.zone))
- key32, sid, real_name, ticket_key, game_port = login_gate_with_retry(
- ZoneId(a.zone), jwt, uid, a.name, (8021, 8061, 8001, 8041))
- stop: list[bool] = [False]
- conn, world, updater = enter_world(ZoneId(a.zone), real_name, ticket_key,
- sid, game_port, uid, stop=stop)
- _LOG.info("[✓] 出生 map=%s @(%d,%d) uid=%s", world.me.map_name,
- world.me.x, world.me.y, world.me.uid)
- try:
- if world.me.map_name != MINE_MAP:
- banner("[1] 传送比奇矿区")
- bh = MineEnterBehavior(sid=sid, kill_target=0)
- r = run(conn, world, updater, bh, duration_s=300.0)
- if world.me.map_name != MINE_MAP:
- _LOG.error("[✗] 传送失败 result=%s", r.value)
- return 1
- time.sleep(3.0)
- _ = pump(conn, world, updater, 2.0)
- mn = protocol_map_name(world.me.map_id, world.me.map_name)
- _LOG.info("[发送] CS5012 body=%r", mn)
- _ = conn.send_frame(5012, 0, 0, 0, 0, mn.encode())
- deadline = time.time() + a.seconds
- n5012 = 0
- while time.time() < deadline:
- frames = pump(conn, world, updater, 0.5)
- for f in frames:
- if f.msg_id == 5012:
- n5012 += 1
- _LOG.info("[SC5012] recog=%d p1=%d p2=%d body=%r",
- f.recog, f.p1, f.p2, f.body[:400])
- _LOG.info("[结束] 5012 响应 %d 帧", n5012)
- return 0 if n5012 else 1
- finally:
- stop[0] = True
- conn.close()
- _LOG.info("连接已关闭")
- if __name__ == "__main__":
- try:
- sys.exit(main())
- except PbotError as e:
- _LOG.error("失败: %s", e.detail)
- sys.exit(1)
|