banner
MuElnova

NoxA

Becoming a random anime guy... Pwner@天枢Dubhe/天璇Merak | BUPT CyberSecurity | INTP-A
email
github
bilibili
steam
twitter

幻獸帕魯存檔結構解析

如何將本地存檔修改為伺服器存檔的幻獸帕魯#

image

閱讀之前#

請確保你具備一定的操作能力。基於已經能夠開啟伺服器的思考,下文將預設讀者會使用 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
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。