FindMuck/SnowRunner_Noclip
GitHub: FindMuck/SnowRunner_Noclip
针对 SnowRunner 游戏的逆向工程项目,通过 Cheat Engine 内嵌 Lua 脚本操控 Havok 物理引擎实现载具 Noclip 自由飞行,并附带完整的结构映射笔记。
Stars: 0 | Forks: 0
# SnowRunner Noclip
一个 SnowRunner 逆向工程项目,主要致力于为车辆构建一个实用的 **Noclip / 自由飞行脚本**。
**已测试的游戏版本:**
**Patch 18.0 (Season 8) — `1.148111.SNOW_DLC8`**
是的,这是一个较老的游戏版本。这仅仅是我个人电脑上刚好有的版本。
## 演示
https://github.com/user-attachments/assets/a6db30a2-8338-43c9-a4e4-99eda691ef7e
## 仓库结构
- [SnowRunner_Noclip.CT](SnowRunner_Noclip.CT) — 用于实际操作的精简表。只需在 Cheat Engine 中加载它并启用 Noclip 脚本即可。
- [SnowRunner_Noclip_debug.CT](SnowRunner_Noclip_debug.CT) — 调试/工作台表。如果你想检查指针、验证偏移量,或者从我停下的地方继续逆向,这将非常有用。
- [mappings.md](mappings.md) — 我映射/逆向的结构和偏移量笔记。
- [src/SnowRunner_Noclip.lua](src/SnowRunner_Noclip.lua) — Noclip 脚本的可选纯文本源代码副本,便于阅读和对比差异。
## 功能
- noclip / 自由飞行移动
- 悬停/冻结 切换
- 倾斜 / 旋转 控制
- 摄像机 / 视觉同步
- 移动**整个相连的 Havok 岛**,而不仅仅是一个刚体
- 已使用附带的拖车进行测试*(不含货物)*
它可能也适用于合作模式,但我**没有**测试过,所以只能说不确定,不敢保证。
## 用法
1. 打开 [SnowRunner_Noclip.CT](SnowRunner_Noclip.CT)。
2. 启用 Noclip 脚本条目——它将自动附加到正在运行的 SnowRunner 进程。
3. 使用[控制键](#controls)。
## 控制键
### 飞行
- Ctrl + Space — 切换 悬停/冻结
- Ctrl + W / S — 向前 / 向后
- Ctrl + A / D — 向左 / 向右
- Ctrl + Q / E — 向上 / 向下
### 旋转
- Alt + W / S — 俯仰
- Alt + A / D — 偏航
- Alt + Q / E — 翻滚
### 速度
- Ctrl + 1 — 正常速度
- Ctrl + 2 — 更快速度
## 工作原理
Noclip 脚本实现为一个内嵌 Lua 的 Cheat Engine 自动汇编脚本。
它通过 `TRUCK_CONTROL` 单例解析当前车辆,获取主驾驶室 `hkpRigidBody`,然后遍历车辆的 `hkpSimulationIsland`,使所有相连的刚体一起移动。
为了保持卡车的稳定性和视觉同步,它更新了:
- Havok 世界/扫描位置
- 运动参考槽位
- 视觉车辆坐标
- 附加组件/驾驶室视觉基础节点
它还会在需要时将相关速度归零,并在旋转时应用角速度。
所以这不仅仅是“传送一个指针然后祈祷一切顺利”——它试图以一种游戏能够容忍的方式移动整个卡车组件。
## 兼容性
本项目构建所用的偏移量基于:
**Patch 18.0 (Season 8) — `1.148111.SNOW_DLC8`**
SnowRunner 的其他版本可能会有:
- 被移动的单例
- 发生偏移的对象布局
- 发生偏移的偏移量
- 部分匹配的结构
因此,如果它在你的游戏版本上不起作用,**并不**自动意味着整个映射都没用了——可能只需要更新几个锚点。
## 为更新版本进行适配
## 已知问题
- **驾驶员手臂“变成意大利面”**
在进行 noclip 时,驾驶员的手臂可能会以奇怪的方式被拉长。我的猜测是驾驶员的 IK(反向动力学)不属于同一个 Havok 物理模拟岛,并且被单独的动画控制器拉回了方向盘。
- **拖车 + 货物未经过全面测试**
已经测试了附带拖车的情况,但没有测试每一种可能的附加组件/货物组合。
## 逆向工程笔记
这是我尝试动态逆向 SnowRunner 内部结构的一部分,并将该工作转化为一个可用的 Noclip 脚本的过程。
使用的主要工具/方法:
- [`RTTI Reverse Lookup - Cheat Engine script`](https://github.com/FindMuck/CE_RTTI_Reverse_Lookup)
- Cheat Engine 的 "Structure dissect"(结构剖析)
- 手动指针追踪与结构验证
- Cheat Engine "Memory Viewer"(内存查看器) + 反汇编器
- 手动汇编/代码路径调查
- "what accesses this address"(什么访问了这个地址)
- "what writes to this address"(什么写入了这个地址)
- pointermap / pointerscan(指针映射/指针扫描)对比
用于寻找稳定候选对象的“对比 pointermap pointerscan”技术出自这个[视频](https://www.youtube.com/watch?v=rBe8Atevd-4)。
## 相关项目
在编写本 README 时,我发现还有其他 SnowRunner 项目也记录了游戏的部分内容或修改了车辆行为:
- [Ferrster/Snowrunner-Manual-Gearbox-Mod](https://github.com/Ferrster/Snowrunner-Manual-Gearbox-Mod)
- [drafty46/SMT](https://github.com/drafty46/SMT)
- [NakedDevA/SnowFlyer2](https://github.com/NakedDevA/SnowFlyer2)
我在进行这项映射工作时并不了解它们。
它们可能涵盖了重叠的领域、不同的领域,或者仅仅是针对不同的游戏版本。因此,如果你想进一步研究该游戏,它们也值得一看。
说明
如果你知道如何使用 Cheat Engine 并且有一些经验,那么 Noclip 脚本可以在游戏的新版本中被重新启用。 主要的起点是寻找并更新 **`TRUCK_CONTROL` 单例**。 我推荐使用我的 [`RTTI Reverse Lookup - Cheat Engine script`](https://github.com/FindMuck/CE_RTTI_Reverse_Lookup) 工具,这是一个用于重新查找类锚点和单例路径的良好起点。 另外请使用 [mappings.md](mappings.md)。如果只是少数几个偏移量发生了变动,当前的映射笔记应该仍然能为你节省大量时间(Noclip 脚本本身的注释中也包含了一个精简的偏移量映射)。 大致思路: 1. 找到新的 `TRUCK_CONTROL` 单例(使用 RTTI 工具 — `fast start` 以及随后的 `no full-scan`,对于这个目的应该足够了)。 2. 确认: - `[TRUCK_CONTROL] + 0x8` 仍然指向当前活动的 `vehicle object` *(或者找到新的等效物)* 3. 从该 `vehicle object` 中,验证: - `+ 0x5C8` → 主 `hkpRigidBody` - `+ 0x58` → 附加组件管理器 - 视觉位置字段 4. 检查 Havok 刚体布局: - 位置块 - 旋转块 - 速度字段 - simulation island 指针 5. 相应地更新脚本偏移量。标签:Cheat Engine, CT文件, Havok Physics, Havok引擎, Lua, Lua脚本, Noclip, rizin, SnowRunner, 云资产清单, 作弊引擎, 内存修改, 内存偏移, 内存地址分析, 单机游戏修改, 数据结构映射, 汇编, 游戏Mod, 游戏安全, 游戏逆向, 物理引擎, 载具穿墙, 逆向工程, 雪地奔驰, 飞行作弊