news 2026/10/7 7:48:54

python语言-《侠盗猎车:罪恶都市》中文版-5项修改器-QZQ

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python语言-《侠盗猎车:罪恶都市》中文版-5项修改器-QZQ
import pymem import pymem.process import tkinter as tk from tkinter import ttk, messagebox import threading import time import ctypes import keyboard # 需要安装:pip install keyboard # ===================== 罪恶都市 1.0原版 偏移 ===================== OFFSET_PLAYER_PTR = 0x0054AD28 OFFSET_HEALTH = 0x354 OFFSET_ARMOR = 0x358 OFFSET_MONEY = 0x0054ADC8 OFFSET_WANTED = 0x00549788 # 警星指针偏移(玩家对象内部) OFFSET_WANTED_PTR = 0x5F4 OFFSET_WANTED_VALUE = 0x20 PM = None BASE_ADDR = 0 PROCESS_NAME = "gta-vc.exe" # 秘籍:NUTTERTOOLS 高级武器 CHEAT_WEAPON = "NUTTERTOOLS" # ===================== 游戏附加 ===================== def attach_game(): global PM, BASE_ADDR try: PM = pymem.Pymem(PROCESS_NAME) module = pymem.process.module_from_name(PM.process_handle, PROCESS_NAME) BASE_ADDR = module.lpBaseOfDll messagebox.showinfo("成功", "已附加 gta-vc.exe!") status_label.config(text="✅ 已连接游戏") except pymem.exception.ProcessNotFound: messagebox.showerror("错误", "未找到 gta-vc.exe\n请先启动罪恶都市!") status_label.config(text="❌ 未找到游戏") PM = None BASE_ADDR = 0 except Exception as e: messagebox.showerror("异常", f"附加失败:{str(e)}") status_label.config(text="❌ 连接失败") PM = None BASE_ADDR = 0 def get_player_ptr(): global PM, BASE_ADDR if PM is None or BASE_ADDR == 0: return 0 try: return PM.read_int(BASE_ADDR + OFFSET_PLAYER_PTR) except: return 0 # ===================== 写入功能 ===================== def set_health(): global PM if PM is None: messagebox.showwarning("提示", "请先附加游戏!") return player_ptr = get_player_ptr() if player_ptr == 0: messagebox.showerror("错误", "读取玩家指针失败!") return try: val = float(health_entry.get()) PM.write_float(player_ptr + OFFSET_HEALTH, val) except ValueError: messagebox.showerror("错误", "请输入数字!") def set_armor(): global PM if PM is None: messagebox.showwarning("提示", "请先附加游戏!") return player_ptr = get_player_ptr() if player_ptr == 0: messagebox.showerror("错误", "读取玩家指针失败!") return try: val = float(armor_entry.get()) PM.write_float(player_ptr + OFFSET_ARMOR, val) except ValueError: messagebox.showerror("错误", "请输入数字!") def set_money(): global PM, BASE_ADDR if PM is None: messagebox.showwarning("提示", "请先附加游戏!") return if BASE_ADDR == 0: messagebox.showerror("错误","模块基址获取失败") return try: val = int(money_entry.get()) PM.write_int(BASE_ADDR + OFFSET_MONEY, val) except ValueError: messagebox.showerror("错误", "请输入数字!") def set_wanted(): global PM, BASE_ADDR if PM is None: messagebox.showwarning("提示", "请先附加游戏!") return if BASE_ADDR == 0: messagebox.showerror("错误","模块基址获取失败") return try: val = int(wanted_entry.get()) if val < 0 or val > 6: messagebox.showwarning("提示", "通缉等级范围0~6") return PM.write_int(BASE_ADDR + OFFSET_WANTED, val) except ValueError: messagebox.showerror("错误", "请输入数字!") def set_wanted_stars(): global PM, BASE_ADDR if PM is None: messagebox.showwarning("提示", "请先附加游戏!") return player_ptr = get_player_ptr() if player_ptr == 0: messagebox.showerror("错误", "读取玩家指针失败!") return try: val = int(wanted_star_entry.get()) if val < 0 or val > 6: messagebox.showwarning("提示", "警星范围0~6") return wanted_ptr = PM.read_int(player_ptr + OFFSET_WANTED_PTR) if wanted_ptr == 0: messagebox.showerror("错误", "警星结构指针为空!请先触发一次通缉。") return PM.write_int(wanted_ptr + OFFSET_WANTED_VALUE, val) except ValueError: messagebox.showerror("错误", "请输入整数!") except Exception as e: messagebox.showerror("异常", f"写入警星失败:{e}") # ===================== 秘籍模拟功能 ===================== def send_cheat(cheat_code): """模拟键盘输入秘籍代码""" for ch in cheat_code: keyboard.press(ch) time.sleep(0.01) keyboard.release(ch) time.sleep(0.01) def press_f1_once(): """按一次 z,刷一次高级武器""" send_cheat(CHEAT_WEAPON) def cheat_loop(): """勾选后每 20s 自动刷一次武器""" global PM, BASE_ADDR while True: if auto_cheat_var.get() and PM is not None and BASE_ADDR != 0: try: send_cheat(CHEAT_WEAPON) except: pass time.sleep(20) # ===================== 后台刷新与冻结 ===================== def loop_refresh_info(): global PM, BASE_ADDR while True: if PM is not None and BASE_ADDR != 0: try: player_ptr = PM.read_int(BASE_ADDR + OFFSET_PLAYER_PTR) if player_ptr != 0: hp = PM.read_float(player_ptr + OFFSET_HEALTH) ar = PM.read_float(player_ptr + OFFSET_ARMOR) wanted_ptr = PM.read_int(player_ptr + OFFSET_WANTED_PTR) if wanted_ptr != 0: wanted_star = PM.read_int(wanted_ptr + OFFSET_WANTED_VALUE) else: wanted_star = 0 else: hp = 0 ar = 0 wanted_star = 0 mon = PM.read_int(BASE_ADDR + OFFSET_MONEY) want = PM.read_int(BASE_ADDR + OFFSET_WANTED) root.after(0, lambda: health_var.set(f"{hp:.1f}")) root.after(0, lambda: armor_var.set(f"{ar:.1f}")) root.after(0, lambda: money_var.set(str(mon))) root.after(0, lambda: wanted_var.set(str(want))) root.after(0, lambda: wanted_star_var.set(str(wanted_star))) except Exception: root.after(0, lambda: health_var.set("读取失败")) root.after(0, lambda: armor_var.set("读取失败")) root.after(0, lambda: money_var.set("读取失败")) root.after(0, lambda: wanted_var.set("读取失败")) root.after(0, lambda: wanted_star_var.set("读取失败")) time.sleep(0.3) def freeze_loop(): global PM while True: if freeze_var.get() and PM is not None and BASE_ADDR != 0: try: player_ptr = get_player_ptr() if player_ptr != 0: PM.write_float(player_ptr + OFFSET_HEALTH, float(health_entry.get())) PM.write_float(player_ptr + OFFSET_ARMOR, float(armor_entry.get())) except: pass time.sleep(0.1) def freeze_wanted_loop(): global PM, BASE_ADDR while True: if freeze_wanted_var.get() and PM is not None and BASE_ADDR != 0: try: player_ptr = get_player_ptr() if player_ptr != 0: wanted_ptr = PM.read_int(player_ptr + OFFSET_WANTED_PTR) if wanted_ptr != 0: PM.write_int(wanted_ptr + OFFSET_WANTED_VALUE, 0) PM.write_int(BASE_ADDR + OFFSET_WANTED, 0) except: pass time.sleep(0.1) # ===================== GUI ===================== root = tk.Tk() root.title("GTA罪恶都市 5项修改器") root.geometry("560x520") health_var = tk.StringVar(value="---") armor_var = tk.StringVar(value="---") money_var = tk.StringVar(value="---") wanted_var = tk.StringVar(value="---") wanted_star_var = tk.StringVar(value="---") status_label = ttk.Label(root, text="❌ 未连接游戏", font=("Consolas",11)) status_label.pack(pady=5) attach_btn = ttk.Button(root, text="1.附加游戏进程", command=attach_game) attach_btn.pack(pady=3) frame = ttk.Frame(root) frame.pack(pady=10, fill="x", padx=20) # 生命 ttk.Label(frame, text="生命值:").grid(row=0, column=0, sticky="w") health_entry = ttk.Entry(frame, width=12) health_entry.grid(row=0, column=1, padx=5) health_entry.insert(0, "200.0") ttk.Button(frame, text="写入", command=set_health).grid(row=0, column=2, padx=2) ttk.Label(frame, text="当前:").grid(row=0, column=3, padx=3) ttk.Label(frame, textvariable=health_var).grid(row=0, column=4) # 护甲 ttk.Label(frame, text="护 甲:").grid(row=1, column=0, sticky="w") armor_entry = ttk.Entry(frame, width=12) armor_entry.grid(row=1, column=1, padx=5) armor_entry.insert(0, "200.0") ttk.Button(frame, text="写入", command=set_armor).grid(row=1, column=2, padx=2) ttk.Label(frame, text="当前:").grid(row=1, column=3, padx=3) ttk.Label(frame, textvariable=armor_var).grid(row=1, column=4) # 金钱 ttk.Label(frame, text="金 钱:").grid(row=2, column=0, sticky="w") money_entry = ttk.Entry(frame, width=12) money_entry.grid(row=2, column=1, padx=5) money_entry.insert(0, "99999999") ttk.Button(frame, text="写入", command=set_money).grid(row=2, column=2, padx=2) ttk.Label(frame, text="当前:").grid(row=2, column=3, padx=3) ttk.Label(frame, textvariable=money_var).grid(row=2, column=4) # 通缉值 ttk.Label(frame, text="通缉值:").grid(row=3, column=0, sticky="w") wanted_entry = ttk.Entry(frame, width=12) wanted_entry.grid(row=3, column=1, padx=5) wanted_entry.insert(0, "0") ttk.Button(frame, text="写入", command=set_wanted).grid(row=3, column=2, padx=2) ttk.Label(frame, text="当前:").grid(row=3, column=3, padx=3) ttk.Label(frame, textvariable=wanted_var).grid(row=3, column=4) # 警星数 ttk.Label(frame, text="警星数:").grid(row=4, column=0, sticky="w") wanted_star_entry = ttk.Entry(frame, width=12) wanted_star_entry.grid(row=4, column=1, padx=5) wanted_star_entry.insert(0, "0") ttk.Button(frame, text="写入", command=set_wanted_stars).grid(row=4, column=2, padx=2) ttk.Label(frame, text="当前:").grid(row=4, column=3, padx=3) ttk.Label(frame, textvariable=wanted_star_var).grid(row=4, column=4) # 冻结选项 freeze_var = tk.BooleanVar() freeze_check = ttk.Checkbutton(root, text="冻结生命与护甲(不掉血)", variable=freeze_var) freeze_check.pack(pady=2) freeze_wanted_var = tk.BooleanVar() freeze_wanted_check = ttk.Checkbutton(root, text="锁定警星为0(永不被通缉)", variable=freeze_wanted_var) freeze_wanted_check.pack(pady=2) # z 热键 + 自动刷武器 auto_cheat_var = tk.BooleanVar() auto_cheat_check = ttk.Checkbutton(root, text="自动刷高级武器(z/NUTTERTOOLS,20s一次)", variable=auto_cheat_var) auto_cheat_check.pack(pady=2) f1_btn = ttk.Button(root, text="按一次 z 刷高级武器", command=press_f1_once) f1_btn.pack(pady=2) # 绑定真实 z 键 keyboard.add_hotkey('z', press_f1_once) # 启动后台线程 threading.Thread(target=loop_refresh_info, daemon=True).start() threading.Thread(target=freeze_loop, daemon=True).start() threading.Thread(target=freeze_wanted_loop, daemon=True).start() threading.Thread(target=cheat_loop, daemon=True).start() root.mainloop()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 7:48:41

ESP32选型必读:SoC芯片与模组到底差在哪?

平时在社区里经常看到新手问同一个问题&#xff1a;我买了颗“ESP32芯片”&#xff0c;怎么照着例程一烧就失败&#xff1f;等他发来实物图一看&#xff0c;买的明明是ESP32-WROOM-32模组。另一边还有人在吐槽模组太大塞不进外壳&#xff0c;琢磨着自己画板能不能直接用“裸芯片…

作者头像 李华
网站建设 2026/10/7 7:48:41

树莓派智能显示模块评测:DSI触摸屏快速上手与实用场景搭建

树莓派智能显示模块正式发售了。作为一个从树莓派2B时代就开始折腾的老玩家&#xff0c;我必须说&#xff0c;这个品类等了太久。以前想在树莓派上做一块带屏幕的智能设备&#xff0c;你得自己折腾HDMI转接、触摸驱动、外壳固定&#xff0c;运气不好还要跟各种兼容性问题搏斗。…

作者头像 李华
网站建设 2026/10/7 7:48:30

【零基础安装】OpenClaw 桌面 AI 自动化工具完整实操(含安装包)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/7 7:45:13

ESP8266+DS3231+MAX7219:打造高精度NTP自动对时点阵时钟

1. 项目缘起与整体设计思路MatrixClock 这个项目&#xff0c;最早是我在做一个桌面点阵时钟时折腾出来的。核心硬件就三样&#xff1a;一块 ESP8266 做主控&#xff0c;一块 DS3231 做本地高精度 RTC&#xff0c;再加一块 MAX7219 驱动的 8x32 点阵屏。最初的想法特别朴素——让…

作者头像 李华
网站建设 2026/10/7 7:44:16

AIHOT:大模型加持的开源热点监测与自动化日报生成实践

每天早晨打开十几个网页、把同样的新闻翻来覆去读三遍、然后憋出一份像样的行业日报——我把这个状态维持了半年&#xff0c;直到做了 AIHOT。这个开源项目的名字很简单&#xff0c;AI 加 HOT&#xff0c;用意是一个月前写在 README 第一行的那句话&#xff1a;让大模型替你把“…

作者头像 李华