Minecraft Command Advent Calendar 2024 Series 2 Day 24 (2024/12/24)
超雑な記事です。
0. UUID調べる必要あった?
プレイヤーのUUIDって使われている場面見れるの?
ワールドのセーブデータにスコアボード以外は使われていますが、ゲームプレイでは使われていそうな感じはしません。
簡単に調べてみた結果、あることがわかったので今回は紹介します。
特にマルチでは為にならない雑学が入ったので是非読んでみてください。
重要
こちらの記事はv1.21.xで検証しています。
UUIDの歴史上NBTは1.16から仕様が変わっているので、1.15.2以前は順番が違う事があるかもしれません。
1. UUIDを調べたきっかけ
自分は、あるマイクラの動画をYouTubeで見たとき、不思議なことを感じました。
それは、スペクテイターでテレポートメニューを表示していた時。
この順番ってどのサーバーでも同じやんって。
そう、この順番、なんか法則性があるんです。でないとこの順番にはならないはず。
Tabリストはプレイヤー名で並べ替えられていますが、このメニューはプレイヤー名では並べ替えられていません。
ということは…
UUIDを使っているということ。
2. アカウント買った時に付与されるUUIDについて
UUIDはマイクラアカウントを買った時に自動でランダムになるのか、何が規則性なのかを調べてみました。
まずアカウント買う前に決まっているのか。
ということで調べました。
何も割り当てられていないアカウントにはオンラインUUIDがついていませんね。
でも、ここで1つ知った事、オフラインUUIDも存在するらしいです。なんじゃそりゃ。
なんかこっちはプレイヤー名で決まっていそうですね。
まぁオフラインなのでマルチでは使わないだろうという事で、今回はオンラインUUIDのみについて焦点を当てていきます。
ここでUUIDについての知識を1つ。
UUIDは次の書き方が基本です。
NNNNNNNN-NNNN-NNNN-NNNN-NNNNNNNNNNNN
Nには0~9もしくはa~fが入ります。これは16進数の書き方となります。
UUIDには種類があり、種類番号が使われている場合もありますが、今回は詳細を省きます。
UUIDは1文字辺り4bitなので、2文字で1Bと計算します。
続いてマイクラのデータコマンドで入手したUUIDを見てみましょう。
マイクラのデータコマンドで入手すると10進数に自動的に置き換えられています。
[I; <-約21億~約21億>, <-約21億~約21億>, <-約21億~約21億>, <-約21億~約21億>]
これを見る限り、どうやら4B(8文字)で区切られています。
更に、1列目は4Bなのでそのまま10進数でも1列目に変換されていますが、2列目は2B、3列目も2Bなので、これは10進数では合わせて2列目になっている感じです。
5列目は24B(12文字)ありますが、前の4文字と後ろの8文字で10進数の3列目と4列目に分かれている模様。
3. 法則性について
今回はスペクテイターの順番とUUIDの法則性について調べます。
YouTubeの動画を勝手に借りました。ごめんね。
名前は伏せておきます。本当は伏せたくないけど一応。
まぁ自分が1番気になったのは、どの動画でも1番目にいた人を調べました。
すると16進数での先頭が81でした。
続いてどの動画でも1番後ろにいる人のUUIDを調べました。
すると16進数での先頭が7eでした。
このことから、8が先頭のアカウントが最初に来て、7が最後に来る、そんな感じだと思っていました。
これは10進数では8~fはマイナスだよとも読み取る事が出来ます。
つまり、
UUIDで最初の数字が低い-2147483648から順に並べ替えられているという事になります。
1列目が全く同じ場合は2列目、3列目へと続く感じですね。
(そもそも42億もアカウント作られていないから1列目でほぼ被らない)
4. 他にUUID順ってあるのだろうか?
個人的に1番気になった順番はコマンドexecute asの実行順についてです。
デフォルトの実行順序がセレクター引数のsortで決まるので、セレクター引数が[sort=arbitrary]を調べてみましたが、自分で試した結果Wikiに書いてある通りスポーン順でした…
5. データパックでもUUIDを使うようになった今(ほぼおまけ)
マルチに対応したデータパックで、現在UUIDが使われる事が非常に多くなったと自分では最近感じています。
UUIDはとても便利です。
- プレイヤーID変えてもプレイヤーデータと同じように維持される。
- 1.20.2のマクロ登場でストレージ名にUUIDがめっちゃ使いやすくなった。
マクロ登場により、
/function alpha:test with entity @s
$data modify storage alpha:playerstorage player."$(UUID)".test set value "winner"
みたいな感じにするだけで、簡単にプレイヤー専用のストレージを作れるようになりました。
しかもこれはUUIDを強制的にstringに変更しているだけなので、マイクラのアップデート以外で壊れる事がほぼない最強のストレージになります。
6. おわり
ここまで記事を読んでくださりありがとうございました。
これ以外にもUUID順があるかもしれませんが、自分ではわからなかったので、今回はここまでとさせていただきます。
データパックとほぼ関係なかったんやけど…