Skip to content

Latest commit

 

History

History
52 lines (40 loc) · 2.9 KB

File metadata and controls

52 lines (40 loc) · 2.9 KB

0003. ワールド形式で対応を判定する

  • 状態: 採用
  • 日付: 2026-08-31

背景

当初は「対象は Java版 26.2 (DataVersion 4903) の 1 バージョンだけ」と決め、 それ以外は読み込み時に警告、書き込み時にエラーとしていた。

しかしこの決め方だと、Minecraft が更新されるたびに、 中身が何も変わっていなくても利用者に警告が出る。 ライブラリ側も追随して版を上げ続けることになる。

実際に調べたところ、いまのワールド形式は 26.1 で入ったもので、26.2 でも変わっていない。 26.3 のスナップショットにも形式変更は入っていない。 バージョン番号の一致を条件にしたのが間違いだった。

決定

判定の基準を ワールドの形式 に変える。

  • NBT レイヤ (レイヤ1) は完全にバージョン非依存。DataVersion を一切見ない
  • 扱える形式の下限MIN_SUPPORTED_DATA_VERSION = 4786(26.1)とする
  • 読み込み: 4786 以上なら何もしない。警告も出さない。 下限未満のときだけ Warn(既定)/ Error / Ignore から選ぶ
  • 書き込み: DataVersion は読んだ値をそのまま残す。書き換えない。 下限未満のチャンクは既定で UNSUPPORTED_DATA_VERSIONallow_foreign_data_version = true で明示的に許可できる
  • TARGET_DATA_VERSION = 4903 は「動作を確かめたバージョン」として残す

理由

  • 形式が同じなら読み書きできる。できることに警告を出すと、 本当に見るべき警告が埋もれる
  • DataVersion を書き換えると、そのワールドを開いたゲーム側が アップグレードの要否を誤る。読んだ値を残すのが唯一の正解
  • 読み込みを厳格にすると、壊れたワールドの調査という有力な用途が塞がれる。 読むだけならデータを壊しようがない
  • 書き込みを寛容にすると、形式の違うワールドを黙って上書きし、 利用者が気づかないうちに壊す。ここは既定で止めるべき
  • 許可フラグの名前を allow_foreign_data_version としているのは、 「変換する」ではなく「異物をそのまま許す」意味を名前で示すため

結果として受け入れること

  • 下限より古いワールドを新形式へ移行する用途には使えない。それは Minecraft 本体の仕事
  • 形式が変わったことに気づかないまま新しいワールドを読むと、 黙って誤読する余地がある。構造が想定と違えば MALFORMED_DATA で止まるが、 それをすり抜ける変更はありうる
  • 形式が変わったときは下限を上げる。扱えなくなるワールドが出るので、 バージョン番号のいちばん上の桁も上げる