Minecraft Wiki

除另有声明,转载时均必须注明出处若簡繁轉換出錯,請以遊戲內為準请勇于扩充与修正内容有兴趣逛逛我们的微博沟通交流,欢迎到社区专页需要协助,请在告示板留言

了解更多

Minecraft Wiki
Advertisement
Information icon
此特性為基岩版獨有。
Clock
此條目需要更新。

條目中某些資訊已經不符合目前版本情況。

Disambig gray  關於Java版的世界格式文件,請見「Java版世界格式」。

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: 玩家分數。
    •  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結構[]

  • 根複合標籤。
    •  Entities: 每個列表中的TAG_Compound定義了世界內的一個實體。
    •  TileEntities: 每個列表中的TAG_Compound定義了一個方塊實體,例如世界中的一個熔爐

實體格式[]

每個實體是一個包含在區塊檔案中的實體列表中的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.0level.dat現在是NBT格式檔案。
player.dat的資訊移動被到level.dat。
加入了entities.dat。
0.3.2Entities.dat被拓展以儲存方塊實體
0.9.0?加入了新的世界存檔格式,基於LevelDB 1.17和Zlib壓縮支持。載入舊的世界會自動轉換到新的格式。
攜帶版
1.0.0?每個子區塊現在被分開儲存為不同的leveldb key。
基岩版
1.2.13?子區塊現在會被整合在一起。[4]

參考[]

語言

Advertisement