リージョンファイルフォーマット

提供: Minecraft Wiki
移動先: 案内検索
Cleanup.svg
この記事はスタイルガイドの基準を満たす必要があります。 [議論]
この記事を整理してくださる協力者を求めています
Information icon.svg
この項目はJava Edition限定の要素です。

リージョンファイルフォーマットBeta 1.3で導入されたMinecraftチャンクの保存形式であり、32×32個のチャンク(512×256×512、合計67,108,864ブロック)のグループがリージョンファイルに保存されている。このファイル形式は、Infdevの開発段階から使用されていたAlphaレベルフォーマットにとって代わり、チャンクを個別のファイルに格納していた。リージョンはファイルシステムの一つであり、見出しがファイルごとのプレイヤーの位置を示し、セクタが割り当てサイズとなる。

このシステムは、Optimineプロジェクトを開発したことでも知られるScaevolus氏のModであるMcRegionを基にしている。[1]McRegionのフォーマットは、チャンク更新の時間軸の表が追加された以外はほぼそのまま採用されている。JahKob氏は、このフォーマットは以前のシステムに比べて最大7倍の速度を実現していると主張している。[2]リージョンファイルフォーマットとAlphaレベルフォーマットの間のワールドの総ファイルサイズの差は無視できるほどのものである。

このフォーマットはAnvilファイルフォーマットに取って代わったものであるが、AnvilファイルフォーマットはChunkフォーマットのみを変更し、リージョンファイルの拡張子のみが「.mcr」から「.mca」に変更された。

リージョンファイル[編集 | ソースを編集]

リージョンファイルの位置[編集 | ソースを編集]

リージョンファイルは「region」と呼ばれるワールドディレクトリのサブフォルダにあり、r.x.z.mcrという形式で名前が付けられている。チャンクが属するリージョンの座標は、チャンクの座標の階数を32で割った値から求められる。

Java Editionでは:

   int regionX = (int)floor(chunkX / 32.0);
   int regionZ = (int)floor(chunkZ / 32.0);

又はビット操作(ビットシフト)の場合。

   int regionX = chunkX >> 5
   int regionZ = chunkZ >> 5

例えば、(30,-3)のチャンクは(0,-1)の領域にあり、(70,-30)のチャンクは(2,-1)の領域にある。

構造[編集 | ソースを編集]

リージョンファイルは、どのチャンクがリージョンファイル内に存在しているか、最後に更新されたのはいつか、どこにあるかなどの情報を含む8kiBの見出しで始まる。(x,z)(チャンク座標)のチャンクのリージョンファイル内の位置は、そのリージョンファイル内のバイトオフセット4×{(x mod 32)+(z mod 32)×32}で見つけなければなりません。x mod 32またはz mod 32の値が負の場合(Java/C/C++で%演算子を使用した場合に発生)、単に32を追加するか、プmodを&(AND演算子)に置き換えられる。オフセットの計算は次のようになる:4×{(x&31)+(z&31)×32}。その時間軸は、ファイルの4096バイト後に見つけることができる。ファイルの残りの部分は、未使用の領域を挟んで1024チャンクまでのデータで構成されている。

バイト 0 - 4095 4096 - 8191 8192...
説明 位置(1024件) 時間軸(1024件) チャンクと未使用の領域

チャンク位置[編集 | ソースを編集]

チャンクの位置情報は4バイトで構成され、2つのフィールドに分割されている。最初の3バイトは、ファイルの開始位置から4KiBセクターでのオフセット(ビッグエンディアン)で、残りの1バイトはチャンクの長さを示すバイトである(同じく4KiBセクターで、切り上げ)。チャンクのサイズは常に1MiB以下である。チャンクがリージョンファイルに存在しない場合(例えば、まだ生成されていない、または移行されていないなど)、両方のフィールドはゼロになる。

バイト 0 1 2 3
説明 オフセット セクター数

オフセット2のチャンクは、時間軸の表の直後から始まる。

チャンク時間軸[編集 | ソースを編集]

時間軸の表のエントリは、個々の4バイトのビッグエンディアン整数で、チャンクの最終修正時間をエポック秒単位で表す。

バイト 0 1 2 3
説明 時間軸

チャンクデータ[編集 | ソースを編集]

チャンクデータは、残りのチャンクデータの正確な長さをバイト単位で示す(ビッグエンディアン)4バイトの長さのフィールドで始まる。次のバイトはチャンクデータに使用される圧縮方式を示し、残りの(長さ-1)バイトが圧縮されたチャンクデータとなる。

Minecraftは常に最後のチャンクのデータを調整し、長さが4096Bの倍数になるようにする(ファイル全体のサイズが4KiBの倍数になるように)。Minecraftは最後のチャンクが調整されていないファイルは受け付けない。この調整は長さフィールドには含まれないことに注意。

バイト 0 1 2 3 4 5...
説明 長さ(バイト) 圧縮タイプ 圧縮データ(長さ-1バイト)

現在、定義された圧縮方式は2つある。

方法
1 GZip (RFC1952) (未使用)
2 Zlib (RFC1950)

圧縮されていないデータはNBTフォーマットで、Chunkフォーマットの記事で詳細に説明されている情報に従っている;圧縮方式1で圧縮された場合、圧縮データはAlphaチャンクファイルのディスク上の内容と同じになる。チャンクは常に公式クライアントによって圧縮方式2を使って保存されることに注意。

移行とlevel.dat[編集 | ソースを編集]

Minecraftを新形式に変換した際の見た目

Beta 1.3では「古い」チャンクはプレイ中に読み込まれるように増分的に読み込まれず、ワールドを読み込む前にリージョンファイルに変換される。変換の一環として、level.datはTAG_Int("version") (注)を19132に設定して更新された。Beta 1.3では新しいレベル名フィールドであるTAG_String("LevelName")も導入されている。また、プレイヤーのTAG_Compoundsに新しいTAG_Byte("Sleeping")が導入された - シングルプレイヤーではlevel.datmマルチプレイヤーではベッドの中にいるかどうかを示す[プレイヤー名].datを指定する。値は1(true)または0(false)である。Beta 1.8ではTAG_Int("GameType")が追加された。Beta 1.9ではTAG_byte("hardcore")が追加された。

それ以外の場合、level.datの形式は変更されない。

関連ページ[編集 | ソースを編集]

外部リンク[編集 | ソースを編集]

脚注[編集 | ソースを編集]

ソフトウェア[編集 | ソースを編集]

コミュニティではリージョンファイルを扱うためのプログラムが開発されてきた。

名前 説明 スクリーンショット
McRegion このMODは、チャンクがディスクに保存される方法を最適化し、プレイヤーがワールドを移動するときにチャンクを読み込んだり保存したりする一時停止がずっと短くなり、目立たなくなることを意味する。
Minecraft Region Fixer このツールはリージョンファイルの問題を修正するPythonスクリプトである。典型的なエラー(チャンクの破損、チャンクの誤置、エンティティが多すぎる問題)を見つけ、様々な方法でこれらのエラーを修正できる(チャンクの削除、バックアップコピーで置換、チャンクを再配置)。これはコマンドラインアプリケーションである。
MCA2NBT シンプルなUnixコマンドラインユーティリティで、Minecraftの.mcaリージョンファイル(anvilフォーマット)を、各チャンクの圧縮されていないNBTファイルを含む同じベースネームのディレクトリに変換する。
Region Scanner Java Edition 1.7.10(のみ)のリージョンファイルを解析して大量編集するJavaコマンドラインユーティリティ