【Minecraft】游戏世界数据的结构、存储位置以及分析方法等

使用这个并结合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中查询,因此可以仅通过命令从用户名获取该用户的状态等信息。

以下命令用于将所有仍保留用户名称缓存的玩家的明灯数量(位于库存、装备和副手中)进行总计并输出。

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
广告
将在 10 秒后关闭
bannerAds