條目中某些資訊已經不符合目前版本情況。
Minecraft基岩版為儲存的世界使用了一個完全不同的格式。攜帶版0.9.0及以後版本採用的是谷歌LevelDB的修改版,使用Zlib壓縮格式來儲存資料。攜帶版0.8.1及更低版本使用一個經修改的NBT格式(為某些檔案使用了小端序)。
1.0[]
1.0中,以LevelDB鍵值形式單獨儲存每個子區塊。[1]
例如,主世界: | x: 32 | z: 32 | 标签: 8 |(非必须)子区块id: 8 |
任何其他維度: | x: 32 | z: 32 | 维度: 32 | 标签: 8 |(非必须)子区块id: 8 |
合理的標籤值:
enum class Tag : char {
Data2D = 45,
Data2DLegacy = 46,
SubChunkPrefix = 47,
LegacyTerrain = 48,
BlockEntity = 49,
Entity = 50,
PendingTicks = 51,
BlockExtraData = 52,
BiomeState = 53,
FinalizedState = 54,
Version = 118
};
要請求一個特定的子區塊,你需要將值「47」填入標籤中,並且提供一個介於0到16的數字給子區塊ID。注意,子區塊可以不存在。然而它們仍如同堆疊般運作,舉例來說,如果有個子區塊存在,那麼所有其下方的子區塊必須存在。
子區塊的格式如下:
- 版本:1位元組
- 方塊ID:4kb,每方塊8位元組
- 方塊資料:2kb,每方塊4位元組
- 天空亮度:2kb,每方塊4位元組
- 方塊亮度:2kb,每方塊4位元組
0.9.0[]
LevelDB格式[]
Mojang修改的LevelDB已發布在此處,並且構建它需要的參數都被Tommaso記錄於https://twitter.com/_tomcc/status/477950809427427328,官方的LevelDB頁面則位於 此處,尋找一個以攜帶版為基準的請參閱此處。
資料庫被儲存在攜帶版世界的db/子資料夾。似乎這也是地形檔案的儲存位置。因為你可以用一個無限世界的db資料夾來替換舊世界的db資料夾,這樣就可以把一個舊世界轉換為無限世界。
儲存在資料庫的資料有三種類型:地形資料,實體資料,方塊實體資料。
鍵值形式:9位元組長的鍵值,可能由下述所組成:
- 為小端序整數的區塊X座標
- 為小端序整數的區塊Z座標
- 另外的1個字節表示該資料的類型:
- 0x30(48 以十進位顯示、'0' ASCII)可能為地形資料
- 0x31(49 以十進位顯示、'1' ASCII)為方塊實體資料
- 0x32(50 以十進位顯示、'2' ASCII)為實體資料
- 0x76(118 以十進位顯示、'v' ASCII)為1位元組的資料
自從0.12.1版本加入了地獄,就有了特殊的記錄地獄資料的鍵,大小有13位元組,好像有:
- 為小端序整數的區塊X座標
- 為小端序整數的區塊Z座標
- 為小端序整數的1(0x01 0x00 0x00 0x00)
- 表示資料類型的額外的1位元組:
- 0x30(48 以十進位顯示、'0' ASCII)可能為地形資料
- 0x31(49 以十進位顯示、'1' ASCII)為方塊實體資料
- 0x32(50 以十進位顯示、'2' ASCII)為實體資料
- 0x76(118 以十進位顯示、'v' ASCII)為1位元組的資料
0×30的地形資料條目看似包含x*z*y = 16*16*128區塊的的方塊資料。這個資料和這個和0×30地形資料鍵有關的值的值始終為83,200,並且似乎包含以下資料:
- 看似為x*z*y = 16*16*128的區塊的32,768位元組方塊資料。
- 16,384位元組的普通資料(上面的方塊資料的每個字節為一個半字節)。
- 16,384位元組的天空亮度資料(上面的方塊資料的每個字節為一個半字節)。
- 16,384位元組的方塊亮度資料(上面的方塊資料的每個字節為一個半字節)。
- 256位元組的附加資料,似乎是一個z*x = 16*16位元組的陣列(上面128位元組塊資料的每個垂直y列的一個字節),包含髒列資訊。
- 1,024位元組的附加資料,似乎是一個16*16*4位元組的陣列(上面的128位元組塊資料的每個垂直y列的四個字節),包含草色資訊。
以下所提供的定義是為了闡明包含32,768方塊的區塊的LevelDB條目和相對應的整個世界所包含的方塊位置的繪製:
- 設X和Z為LevelDB鍵值。
- 設C []為LevelDB區塊的三維陣列。前兩個指數i和j的值域為0到15,第三個指數y的值域為0到127。
- 設W []為整個世界所包含的方塊三維陣列。
- 對於old世界,前兩個指數x和z的值域為0到255;對於infinite世界,x和z的值域高出四位數,並可以為負數
- 不論是old還是infinite世界,第三個指數y的值域都是0到127。
假設以上的定義,以下為帶有X和Z值的地圖的LevelDB的方塊位置和其所對應的整個世界所包含方塊位置:
- 當x = 16*X + i and z = 16*Z + j時,C [i, j, y] <-> W [x, z, y]。
x指數指定了南北方位,x值越小,方位越北。z指數指定了東西方位,z值越小,方位越東。y指數制定了垂直方位,y值越小,高度越低。在old世界中,在東北的最低處的角落的位置為W [0, 0, 0]。
以上的0×31 tile實體和0×32實體資料條目為NBT編碼,並在根層次包含0、1、或多個連接的複合標籤。在複合為0的情況下,LevelDB指定0為這個鍵值的長度。多個連接複合標籤可被支持,因為在一個區塊內,可有不止一個實體會被載入。每個0×31 tile實體和0×32實體條目會有一個關聯的0×30的地形條目,但是反之不然。
0×30的地形條目的數量和0×76的1位元組資料條目始終是一樣的,並且兩者的x值和z值有一對一的關聯。在這三個值中,發現了1位元組的資料,包括了二進位的值0、1、和2。0值會在old世界發現,1和2值會在infinite世界發現。
同時,實體資料條目有特殊鍵~local_player來儲存本地玩家實體。如果此處存在實體資料,則它優先於level.dat中儲存的玩家資料。和~local_player鍵有關的值為NBT編碼,並在根層次裡只有一個複合標籤。
遠程玩家也個有由兩部分組成的特殊鍵。第一個帶有前綴player_,第二個是包含遠程使用者的clientid.txt檔案的客戶ID。例如,player_-12345678為客戶ID為-12345678的遠程使用者的鍵。和player——前綴鍵有關的值為NBT編碼,並在根層次裡只有一個複合標籤。
在超平坦世界中,有一個長度為20的特殊的「game_flatworldlayers」鍵。與此鍵關聯的值是ASCII文字格式的一組數字。例如,與「game_flatworldlayers」鍵相關聯的值為「[7,3,3,2]」,其中該示例的值長度是9。
level.dat[]
level.dat的結構與0.8.1及以下版本的很相似。
結構[]
- 世界資料
- Dimension: 玩家所在的維度。0為主世界。
- GameType: 預設遊戲模式:生存(0)模式、創造(1)模式。
- Generator: 世界類型:舊,無限(1),或超平坦(2)
- LastPlayed: 當玩家儲存遊戲時,儲存Unix時間戳(以秒為單位)。
- LevelName: 指定這個存檔的名字。
- 有限地圖起點(僅限於舊世界(Old)模式)
- LimitedWorldOriginX: 有限地圖生成位置的X座標。
- LimitedWorldOriginY: 有限地圖生成位置的Y座標。
- LimitedWorldOriginZ: 有限地圖生成位置的Z座標。
- Platform: 似乎儲存建立層次的平台。目前觀察值為2。
- RandomSeed: 地圖種子。
- SizeOnDisk: 估計的存檔大小(字節)。
- 在世界中的生成座標。
- SpawnX: 玩家生成位置的X座標。預設為0。
- SpawnY: 玩家生成位置的Y座標。預設為64。
- SpawnZ: 玩家生成位置的Z座標。預設為0。
- StorageVersion:基岩版儲存工具版本, 目前為4
- Time:基岩版以「刻」的方式來儲存一天的時間。現實一秒鐘等於20刻;一個遊戲中的日夜更新等於14400刻,也就是12分鐘——比普通的晝夜更新(20分鐘)短了8分鐘。0刻為白天的開始,7200刻開始「日落」,8280刻進入黑夜,13320刻開始「日出」,最後14440刻為另一天白天的開始。level.dat中存的刻度值會一直增長,超過14400,但是遊戲中的晝夜更新仍用14400進位。
- dayCycleStopTime:增加在8.0。預設是18446744073709552000。
- spawnMobs:禁止(0)或允許(1)生物生成。
LOG[]
LOG檔案位於存檔的/db路徑,並且是leveldb格式的一部分,用於壓縮LDB檔案之間。它類似於程式的日誌檔案。格式為:
YYYY /MM/DD-Hour/Minute/Second.StepName "Info"
例如:
2014/07/24-22:20:08.400488 4a3638 Recovering log #3
0.8.1及以前[]
level.dat[]
level.dat的格式在0.2.0版時被修改了;它現在是一個基於計算機版本的level.dat格式的NBT格式的檔案。 在一個0.2.0 移動版之後的世界裡, level.dat 是一個儲存了環境資料(比如時間)和玩家的健康值、背包、速度和地圖內的位置的未壓縮的小端序NBT檔案。
這個檔案有8位元組的檔案頭。包括一個小端序的4位元組表明檔案類型的整數,對於level.dat是3(更新前是2)。 在它之後是另一個整數,表明了檔案除去檔案頭之外的大小。[2]
NBT結構[]
- 世界資料。
- GameType: 生存模式時為0,創造模式時為1。
- LastPlayed: 儲存玩家儲存遊戲檔案時的Unix 時間戳(以秒的形式)。
- LevelName: 世界名稱。
- Platform: 看起來是用來儲存世界所建立時的平台的。目前觀察到的值是2。
- Player: 玩家實體資訊。它缺少id標籤並且有附加元素:
- Armor: 每個列表中的TAG_Compound定義了玩家正穿著的一件盔甲。這是一個長度4的列表。對應著頭盔、胸甲、護腿和靴子。
- 背包物品資料。
- id: 物品或方塊的ID。
- Count: 物品在背包內堆疊的數量。任何物品都能堆疊,包括工具。範圍在1-255之間。高於255的值在遊戲內不會顯示。
- Damage: 對於盔甲, 是盔甲的損害值。盔甲滿的損害值意味著沒有損傷。在損害值到達0時,它會損壞然後消失。
- 背包物品資料。
- Dimension: 玩家所在的維度。0代表主世界。
- Inventory: 列表內的每個TAG_Compound定義了一個玩家正在攜帶或手持的物品。
- 背包物品資料。
- Slot: 標誌著這件物品在哪個背包槽內。
- id: 物品或方塊的ID。
- Count: 物品在背包內堆疊的數量。任何物品都能堆疊,包括工具。範圍在1-255之間。高於255的值在遊戲內不會顯示。
- Damage: 對於工具, 是工具的耐久值。工具滿的耐久值(比如金質工具的33)意味著沒有損傷。在損害值到達0時,它會損壞然後消失。
- 背包物品資料。
- Score: 玩家分數。
- Armor: 每個列表中的TAG_Compound定義了玩家正穿著的一件盔甲。這是一個長度4的列表。對應著頭盔、胸甲、護腿和靴子。
- RandomSeed: 為生成地形用的隨機種子。
- SizeOnDisk: 字節形式的整個世界的大小。
- SpawnX: 玩家重生點的X座標(預設為0)。
- SpawnY: 玩家重生點的Y座標(預設為64)。
- SpawnZ: 玩家重生點的Z座標(預設為0)。
- StorageVersion: 目前的攜帶版NBT的版本。目前為3。
- Time: 以刻的形式儲存的當天時間。每一真實生活中的秒中有20刻, 每Minecraft日有14400刻,是整個日夜循環只有12分鐘的長度(比標準的20分鐘日夜循環短8分鐘)。0是白天的開始,7200是日落的開始,8280是夜晚的開始, 13320是是日出的開始, 14400 又到了白天. 儲存在level.dat內的值總是增加並且可以大於14400,但當天時間總是Time欄位除以14400的餘數。
chunks.dat[]
這個檔案儲存16x16(256)個區塊的陣列,儲存了每個預設地圖的全部256x256x128(8,388,608)個方塊。每個 4096位元組(或者說4kb)是一個區域長度,一個預設地圖內有5377個區域 。這個檔案最高可以儲存32x32(1024)個區塊或是512x512x128(33,554,432)個方塊, 在在遊戲生成的預設地圖中,地圖會處在一個標準的大小。檔案內的字節類型絕大多數為32位元的小端序, 除了幾個區域的資料。
第一個區域是資料位置表,指向哪些區塊是可用的和它們在地圖和本檔案內的位置。資料位置表的每128位元組描述了地圖中的一行區塊,但它經常只有64位元組長,因為每行只有16個區塊。
在資料位置表中的每個區塊是15 XX ZZ 00, 15 (21hex) 描述了本節中有多少個區域,第二個數字是16進位的區塊左上角的X座標,第三個數字是16進位的目前區塊所在的行的Z座標, 最後一個數字保持未使用直到一個導致地圖大小變大的更新發生。
要尋找一個區塊在表中的偏移值,所有必須做的就是使用這個算法:4096+(x*21*4096)+(z*21*16*4096),第一個區域是位置表,所以我們從4096位置開始。每21*4096位元組是一個新區塊,所以乘x。Z座標同理,每16區塊為一行,所以乘16。
在前8個區域的方塊資訊後是四個儲存確切方塊資料的使用大端序的區域。每字節代表兩個方塊。
在這4個區域之後是4個區域的天頂光照資訊。 每字節是兩個方塊並要用大端序讀取。光照值是F表示黑暗,光照值是0表示光亮。因為遊戲動態生成光照所以透過外部程式修改此值是無意義的。
player.dat[]
在0.2.0前的版本,這個檔案儲存了玩家背包資訊(現在位於level.dat)。
entities.dat[]
這個檔案在0.2.0 Alpha版加入,使用經修改的小端序NBT格式。它以一種基於Alpha世界格式的格式儲存實體資訊。 在0.3.2時,這個檔案被擴展以儲存 方塊實體資訊。
這個檔案具有12位元組的頭部,以ASCII字串"ENT"開始,後跟一個0,再是一個小端序的整數1,後跟另一個小端序整數表明字節形式的檔案長度(不包括頭部)。[2]
NBT結構[]
實體格式[]
每個實體是一個包含在區塊檔案中的實體列表中的TAG_Compound。唯一的例外是玩家實體(儲存在level.dat中)。
所有實體共享這個基類:
- 實體資料
- id: 實體ID。13 代表著綿羊,32代表著殭屍,64代表著掉落物。
- Pos: 3個TAG_Floats描述實體目前的 X,Y,Z座標。
- Motion: 3個TAG_Floats 描述實體目前的dX,dY,dZ 速度。 (注意: 0,0,0 代表無動作)
- Rotation: 2個TAG_Floats描述目前以度為單位的傾斜度。
- :實體Y軸的順時針傾斜度。朝西為0。因為它累計生物在遊戲中的每次傾斜,所以可以是一個很大的值。
- : 實體Y軸的從水平開始的傾斜度。水平為0。為負值時看起來向下。不要超過正負90度。
- FallDistance: 實體已下落的距離。越大時當實體落地時會造成更大傷害。
- Fire: 距離火焰熄滅還剩多少刻。負值反映實體在火焰中能保持多久不燃燒。
- Air: 實體有多少空氣(刻的形式).在空氣中為300。在水下時減少。
- OnGround: 當實體接地時為1。
生物[]
- 生物的附加欄位:
- AttackTime: 實體的"無敵盾牌"在受到打擊後保持的刻形式的時間長度。
- DeathTime: 生物已死亡的刻數。控制死亡動畫。
- Health: 生物擁有的健康值。玩家和敵對生物最高有20點,牲畜最高有10點。
- HurtTime: 未知。
- 動物的附加欄位(比如綿羊):
- Age: 動物年齡。可能被後續版本中的幼年動物使用。
Sheep 綿羊有兩個附加欄位:
- Sheared: 1或0 (true/false) - 已剪毛時為1。
- Color: 0到15 - 現有一個證據表明此值不影響綿羊的顏色,但影響綿羊的羊毛掉落的顏色。[3]
- 物品附加欄位:
- Health: 從5開始,目前僅當物品受到火焰傷害時降低。降至0時物品被摧毀。
- Age: 物品掉落在地上的時間.在2400刻或者說2分鐘後,物品會被摧毀。
- Item: 物品資料
- id: 物品或方塊ID
- Damage: 物品的損害值。0代表著無損害。當損害值超過物品耐久值時,它會損壞然後消失。只有盔甲和工具會正常累加損害值。
- Count: 掉落物實體包含的物品數量。任何物品都能堆疊,包括工具、盔甲和交通工具,範圍在0-255之間。
歷史[]
| 攜帶版Alpha | |||||
|---|---|---|---|---|---|
| 0.2.0 | level.dat現在是NBT格式檔案。 | ||||
| player.dat的資訊移動被到level.dat。 | |||||
| 加入了entities.dat。 | |||||
| 0.3.2 | Entities.dat被拓展以儲存方塊實體 | ||||
| 0.9.0 | ? | 加入了新的世界存檔格式,基於LevelDB 1.17和Zlib壓縮支持。載入舊的世界會自動轉換到新的格式。 | |||
| 攜帶版 | |||||
| 1.0.0 | ? | 每個子區塊現在被分開儲存為不同的leveldb key。 | |||
| 基岩版 | |||||
| 1.2.13 | ? | 子區塊現在會被整合在一起。[4] | |||
參考[]
- ↑ https://www.reddit.com/r/MCPE/comments/5cw2tm/level_format_changes_in_mcpe_0171_100/d9zv9s8/
- ↑ 2.0 2.1 https://github.com/TkTech/OpenNBT/blob/master/opennbt/helpers.py
- ↑ http://www.minecraftforum.net/topic/1035251-sheep-wool/
- ↑ https://gist.github.com/Tomcc/a96af509e275b1af483b25c543cfbf37#the-new-subchunk-format
| 版本 |
| ||||||
|---|---|---|---|---|---|---|---|
| 開發 |
| ||||||
| 技術性 | |||||||
| 多人遊戲 | |||||||
| 特色功能 | |||||||