Skip to content

Latest commit

 

History

History
129 lines (110 loc) · 13.1 KB

File metadata and controls

129 lines (110 loc) · 13.1 KB

機能一覧

何ができて何ができないかの一覧です。

凡例

記号 意味
対応済み
🔶 条件つきで対応(右端の「備考」に条件を記載)
実装中
未対応

対応しているのは C# / Java / TypeScript / Python / Rust で、今後も増やします。 対象は 26.1 で導入されたワールド形式(DataVersion 4786 以降)です。 動作は Java版 26.2 / DataVersion 4903 で確かめています。 形式が同じであれば、これより新しいバージョンのワールドもそのまま読み書きできます。 過去バージョンのワールド改変には対応していません(→ 07 バージョンポリシー)。

この表は CI の docs-sync ジョブが各言語の公開APIと突き合わせていて、 表と実装が食い違うとビルドが落ちます。

実データでの検証: Java版 26.2 の実ワールドを走査し、.dat 23個 + チャンク 3,717個 の すべてで読み込みとバイト一致の書き戻しが通りました。 リージョンファイル 12 個は、開いて無変更で書き戻すと原本とバイト単位で一致します。 代表ファイルは対応言語すべてに通していて、正規化JSON・SNBT・チャンク一覧・詰め直したバイト列が 全言語で一致することも確かめました(→ 90 適合性 2.4)。


レイヤ1: NBT

機能 C# Java TS Py Rust 仕様 備考
全13タグの読み込み 10
全13タグの書き込み 10 出力は一意(正準ライタ)
MUTF-8 文字列(U+0000・補助文字・孤立サロゲート) 10
圧縮 Gzip / Zlib / 無圧縮 10
圧縮方式の自動判定 10 読み込みの既定
Java形式(名前付きルート) 10
Network形式(無名ルート 1.20.2+) 10
ネスト深さ上限による保護 00 既定 512
宣言長の先行検証 10 巨大長宣言によるメモリ枯渇を防ぐ
展開後サイズの上限 00 既定は無制限
挿入順を保持する Compound 10 ラウンドトリップの前提
型付き取得子(キー欠落と型不一致の区別) 10 get_* / opt_*
型付き設定子 10 set_int(key, 42) のように値を直に渡せる
位置を指定した読み込み 10 連なった NBT を順に読み進める
SNBT パース 11 1.21.5+ 構文
SNBT 出力(1行 / 整形) 11
浮動小数点の正準10進表記 11 言語標準の書式に依存しない
SNBT の異種リスト 11 バイナリNBTへ写せないため受理しない(adr/0006
SNBT の \N{文字名} エスケープ 11 実装間で名前表が揃わない

レイヤ2: Anvil (.mca)

機能 C# Java TS Py Rust 仕様 備考
リージョンの読み込み 20
無変更なら書き戻してもバイトが変わらない 20 触っていないチャンクの配置を保つ
リージョンの書き込み(セクタ再配置つき) 20 同サイズならその場、拡大時のみ移動
解放セクタの再利用 20 先頭から空きを探す
チャンクの削除 20
タイムスタンプの読み書き 20
圧縮ID 1 (GZip) / 2 (Zlib) / 3 (無圧縮) 20 書き込み既定は 2
圧縮ID 4 (LZ4) 🔶 🔶 🔶 🔶 🔶 20 読み込みのみ。書き込むと Zlib になる
圧縮ID 127 (カスタム) 20 方式が実装依存。生バイトAPIでのみ取得可
外部ファイル .mcc の読み込み 20
外部ファイル .mcc への自動退避と復帰 20 1MiB超で退避、縮めば内部へ戻す
生バイトでのチャンク入出力 20 未対応圧縮方式でも取り出せる
断片化解消 optimize() 20 添字順に詰め直す
セクタ重複・不正オフセットの検出 20 開いた時点で弾く
ファイル長のセクタ整列検査 20
region/ entities/ poi/ の横断アクセス 20 RegionFolder
開いたリージョンの上限管理 20 既定 8 件。溢れたら書き出して閉じる

レイヤ3: World / Block

機能 C# Java TS Py Rust 仕様 備考
level.dat の読み込み 40
level.dat の安全な書き込み 40 一時ファイル経由 + level.dat_old
session.lock の確認 🔶 40 起動中ワールドへの書き込みを防ぐ。排他ロックを扱える言語のみ。Py は POSIX のみ(adr/0008
標準3次元 + カスタム次元の解決 40
チャンクの解釈(未知キーの保持つき) 30 読んだ要素をすべて残す
ブロックの取得・設定 30 絶対座標/チャンク相対の両方
置き換え時の付随データの掃除 30 block_entities / block_ticks / fluid_ticks から同じ座標の要素を取り除く
バイオームの取得・設定(4×4×4) 30
BlockState の文字列表現 30 minecraft:oak_stairs[facing=north]
ブロック座標と範囲の型 30 BlockPos / Cuboid。範囲内の走査つき
チャンクの変更フラグ 30 is_modified。書き戻す対象を決める
パレット自動拡張とビット幅の再計算 31
未使用パレットの掃除 compact() 31 明示呼び出し時のみ
非正準な BitStorage の救済読み 31 lenient_bit_storage
Heightmaps の保持 30 値をそのまま残す
Heightmaps の再計算 30 adr/0004
光源の再計算 30 同上。invalidate_lighting() で無効化のみ提供
entities / poi の型付きAPI 30 生NBTとしてなら読み書き可
チャンクの新規生成 ワールド生成は本ライブラリの範囲外
Bedrock版(LevelDB形式) 対象外

共通

機能 C# Java TS Py Rust 仕様 備考
共通 ErrorCode による分類 00 全言語でコード集合が一致
扱えない形式の検出(警告/エラー切替) 30
適合性検証ツール(CLI) 90 全言語の出力を相互diff
実ワールド走査ツール 90 spec/tools/scan_world.py。検証用のため Python のみ
ドキュメント同期検証 adr/0009 spec/tools/check_docs_sync.py。全言語のソースを静的解析して突き合わせる

言語ごとの差異

概念と機能はどの言語でも同じですが、言語の性質上どうしても表現が変わる箇所があります。 移植のときに迷わないよう、ここに集めてあります。

箇所 差異 理由
TAG_Long の値型 TypeScript のみ bigint number では 2^53 超の整数を表せない(adr/0007
TAG_String の値型 Rust のみ 2 形態の enum String が UTF-8 に限られ、孤立サロゲートを保持できない(spec/10 2.3
整数の範囲検証 Python / TypeScript は構築時に実行時検査 言語に整数幅が無いため、型では守れない
例外 / 戻り値 Rust のみ Result<T, Error> 他4言語は例外。ErrorCode の集合は一致(adr/0005
set_block の引数 Rust のみ IntoBlockState トレイト 他4言語はオーバーロードで BlockState と文字列の両方を受ける
Java の検査例外 使わない シグネチャを他言語と揃えるため(adr/0005
Python の再帰上限 読み書き時に一時的に引き上げる 既定の上限 1000 が仕様の深さ上限 512 に届かないため
ストリーム入出力 TypeScript には無い Node のストリームは非同期しか無く、同期 API で揃えられないため。ファイルとバイト列の入口は同じ
session.lock の確認 C# / Java / Python(POSIX) のみ実施 標準ライブラリでファイルの排他ロックを扱えない言語があるため(adr/0008