| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- # -*- 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()
|