维京世界转换检测

创作者: SonicDM
已更新:2026-09-10 08:20:09
156KB

关于此 MOD

用于定位导致英灵神殿1.0世界转换失败的畸形旧版物品栏的诊断BepInEx插件。

维京世界转换诊断

用于追踪导致Valheim 1.0世界转换崩溃的遗留物品栏数据的诊断BepInEx插件。

这是在之前一个运行良好的原版世界在更新至《英灵神殿》1.0后无法加载时创建的,错误信息如下:

System.NullReferenceException:未将对象引用设置到对象的实例,位于 ItemDrop+ItemData.IsSameType,位于 Inventory.AddItem,位于 Inventory.AddTempItem,位于 Inventory.LoadOld,位于 ZDOMan.ConvertInventories。世界在加载文件中途失败。未保存即退出。请检查备份!

同一个世界在之前的英灵神殿版本上都能正常加载,包括大约一年前的备份。

问题出在一个格式错误的旧版容器库存上。

此插件的功能

ValheimWorldConvertDiag 修补旧版世界物品栏转换流程,并在转换失败时记录正在处理的物品栏和 ZDO。

它记录了以下详细信息:

  • 背包容量
  • 已加载物品数量
  • 最后一项名称
  • 预制体哈希
  • 堆叠数量
  • 耐久度
  • 物品栏网格位置
  • 制作数据
  • 物品数据.是否为同类型() 状态
  • 共享 空状态
  • 同一库存中最近处理的物品
  • 源 ZDO UID
  • ZDO世界位置
  • 源预制体哈希

最有用的部分是ZDO位置。

无需手动打开数百个箱子,你可以使用记录的坐标来找到导致转换失败的确切世界对象。

重要

该插件仅用于诊断。

它不会:

  • 修改世界数据
  • 删除物品
  • 跳过损坏的库存
  • 抑制原始异常
  • 自动修复世界

始终从备份开始操作。

确认的现实案例

用于开发此插件的世界包含超过140万个ZDO,且从未安装过任何模组。

瓦尔海姆1.0在转换此旧版物品栏时失败:

物品栏大小:4x4 失败前已装载物品:6

最近包含的物品:

木材 x50 位置 1,0 石头 x7 位置 3,0 石头 x50 位置 0,1 焦骨 x50 位置 2,1 焦骨 x50 位置 4,1 焦骨 x14 位置 1,1 木材 x38 位置 4,1

可疑之处在于,一个4格宽的物品栏中竟包含以下位置的物品:

位置=4,1

而且多个物品似乎在同一个位置重叠了。

崩溃发生在以下位置:

掉落物品+物品数据.类型相同

两者皆然 物品数据 已获得物品:

空

插件将源ZDO识别为:

UID:1:183157 位置:(-866.75, 31.46, -8632.98) 预制体哈希:328745978

那个地点原来是灰烬之地一处老旧登陆营地里的一个不起眼的宝箱。

世界是使用之前的英灵神殿版本加载的,有问题的宝箱已被摧毁,掉落的物品已被移除,世界已再次保存。

在那之后,Valheim 1.0 成功转换了世界。

推荐恢复流程

不要试图在《英灵神殿》1.0中直接修复世界。

最安全的流程是:

  1. 保留一份1.0版本前原始世界的未改动备份。
  2. 使用此诊断插件运行《英灵神殿》1.0。
  3. 让转换正常失败。
  4. 读取记录的ZDO坐标。
  5. 切换回之前的英灵神殿版本。
  6. 在那个旧版本上加载同一个世界。
  7. 前往已记录的坐标。
  8. 移除或清空有问题的容器/对象。
  9. 正常拯救世界。
  10. 切换回 Valheim 1.0。
  11. 请再试一次转换。
  12. 如果发现另一个格式错误的物品栏,请重复此操作。

这样可以避免直接编辑存档文件。

使用之前的英灵神殿版本

《英灵神殿》通过 Steam 保留了一个较旧的稳定分支。

对于普通游戏客户端:

  1. 打开Steam。
  2. 右键单击 英灵神殿.
  3. 选择 属性.
  4. 打开 贝塔 标签页。
  5. 选择上一个稳定分支,通常命名为:
默认_旧
  1. 让Steam下载旧版本。
  2. 启动《英灵神殿》。
  3. 加载受影响的世界。
  4. 将物体固定在插件所报告坐标处。
  5. 保存并退出。

完成后:

  1. 返回 属性 > 测试版.
  2. 切换回普通/默认分支。
  3. 让Steam再次更新至英灵神殿1.0。
  4. 重试世界转换。

分支名称可能会随时间变化,因此如果 默认_旧 已不再存在,请使用 Iron Gate 为上一个稳定版本提供的任意 Steam 测试分支。

专用服务器回滚

对于专用服务器,具体流程取决于服务器的安装方式。

如果使用SteamCMD,请在加载世界之前先通过上一个稳定分支安装或更新服务器。

示例模式:

app_update 896660 -beta default_old validate

在没有备份服务器文件和世界之前,请不要盲目地将其运行在生产服务器上。

如果使用Docker,请检查你的镜像如何暴露Steam测试分支。许多英灵神殿Docker镜像允许设置Steam分支或测试版环境变量。

重要的是,世界必须使用在失败的1.0转换代码之前的英灵神殿版本加载。

请勿混用已转换和未转换的存档

一旦《英灵神殿》1.0正式版成功转换了世界,请将转换后的副本与旧格式版本分开保存。

推荐备份布局:

我的世界-预览版-1.0/ 我的世界-修复版-旧版本/ 我的世界-转换版-1.0/

不要反复将同一个工作副本在旧版本和新版本之间来回移动。

使用副本。

专用服务器使用

这是在专用 Valheim 服务器上运行 BepInEx 进行开发和测试的。

典型插件位置:

/config/bepinex/plugins/ValheimWorldConvertDiag.dll

或者,根据你的设置:

BepInEx/plugins/ValheimWorldConvertDiag.dll

诊断日志已写入 BepInEx 配置目录。

在开发过程中使用的Docker设置上:

/config/bepinex/ValheimWorldConvertDiag.log

单人 / 本地世界使用

该插件修补了共享的英灵神殿世界转换类,包括:

ZDOMan物品栏 ItemDrop.ItemData

这些不是仅限专用服务器的职业。

因此,该插件也应适用于:

  • 单人世界
  • 本地托管的世界
  • 玩家主持的多人世界

只要 Valheim 在 BepInEx 下运行。

典型客户端安装:

Valheim/ └── BepInEx/ └── plugins/ └── ValheimWorldConvertDiag.dll

诊断日志应出现在正常的 BepInEx 配置目录下,例如:

Valheim/BepInEx/config/ValheimWorldConvertDiag.log

客户端的使用尚未经过本人测试,如果你确认可用或发现任何不同之处,请提交 issue。

如何使用

  1. 备份受影响的世界。
  2. 安装 BepInEx。
  3. 将插件DLL放入BepInEx插件文件夹中。
  4. 使用转换时崩溃的版本启动瓦尔海姆。
  5. 让世界转换正常失败。
  6. 开启:
瓦尔海姆世界转换诊断日志
  1. 查找:
---------------- 转换失败报告 ----------------
  1. 寻找:
源ZDO候选:

示例:

ZDO候选源:类型=ZDO,m_uid=1:183157,m_position=(-866.75, 31.46, -8632.98),m_prefab=328745978
  1. 记录X和Z坐标。
  2. 切换到上一个英灵神殿版本。
  3. 加载同一个世界。
  4. 前往报告地点。
  5. 在那里找到容器或物体。
  6. 清空或移除它。
  7. 正常拯救世界。
  8. 返回瓦尔海姆 1.0。
  9. 重试转换。

如果转换再次失败,请重复该过程。可能存在多个格式错误的旧版库存。

传送到错误对象

启用开发者命令后,记录的X和Z坐标可用于:

转到 X Z

例如:

前往 -867 -8633

先使用四舍五入后的整数在旧版游戏中可能更容易。

如果未启用开发者命令,请使用以下方式启动英灵神殿:

控制台

然后在游戏内打开控制台并运行:

开发者命令

在那之后, 转到 可以使用。

如果物体是一次性的

如果报告的位置只是一个旧的临时营地、废弃的储物区、船只、推车或垃圾箱,最简单的修复方法可能就是将其彻底摧毁。

在确诊病例中:

  1. 旧版本已加载。
  2. 违规的箱子已被破坏。
  3. 移除掉落 被运行了。
  4. 世界得救了。
  5. Valheim 1.0 转换已重试。
  6. 转换成功。

只有在你能够接受丢失该对象内容的情况下才这样做。

建筑

本项目有意不包含 Valheim、Unity、Harmony 或 BepInEx 的 DLL 文件。

将所需的引用放入:

lib/

所需文件:

BepInEx.dll 0Harmony.dll UnityEngine.dll UnityEngine.CoreModule.dll

然后用以下内容建造:

.\build.ps1

或:

dotnet build -c Release

输出的DLL将位于:

bin/Release/netstandard2.1/

为什么不自动修理库存?

该插件有意不尝试自动修复。

关于格式错误的旧版库存数据,存在太多未知因素,悄无声息地重写世界数据可能比原始问题造成更大损害。

更安全的工作流程是:

在旧游戏版本上手动诊断定位修复,重试转换

当此插件可能有帮助时

这在以下情况下特别有用:

  • 在《英灵神殿》1.0版本之前,世界本来运转正常
  • 同一个世界仍可在之前的英灵神殿版本中加载
  • 《英灵神殿》1.0 在转换世界时崩溃
  • 堆栈跟踪包含以下内容的某种组合:
ZDOMan.ConvertInventories Inventory.LoadOld Inventory.AddTempItem Inventory.AddItem ItemDrop+ItemData.IsSameType

如果世界在之前的英灵神殿版本中也无法加载,那么问题可能是无关的存档损坏,这个插件可能帮不上忙。

建议的备份策略

在做任何操作之前,请先备份两个世界文件:

世界数据库 世界文件

至少保留:

原始未动备份旧版本修复副本1.0转换测试副本

不要用你唯一的副本进行测试。

潜在故障说明

已确认的案例似乎涉及格式不正确的旧版背包栏位数据,而非整体损坏的世界。

容器被报告为4x4物品栏,但部分序列化物品使用的X坐标为 4,这超出了正常的 0-3 4格宽物品栏的射程。

旧版英灵神殿仍然能够加载并使用那个容器。

英灵神殿1.0的转换路径试图重建旧版物品栏,遇到了无效或冲突的槽位状态,最终在以下位置触发了空引用:

物品掉落+物品数据.类型相同

这就是为什么一个坏容器会阻止一个本来健康的世界完成转化。

异常物品栏的确切原因尚不明确。

可能的原因包括:

  • 一个旧的物品栏序列化错误
  • 堆叠移动或合并期间发生的保存
  • 物品栏槽位元数据不同步
  • 旧版本曾容忍的一次性容器状态

已确认案例中的相邻容器是同时生成的,且未受影响,因此这似乎并不单纯取决于容器年龄或宝箱创建时的游戏版本。

故障排除

插件不会创建日志

确认:

  • BepInEx 已安装并正在加载
  • DLL 位于正确的 BepInEx/plugins 目录
  • 插件会出现在BepInEx启动日志中
  • 世界其实正在抵达 ZDOMan.转换库存

日志中不包含 源ZDO候选

请确保您使用的是当前的插件版本,该版本包含ZDO库存获取器诊断功能。

旧版插件能识别出出错的物品栏内容,但无法识别其世界坐标。

上报的坐标中没有任何东西

可能的解释包括:

  • 物体在地形下方
  • 该物体位于另一个结构内部
  • 物品栏属于一辆马车
  • 物品栏属于一艘船
  • 该物体已被部分摧毁
  • 对象是临时或异常容器

搜索附近区域,不要想当然地以为这一定是个普通宝箱。

修复一个对象后转换成功,但随后再次失败

这意味着可能存在多个格式错误的物品栏。

再次运行诊断插件,获取下一组ZDO坐标,切回旧版本,修复下一个对象,保存并重试。

测试环境

初始开发和成功恢复是在以下环境中完成的:

  • 英灵神殿 1.0
  • 1.0版本之前创建的旧世界
  • 原版世界
  • 专用服务器
  • BepInEx 5.x
  • Docker托管的英灵神殿服务器
  • Windows Docker 主机

相同的诊断方法应适用于任何使用相同英灵神殿世界转换代码的地方。

贡献

如果这个插件帮助您恢复了世界,请打开问题或讨论并附上:

  • 无论你使用的是单人模式还是专用服务器
  • 世界是否安装了模组
  • 相关堆栈跟踪
  • 诊断失败报告
  • 在报告坐标处发现了什么样的物体
  • 无论删除还是清空它,都允许转换成功

除非你愿意分享,否则不要上传你的整个世界存档。

免责声明

这是一个非官方诊断工具,与Iron Gate AB无关。

在测试任何内容之前,请先备份你的世界。

使用风险自负。

Valheim: 英灵神殿 的热门 MOD

探索适用于 Valheim: 英灵神殿 的最佳MOD,带来新功能、升级画面,以及令人兴奋的方式来改变您的游戏体验。

使用 Xmod 解锁 Valheim: 英灵神殿 的全部潜力 — 今天就探索这些顶级 MOD!