【PalWorld】専用サーバーをアップデートしたらキャラクターの新規作成からやり直しなるバグの対処方法
はじめに
記事を書いてる時はちょうど天落アップデートがリリースされた頃です。
桜島アップデートで遊んでいたサーバーを天落にアップデートしたところ、何故かキャラクターの新規作成からになってしまいました。
色々調べた結果、解決方法を見つけたので、今回はそれを記事にまとめようと思います。
発生環境
項目 | 内容 |
---|---|
プラットフォーム | Steam |
サーバーOS | Linux (Ubuntu Server 24.04 LTS) |
バージョン | v0.3.9 -> v0.4.12 |
発生状況
- 2024年10月2日に専用サーバーを停止 (GameVersion: v0.3.9)
-
<インストールディレクトリ>/Pal/Saved
フォルダのみをサーバーPCから別PCへバックアップ - サーバーPCを新調
- 2024年12月26日にSteamCMDを使ってPalWorldのサーバーをインストール
-
<インストールディレクトリ>/Pal/
ディレクトリに2で取ったバックアップをコピー - 専用サーバーを起動 (GameVersion: v0.4.12)
- v0.3.9の時と同一のSteamアカウントでログイン
- キャラクターの新規作成からスタート
原因
プレイヤーデータが保存されているフォルダを見ると、別のプレイヤーIDとしてプレイヤーデータが生成されていました。
何故、別のプレイヤーIDとしてプレイヤーデータが生成されるのかは原因は不明です。
対処方法
ワールドデータとプレイヤーデータに含まれる古いプレイヤーIDを全て新しいプレイヤーIDに置換します。
具体的にはLevel.sav
と<プレイヤーID8桁>000000000000000000000000.sav
というバイナリデータのファイルをjsonに変換して、IDを書き換えて、savに変換してサーバーに戻すという方法です。
今回はWindowsとLinuxの2つで解説していきます。
1. sav/json変換ツールをダウンロード
cheahjsさんが作成した、savファイルとjsonファイルを相互に変換するツールを使います。
Windows
このページにアクセスして、palworld-save-tools-windows-<バージョン>.zip
をダウンロードしてください。
Linux
wget https://github.com/cheahjs/palworld-save-tools/releases/download/<バージョン>/palworld-save-tools-windows-<バージョン>.zip
2. sav/json変換ツールを解凍
ダウンロードした変換ツールを解凍します。
Windows
ダウンロードしたzipを右クリックまたは上部のメニューから「すべて展開」ボタンをクリックします。
そのまま「展開」ボタンをクリックします。
Linux
linux@palworld-server:~$ sudo apt update
linux@palworld-server:~$ sudo apt install unzip
linux@palworld-server:~$ unzip palworld-save-tools-windows-<バージョン>.zip -d palworld-save-tools
3. Pythonをインストール
バージョンは3.9以降をインストールしてください。
Windows
Pythonの公式サイトまたはMicrosoft Storeからダウンロードしてインストールしてください。
Linux
linux@palworld-server:~$ sudo apt install python3
4. ワールドデータとプレイヤーデータの準備
Level.sav
と<プレイヤーID8桁>000000000000000000000000.sav
を見つけてください。
プレイヤーデータはプレイヤーIDが分からないと特定出来ないので、最初はPlayers
フォルダごとコピーしてください。
/<インストールディレクトリ>
└─ Pal
└─ Saved
└─ SaveGames
└─ 0
└─ <専用サーバー名>
├─ Level.sav # ワールドデータ
└─ Players
└─ <プレイヤーID8桁>000000000000000000000000.sav # プレイヤーデータ
5. ワールドデータをjsonに変換
変換ツールを使ってLevel.savをjsonに変換します。
Windows
Level.sav
をconvert.cmd
にドラッグ&ドロップします。
コマンドプロンプトが起動して変換が開始されます。
「続行するには何かキーを押してください...」と表示されれば変換終了です。
変換されたファイルはLevel.sav.json
としてLevel.sav
と同じフォルダに出力されます。
Linux
linux@palworld-server:~$ python3 palworld-save-tools/convert.py <Level.savのパス>
Converting Level.sav to JSON, saving to Level.sav.json
Decompressing sav file
Loading GVAS file
Writing JSON to Level.sav.json
linux@palworld-server:~$
convert.pyにLevel.sav
のパスを渡して実行すると変換が開始されます。
入力状態に戻れば変換終了です。
変換されたファイルはLevel.sav.json
としてLevel.sav
と同じフォルダに出力されます。
6. 変換したワールドデータからプレイヤーIDを検索
変換後のjsonからプレイヤー名で検索をします。
そうすると2つヒットしたうちの2番目にヒットした行の3行上にplayer_uid
という項目があります。
そこに書いてある値の頭8桁がプレイヤーIDになります。
ただし、プレイヤー名に日本語が含まれている場合はUnicodeで保存されているので、下記サイトからプレイヤー名をUnicodeに変換してから検索してください。
{
"player_uid": "XXXXXXXX-0000-0000-0000-000000000000",
"player_info": {
"last_online_real_time": 16377633900000,
"player_name": "<プレイヤー名>"
}
},
XXXXXXXX
がプレイヤーIDになります。
Windows
メモ帳やVScodeなどのテキストエディタでLevel.sav.json
を開いて、Ctrl+F
からプレイヤー名で検索してください。
Linux
grep -A 2 -B 4 "<プレイヤー名>" Level.sav.json
grep -A 2 -B 4 '\\u30d7\\u30ec\\u30a4\\u30e4\\u30fc\\u540d' Level.sav.json
grepコマンドでUnicodeで検索するときは、シングルクォーテーションに変えて、バックスラッシュの前にもう一つバックスラッシュをつけてエスケープしてください。
7. プレイヤーデータをjsonに変換
手順6で検索したプレイヤーIDに該当するXXXXXXXX000000000000000000000000.sav
を、手順5と同様の手順でjsonに変換してください。
8. 新しいプレイヤーIDの確認
<インストールディレクトリ>/Pal/Saved/SaveGames/0/<専用サーバー名>/Players
フォルダの中身を全て削除します。
プレイヤーデータが無い状態でサーバーを起動して、ログインしたらログアウトしてください。
そうすると<インストールディレクトリ>/Pal/Saved/SaveGames/0/<専用サーバー名>/Players
フォルダ内にXXXXXXXX000000000000000000000000.sav
ファイルが生成されたと思います。
頭8桁のXXXXXXXX
部分が新しいプレイヤーIDになるのでメモしてください。
9. 古いプレイヤーIDを新しいプレイヤーIDに置換
ワールドデータとプレイヤーデータのjsonファイル内の全ての8桁の古いプレイヤーIDを、手順8でメモした8桁の新しいプレイヤーIDに置換します。
Windows
メモ帳やVScodeなどのテキストエディタでも置換は出来ますが、処理が重くて実行出来ない場合があります。
その場合は下記手順を試してください。
Level.sav.json
があるフォルダを開いて、アドレスバーにcmd
と入力してEnterを押してください。
C:\Users\palworld\server>powershell
コマンドプロンプトが起動したら、powershell
と入力してEnterを押してください。
PS C:\Users\palworld\server>(Get-Content -Path "Level.sav.json" -Raw) -replace "ABCDE", "ZZZ" | Set-Content -Path "Level.sav.json"
上記のコマンドを入力してEnterを教えてください。
プレイヤーデータも同様の手順でプレイヤーIDの置換をしてください。
Linux
linux@palworld-server:~$ sed -i 's/<古いプレイヤーID>/<新しいプレイヤーID>/g' <Level.sav.json>
プレイヤーデータも同様の手順でプレイヤーIDの置換をしてください。
10. jsonをsavに変換
新しいプレイヤーIDに置き換えたワールドデータとプレイヤーデータのjsonをsavに戻します。
savからjsonに変換したときと同じツールを使ってsavに変換します。
Windows
Level.sav.json
をconvert.cmd
にドラッグ&ドロップします。
コマンドプロンプトが起動して変換が開始されます。
Are you sure you want continue? (y/n)
と表示されたら、既に存在しているLevel.sav
に上書きするかの確認になります。
上書きしても大丈夫な場合はy
と入力してEnterを押してください。
上書きしたくない場合はn
と入力してEnter押して、Level.sav
のコピーをしてから再度実行してください。
「続行するには何かキーを押してください...」と表示されれば変換終了です。
プレイヤーデータも同様の手順でsavに変換してください。
Linux
linux@palworld-server:~$ python3 palworld-save-tools/convert.py <Level.sav.jsonのパス>
Converting Level.sav.json to SAV, saving to Level.sav
Level.sav already exists, this will overwrite the file
Are you sure you want to continue? (y/n):
convert.pyにLevel.sav.json
のパスを渡して実行すると変換が開始されます。
Are you sure you want continue? (y/n)
と表示されたら、既に存在しているLevel.sav
に上書きするかの確認になります。
上書きしても大丈夫な場合はy
と入力してEnterを押してください。
上書きしたくない場合はn
と入力してEnter押して、Level.sav
のコピーをしてから再度実行してください。
linux@palworld-server:~$ python3 palworld-save-tools/convert.py <Level.sav.jsonのパス>
Converting Level.sav.json to SAV, saving to Level.sav
Level.sav already exists, this will overwrite the file
Are you sure you want to continue? (y/n):Loading JSON from Level.sav.json
Compressing SAV file
Writing SAV file to Level.sav
linux@palworld-server:~$
入力状態に戻れば変換終了です。
11. ワールドデータとプレイヤーデータをサーバーに戻す
savへ変換したワールドデータとプレイヤーデータをサーバーに戻します。
ワールドデータは<インストールディレクトリ>/Pal/Saved/SaveGames/0/<専用サーバー名>
フォルダに配置します。
プレイヤーデータは<インストールディレクトリ>/Pal/Saved/SaveGames/0/<専用サーバー名>/Players
フォルダに配置します。
/<インストールディレクトリ>
└─ Pal
└─ Saved
└─ SaveGames
└─ 0
└─ <専用サーバー名>
├─ Level.sav # ワールドデータ
└─ Players
└─ <プレイヤーID8桁>000000000000000000000000.sav # プレイヤーデータ
12. 復旧確認
修正したファイルをサーバーに戻し終わったら、サーバーを起動してログインしてください。
問題なく前のデータからプレイできれば復旧は成功です。
参考資料
Discussion