【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