tip.此方法应该也适用其他大部分不更新也能正常游玩的单机游戏

前因

今天早上 Beat Saber 更新了 正好想着写写如何跳过更新的文章
update-waiting
由于平时经常打 VR 游戏节奏光剑 大部分人都会打 Mods 能够增强游戏性
可以添加很多自定义歌曲 也就是社区大佬自制谱给大家拿出来玩 也有人做了一个排行榜网站 插件内置到游戏可以自己上传 其他功能包括一些修改人物、场景、方块模型 或者修改方块出现的反应时间
官方是不封杀 Mod 的 也并不是有意使 Mod 失效的 但是每次更新一个小版本 即使是更新了一两首歌曲 也会导致 Mod 失效 而且各个版本 Mod 不互通 这就需要等模组制作大佬们更新 一般 1-7 天
期间如果想玩的话 只能在没有 Mod 的情况下游玩 或者部分大佬更新了部分模组这样玩
我之前刚入坑这个游戏的时候不怎么懂 但是游戏已经更新了 就上网搜大佬的解决方法 做法是
在更新之前备份原整个游戏的目录 更新之后再把新的文件夹删掉 把原目录改名为游戏目录
如果更新完了已经不可挽回的话 就备份歌曲文件夹、场景文件夹、人物模型、之前打歌的成绩数据(userdata)文件夹 然后使用 Steam 自带的 download_depot 来返回原版本
但是像我这种下了 1000+首歌的人很不友好 而且文件很多很碎 文件夹也占了 20 个 G
folder

解决思路

首先如果你想让某个游戏不自动更新 右键该游戏点击属性-更新
properties
于是我想了想所有方法归根结底的解决方案 不就是把 app 的 manifest id 改成最新的就可以了 上面的原理也是这样
Steam 检查软件/游戏的更新不会去扫你每个游戏目录和最新版是否一样 都会在更新前或者更新后对 app 进行标记 所以每次只需要对比本地的 manifest 和官方服务器最新的 manifest 版本是否一致即可 我可能说的不太明白
先打开 Beat Saber 对应的 app manifest 文件 位于 steamapps 目录下
登录 steamdb 搜索 Beat Saber 或者 Steam 商店找到该游戏 先获取它的 appid
steamdb
看到对应的 appid 是 620980 去找这个 appmanifest_620980.acf 文件
620980-acf
双击记事本打开后里面有很多内容
acf-before
其中”StageFlags”为 4 的时候 意思是该 app 已经完全安装 其他值的时候都没有是完全安装的最新版 具体数值对应意思可查询(https://github.com/lutris/lutris/blob/master/docs/steam.rst)
如果更新启动了 它有一个副作用是会更改 BytesDownloaded 这几个参数都是明面意思 代表着需要下载多少字节、已下载多少字节
我们可以先打开并参考其他已是最新版本的游戏 manifest 文件查看数值 BytesToDownload 和 BytesDownloaded 会是对应相同的 BytesToStage 和 BytesStaged 也是对应相同的
我们把他们都改为 0 也就是不需要下载 并把”StageFlags”值改为 4
然后我们看到下面这个 app 还对应了一个 depot 我们前往 steamdb 搜索 Beat Saber 点击左方的 Depots
steamdb-depots
里面有一个对应的 depot id 620981 这个是游戏本体 点 620981 这串 id 会进到下一个页面
steamdb-manifests
点击左方的 Manifests 可以看到历史版本的各个 manifest 数值 我们复制 13 小时前更新的最新的”676582354127623831” 粘贴到之前 acf 文件里的 manifest 参数 size 甚至不用更改
acf-after
文件更改到这里就完成了 Ctrl+S 进行保存 然后我们退出 Steam 并重新启动 让它重新加载我们更改过的 manifest 文件
update-complete
可以看到 Beat Saber 已经不在更新列表了 我们也是可以正常启动不会触发更新的 感谢您看到这里

其实理论上可以做一个小程序的 但是技术力不是很好哈哈哈