跳到主要内容

幻兽帕鲁如何将本地存档修改为服务器存档

· 阅读需 4 分钟
Muel - Nova
Anime Would PWN This WORLD into 2D
🤖AI Summary

博主 nova 在文章中详细介绍了将本地存档转换为服务器存档的完整过程。本文假设读者有一定的技术基础,包括使用 Python3 和 terminal,并已经具备开启服务器的能力。

前置条件

在进行存档转换前,需要具备以下条件:

修改过程

  1. 服务器存档提取:首先将本地存档目录 %SAVE% 复制到服务器存档位置。原房主登录游戏,创建新用户并进行操作,退出后在 %SAVE%/Players 文件夹下会生成一个新的玩家文件,这个文件对应原房主的 GUID。
  2. 脚本运行:关闭服务器,备份 %SAVE% 文件夹后,运行脚本对存档进行必要修改。
  3. 重新开启服务器:重新启动服务器后,原房主的存档将被恢复,但需要重新加入好友的服务器来恢复名称和公会信息。

存档文件分析

文件主要储存在 %appllocaldata%\Pal\Saved\SavedGames\<STEAM_ID>\<WORLD_ID> 目录下,包括:

  • LocalData.sav:保存地图数据
  • Level.sav:保存资源、所有者及地图事件信息
  • Player/*.sav:玩家的个人存档文件

.sav 文件结构

.sav 文件经过 zlib 压缩,包括以下部分:

  • [0:4]:未压缩大小
  • [4:8]:压缩后大小
  • [8:11]:固定的 magicNumber "PlZ"
  • [11]:压缩类型
  • [12:]:压缩数据

解压后可转换为 JSON 文件,方便进一步操作。

工具

文章推荐使用 uesave-rs 库来读取和写入 Unreal Engine 的存档文件,便于将 .sav 文件转换为 JSON 文件。

通过这一系列步骤,读者可以有效地将本地存档转换为服务器存档,从而实现跨设备或多用户共享同一游戏世界。

阅读之前

请确保你拥有一定的动手能力。基于已经能够开启服务器的思考,下文将默认读者会使用 Python3,会使用 terminal。

前置条件

%SAVE%
├── LevelMeta.sav
├── Level.sav
├── LocalData.sav
├── Players
│   ├── 00000000000000000000000000000001.sav
│   ├── PLAYER_B_GUID.sav
│   └── PLAYER_C_GUID.sav
└── WorldOption.sav

版本信息(时效性)

修改过程

服务器存档提取

首先确保你的服务器已经开启完成,将 %SAVE% 完整的复制到服务器存档处。

原房主登入游戏,应该存在需要新建用户的情况,此时新建用户,随意进行一些操作后退出。

此时,应该在 %SAVE%/Players 文件夹下多出一个新的文件,这个 GUID 是每个 STEAM 用户特定的,我们用 0D000721000000000000000000000001.sav 表示

%SAVE%
├── LevelMeta.sav
├── Level.sav
├── LocalData.sav
├── Players
│   ├── 00000000000000000000000000000001.sav
│   ├── PLAYER_B_GUID.sav
│   ├── 0D000721000000000000000000000001.sav
│   └── PLAYER_C_GUID.sav
└── WorldOption.sav

此时,0d000721000000000000000000000001 即为原房主的 GUID

关闭服务器,确保你已经对 %SAVE% 文件夹进行了备份

脚本运行

git clone https://github.com/MuelNova/Palworld-Save-Patcher.git
cd Palworld-Save-Patcher
python script.py fix-host %SAVE% %GUID%
# 请自己替换
# python script.py fix-host /home/nova/test_pal 0d000721000000000000000000000000

重新开启服务器

此时原房主进来应该已经有东西了,但是名称和工会不再存在。需要加入好友的服务器才可以。这也是一个小缺陷(因为这些内容存在 BYTE 里,使用 uesave 不太方便弄)

原理

这部分不感兴趣的人可以不看了

存档文件分析

%applocaldadta%\Pal\Saved\SavedGame\<STEAM_ID>\<WORLD_ID>

LocalData.sav

保存了地图,与用户无关。可以直接拷贝去其他存档省去开图的过程。

Level.sav

关键文件,保存了所有的资源及其所有者以及地图事件等信息

Player/xxxxxx.sav

玩家文件

.sav 文件

目前还只知道修改方法,而不知道原理,可以看 Converting PalWorld saves to JSON and back (github.com) 这个 gist。

首先对于一个 .sav 文件,它并不是一个标准的 UE .sav 文件头,而是一个经过 zlib 压缩(或者二次压缩)的文件。

[0:4] 为未压缩大小

[4:8] 为压缩后大小

[8:11] 为一个固定的 magicNumber "PlZ"

[11] 为一个 type,可能为以下值: 0x30, 0x31, 0x32。其中 0x30 还没有使用。而 0x31 为一次 zlib 压缩,0x32 为两次 zlib 压缩

[12:] 即为压缩后的数据

解压缩后即为一个 GVAS 文件,可以直接使用 trumank/uesave-rs: Rust library to read and write Unreal Engine save files (github.com) 等来转换为 json 文件

image-20240122100541443

uesave to-json --input <GUID>.sav.gvas --output <GUID>.sav.json
Loading Comments...