关于main.ttw文件损坏导致坏档的问题分析与解决方案

作者:NAIWAZI | 日期:2025.7.3

问题背景

随着V2.0更新,新的问题不断涌现。最近,许多服主反映重启服务端后存档损坏,无法载入。具体表现如下:

错误表现1
错误表现2

问题分析

通过dnspy反编译游戏文件后发现,官方源文件在写入main.ttwsleeper的内容时,存在长度溢出问题。问题代码段位于SleeperVolume.Write,用于写入main.ttwsleeper相关内容。

问题代码

在这段代码中,第一行写入的为单字节的“长度”,后面的循环为写入groupCountList的内容。如果groupCountList的长度超过1字节(即255),例如长度为510,强制转换为byte后,会将8位之后的数据截断。这样,len = (byte)510后,len的值就变成了254。然而,下面的循环次数依旧为510次,导致在读取时数据错位,从而使main.ttw读取失败。

解决方案

方案一

简单地将写入的循环次数封顶改为转为byte后的长度(即以上例子中的len)。这样虽然会丢失一部分数据,但这部分数据并不重要。

方案二

将写入长度的单字节改为int的四字节。这样,在读取函数中也要对应地改为4字节。

后续处理

这个BUG已经与官方沟通,预计下个版本将进行修复。这里提供了一个第一种方案的修复补丁,需要的服主可以下载使用,也可以使用dnspy反编译后查看修复原理。

下载修复MOD