対応の判定はワールドの形式で行っています。Minecraftのバージョン番号は条件にしません(adr/0003)。
いまの形式は26.1(DataVersion 4786)で入りました。
次元とプレイヤーデータの置き場が変わり、level.datの中身も分割されています。
それ以降のバージョンなら、形式が変わらない限りそのまま読み書きできます。
MIN_SUPPORTED_DATA_VERSION = 4786 扱える形式の下限(26.1)
TARGET_DATA_VERSION = 4903 動作を確かめたバージョン(26.2)
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になります。推測で読み進めることはしません。
レイヤ1(NBT)とレイヤ2(Anvil)はバージョン検査を一切しません。どのバージョンのファイルでも読み書きできます。
バージョンを見るのはレイヤ3(World)だけです。 古いワールドからNBTを取り出すだけなら、何の制約もなく使えます。
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で一度ワールドを開いて公式のアップグレードを済ませ、そのあとこのライブラリで編集する」です。
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 |
形式が変わっていなければ、何もしなくてもそのまま使えます。 ライブラリ側の更新も要りません。
形式が変わったときだけ、下限を上げて対応します。 そのときは扱えなくなるワールドが出るので、バージョン番号のいちばん上の桁も上がります。
対応の手順はリリース手順にまとめてあります。