パルワールド(v1.2.0~v1.3.0)サーバーで個人のセーブデータが破損してしまうバグの修正方法
パルワールドのサーバーを建てて遊んでいたら、突然個人のセーブデータが破損したようで全員がキャラクリエイトからになってしまいました
公式Discordでも同様の症状の方がかなりの数いるようです
このバグの修正方法を見つけたので、備忘録として書いておきます
症状
- サーバーのアップデートがあり、サーバーをリスタート
- サーバーリスタート後、接続したらキャラクリエイト画面になってしまった
注意
バグった後キャラクタークリエイトを完了してしまったメンバーのデータを戻すのは難しくなります
必ずキャラクタークリエイトをする前に対処してください 僕はデータ消えました
まえがき
僕が遭遇したバグの原因と、みなさんのサーバーの原因は違う可能性もあります
試してみて、なんか違うと思ったらバックアップからデータを戻して他の方法も探してみてください
全て自己責任でお願いします
修正方法
まずは必ずセーブデータのバックアップを取ってください
サーバーのフォルダー中の [サーバーパス]/Pal/Saved
のフォルダーを丸ごとコピーしてどこかにバックアップしておくことをおすすめします
(サーバーパスはレンタルしているサーバーにより異なります)
Pythonをインストール
Windows の方は Microsoft Store から簡単にインストールできます
インストールしたら、以下のコマンドをPowershellで打ってみてください
PS C:\Users\suzu2> python --version
Python 3.12.1
バージョンは3.12系なら大丈夫だと思います
セーブデータ変換ツールをダウンロードする
有志の方が制作されたツールがあるので、こちらをダウンロードしてください
リンクはReleasesのところからいけます
ダウンロードしたら解凍しておいてください
Level.sav を変換する
バックアップしたセーブデータの中で、 [...]/Saved/SaveGames/0/[長い文字列]/Level.sav
というファイルがあります
一旦これを作業できるフォルダーへコピーしてください
コピーしたら、先程解凍したツールの convert-single-sav-to-json.bat
に対して、 Level.sav
をドラッグアンドドロップしてください
(処理にかなりの時間がかかります)
ここでエラーが出る場合は python がちゃんとインストールできてるか確認してみてください
変換したデータからメンバーの情報を取得する
処理が完了すると、 Level.sav.json
というファイルができています
これをNotepad++やVSCodeといったいい感じのテキストエディタで開きます
開くと、クソ長い文字列が出ます
落ち着いて、バグった人のゲーム内の名前を検索してみてください
検索すると数件ヒットすると思いますので、以下の様な形の箇所をなんとなく見つけてください
{
"key": {
"Struct": {
"Struct": {
"PlayerUId": {
"Struct": {
"value": {
"Guid": "bd49ba73-0000-0000-0000-000000000000"
},
"struct_type": "Guid",
"struct_id": "00000000-0000-0000-0000-000000000000"
}
},
"InstanceId": {
"Struct": {
"value": {
"Guid": "6afb0233-0aad-4663-8780-51dd95092fe2"
},
"struct_type": "Guid",
"struct_id": "00000000-0000-0000-0000-000000000000"
}
},
"DebugName": {
"Str": {
"value": ""
}
}
}
}
},
"value": {
"Struct": {
"Struct": {
"RawData": {
"Array": {
"array_type": "ByteProperty",
"value": {
"Base": {
"Byte": {}
}
}
},
"Parsed": {
"object": {
"SaveParameter": {
"struct_type": "PalIndividualCharacterSaveParameter",
"struct_id": "00000000-0000-0000-0000-000000000000",
"id": null,
"value": {
"Level": {
"id": null,
"value":47,
"type": "IntProperty"
},
"Exp": {
"id": null,
"value": 6342556,
"type": "IntProperty"
},
"NickName": {
"id": null,
"value": "!!!!!!!!!!!!!!!ここがユーザー名になっていて、検索でヒットします!!!!!!!!!!!!!!!!",
"type": "StrProperty"
},
このようなデータが必ずあります
見つけたら、 Key > Struct > Struct > PlayerUId > Struct > Value > Guid
の箇所を見つけてください
↑のデータだと "bd49ba73-0000-0000-0000-000000000000" になります
こちらがユーザーのIDになるので、このIDを バグったメンバー全員分 メモっておいてください
メンバーのセーブデータを変換する
バックアップしたデータの [...]/Saved/SaveGames/0/[長い文字列]/Players
のフォルダ内にデータがズラッと入っています
このデータの先頭の文字列と先ほどメモったバグったメンバー全員分のIDが一致するデータがあります
このデータを作業するフォルダーなどに全員分コピーしておいてください
↓ BD49BA73************
みたいなファイルがある
コピーしたら、それらを先程のツールに Level.sav
と同じようにドラッグアンドドロップで変換しておきます
メンバーのセーブデータ全員分修正する
変換したメンバーのセーブデータをいい感じのテキストエディタで開き、 save_game_type
で検索します
すると、以下のような箇所が見つかると思います
"root": {
"save_game_type": "None.PalWorldPlayerSaveGame",
"properties": {
"Version": {
"Int": {
"value": 100
}
},
この、 None.PalWorldPlayerSaveGame
の箇所がバグの原因です!
これを /Script/Pal.PalWorldPlayerSaveGame
にまるっと書き換えます
"root": {
"save_game_type": "/Script/Pal.PalWorldPlayerSaveGame",
"properties": {
"Version": {
"Int": {
"value": 100
}
},
書き換えたら忘れず保存して、他のメンバー全員分にも同じ作業をしてください
メンバーのセーブデータをもとに戻す
変換したセーブデータを更に変換してもとの形式に戻す必要があります
変換ツールの convert-single-json-to-sav.bat
にメンバーのセーブデータ全員分をドラッグアンドドロップして変換してください
できたファイルをサーバーに戻す
まずはPalworldのサーバーを必ず停止してください
新しいメンバーのセーブデータ全員分 *.sav
ファイルを [サーバーパス]/Pal/Saved/SaveGames/0/[謎の文字列]/Playes
の中に上書き保存してください
できたら、Palworldサーバーを開始し、問題なくゲームが開始できることを確認してみてください
Discussion
見させていただきました。
有益な情報ありがとうございます。
自分のidのファイルの中に確認したのですが
save_game_type
という項目すらありませんでした。
こちらはまた別の問題と見ていいのでしょうか?
それともjsonのファイルをメモ帳で開いたことが問題なのでしょうか?
そうなるとそのセーブデータ全体が破損している可能性も考えられますし、
メモ帳で開くとファイルの全体を開けないらしいので、できればVSCodeなどを使うのをおすすめします
お世話になります
vscodeダウンロードし
試しに問題なく開けるサーバーを
変換してみたのですが
同じくsave_game_type
が見当たりませんでした。
Pythonバージョンもこの記事の通りです。
vscodeにてctrl+fにて検索するのが間違いなのでしょうか?
お使いの環境(サーバーの種類やゲームバージョン)がわからないのでなんとも言えませんが、開くファイルを間違えているか、最近のアップデートでこの方法は使えなくなっている可能性もあります