# -*- coding: utf-8 -*- """ run_zone19_create_kill.py —— 一键脚本: 登录 → 逐鹿19区创角 → 进游戏 → 开喝药 → 到比奇大城 → 杀3怪 用法: .venv/bin/python run_zone19_create_kill.py [--name 角色名] [--kill 3] [--minutes 3] """ import argparse import json import os import random import socket import sys import threading import time import requests as rq import urllib3 urllib3.disable_warnings() HERE = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, HERE) from encode6bitbuf_final import encode6, decode6 # noqa: E402 import login_996pc as L # noqa: E402 import cq2_pure_enter as P # noqa: E402 from combat_bot import CombatBot, send_init_frames, DIRS, log, pack_point, lo16, hi16, proto_map_name, enter_game_gate_v2 # noqa: E402 from mir_map import load as map_load # noqa: E402 from quest_bot3 import PushBot, run_fsm # noqa: E402 # 逐鹿19区 server id (serverlist.json 中逐鹿19区) ZONE_19 = 14504561 def main(): ap = argparse.ArgumentParser() ap.add_argument("-u", "--user", default="longwu988") ap.add_argument("-p", "--password", default="Longwu1988") ap.add_argument("--zone", type=int, default=ZONE_19) ap.add_argument("--name", default=None) ap.add_argument("--port", type=int, default=0) ap.add_argument("--kill", type=int, default=3) ap.add_argument("--minutes", type=float, default=5.0) args = ap.parse_args() # 1. 登录 print(f"[1/6] 登录 {args.user} ...", flush=True) s = rq.Session() j, _ = L.do_login(s, args.user, args.password) if j.get("code") != 200: raise SystemExit(f"[!] 登录失败: {j.get('msg')}") jwt = j["data"]["token"] uid = (j["data"].get("userInfo") or {}).get("id") or P.UID print(f" uid={uid}", flush=True) # 2. 随机名字 name = args.name or ("萌新" + str(random.randint(1000, 9999))) print(f"[2/6] 角色名: {name}", flush=True) # 3. EnterGameClient (zone) print(f"[3/6] EnterGameClient(zone={args.zone})...", flush=True) r = P.enter_game(s, jwt, args.zone) if r.get("code") != 200: raise SystemExit(f"[!] 进区失败: {r.get('msg')}") # 4. 登录服握手+创角 print(f"[4/6] 登录服握手+创角...", flush=True) ports = [args.port] if args.port else [8041, 8021, 8061, 8001] key32 = sid = tkey = game_port = None got_name = None for pt in ports: try: key32, sid, rname, tkey, game_port = P.login_gate( args.zone, jwt, name, pt, uid) if key32: got_name = rname print(f" 登录端口={pt} 角色={rname} 游戏端口={game_port}", flush=True) break except SystemExit as e: print(f" 端口{pt}失败: {e}", flush=True) except Exception as e: print(f" 端口{pt}失败: {str(e)[:80]}", flush=True) if not key32: raise SystemExit("[!] 所有候选端口失败") name = got_name or name # 5. 用 v2 协议连游戏服(避免 SC658 不下发) print(f"[5/6] 连接游戏服 (v2)...", flush=True) g = enter_game_gate_v2(args.zone, name, tkey, sid, game_port, uid) bot = PushBot(g, sid, name) P.heartbeat_loop(g, sid, bot.lock) # 等 SC658 t0 = time.time() while time.time() - t0 < 12: bot.pump(0.3) if 658 in bot.frame_log: break if 658 not in bot.frame_log: g.close() raise SystemExit("[!] SC658 超时, 世界未初始化") print(f" SC658 ✓ ({time.time()-t0:.1f}s)", flush=True) # 6. 发送 17 帧初始化 send_init_frames(bot, uid) for _ in range(24): bot.pump(0.5) if bot.me["id"] and bot.me.get("mapname"): break log(f"进世界: map={bot.me.get('mapname')} @{bot.me['x']},{bot.me['y']} uid={bot.me.get('uid')}") # 7. 跑 run_fsm — 内部会触发 喝药/CS3031/renwu_mov→等待地图→NPC→比奇大城→杀怪 kills = run_fsm(bot, g, args.kill, args.minutes) log(f"[完成] kills={kills}") return kills if __name__ == "__main__": main()