Palworldのワールドデータ移行メモ

# 概要
プレイ方式の変更を行う際にワールドデータをそのまま移設したい時の方法。
主に以下に対応する。
- Windows Co-op⇔Windows Server
- Windows Server⇔Linux Server
- 多分Co-op⇔Linux Serverも行ける
※Co-opとは招待コード式のサーバーのこと。

筆者はver0.1.4.0にて実施。

これらを行うとホスト側のプレイヤーデータがなかったり、全プレイヤーのプレイヤーデータがなかったりするので、それを何とかするツール。
**※パルワールド自体ベータなのと、このツールも実験的なものであることには注意。**
**※必ず実施前にワールドデータのバックアップを取得すること。**

# 準備するもの
- コマンドプロンプトの知識
- [Python](https://www.microsoft.com/ja-jp/?ranMID=46128&ranEAID=wizKxmN8no4&ranSiteID=wizKxmN8no4-3Bu4b_HJoZnFY9T9O4fiGA&epi=wizKxmN8no4-3Bu4b_HJoZnFY9T9O4fiGA&irgwc=1&OCID=AIDcmm549zy227_aff_7794_1243925&tduid=%28ir__byr3kho30gkftx1rkk0sohzx0u2x9pjz16flqyif00%29%287794%29%281243925%29%28wizKxmN8no4-3Bu4b_HJoZnFY9T9O4fiGA%29%28%29)
- [Palworld Host Save Fix (github)](https://github.com/xNul/palworld-host-save-fix/)
 ※リリースはないのでコードのところからDownloadZIPでソースを保存する
- [uesave-rs (github)](https://github.com/trumank/uesave-rs)

# 手順
## Co-op → Windows Server（SteamCMD）
1. 後でコマンドプロンプトで必要になるのでダウンロードしたuesave-rsの解凍フォルダ内にあるuesave.exeのフォルダパスをメモ帳に控えておく（☆1）
1. 下記フォルダにアクセスし移行したいワールドデータのフォルダをコピー
　`C:\Users\<username>\AppData\Local\Pal\Saved\SaveGames\<random_numbers>`
1. 下記フォルダにセーブデータを貼り付け
　`<Windows専用サーバー保管フォルダ>\PalServer\Pal\Saved\SaveGames\0`
1. 貼り付けたフォルダのパスをメモ帳に控えておく（☆2）
1. 下記フォルダにある`GameUserSettings.ini`を開き、`DedicatedServerName`の設定値をコピーしたフォルダネームと同じものにする
　`<Windows専用サーバー保管フォルダ>\PalServer\Pal\Saved\Config\WindowsServer`
  設定値は`DedicatedServerName=<random_numbers>`のような記述になるはず。
1. 下記フォルダにある`WorldOption.sav`を削除する
　`<Windows専用サーバー保管フォルダ>\PalServer\Pal\Saved\SaveGames\0\<random_numbers>`
  ※この操作は`palworldsettings.ini`を読み込ませるための手順。Co-opの設定をそのまま使いたいなら消さなくてもOK。
  ※`palworldsettings.ini`は未実装の設定もいくつかあるようで、正しく読み込めない。そのため、可能なら`WorldOption.sav`を編集してプレイすることが望ましい。ただし知識が必要。
1. 下記フォルダを参照し、ファイル構成をある程度覚えておく
  `<Windows専用サーバー保管フォルダ>\PalServer\Pal\Saved\SaveGames\0\<random_numbers>\Players`
 ※この後GUID取得のため新規でキャラクターを作成する際に新規で作られるファイルが重要になる
1. PalServer.exeを立ち上げ実際にログインし、Co-opで使っていたワールドであるかを確認する
 ※もともとホストの人はキャラクターデータがないため、クライアントの人に確認をお願いする。
 ※GUIDを取得する必要があるため、ホストの人もキャラクターを作成してログインしておく。作成データは適当でOK。後で上書きされる。
 ※WorldOption.savを消した影響でリスポーン地点の選択になるが、それ以外の問題は特にない。
1. 確認して問題がなければサーバーを終了し、7で確認したフォルダに今までなかったファイルがあるはずなのでそのファイル名をメモ帳に控えておく（☆3）
1. 同じ様に0が大量に並んで末尾が1になっているファイルがあるのでそのファイル名もメモ帳に控えておく（☆4）
1. 3で貼り付けたファイルをそのまま同じフォルダなどにコピペしバックアップ
1. コマンドプロンプトを実行し、cdでfix-host-save.pyが格納されたフォルダを指定する
1. 下記コマンドを実行
　`python fix-host-save.py "☆1" "☆2" "☆3" "☆4" False`
  ※☆～はメモ帳に控えた各種パスやファイル名を指定する事。
1. 暫くすると`fix-host-save.pyのフォルダ名>`のような表示が出て実行が完了する
　※このときファイルが生成されたりするが触らないこと
1. PalServer.exeを再度立ち上げ、ホストがちゃんと元のキャラクターで入れるか、拠点のパルや手持ちパルが動くかを確認する
1. 成功してたら後は楽しむだけ

## 他の方法
無責任かもだけど筆者はこの方法しかやってないので後はわからない。
15で成功してても、パルが動かなかったりといった問題が出ることもあるらしい。その場合追加手順があるみたいだけど、筆者は問題なくここで終わったのでその先はわからない。
英文だけど[Palworld Host Save Fix](https://github.com/xNul/palworld-host-save-fix/)に全部記載されているので他の方法とか知りたかったら頑張って翻訳駆使してやってみて。

# `palworldsettings.ini`を使わずにCo-opのワールド設定を変更する方法
1. [palworld-save-tools](https://github.com/cheahjs/palworld-save-tools)をダウンロード
2. 解凍したフォルダの中にある`convert.cmd`に対し、`WorldOption.sav`をD&D
3. 開かれるコマンドプロンプト窓の指示に従う
4. jsonファイルが新しく生成されているのでそのファイルを編集
 過去バージョンと記述方法が異なるようなので編集には注意が必要。
 沢山の記述があるが下の方に行くと以下のような記述が出てくる。見つからなくて困ったら`OptionWorldData`あたりで検索。
```json
		"OptionWorldData": {
			"struct_type": "PalOptionWorldSaveData",
			"struct_id": "00000000-0000-0000-0000-000000000000",
			"id": null,
			"value": {
				"Settings": {
					"struct_type": "PalOptionWorldSettings",
					"struct_id": "00000000-0000-0000-0000-000000000000",
					"id": null,
					"value": {
						"Difficulty": {
            ～中略～
						"bIsStartLocationSelectByMap": {
							"value": false,
							"id": null,
							"type": "BoolProperty"
						}
					},
					"type": "StructProperty"
				}
			},
			"type": "StructProperty"
		}
	},
	"trailer": "AAAAAA=="
}
```
おそらく`bIsStartLocationSelectByMap`を最後にこんな感じ。
ここにAdminPasswordやServerPasswordなどを追加する場合は適宜項目を追加する。
特に`BaseCampWorkerMaxNum`は忘れずに。存在してればその値を書き換えて、存在してないなら追加する。
拠点パルの最大数の設定は現状`palworldsettings.ini`では未実装のままらしくデフォルトで15体上限とされているので注意する。
VSCode使うと同名キーが重複すると強調表示してくれるから便利だよ。
```json
                ～中略～
						"bIsStartLocationSelectByMap": {
							"value": false,
							"id": null,
							"type": "BoolProperty"
						},
						"BaseCampWorkerMaxNum": {
							"id": null,
							"value": 20,
							"type": "IntProperty"
						},
                        "ServerPlayerMaxNum": {
    						"id": null,
							"value": 20,
							"type": "IntProperty"
                        },
                        "ServerName": {
							"id": null,
                            "value": "サーバーの名前"
							"type": "StrProperty"
                        },
                        "ServerDescription": {
							"id": null,
                            "value": "サーバーの説明"
							"type": "StrProperty"
                        },
                        "AdminPassword": {
							"id": null,
							"value": "任意のパスワード",
							"type": "StrProperty"
						}
					},
					"type": "StructProperty"
				}
			},
			"type": "StructProperty"
		}
	},
	"trailer": "AAAAAA=="
}
```
5\. 編集が終わったら保存。念の為`WorldOption.sav`はバックアップして削除。
6\. 今度はjsonを`convert.cmd`に放る。
　記述方法に特に問題がなければsavファイルが生成される。
7\. パルワールドを起動して確認。拠点アップグレードが進んでいるなら15を超えて登録できれば成功。
8\. 後は楽しむ。

お疲れ様でした。