# Windows 单文件安装器

在本机生成的 `build/installer/GTADroneSimulator-Setup.exe` 中包含无人机 mod、Menyoo 2.4.4、ScriptHookV / SHVDN、Mavic 模型和加载器、独立 Python 3.12.10 运行环境、Flask / Waitress 后端，以及 DireZephyr v6.1 的 100% 通关存档。安装过程可以离线完成，地图从目标电脑自己的 GTA 资源生成。

## 使用

1. 使用 Windows 10/11 x64，游戏版本须为 **GTA V Legacy 1.0.3889.0**。先进入故事模式保存一次，再退出游戏。
2. 双击 EXE，并允许管理员权限。打开后仅检测安装记录、游戏目录和存档账户，不自动安装。未安装时点击“开始安装”；已安装时显示版本，点击“更新／修复安装”后才修改文件。
3. 完成后双击桌面 **GTA 仿真服务器**，后端启动并打开 `http://127.0.0.1:15001/`。重复点击会打开已有服务，不重复启动。其他程序占用 15001 时会明确报错。
4. 启动 GTA 故事模式，在“加载游戏”中选择新安装的 100% 存档。F7 生成无人机、F 登入、T 起飞；F8 打开 Menyoo。

安装器会在游戏的 `commandline.txt` 中补充 `-nobattleye`。若 Steam/Rockstar 启动器仍启动 BattlEye，请在该启动器的设置中关闭 BattlEye，或将 `-nobattleye` 加入游戏启动选项后进入故事模式。

后端默认监听 `0.0.0.0:15001`，安装器为该 Python 程序添加仅限 **Private / LocalSubnet** 的入站规则。私有局域网内可访问 `http://本机局域网IP:15001/`。高级用户可通过 `GTA_BACKEND_PORT` 调整端口，并相应配置自己的防火墙。

默认安装目录是 `%LOCALAPPDATA%\GTADroneSimulator`，其中 `Stop-Server.cmd` 用于关闭本安装器启动的后端，`logs` 保存日志，`backups` 保存每次安装替换前的文件和 `journal.json`，`installation.json` 记录游戏目录、存档槽位和安装版本。Python 放在 `.runtime\python`，无需安装系统 Python 或 .NET SDK。

安装器优先复用相同的通关存档；否则选择空闲手动槽位，并避开仅剩 `.bak` 的槽位。全部手动槽位占用时会停止安装，请先在游戏中整理槽位。安装异常时回滚已修改的文件，已有自定义按键、速度、Menyoo 配置和 SHVDN 配置会保留。

## 构建与验证

运行 `tools/Build-Installer.ps1 -Python .\.venv\Scripts\python.exe`，输出 EXE 和 `.sha256`。构建需要项目 .NET SDK、固定的 `downloads` 缓存、已验证的 `build/windows-media/wheels` 和 `SHA256.json`，以及 `build/vm-model-installer` 和对应 manifest。安装器自身是 .NET Framework 4.8 WinForms 程序，目标电脑不需要构建工具。

另外需要以下固定下载：

| 资源 | 官方地址 | SHA256 |
| --- | --- | --- |
| Menyoo 2.4.4 | https://github.com/itsjustcurtis/MenyooSP/releases/download/v2.4.4/MenyooSP.zip | `2A870CCA448A204A2C21B8090A23F010497D215E435BBE229852670A6718163A` |
| Python 3.12.10 embeddable x64 | https://www.python.org/ftp/python/3.12.10/python-3.12.10-embed-amd64.zip | `4ACBED6DD1C744B0376E3B1CF57CE906F9DC9E95E68824584C8099A63025A3C3` |
| DireZephyr v6.1 完结存档 | https://www.gta5-mods.com/misc/100-save-game | `E40E4AEA697DEC8C855E6AEEBD6B5563ECB9EB5ADF6A181E8CC586CF726D5373`（原始 RAR） |

测试入口 `tools/Installer/Test-Core.ps1` 覆盖存档选择、重复安装、满槽拒绝、孤立备份、自定义配置和文件回滚。EXE 的 `--preview` 模式只显示界面；`--verify-package <新目录>` 解压并逐文件校验资源，不执行安装。

离线安装包只在本机 `build` 中生成，不上传 GitHub。包中包含第三方插件和本地构建的模型工具，来源与随附声明在安装目录 `third-party`；不包含原版 GTA 归档、账号凭据或用户个人存档。源码仓库保持只分发构建流程与项目自有插件。

## 图形 SSH 连接窗口

每次双击桌面快捷方式，会打开后端网页和 SSH 连接窗口；已有窗口则恢复到前台，不重复占用隧道端口。填写公网跳板机 IP / 域名、SSH 用户名、密码和 SSH 端口，点击“启动端口转发”。首次连接须与管理员核对服务器指纹；指纹变化会拒绝连接。连接成功后，点击“复制本机 SSH 命令”，在自己的电脑执行，并访问 `http://127.0.0.1:15001/`。

云电脑端内置 Paramiko SSH 客户端库及依赖，无需系统 SSH、CMD、PowerShell 或管理员权限即可连接；跳板机需要允许密码登录和远程端口转发。密码仅通过子进程标准输入传递，不出现在命令行。默认不保存用户名和密码；勾选“保存用户名和密码到本机”后，点击连接时使用 Windows DPAPI（CurrentUser）加密保存密码，下次自动填入。取消勾选立即清除保存的登录信息。同一 Windows 账号下的程序仍可解密，因此共用账号的云电脑不宜勾选。窗口还记住跳板机地址、端口与已信任的服务器公钥。关闭窗口或点击“断开连接”会关闭隧道，后端继续运行。断线会显示错误，用户可重新输入密码连接。

跳板机默认只绑定 `127.0.0.1:15001`，不会主动公开控制接口。每台云电脑应设置不同的“跳板机转发端口”；本机命令会同步更新。管理员应保持 SSH 服务的 `GatewayPorts no`，并为使用者提供适当的 SSH 账号。

已有安装可下载 `GTA-SSH-Update.zip`，关闭远程连接窗口，将全部内容解压到 `%LOCALAPPDATA%\GTADroneSimulator`，合并覆盖 `tools` 和 `.runtime`，然后重新打开桌面快捷方式。这个更新过程不调用命令行、不要求管理员；完整安装器的安装流程仍使用 PowerShell 和管理员权限。

构建还需要 `downloads/ssh-wheels` 中由 `tools/Installer/ssh-wheels.json` 固定哈希的依赖。`Test-Tunnel.py` 使用本地测试 SSH 服务验证 HTTP 转发、关闭释放、指纹变更拒绝、密码错误和远端转发被拒绝，不依赖外部账号。
