🐲

【PalWorld】専用サーバーをアップデートしたらキャラクターの新規作成からやり直しなるバグの対処方法

2024/12/28に公開

はじめに

記事を書いてる時はちょうど天落アップデートがリリースされた頃です。
桜島アップデートで遊んでいたサーバーを天落にアップデートしたところ、何故かキャラクターの新規作成からになってしまいました。
色々調べた結果、解決方法を見つけたので、今回はそれを記事にまとめようと思います。

発生環境

項目 内容
プラットフォーム Steam
サーバーOS Linux (Ubuntu Server 24.04 LTS)
バージョン v0.3.9 -> v0.4.12

発生状況

  1. 2024年10月2日に専用サーバーを停止 (GameVersion: v0.3.9)
  2. <インストールディレクトリ>/Pal/SavedフォルダのみをサーバーPCから別PCへバックアップ
  3. サーバーPCを新調
  4. 2024年12月26日にSteamCMDを使ってPalWorldのサーバーをインストール
  5. <インストールディレクトリ>/Pal/ディレクトリに2で取ったバックアップをコピー
  6. 専用サーバーを起動 (GameVersion: v0.4.12)
  7. v0.3.9の時と同一のSteamアカウントでログイン
  8. キャラクターの新規作成からスタート

原因

プレイヤーデータが保存されているフォルダを見ると、別のプレイヤーIDとしてプレイヤーデータが生成されていました。
何故、別のプレイヤーIDとしてプレイヤーデータが生成されるのかは原因は不明です。

対処方法

ワールドデータとプレイヤーデータに含まれる古いプレイヤーIDを全て新しいプレイヤーIDに置換します。
具体的にはLevel.sav<プレイヤーID8桁>000000000000000000000000.savというバイナリデータのファイルをjsonに変換して、IDを書き換えて、savに変換してサーバーに戻すという方法です。

今回はWindowsとLinuxの2つで解説していきます。

1. sav/json変換ツールをダウンロード

https://github.com/cheahjs/palworld-save-tools

cheahjsさんが作成した、savファイルとjsonファイルを相互に変換するツールを使います。

Windows

変換ツールのダウンロード

このページにアクセスして、palworld-save-tools-windows-<バージョン>.zipをダウンロードしてください。

Linux

Shell
wget https://github.com/cheahjs/palworld-save-tools/releases/download/<バージョン>/palworld-save-tools-windows-<バージョン>.zip

2. sav/json変換ツールを解凍

ダウンロードした変換ツールを解凍します。

Windows

変換ツールのzipを解凍する1

ダウンロードしたzipを右クリックまたは上部のメニューから「すべて展開」ボタンをクリックします。

変換ツールのzipを解凍する2

そのまま「展開」ボタンをクリックします。

Linux

Shell
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のダウンロード

Pythonの公式サイトまたはMicrosoft Storeからダウンロードしてインストールしてください。

Linux

Shell
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.savconvert.cmdにドラッグ&ドロップします。

Level.savをjsonに変換中

コマンドプロンプトが起動して変換が開始されます。
「続行するには何かキーを押してください...」と表示されれば変換終了です。

Level.sav.jsonが出力

変換されたファイルはLevel.sav.jsonとしてLevel.savと同じフォルダに出力されます。

Linux

Shell
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に変換してから検索してください。

https://www.learnjapanesetools.com/en/japanese-to-unicode

https://tech-unlimited.com/escape-unicode.html

Level.sav.json
{
  "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

Shell
grep -A 2 -B 4 "<プレイヤー名>" Level.sav.json
Shell
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と入力

Level.sav.jsonがあるフォルダを開いて、アドレスバーにcmdと入力してEnterを押してください。

cmd
C:\Users\palworld\server>powershell

コマンドプロンプトが起動したら、powershellと入力してEnterを押してください。

PowerShell
PS C:\Users\palworld\server>(Get-Content -Path "Level.sav.json" -Raw) -replace "ABCDE", "ZZZ" | Set-Content -Path "Level.sav.json"

上記のコマンドを入力してEnterを教えてください。
プレイヤーデータも同様の手順でプレイヤーIDの置換をしてください。

Linux

Shell
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にドラッグ&ドロップ

Level.sav.jsonconvert.cmdにドラッグ&ドロップします。

上書き確認

コマンドプロンプトが起動して変換が開始されます。
Are you sure you want continue? (y/n)と表示されたら、既に存在しているLevel.savに上書きするかの確認になります。
上書きしても大丈夫な場合はyと入力してEnterを押してください。
上書きしたくない場合はnと入力してEnter押して、Level.savのコピーをしてから再度実行してください。

Level.sav.jsonをsavに変換中

「続行するには何かキーを押してください...」と表示されれば変換終了です。
プレイヤーデータも同様の手順でsavに変換してください。

Linux

Shell
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のコピーをしてから再度実行してください。

Shell
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. 復旧確認

修正したファイルをサーバーに戻し終わったら、サーバーを起動してログインしてください。
問題なく前のデータからプレイできれば復旧は成功です。

参考資料

https://qiita.com/sakanaJA/items/b547277a08c1acb5c35b

https://zenn.dev/suzuesa/articles/ff85f359230dc3

GitHubで編集を提案

Discussion