Skip to content

Latest commit

 

History

History
132 lines (90 loc) · 4.06 KB

02-snbt.md

File metadata and controls

132 lines (90 loc) · 4.06 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進での接尾辞に注意

0xFFbのbは、16進の数字なのかTAG_Byteの印なのか区別できません。 そこで、16進リテラルではs / S / l / Lだけを型の接尾辞として認めます。 b / d / fは数字として読みます(spec/11 2.1)。 2進リテラルの数字は0と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.0d    (符号を落とさない)

引用符とエスケープ

  • 文字列は常に"で囲む
  • "と\は\"と\\にする
  • \b \t \n \f \rはこの短縮形で書き、それ以外の制御文字は\uXXXXにする
  • 正しいサロゲートペア(絵文字など)はそのまま出す
  • 孤立サロゲートは\uXXXXでエスケープする

キーの引用

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


6. 扱わないもの

対象は、バイナリNBTへ一意に写せる範囲だけです(adr/0006)。

  • [1, "a", {}]のように型の違う要素が混じったリストは、バイナリNBTのTAG_Listで表せないので受け付けません。パースするとMALFORMED_DATAになります
  • 文字名によるエスケープ\N{名前}は、実装間で名前表が揃わないので扱いません。パースするとUNSUPPORTED_FEATUREになります

コマンド用の拡張のうちbool()とuuid()は、バイナリNBTへ写せるので対応しています。


7. 次に読むもの