Skip to content

Latest commit

 

History

History
129 lines (89 loc) · 3.5 KB

File metadata and controls

129 lines (89 loc) · 3.5 KB

02. SNBT

SNBT (Stringified NBT) は NBT を人が読める文字列で表したものです。 コマンドの /give/data で使われる記法です。

{Name:"minecraft:oak_stairs",Count:1b,tag:{Damage:0}}

コード例は基準実装の C#。 他言語での綴りは API 対応表


1. 相互変換

// 文字列 -> タグ
NbtTag tag = Snbt.Parse("{a:1b,b:[1,2,3]}");

// タグ -> 文字列
string oneLine = Snbt.Write(tag);
string pretty  = Snbt.WritePretty(tag);

WritePretty は改行とインデントを入れます。 Write は 1 行に詰める。どちらも全言語で 1 バイトも違わない出力になります。


2. 型の接尾辞

数値はどの型なのかを接尾辞で表します。

接尾辞
b / B TAG_Byte 1b
s / S TAG_Short 1s
なし(整数) TAG_Int 1
l / L TAG_Long 1l
f / F TAG_Float 1.0f
d / D / なし(小数) TAG_Double 1.0

配列は先頭に型を書きます。

[B;1b,2b]      TAG_Byte_Array
[I;1,2,3]      TAG_Int_Array
[L;1l,2l]      TAG_Long_Array
[1,2,3]        TAG_List(要素は TAG_Int)

3. 1.21.5 以降の拡張構文

新しい構文にも対応しています。

0x1F        16進リテラル
0b1010      2進リテラル
1_000_000   桁区切り
.5          先頭の 0 を省いた小数
2e3         指数表記
+5 / -5     符号
true/false  bool(TAG_Byte の 1 / 0 になる)
{a:1,}      末尾のカンマ

16進での接尾辞に注意

0xFFbb は 16 進の数字なのか TAG_Byte の印なのか区別できません。 そこで 16 進・2 進リテラルでは s / S / l / L だけを型の接尾辞として認めます。 b / d / f は数字として読みます(spec/11 2.1)。


4. 特殊な浮動小数点数

Infinity    -Infinity    NaN

これらは SNBT で読み書きできるが、Minecraft 自身は受け付けないことがあります。 ワールドへ書き込む用途には使わないでください。


5. 出力は常に同じ形になる

全言語で同じ入力から同じ文字列が出るよう、次を仕様で固定しています。

小数の表記

言語ごとの既定の書式(C# の R、Java の Double.toString、 JavaScript の toString…)は微妙に違います。 そこで元の値へ正確に戻る最短の 10 進表記を自前で求めている (spec/11 5.1)。

0.1f   ->  0.1f     (0.10000000149011612f にはしない)
-0.0   ->  -0.0     (符号を落とさない)

引用符とエスケープ

  • 文字列は原則 " で囲む
  • " を含み ' を含まないときだけ ' で囲む
  • 正しいサロゲートペア(絵文字など)はそのまま出す
  • 孤立サロゲートだけを \uXXXX でエスケープする

キーの引用

[A-Za-z0-9_.+-] だけからなるキーは引用しない。それ以外は引用します。


6. 扱わないもの

SNBT にはコマンド用の拡張(bool()uuid() など)があるが、 バイナリ NBT へ一意に写せるものだけを対象にしている (adr/0006)。


7. 次に読むもの