SAM(成就管理器):Steam 成就批量修改指南

📅 2026/8/23 15:27:01
SAM(成就管理器):Steam 成就批量修改指南
SAM成就管理器Steam 成就批量修改指南【免费下载链接】SteamAchievementManagerA manager for game achievements in Steam.项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManagerSAMSteam Achievement Manager是一个直接对接本地 Steam 客户端的成就管理器让你批量解锁或重新锁定游戏成就并直接编辑游戏里的数值统计。如果你遇到过游戏只剩一个成就死活打不了、或者换机重装后成就记录想清零重来的情况这个工具就是为这类场景准备的。SAM 到底是怎么跑的SAM 的源码分三个工程一个负责选游戏的窗口、一个负责改数据的主窗口、一个封装 Steam 客户端的接口层。它启动时直接加载 Steam 安装目录里的steamclient.dll走官方接口读写数据不碰任何本地存档文件。选游戏窗口SAM.Picker这个模块回答哪些游戏能管。它先下载一份候选游戏清单再逐个用 Steam 接口检查你是否拥有该游戏只把拥有的游戏列出来图标是懒加载的滚到哪里才下载哪里的图。双击某个游戏就会带 AppID 参数启动主窗口。SAM.Picker/GamePicker.csSAM.Picker/Program.csSAM.Picker/GameInfo.cs你感知到的就是一个可搜索、可按正式游戏 / Demo / MOD筛选的列表列表里没有的游戏也可以直接手动输入 AppID 添加。主管理窗口SAM.Game这个模块是核心操作面展示成就列表和统计数值表允许你修改状态然后写回 Steam。打开时它先读 Steam 本地appcache/stats/目录下的UserGameStatsSchema_{AppID}.bin文件解析出每个成就的名称、描述、图标和权限标志再通过ISteamUserStats接口拉取当前解锁状态和数值铺成列表和表格两栏。SAM.Game/Manager.csSAM.Game/Stats/AchievementDefinition.csSAM.Game/Stats/StatInfo.cs你拿到的就是打勾、点 Store、保存完成这个主界面成就图标还会从 Steam CDN 异步下载下来。原生接口层SAM.API这个模块负责把 C# 调用翻译成steamclient.dll的导出函数。它按名字解析CreateInterface、Steam_BGetCallback、Steam_FreeLastCallback三个指针动态构造SteamUserStats013、SteamClient018等接口包装再用一个 WinForms 定时器周期性地把回调消息抽干。SAM.API/Steam.csSAM.API/Client.csSAM.API/Interfaces/ISteamUserStats013.cs这一层的价值在于上面两个窗口完全不用关心怎么跟 Steam 说话只管调封装好的接口。五分钟把 SAM 跑起来SAM 是 Windows 上的 WinForms 程序目标框架 .NET Framework 4.8并且硬性要求 Steam 客户端正在运行并已登录这两点绕不开。准备环境Windows 系统Steam 已安装并登录.NET Framework 4.8Win10/11 通常自带装了 .NET SDK 或 Visual Studio 2019 以上版本。获取项目源码git clone https://gitcode.com/gh_mirrors/st/SteamAchievementManager cd SteamAchievementManager构建工程。项目只定义了 x86 平台构建时务必显式指定否则输出路径会不一致dotnet build SAM.sln -p:Platformx86看到bin\目录下生成SAM.Picker.exe和SAM.Game.exe说明构建成功没有命令行环境时也可以直接用 Visual Studio 打开SAM.sln编译平台选 x86。启动选游戏窗口验证连通性bin\SAM.Picker.exe看到游戏列表窗口出现、底部状态栏显示 Displaying X games. Total X games. 就说明和 Steam 连上了。双击任意一个游戏主窗口显示 Retrieved N achievements and M statistics.就算首次跑通。你大概率会做的三件事批量解锁或重新锁定成就这是 SAM 的招牌场景存档损坏、游戏停更后把成就一次性对齐到你想要的状态。在成就列表里勾选或取消你要改的成就工具栏提供三个批量按钮工具栏按钮效果Unlock All把列表中所有成就置为已解锁Lock All把所有成就置为未解锁Invert All逐项翻转当前勾选状态点 Store 按钮SAM 先对每个变更的成就调用SetAchievement再统一调StoreStats提交。弹窗提示 Stored N achievements 即完成中途任何一步失败会回滚并重新加载列表避免改一半的状态。编辑数值统计不少游戏统计击杀数游玩时长这类数值SAM 允许你直接改。切到统计页勾选 Enable stats editing 复选框解锁 Value 列。直接输入新值SAM 会按 schema 里定义的类型和上下限校验越界会在该行显示 Invalid value。点 Store 保存。注意标记为 Increment Only 的统计只增不减服务端校验的统计则完全不可改。重置全部进度想从零重玩一款游戏时用。代码里刻意叠了三道确认防止误触Are you absolutely sure you want to reset stats?——确认重置统计Do you want to reset achievements too?——选择是否连成就一起清Really really sure?——最后一道防线三道都确认后调用ResetAllStats并刷新列表。⚠️ 这一步不可逆清之前想清楚。SAM 容易报错的地方与排障现象大概率原因处理动作弹窗 Steam is not runningSteam 没启动或当前账号未登录启动 Steam 并登录再重新运行 SAM弹窗 declines to being run from the Steam directory程序被放进了 Steam 安装目录把bin\整个移出 Steam 目录再运行状态栏 generic error -- you dont own the game该 AppID 对应的游戏你并不拥有核对 AppID用库里真实拥有的游戏某行统计显示 Stat is protected或成就无法勾选游戏对该项启用了服务端校验权限标志非 0该项无法修改换其他未受保护的项操作列表里只有一项 Spacewar候选游戏清单下载失败程序回退到了默认游戏检查网络后点 Refresh仍不行就手动输入 AppID如果以上都没解决先确认游戏确实在你的 Steam 库里、且没有别的账号家庭共享正在占用再到项目的 Issues 里搜一下有没有相同报错。源码导读SAM 与 Steam 的交互原理整体思路是用官方 SDK不逆向。SAM.API从注册表拿到 Steam 安装路径用LoadLibraryEx加载steamclient.dll再调用标准的CreateInterface导出按版本号取接口——接口版本名如SteamUserStats013就是唯一键。回调走的是标准模式WinForms 定时器周期性调Steam_BGetCallback抽干消息队列服务器返回统计数据时触发 UserStatsReceived 回调主窗口随后解析 schema 并渲染。成就的显示名、图标、保护标志这些元信息来自本地appcache/stats/下的 schema 文件所以即使 Steam 商店页面打不开列表照样能填全。三个最值得读的入口SAM.API/Steam.cs——明白一个 DLL 如何被动态加载、导出函数指针如何变成可调用的 C# 委托SAM.API/Client.cs——明白 pipe 创建、连接 global user、回调泵的流程以及每一步失败如何映射成 Steam is not running 弹窗SAM.Game/Manager.cs——从 schema 解析、列表渲染到 Set/Store 三级保存整条主链路都在这一个文件里最后想拿满成就却卡在最后一个的那点麻烦SAM 把它压缩成了打勾加一次 Store 点击。项目以 zlib 许可证开源版本 7.0.x2024 年完成代码整理后公开使用基本无限制。用起来有任何问题直接去项目的 Issues 提一条把报错弹窗原文带上就行。【免费下载链接】SteamAchievementManagerA manager for game achievements in Steam.项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考