

この記事を読んでいるということは、パルワールドを専用サーバーで、鍵をかけずに遊んでいましたね?
そしてチーターにステータスをマイナスにされてしまったのではないでしょうか?
足が重くて動けないですよね…。
心中お察しいたします。
そして公式サーバーの方はご愁傷様です。
専用サーバーの方…
おめでとうございます!🎉
今回は専用サーバーでチーター襲撃イベントに合われた方のセーブデータの復旧方法をご紹介します。
追記
どうやら「記憶リセット薬」を飲むことでも修復が可能なようです。
プログラムやサーバーの知識がない方、または公式サーバーの場合は上記方法がオススメです。
■手順
1.Pythonのダウンロード
Microsoft Storeからでもダウンロード可能です。
バージョンは3.12辺りをDLしておけば良いと思います。
2.セーブデータ変換ツールのダウンロード
以下から変換ツールをダウンロードします。
https://github.com/cheahjs/palworld-save-tools/releases?page=2
※「Assets」をクリックし、「 palworld-save-tools-windows.zip 」もしくは「palworld-save-tools-windows-(バージョン).zip 」をダウンロード。
※自分は v0.4をダウンロードしています。
3.Level.savをLevel.sav.jsonに変換する。
セーブデータの中に、「[…]/Saved/SaveGames/0/[文字列]/Level.sav」というファイルが存在します。
こちらの中身を、適当なフォルダーにコピペします。
その後、先程ダウンロードしたzipファイルを解凍し、「convert-single-sav-to-json.bat」に対して、 Level.sav をドラッグアンドドロップしてください。
その後、キーボードの「y」を押すと処理が始まります。※小文字でおk
※似た名前のファイルがあるので、間違えないように注意してください。
ファイルはかなり重いので、処理にかなりの時間がかかります。
処理が完了すると、「Level.sav」と同じフォルダ内に「Level.sav.json」が作成されます。
4.Level.sav.jsonをテキストエディタで開く。
VSCodeなどのテキストエディタを利用し、「Level.sav.json」を開きます。(VSCodeなどの開けるエディタがない場合はダウンロードしてください)
5.ユーザー名で検索し、ステータス箇所を変更していく
Ctrl+Fを押し、ゲーム内のプレイヤーの名前で検索をします。
検索すると数件ヒットすると思いますので、以下のような箇所を探します。
※以下の「プレイヤー名」が対象のプレイヤー名になります。
※「プレイヤーレベル」は対象のプレイヤーのレベルになります。
"Parsed": {
"object": {
"SaveParameter": {
"struct_type": "PalIndividualCharacterSaveParameter",
"struct_id": "00000000-0000-0000-0000-000000000000",
"id": null,
"value": {
"Level": {
"id": null,
"value": プレイヤーレベル,
"type": "IntProperty"
},
"Exp": {
"id": null,
"value": 168228,
"type": "IntProperty"
},
"NickName": {
"id": null,
"value": "プレイヤー名",
"type": "StrProperty"
},
上記の箇所から、しばらく下のほうを見ていくと、value値が明らかにマイナス担っている項目があります。
"CraftSpeed": {
"id": null,
"value": -6941800,
"type": "IntProperty"
},
例えば、上記は「作業速度」の値になります。
明らかにやばい数字です。。。
まずはこちらをデフォルトの「100」にしましょう。
その後、更に更に下のほうに行くと、
"UnusedStatusPoint": {
"id": null,
"value": -2147192090,
"type": "IntProperty"
},
上記のような項目があります。
こちらは、利用していないステータスポイントになります。
こちらのvalueをプレイヤーのレベル数与えます。
その下に、「GotStatusPointList」という項目があります。
"GotStatusPointList": {
"array_type": "StructProperty",
"id": null,
"value": {
"prop_name": "GotStatusPointList",
"prop_type": "StructProperty",
"values": [
{
"StatusName": {
"id": null,
"value": "最大HP",
"type": "NameProperty"
},
"StatusPoint": {
"id": null,
"value": 8,
"type": "IntProperty"
}
},
{
"StatusName": {
"id": null,
"value": "最大SP",
"type": "NameProperty"
},
"StatusPoint": {
"id": null,
"value": 10,
"type": "IntProperty"
}
},
{
"StatusName": {
"id": null,
"value": "攻撃力",
"type": "NameProperty"
},
"StatusPoint": {
"id": null,
"value": -138840,
"type": "IntProperty"
}
},
{
"StatusName": {
"id": null,
"value": "所持重量",
"type": "NameProperty"
},
"StatusPoint": {
"id": null,
"value": -13874,
"type": "IntProperty"
}
},
{
"StatusName": {
"id": null,
"value": "捕獲率",
"type": "NameProperty"
},
"StatusPoint": {
"id": null,
"value": 4,
"type": "IntProperty"
}
},
{
"StatusName": {
"id": null,
"value": "作業速度",
"type": "NameProperty"
},
"StatusPoint": {
"id": null,
"value": -138838,
"type": "IntProperty"
}
},
{
"StatusName": {
"id": null,
"value": "teProperty\u0002IntProperty",
"type": "NameProperty"
},
"StatusPoint": {
"id": null,
"value": -2147483646,
"type": "IntProperty"
}
}
],
その中を見ていくと、StatusNameに日本語で「最大HP」「最大SP」など書いている箇所があります。
その下の「StatusPoint」内のvalueがステータスポイントの数になります。
サーバー内のユーザーがステータスポイントをどのように割り振ったかはわからないと思うので、全部「0」にし、ステータスポイントをレベル分ユーザーに配布する形で復旧を行うのがよいと思います。
※「teProperty\u0002IntProperty」はよく分かりませんでしたが、とりあえず「0」にしました。
※捕獲率は特にいじられていないので、そのままで良いかと思います(最大10)
ちなみに自分の場合、チーター襲撃イベントの際にログインしているユーザーのみ書き換えられていましたので、当時ログインしていたプレイヤーの数だけ上記の修正を行います。
すべてのステータスをリセット後、Ctrl+S等で保存します。
※ファイル事態が重く、うまく保存ができない可能性がありますので、ちゃんと保存されているか確認してください。
6.Level.sav.jsonをLevel.savに変換する
今度は「convert-single-json-to-sav.bat」に対して、 Level.sav.json をドラッグアンドドロップしてください。
その後、キーボードの「y」を押すと処理が始まります。※小文字でおk
7.サーバーにアップロードし、再起動
先程のLevel.savをサーバーに戻し、サーバーの再起動を行います。
その後、サーバーにログインして確認してみてください。
以上、専用サーバーを利用する際は、サーバーに鍵をかけましょう!
補足
プレイヤーデータの所有者が異なっている状態でゲームを起動すると、プレイヤーデータをセーブするタイミングでサーバーが落ちてしまいます。
これを防ぐために、移行前のファイルに付与されている所有者を移行先の所有者へ変更する作業が必要になります。
その場合の作業手順に関してはこちらの記事で紹介されているので、こちらを参考にお願いします。