| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- #!/usr/bin/env python3
- """run_juece13_mine_kill100.py — 角色【新角色】→ 比奇矿区自动战斗杀 100 只.
- 复用 AutoFightBehavior(地图参数化) + 盟重传送员矿区链(@jiuxian_move_1,1,1)。
- 矿区怪弱(dmg 3-14) — 数值适配 25-26 级战士, 预期长期挂机。
- 用法:
- uv run python scripts/run_juece13_mine_kill100.py -u longwu988 -p Longwu1988 \
- --zone 14570166 --name 新角色 [--kills 100] [--minutes 90] [--wait 90]
- """
- from __future__ import annotations
- import argparse
- import logging
- import sys
- import time
- sys.path.insert(0, "scripts")
- import requests
- from run_juece13_mine_farthest import (
- MINE_MAP,
- MineEnterBehavior,
- _d401_walls,
- banner,
- find_farthest,
- setup_logging,
- )
- from run_juece13_wugong_autofight import AutoFightBehavior
- from pbot.bot.runner import pump, run
- from pbot.config import Account
- from pbot.errors import PbotError
- 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.login.zone_ports import resolve_zone_gateway
- from pbot.types import ZoneId
- _LOG = logging.getLogger("juece13_mine100")
- def parse_args() -> argparse.Namespace:
- """命令行."""
- 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("--kills", type=int, default=100)
- _ = ap.add_argument("--minutes", type=float, default=90.0)
- _ = ap.add_argument("--wait", type=float, default=0.0,
- help="进图后原地等待秒数(收帧+心跳, 不移动不攻击)")
- _ = ap.add_argument("--login-port", type=int, default=0)
- return ap.parse_args()
- def main() -> int:
- """登录 → 矿区 → 自动战斗至 N 杀或超时 → 退出."""
- a = parse_args()
- setup_logging()
- banner("[0] 矿区自动战斗: 区=%d 角色=%s 目标=%d杀 时限=%.0fmin 等待=%.0fs",
- a.zone, a.name, a.kills, a.minutes, a.wait)
- 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))
- gw_host, conn_port, real_port = (("", a.login_port, a.login_port)
- if a.login_port else resolve_zone_gateway(a.zone))
- ports = (conn_port,)
- key32, sid, real_name, ticket_key, game_port = login_gate_with_retry(
- ZoneId(a.zone), jwt, uid, a.name, ports, host=gw_host, real_port=real_port)
- _LOG.info("[票据] sid=%d 角色=%s 游戏端口=%d", sid, real_name, game_port)
- stop: list[bool] = [False]
- conn, world, updater = enter_world(ZoneId(a.zone), real_name, ticket_key,
- sid, game_port, uid, stop=stop, host=gw_host)
- _LOG.info("[✓] 出生 map=%s @(%d,%d)", world.me.map_name, world.me.x,
- world.me.y)
- try:
- from pbot.game.heal import enable_auto_heal
- state = None
- for _ in range(2):
- state = enable_auto_heal(conn, sid, want_on=True, world=world)
- if state == "on":
- break
- _LOG.warning("[喝药✗] 状态=%s — 重试一轮", state)
- time.sleep(1.0)
- _LOG.info("[喝药] %s", state)
- 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)
- if a.wait > 0:
- banner("[2] 原地等待 %.0f 秒(仅心跳+收帧)", a.wait)
- deadline = time.time() + a.wait
- while time.time() < deadline:
- _ = pump(conn, world, updater, 0.5)
- _LOG.info("[等待✓] hp=%d/%d 视野怪=%d 位置=(%d,%d) map=%s",
- world.me.hp, world.me.max_hp,
- len(world.monsters), world.me.x, world.me.y,
- world.me.map_name)
- banner("[3] 自动战斗: 目标 %d 杀", a.kills)
- af = AutoFightBehavior(
- sid=sid, map_name=MINE_MAP, walls=_d401_walls(),
- farthest_fn=find_farthest, kill_goal=a.kills)
- r = run(conn, world, updater, af, duration_s=a.minutes * 60)
- _LOG.info("[结束] result=%s 击杀=%d/%d 腿=%d 弹回=%d 位置=(%d,%d) "
- "hp=%d/%d map=%s",
- r.value, af.kills, a.kills, af.legs, af.rejected,
- world.me.x, world.me.y, world.me.hp, world.me.max_hp,
- world.me.map_name)
- return 0 if af.kills >= a.kills 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)
|