【Minecraft】worldとplayerdataの移行方法

# はじめに
Minecraftのworldを別のサーバに移行したときに、「え、playerdataがない･･･！」 ってなった かつ 調べてもあんまり情報がでてこなかったので備忘録🤓
（友達みんなと今更マイクラにハマっているのであった･･･）

# Minecraft Serverの基本情報
まずマイクラフトのデータ移行にあたって理解しておくべき、ディレクトリ構成やファイルの内容( ..)φメモメモ

## 環境構成
- Ubuntu 22.04.3 LTS
- Java版 ver 1.20.4

## Minecraft Serverのディレクトリ構成
↓がサーバーのディレクトリ構成
他にもいろいろファイルはあるけど、移行で使ったところだけ記載

```
- /opt/minecraft_server/    
    - logs
        - yyyy-mm-dd-x.log.gz
        - ...
    - server.properties
    - usercache.json
    - world/
        - playerdata/
        - xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx.dat
        - ...
```

### 各ファイルの解説
- `logs` : クライアントが接続失敗したときとかに見るログ
- `server.properties`: マイクラサーバーの難易度・Seed値とかの設定ファイル
- `usercache.json`: playerのUUIDが書いてあるファイル
- `world`: マイクラのワールドデータ
- `playerdata`：各プレイヤーの装備・インベントリ・最後に切断した位置を保持しているファイル

↑このへんは調べたら、いろんなサイトで出てくる！！📚

# worldの移行でやったこと
- 移行元のworldをローカル環境にダウンロード
- worldをzip圧縮
- [WinSCP](https://winswinscp.net/eng/docs/lang:jp)でローカル → 移行先サーバの`/opt/minecraft_server/`にworld.zipを転送
- 転送したzipファイル解凍

<br />
なんかちょっと前にこういう仕事してた気がするな･･･と複雑な気持ちと懐かしさを感じながら作業😂


## 移行で詰まったところ

よっしゃワールドのデータは移行したぞー！いざ、接続～！！...と思ったら色々問題発生💣
<br />

問題①： Connection Refused でワールドに接続できない
問題②： ワールド接続後、装備やらアイテムやらが何もない

<br />

### 問題①： Connection Refused でワールドに接続できない
まずは、そもそもワールドに接続できない問題である。
なんでよ～😿

### 原因
色々見てみたらworldフォルダの所有者が違うために、ファイルの読み書き・実行できていないことがわかった。

### 解決方法
`world/*`の所有者を`minecraft`にする

```text:コマンド
chown -R minecraft:minecraft ./world/*
```


### 実際にやったこと

まずは`/opt/minecraft_server/logs`の最新ファイルを見てみた。
（ちなみにgzipで圧縮されているので `gunzip yyyy-mm-dd-x.log.gz` で解凍）
<br />

なんかエラーでてる

>[Server console handler/ERROR]: Exception handling console input
java.io.IOException: Input/output error
<br />

もしかして･･･！と思って `ls -l /opt/minecraft_server/`でフォルダの所有者の情報をみてみた

>-rw-r--r--  1 minecraft minecraft 1234 Dec 16 02:06 server.properties
drwxr-xr-x 12 user user 1234 Dec 16 16:38 world



おーやっぱり、所有者他のファイルと違う！となったので、所有者を`minecraft`に変更

```text:コマンド
chown -R minecraft:minecraft ./world/
```

接続してみる･･･
ワールド接続成功！！！やったー！これで始められるぞー！！

....と思ったら、次の問題が発生。
<br />


### 問題②： ワールド接続後、装備やらアイテムやらが何もない
座標 0 にリスポーンするし、装備も持ち物も何にもないじゃん😤どうして～～


### 原因
移行元のサーバと移行先のサーバでユーザーの識別子が異なるため、playerdataが復元できていない。

### 解決方法
移行元のplayerdata（datファイル）を移行先のdatファイルに上書きする

```text: playerdata/
cp {移行元サーバのUUID}.dat {移行先サーバのUUID}.dat
```

### 実際にやったこと

色々調べてみて、各プレイヤーのデータは、`/opt/minecraft_server/world/playerdata`に格納されていることがわかった。

playerdata配下には、こんな感じでdatファイルが複数ある。
そしてどうやらdatファイルのファイル名は、`{プレイヤーのUUID}.dat`になっているらしい。
> 00000000-0000-0000-0000-00000000000.dat
00000000-0000-0000-0000-00000000000.dat_old
11111111-1111-1111-1111-111111111111.dat
11111111-1111-1111-1111-111111111111.dat_old


UUIDはどこで調べられるかというと`usercache.json` に記載されていることがわかった。
↓こんな感じで書いてある

```usercache.json
[
   {
      "name":"player1",
      "uuid":"00000000-0000-0000-0000-000000000000",
      "expiresOn":"2024-01-16 15:43:09 +0900"
   },
   {
      "name":"player2",
      "uuid":"11111111-1111-1111-1111-111111111111",
      "expiresOn":"2024-01-16 15:34:45 +0900"
   },
   { ... }
]
```

ここで移行元サーバの自分のUUIDを調べてみた

> {
      "name":"player1",
      "uuid":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      ...
   }

ほーん、移行先サーバの自分のUUID と 移行元サーバのUUIDが違うからユーザーデータが復元されないのね🤔
<br />

そこで、playerdataを`{移行元サーバの自分のUUID}.dat`→`{移行先サーバの自分のUUID}.dat`に上書きしてみる。

```text: command
cp xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.dat 00000000-0000-0000-0000-000000000000.dat
```

データの上書きに成功したら、ワールドに接続してみる。
<br />

元の装備とアイテムが復活し、最後にマイクラを切断した位置でリスポーンした！！！やったー！建築するぞー！
というわけで、worldとplayerdataの移行が完了✨


# まとめ
趣味のゲームとはいえ、色々調べたりサーバで試行錯誤したので記事にしてみました📝
worldとplayerdataは別で移行するというのがわかったので、これからいくらでもマイクラのデータ移行ができるぞ！

playerdataの移行方法は、ググっても「これだ！」っていう情報があんまりなかったので、誰かの役に立つといいな💁‍♀️🍣


# 参考文献

https://qiita.com/MirrgieRiana/items/bedc482ede695c5d8742#%E3%83%97%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E5%90%8Duuid