How to Modify Local Saves to Server Saves in Palworld
Before You Start
Please make sure you have some hands-on abilities. Based on the assumption that you can open a server, the following text will assume that readers will use Python3 and be familiar with using the terminal.
Prerequisites
- Python3
- MuelNova/Palworld-Save-Patcher
- Prepare the save to be converted, referred to as
%SAVE%
in this guide, it should be similar to the structure below
%SAVE%
├── LevelMeta.sav
├── Level.sav
├── LocalData.sav
├── Players
│ ├── 00000000000000000000000000000001.sav
│ ├── PLAYER_B_GUID.sav
│ └── PLAYER_C_GUID.sav
└── WorldOption.sav
Version Information (Current as of)
- Palworld v0.1.2.0
- Server deployment using https://github.com/thijsvanloef/palworld-server-docker
Modification Process
Extracting Server Saves
Ensure that your server is up and running and copy the entire %SAVE%
to the server saves location.
The original homeowner logs into the game, which should prompt the creation of a new user. Proceed to create a new user and perform some actions before exiting the game.
At this point, a new file should appear in the %SAVE%/Players
folder, representing the GUID of each STEAM user, identified as 0D000721000000000000000000000001.sav
.
%SAVE%
├── LevelMeta.sav
├── Level.sav
├── LocalData.sav
├── Players
│ ├── 00000000000000000000000000000001.sav
│ ├── PLAYER_B_GUID.sav
│ ├── 0D000721000000000000000000000001.sav
│ └── PLAYER_C_GUID.sav
└── WorldOption.sav
In this case, 0D000721000000000000000000000001
is the GUID of the original homeowner.
Shutdown the server, and make sure you have backed up the %SAVE%
folder.
Running the Script
git clone https://github.com/MuelNova/Palworld-Save-Patcher.git
cd Palworld-Save-Patcher
python script.py fix-host %SAVE% %GUID%
# Replace with your own values
# python script.py fix-host /home/nova/test_pal 0D000721000000000000000000000001
Restart the Server
The original homeowner should now have progress in the game; however, the name and guild no longer exist. You need to join a friend's server to see them. This is a small flaw (due to these details being stored in BYTE, making it inconvenient to modify).
Principles
This part can be skipped if not interested.
Analysis of Save Files
Located in %applocaldadta%\Pal\Saved\SavedGame\<STEAM_ID>\<WORLD_ID>
LocalData.sav
Contains map data, unrelated to users. Can be directly copied to other saves to skip the map opening process.
Level.sav
Critical file that stores all resources, their owners, and map events.
Player/xxxxxx.sav
Player files
.sav Files
Currently, only the modification method is known, without the actual principle. Refer to Converting Palworld saves to JSON and back (github.com) for more information.
For a .sav
file, it is not a standard UE .sav file header but a file compressed using zlib
(or double compressed).
[0:4]
is the uncompressed size[4:8]
is the compressed size[8:11]
is a fixed magic number "PlZ"[11]
represents a type, with possible values:0x30, 0x31, 0x32
.0x30
is unused,0x31
is for single zlib compression, and0x32
for double zlib compression[12:]
is the compressed data
After decompression, a GVAS file is obtained, which can be converted to a JSON file using tools like trumank/uesave-rs: Rust library to read and write Unreal Engine save files (github.com).
uesave to-json --input <GUID>.sav.gvas --output <GUID>.sav.json
This Content is generated by ChatGPT and might be wrong / incomplete, refer to Chinese version if you find something wrong.