如何將本地存檔修改為伺服器存檔的幻獸帕魯#
閱讀之前#
請確保你具備一定的操作能力。基於已經能夠開啟伺服器的思考,下文將預設讀者會使用 Python3,會使用 terminal。
前置條件#
- Python3
- MuelNova/Palworld-Save-Patcher
- 準備轉換的存檔,下文將直接使用 % SAVE% 來指代這個目錄,它應該類似於如下
%SAVE%
├── LevelMeta.sav
├── Level.sav
├── LocalData.sav
├── Players
│ ├── 00000000000000000000000000000001.sav
│ ├── PLAYER_B_GUID.sav
│ └── PLAYER_C_GUID.sav
└── WorldOption.sav
版本資訊(時效性)#
- Palworld v0.1.2.0
- 伺服器部署使用 https://github.com/thijsvanloef/palworld-server-docker
修改過程#
伺服器存檔提取#
首先確保你的伺服器已經開啟完成,將 % 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 檔案
uesave to-json --input <GUID>.sav.gvas --output <GUID>.sav.json