泰拉瑞亚游戏存档路径修改

作者 乱步熊 日期 Jan 19, 2016
泰拉瑞亚游戏存档路径修改

泰拉瑞亚(Terraria) 是一款非常受欢迎的2D沙盒游戏,甚至有不少玩家称之为 2D MineCraft。我久闻这款游戏的大名,所以早在半年前就从 Steam 上入了正版。但是非常遗憾的是,泰拉瑞亚的PC版没有合适的引导教程,导致入门有些门槛。比如说新手一进去不知道干什么,不知道如何使用道具、怎么砍树、怎么造房子,然后就在第一个夜晚到来的时候不停地被僵尸和眼球虐死。我自己本身也尝试了好几次,都没有摸索出合适的玩法,都没能入门玩起来,所以这款游戏就这么被我搁置了。

直到上个月,我无意中看到一个同事正在玩泰拉瑞亚的手机版,然后就下载了一个一起玩。令人意外的是手机版对于新手友好多了。手机版的开始菜单专门有一个教程栏目,点进去可以在一个教程地图上按照提示学习游戏的操作。除此之外游戏还特别针对移动版进行了优化,对一些在 PC 上比较复杂的操作在移动平台上进行了简化,大大降低了游戏的入门难度。还有一点令人惊讶的是,泰拉瑞亚的 Android 版和 iOS 版可以无缝局域网联机,甚至包括 iOS 盗版的。经过几天时间跟三四个同事一起联机摸索,我总算是入门了泰拉瑞亚。

长时间用手机玩泰拉瑞亚其实是一件挺累人的事,特别是挖矿和造房子。所以一段时间后,我又拉了几个同事一起玩 PC 版。一开始他们几个人玩的是汉化版的,我玩的是 Steam 英文版,这两个版本居然也是可以无缝局域网联机的,真是太棒了。由于游戏里的道具非常多,英文名字比较复杂,我拿到有些道具之后,不得不查词典,才能跟同事说我拿到的是什么。所以为了方便跟同事沟通,我后来也玩了汉化版的。

这里我碰到一个问题,就是 Steam 版和汉化版的游戏存档都存在 我的文档\My Games\Terraria\ 这个目录下,所以有些时候会发生冲突,造成游戏无法正常启动。所以我就想能不能把汉化版的存档目录修改一下,改成客户端所在目录,这样就方便多了。

先从客户端文件下手吧,把 Terraria.exe 扔到 PEiD 里查一下壳,发现这个东西没有加壳,是 C# 写的 .NET 程序。

既然知道是 .NET 程序,那我们就可以用 .NET Reflector 或者 ILSpy 来反编译分析。我以前没有尝试修改过 .NET 程序,这次也是新手上路。上述两个工具我都尝试过,但是在改完代码后保存可执行文件都或多或少出了一点问题。然后我找到了一个叫 JustDecompile 的反编译工具。这个工具跟大名鼎鼎的
Fiddler 是同一个公司出的,完全免费。下载安装 JustDecompile 后运行,打开 Plugins 菜单,安装 Assembly Editor 插件。这个插件其实就是 Refexlil,在上面两个工具里也可以使用这个插件,非常强大。

我们用 JustDecompile 打开 Terraria.exe, 然后点击 Open->Load Framewrok->Load .NET 4.6 Assemblies->x86 导入 x86 的 .NET 4.6 的库。接着打开 Search 菜单,左边的查找数据类型选择 Full Text, 然后查找 “My Games” 字符串。查找到一个结果,是一个名叫 GetStroragePath 的函数,双击这条结果,跳转到函数所在的代码。可以看到 JustDecompile 已经自动帮我们把反编译出来的 IL 代码转成了 C# 代码,这个函数的实现是这样的:

public static string GetStoragePath()
{
string str = Path.Combine(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "My Games"), "Terraria");
return str;
}

函数内部先通过 Environment.GetFolderPath(Environment.SpecialFolder.Personal) 获取我的文档路径,然后再拼接 “My Games” 和 “Terraria” ,返回拼接结果。毫无疑问,这正是我们找的函数。我们只需要把这个函数的实现稍微修改一下,让它返回当前程序所在的目录就行了。

点击 Plugins->Refexlil 打开编辑插件,可以看到下方出现了 Refexlil 编辑窗口。在编辑窗口上右键->Replace all with code, 在弹出的窗口上把 GetStoragePath 这个函数的实现改为:

public static string GetStoragePath()
{
return System.IO.Path.Combine(Environment.CurrentDirectory, "SaveData");
}

然后点击 Complie 编译,没有错误的话就表示编译成功了,然后点击 OK 确定修改。

最后在左边的 Terraria.exe 上右键->Refexlil v1.8 ->Save as… 另存文件或者 Save and rload 修改当前文件并重新加载。

运行修改后的程序,可以看到当前目录下创建了一个 SaveData 目录。在游戏里创建角色和地图,可以看到都保存到了 SaveData 目录下。这说明我们的修改成功啦~~

我们可以用同样的方法修改 TerrariaServer.exe 这个服务器文件,这样就完成了泰拉瑞亚客户端和服务器端的存档路径修改。

这里我们用 Refexlil 的 Replace all with code 功能,直接通过写C#代码修改程序。其实我试验过用 Refexlil 直接修改IL代码也是可行的,只不过要麻烦一点,需要了解一点IL代码的语法。

我把修改后的文件上传到了百度盘上 链接: http://pan.baidu.com/s/1ntPq1gH 密码: c7g3。安装泰拉瑞亚1.3.0.8汉化v3.4.exe, 把 Terraria.1.3.0.8.chs.Patched_by.kuma.7z,解压出来的文件直接放到安装目录下运行即可。

压缩包校验信息:

文件名称:Terraria.1.3.0.8.chs.Patched_by.kuma.7z | MD5 :A0174572932B0C6FA93921BD207C8605 | SHA1 :2334DF638E123AB3AF123AB8ADAE4E06DF416FB2

参考资料