😽

パルワールド(v1.2.0~v1.3.0)サーバーで個人のセーブデータが破損してしまうバグの修正方法

2024/01/26に公開4

パルワールドのサーバーを建てて遊んでいたら、突然個人のセーブデータが破損したようで全員がキャラクリエイトからになってしまいました
公式Discordでも同様の症状の方がかなりの数いるようです
このバグの修正方法を見つけたので、備忘録として書いておきます

症状

  1. サーバーのアップデートがあり、サーバーをリスタート
  2. サーバーリスタート後、接続したらキャラクリエイト画面になってしまった

注意

バグった後キャラクタークリエイトを完了してしまったメンバーのデータを戻すのは難しくなります
必ずキャラクタークリエイトをする前に対処してください 僕はデータ消えました

まえがき

僕が遭遇したバグの原因と、みなさんのサーバーの原因は違う可能性もあります
試してみて、なんか違うと思ったらバックアップからデータを戻して他の方法も探してみてください
全て自己責任でお願いします

修正方法

まずは必ずセーブデータのバックアップを取ってください

サーバーのフォルダー中の [サーバーパス]/Pal/Saved のフォルダーを丸ごとコピーしてどこかにバックアップしておくことをおすすめします
(サーバーパスはレンタルしているサーバーにより異なります)

Pythonをインストール

Windows の方は Microsoft Store から簡単にインストールできます
インストールしたら、以下のコマンドをPowershellで打ってみてください

PS C:\Users\suzu2> python --version
Python 3.12.1

バージョンは3.12系なら大丈夫だと思います

セーブデータ変換ツールをダウンロードする

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

有志の方が制作されたツールがあるので、こちらをダウンロードしてください
リンクは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のファイルをメモ帳で開いたことが問題なのでしょうか?

すずすず

そうなるとそのセーブデータ全体が破損している可能性も考えられますし、

それともjsonのファイルをメモ帳で開いたことが問題なのでしょうか?

メモ帳で開くとファイルの全体を開けないらしいので、できればVSCodeなどを使うのをおすすめします

隆

お世話になります
vscodeダウンロードし
試しに問題なく開けるサーバーを
変換してみたのですが
同じくsave_game_type
が見当たりませんでした。
Pythonバージョンもこの記事の通りです。
vscodeにてctrl+fにて検索するのが間違いなのでしょうか?

すずすず

お使いの環境(サーバーの種類やゲームバージョン)がわからないのでなんとも言えませんが、開くファイルを間違えているか、最近のアップデートでこの方法は使えなくなっている可能性もあります