Palworld アップデート後キャラクリから始まってしまう(初期化バグ)

## 概要
Palworldのアップデート後、サーバーに接続するとキャラクター作成画面に強制的に移行するバグが発生しました。サーバーの管理者である主が、セーブデータ（.savファイル）を分析してデータを元に戻す方法を模索しました。
## 問題発生時の状況
サーバーをアップデートして再起動した後、接続するとキャラクター作成画面になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623265/5675171e-b897-5fcb-96a1-01db52ccf816.png)


## 注意点

このバグの原因は他のサーバーで異なる可能性があります。
問題が解決しない場合は、バックアップからデータを復元し、他の解決策を試してください。
全て自己責任で行ってください。

## 事前手順

### ①セーブデータのバックアップ
サーバーパス/Pal/Savedフォルダをコピーしてバックアップします。

### ②Pythonのインストール 
Windowsでは下記サイトを参考にするとわかりやすいです！

https://challenge-pg.com/2023/01/21/win11-python-install/

### ③セーブデータ変換ツールのダウンロード
GitHubからセーブデータをJSON形式に変換するツールをダウンロードします。

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

### ④復元したいユーザの新しい「PlayerUId」の特定
キャラメイクが始まるユーザに事前にログインしてもらい下記のディレクトリにどようなファイルが生成されるかを確認してください。
※キャラメイク後にセーブをするとファイルが正常に生成される模様

    /サーバーパス/Pal/Saved/SaveGames/0/[長い文字列]/Players内/

ファイルの特定方法は、バックアップとの比較が正確です。
ファイルの特定ができたら.savファイルの8桁目までをメモしておいてください。
※後程使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623265/4ff6e0fa-fa00-20ae-0380-6dd62489a41b.png)
上記の場合：1506D6FA

## 修正方法

#### ①Level.savファイルの変換
下記のディレクト配下にあるLevel.savをLevel.sav.jsonに変換します。

    /サーバーパス/Pal/Saved/SaveGames/0/[長い文字列]/Players内/

すると下記のようなJSONファイルが生成されるのでこちらをお好みのエディタにて開きます。(メモ帳でも問題なし)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623265/f07c6414-baaf-701c-6b9b-43eb5e9ef2c0.png)

このLevel.savにサーバに関する情報からユーザのレベル情報などユーザに関連する情報があります。

#### ②復元したいユーザの古い「PlayerUId」の特定
先ほど開いた「Level.sav.json」内にて「NickName」で検索をかけます。
このNickNameの中にユーザがつけたオブジェクトの名前があります。
このNickNameは、Unicodeエスケープシーケンスされており、一度返還する必要があります。

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

上記サイトにて変換し、日本語でつけた名前を確認できます。
データを戻したいユーザのNickNameを確認したら、上の方までスクロールし「PlayerUId」を確認します。
        
							"key": {
								"PlayerUId": {
									"struct_type": "Guid",
									"struct_id": "00000000-0000-0000-0000-000000000000",
									"id": null,
									"value": "2f7997a1-0000-0000-0000-000000000000",
									"type": "StructProperty"
								},
								"InstanceId": {
									"struct_type": "Guid",
									"struct_id": "00000000-0000-0000-0000-000000000000",
									"id": null,
									"value": "8a4af73e-617a-4f2b-bff0-b9e5e6055265",
									"type": "StructProperty"
								},
								"DebugName": {
									"id": null,
									"value": "",
									"type": "StrProperty"
								}
							},
							"value": {
								"RawData": {
									"array_type": "ByteProperty",
									"id": null,
									"value": {
										"object": {
											"SaveParameter": {
												"struct_type": "PalIndividualCharacterSaveParameter",
												"struct_id": "00000000-0000-0000-0000-000000000000",
												"id": null,
												"value": {
													"Level": {
														"id": null,
														"value": 29,
														"type": "IntProperty"
													},
													"Exp": {
														"id": null,
														"value": 223491,
														"type": "IntProperty"
													},
													"NickName": {
														"id": null,
														"value": "\u9752\u8449\u6dbc\u98a8",
														"type": "StrProperty"
													}
※\u9752\u8449\u6dbc\u98a8(青葉涼風)の場合
PlayerUIdは、「2f7997a1-0000-0000-0000-000000000000」となります。
今回はこちらのファイルを復元します。
PlayerUIdを確認出来たら、一旦このJSONファイルは最小化しておいてください
(この後使います。)

#### ③メンバーのセーブデータ変換
バックアップからバグのあるメンバーのセーブデータ（Saved/SaveGames/0/[長い文字列]/Players内/[2f7997a1-0000-0000-0000-000000000000.sav(先ほど確認したPlayerUId)）を見つけて、それを再び変換ツールでJSON形式に変換します。

#### ④JSONファイルの修正
■Level.savの修正
復元したいユーザの古い「PlayerUId」を新しい「PlayerUId」に一括で置換を行います。

■古いユーザデータの修正
①復元したいユーザの古い「PlayerUId」を新しい「PlayerUId」に一括で置換を行います。
②ファイル名も同様にユーザの古い「PlayerUId」を新しい「PlayerUId」を置換します。

#### ⑤JSONファイルの変換
先ほど修正した「Level.sav」と「ユーザデータ」をツールを利用し.savファイルに戻します。

#### ⑥サーバーへのファイルの復元:
Palworldのサーバーを停止し、修正した.savファイルをサーバーに戻します。
（サーバーパス/Pal/Saved/SaveGames/0/[謎の文字列]）
サーバーを再起動し、問題が解決しているか確認します。
この手順により、アップデート後に発生した問題を修正できる可能性があります。