reset_and_stand.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. # -*- coding: utf-8 -*-
  2. """
  3. reset_and_stand.py —— 删两个矿工角色 → 重创同名 → quest_bot3 同款进世界 →
  4. 开喝药 → 走到矿场总兵(19,23)旁 → 原地站立报告坐标。
  5. 进世界完全复用 quest_bot3 的 enter_world(已验证可活的会话链)。
  6. """
  7. import argparse
  8. import json
  9. import random
  10. import sys
  11. import time
  12. import requests as rq
  13. import urllib3
  14. urllib3.disable_warnings()
  15. HERE = __file__.rsplit("/", 1)[0]
  16. sys.path.insert(0, HERE)
  17. import login_996pc as L # noqa: E402
  18. import cq2_pure_enter as P # noqa: E402
  19. from quest_bot3 import enter_world, log # noqa: E402
  20. def main():
  21. ap = argparse.ArgumentParser()
  22. ap.add_argument("-u", "--user", default="longwu988")
  23. ap.add_argument("-p", "--password", default="Longwu1988")
  24. ap.add_argument("--zone", type=int, required=True)
  25. ap.add_argument("--name", default="矿工7268")
  26. ap.add_argument("--stand-seconds", type=float, default=120)
  27. a = ap.parse_args()
  28. log("[1/4] HTTP登录...")
  29. s = rq.Session()
  30. j = None
  31. for att in range(5):
  32. try:
  33. j, _ = L.do_login(s, a.user, a.password)
  34. if j.get("code") == 200:
  35. break
  36. except Exception as e:
  37. log(f" 异常({att+1}): {str(e)[:60]}")
  38. time.sleep(10)
  39. if not j or j.get("code") != 200:
  40. raise SystemExit("[!] 登录失败")
  41. jwt = j["data"]["token"]
  42. uid = str(j["data"]["userInfo"]["id"])
  43. log("[2/4] 删除旧角色(矿工7268/矿工2934)...")
  44. from reset_role_lib import delete_roles
  45. delete_roles(a.zone, a.user, a.password, ["矿工7268", "矿工2934"])
  46. # 删角落库有延迟, 同名重创需静置(git log: "522 recovery - settle pause")
  47. log(" 删角完成, 静置 8s 等落库...")
  48. time.sleep(8)
  49. log(f"[3/4] quest_bot3 同款进世界, 重创 {a.name}...")
  50. g = bot = None
  51. for att in range(3):
  52. try:
  53. g, bot = enter_world(s, jwt, uid, a.zone, a.name, 0)
  54. break
  55. except SystemExit as e:
  56. log(f" 进世界尝试{att+1}: {e}")
  57. time.sleep(10)
  58. if not bot:
  59. raise SystemExit("[!] 进世界失败")
  60. try:
  61. log(f" 出生: map={bot.me.get('mapname')} @({bot.me['x']},{bot.me['y']})")
  62. log(" 开喝药...")
  63. st = P.enable_auto_heal(g, sid=bot.sid, want_on=True) if hasattr(P, "enable_auto_heal") else None
  64. log(f" 喝药={st}")
  65. log("[4/4] 走向矿场总兵(19,23)旁...")
  66. n = 0
  67. while not (abs(bot.me["x"] - 19) <= 2 and abs(bot.me["y"] - 23) <= 2) and n < 80 and bot.alive:
  68. moved, arrived = bot.walk_step_toward(19, 23)
  69. bot.pump(0.4)
  70. if not moved:
  71. log(f" 走步{n}: 未移动 me=({bot.me['x']},{bot.me['y']})")
  72. time.sleep(0.5)
  73. n += 1
  74. time.sleep(0.6)
  75. log(f" 到位: ({bot.me['x']},{bot.me['y']}) 距(19,23) "
  76. f"dx={abs(bot.me['x']-19)} dy={abs(bot.me['y']-23)}")
  77. log(f"[站] 原地站立 {a.stand_seconds}s — 角色名【{a.name}】, 请在客户端确认")
  78. t_end = time.time() + a.stand_seconds
  79. k = 0
  80. while time.time() < t_end and bot.alive:
  81. bot.pump(1.0)
  82. k += 1
  83. if k % 5 == 0:
  84. log(f" t+{k}s @({bot.me['x']},{bot.me['y']}) 心跳={bot.frame_log.get(60000,0)}")
  85. log(f"[完] 存活={bot.alive} 帧统计={sorted(bot.frame_log.items(), key=lambda kv: -kv[1])[:10]}")
  86. finally:
  87. g.close()
  88. if __name__ == "__main__":
  89. main()