これとjqを使ってMinecraftのセーブデータを色々解析したときのメモ
- 【Minecraft】LinuxのCLI上でNBT→JSONするツールを作った https://qiita.com/MirrgieRiana/items/e8bbcb2615506dd0342c
前提
- Ubuntu 18.04.3 LTS
- bash
Minecraftサーバーの構成
Minecraftのセーブデータは、デフォルトではサーバーの実行ディレクトリ内にあるworldディレクトリに格納される。
- サーバー/
config/
libraries/
-
world/
DIM-1/
DIM1/
advancements/
-
playerdata/
12345678-1234-1234-1234-12345678ABCD.dat
- 他...
-
region/
r.0.-1.mca
- 他...
- 他...
server.properties
eula.txt
usernamecache.json
- 他...
以下では上記ツリーの「サーバー」をカレントディレクトリとする。
プレイヤー名⇔UUID
プレイヤーは、英数字の名前と長いUUIDを持っている。
この対応表はusernamecache.json
にキャッシュされている。
$ cat usernamecache.json; echo
{
"00000000-0000-0000-0000-000000000000": "Player0",
"11111111-1111-1111-1111-111111111111": "Player1",
"22222222-2222-2222-2222-222222222222": "Player2"
}
$ cat usernamecache.json | jq -r 'with_entries({"key":.value, "value": .key}).Player1'
11111111-1111-1111-1111-111111111111
その他、MojangのWebAPIからも拾ってこれるらしい。
プレイヤーデータ
プレイヤーデータは、world/playerdata/12345678-1234-1234-1234-12345678ABCD.dat
みたいな場所に格納されている。
ここで、12345678-1234-1234-1234-12345678ABCD
は任意のプレイヤーのUUIDである。
UUIDはusernamecache.json
からコマンドで調べられるので、コマンドだけでユーザー名からそのユーザーのステータスを出したりとかもできる。
以下はユーザー名のキャッシュが残っているすべてのプレイヤーのインベントリ(と装備とオフハンド)の中に直接入っている松明の個数を合計して出力するコマンドである。
bash
for entry in $(cat usernamecache.json | jq -c 'to_entries[] | [.key, .value]')
do
uuid=$(echo $entry | jq -r '.[0]')
name=$(echo $entry | jq -r '.[1]')
count=$(cat world/playerdata/$uuid.dat | \
inflate-gzip | \
nbt2json -cp | \
jq '.C.AInventory.values | [.[] | select(.Tid == "minecraft:torch").BCount] | add // 0')
echo -e "$count\t$name"
done