0x00 前言
眼看到了春节假期的最后一天,花了几天时间把死亡搁浅全成就之后再度进入贤者模式,感觉无游可玩...思来想去,还是把DSP下了回来,毕竟又是机甲又是硬核建造,是个男人都会爱上的罢(
游戏自ver 0.8.22.8915之后新增了100条成就,同时也新增了异常数据检测功能, 数据异常不能开启成就检测并且无法上传银河系数据(如凭空多出物品、凭空解锁科技、游戏数值更改等异常) 。对于我这种不安分的人来说,怎么才能在“合理”增强游戏体验的同时不影响跳成就呢?让我们花点时间来一探究竟
0x01 查找异常数据检测逻辑
使用steam
浏览游戏本地文件,进入到Dyson Sphere Program\DSPGAME_Data\Managed
中,找到了熟悉的Assembly-CSharp.dll
,可见DSP是一款基于Unity构建的游戏,同时使用了Mono
框架。使用dnSpy
查看逻辑,搜索关键词normal
,可以找到关键方法GameAbnormalityData. IsGameNormal()
:

为了屏蔽掉数据检测功能,只要让IsGameNormal()
始终返回true
即可
0x02 编写BepInEx插件
BepInEx
,全称Bepis Injector Extensible,是一款适用于 Unity Mono、IL2CPP和 .NET框架(XNA,FNA,MonoGame,etc.)游戏的插件框架。本次我们通过编写一个BepInEx Plugin
来修改DSP的游戏逻辑
1.准备开发环境
配置VS2019
(安装.NET桌面开发)、下载BepInEx
最新版本并释放到DSP根目录,并运行一次游戏,使BepInEx
完成初始化,生成config、plugins
等文件夹及cfg
配置文件
2.新建项目
在VS2019
中新建一个类库(.NET Framework
)项目,框架选择.NET Framework 4.7.2
,添加下列引用:
1.0Harmony20.dll //HarmonyX Pacth base
2.BepInEx.dll
3.Assembly-CSharp.dll //Dyson Sphere Program\DSPGAME_Data\Managed\Assembly-CSharp.dll
4.UnityEngine.dll
5.UnityEngine.CoreModule.dll
3.基于模板开始编写
我们给默认的Class1
修改一个我们想要的名字,我这里改为DSPPlugin
,然后将BepInEx
的命名空间using
一下。
在BepInEx
中,给我们准备了一个类BaseUnityPlugin
,这是继承于MonoBehaviour
的,也就是说BepInEx Plugin
最终会以组件的形式挂载。这里我们以官方wiki - Creating a new plugin project中所给出的模板为基础, 将DSPPlugin
继承BaseUnityPlugin
,并在类上方添加了一个名为BepInPlugin
的特性,这是必须要完成的,只有这样才能正确加载插件
using BepInEx;
namespace DSPPlugin
{
//插件描述特性 分别为 插件ID 插件名字 插件版本(必须为数字)
[BepInPlugin("cn.floeice.DSPPlugin", "EnableAchievements Plugin", "1.0")]
public class DSPPlugin : BaseUnityPlugin
{
//Unity的Start生命周期
void Start()
{
Logger.LogInfo("Hello World!");
}
}
}
4.使用Harmony进行Prefix
参考:HarmonyX Wiki - HarmonyX prefix behaviour
Prefix,即前置补丁,是在补丁目标运行之前运行的,同时我们可以选择是否执行原方法。此处我们的目标就是使IsGameNormal()
始终返回true
,且不执行原方法。写法如下:
using HarmonyLib;
public class GameAbnormalityCheckPatch
{
[HarmonyPrefix]
[HarmonyPatch(typeof(GameAbnormalityData), "IsGameNormal")]
public static bool IsGameNormal(ref bool __result)
{
__result = true;
return false; //拦截原方法,直接使用我们给出的结果
}
}
同时在Start()
中加上下述代码以实现自动Patch:
Harmony.CreateAndPatchAll(typeof(GameAbnormalityCheckPatch));
5.生成并使用插件
选择生成->生成 DSPPlugin
,待生成完毕后,打开输出目录,将生成的DSPPlugin.dll
复制到我们的BepInEx/plugins
目录下:

运行游戏,插件将自动加载
0x03 功能测试
以成就-死星计划为例:

首先新开一档,然后配合Multifunction Mod
无限物品+一键铺满地基,很快,游戏里跳了成就:

稍作等待后,Steam
也同步跳了成就:

证明插件有效,成功屏蔽了异常数据检测功能
Comments | 4 条评论
这就是电脑游戏的修改方式吗?
@wonson
文章写的挺片面的_(:з」∠)_仅代表一小类unity pc游戏哈
#该评论为私密评论#
#该评论为私密评论#