Skip to content

Latest commit

 

History

History
120 lines (82 loc) · 4.79 KB

07-version-policy.md

File metadata and controls

120 lines (82 loc) · 4.79 KB

07. バージョンポリシー

対応の判定はワールドの形式で行っています。Minecraftのバージョン番号は条件にしません(adr/0003)。

いまの形式は26.1(DataVersion 4786)で入りました。 次元とプレイヤーデータの置き場が変わり、level.datの中身も分割されています。 それ以降のバージョンなら、形式が変わらない限りそのまま読み書きできます。

MIN_SUPPORTED_DATA_VERSION = 4786   扱える形式の下限(26.1)
TARGET_DATA_VERSION        = 4903   動作を確かめたバージョン(26.2)

1. 読み込み

DataVersionが4786以上なら何もしません。警告も出ません。

対象より新しいバージョンのワールドでも同じです。 形式が同じなら読めるので、知らせる必要がありません。

// DataVersion 5015のチャンク(対象より新しい)
Chunk chunk = Chunk.FromNbt(nbt);   // 警告なしで読める

4786未満、つまり形式そのものが違うワールドのときだけ、動作を選べます。

動作 意味
Warn(既定) 警告コールバックを呼んで続行する
Error UNSUPPORTED_DATA_VERSIONにする
Ignore 何もしない
ChunkReadOptions options = new ChunkReadOptions
{
    OnVersionMismatch = VersionMismatchAction.Warn,
    OnWarning = message => Console.Error.WriteLine(message),
};

構造そのものが想定と違えば(パレットが無い、dataの長さが合わない、など)、バージョンに関わらずMALFORMED_DATAになります。推測で読み進めることはしません。

NBTレイヤはバージョンに依存しない

レイヤ1(NBT)とレイヤ2(Anvil)はバージョン検査を一切しません。どのバージョンのファイルでも読み書きできます。

バージョンを見るのはレイヤ3(World)だけです。 古いワールドからNBTを取り出すだけなら、何の制約もなく使えます。


2. 書き込み

DataVersionは読んだ値をそのまま残します。 書き換えません。

書き換えてしまうと、そのワールドを開いたゲーム側が「このチャンクは新しい形式だ」と判断してしまい、アップグレードの要否を誤ります。

// DataVersion 5015のチャンクを書き戻す
chunk.ToNbt();   // 5015のままで、許可も要らない

形式の違う古いチャンク(4786未満)は、既定では書き戻せません。

Chunk chunk = /* DataVersion 3700のチャンク */;
chunk.ToNbt();   // UNSUPPORTED_DATA_VERSION

意図して書き戻すなら、明示的に許可します。このときもDataVersionは書き換えません。

ChunkWriteOptions options = new ChunkWriteOptions { AllowForeignDataVersion = true };
chunk.ToNbt(options);   // 3700のまま書き出される

古い形式のワールドは、ディレクトリ構成もlevel.datの中身も違います。 チャンク単体では書き戻せても、ワールド全体としては噛み合わないことがあります。 必ずバックアップを取ってから使ってください。

安全な手順は「先にMinecraftで一度ワールドを開いて公式のアップグレードを済ませ、そのあとこのライブラリで編集する」です。


3. 対応している形式を確かめる

Console.WriteLine(SpringNbt.MinSupportedDataVersion);   // 4786
Console.WriteLine(SpringNbt.TargetDataVersion);         // 4903
言語 下限 検証済み
C# SpringNbt.MinSupportedDataVersion SpringNbt.TargetDataVersion
Java SpringNbt.MIN_SUPPORTED_DATA_VERSION SpringNbt.TARGET_DATA_VERSION
TypeScript MIN_SUPPORTED_DATA_VERSION TARGET_DATA_VERSION
Python MIN_SUPPORTED_DATA_VERSION TARGET_DATA_VERSION
Rust MIN_SUPPORTED_DATA_VERSION TARGET_DATA_VERSION

4. 新しいバージョンが出たら

形式が変わっていなければ、何もしなくてもそのまま使えます。 ライブラリ側の更新も要りません。

形式が変わったときだけ、下限を上げて対応します。 そのときは扱えなくなるワールドが出るので、バージョン番号のいちばん上の桁も上がります。

対応の手順はリリース手順にまとめてあります。


5. 次に読むもの