基岩版使用了修改後的Google的LevelDB(Zlib壓縮格式)來儲存世界格式資料。
基於LevelDB的格式[]
Mojang的LevelDB格式[]
Mojang修改了谷歌的原始LevelDB以加入對Zlib壓縮格式和Windows系統的支持。代碼可以在Github頁面訪問,且編寫指引由Tommaso在此處提供。
對於Java版的LevelDB + Zlib,請見此Github頁面。
Google的leveldb庫自從Mojang在發布Minecraft後得到了極大的改變,但Mojang自己修改後的版本仍然可以獨立運作,但代碼需要一些小修改來實現相容性:
db/snappy_compressor.cc
應該引用<snappy.h>
而不是<snappy/snappy.h>
。table/table_test.cc
包含兩個無法解析但不相關的snappy引用:port::Snappy_Compress
和leveldb::SnappyCompressor
。如果被簡單地注釋掉,其餘的代碼仍可以正常執行。
資料庫儲存在db或基岩版世界的子目錄。傳遞給LevelDB API的資料庫路徑是這個路徑,而不是其中任何檔案的路徑。這似乎也是儲存世界地形的位置,因為可以透過將其db資料夾替換為來自無限世界類型的資料夾來將舊世界類型變為無限。
區塊鍵值格式[]
有關區塊資料的資料庫鍵是以下內容的並列:
- 兩個帶符號的32位元小端序整數(x和z分別位於區塊座標中)。
- 可選的第三個32位元小端序整數(1為地獄,2為終界,忽略掉則為主世界)。
- 一個單字節標籤,指定鍵所代表的記錄類型(見表),以及……
- (對於SubChunkPrefix記錄)一個字節的子區塊索引(從0到15)。
因此,這些鍵值應當為9、10、13或14字節長度。對於指定的區塊而言,並非所有子區塊都需要存在。
BlockEntity
、Entity
和PendingTicks
記錄代表了NBT變種中的串聯根標籤序列,它以短整數格式儲存長度和多字節整數類型,而不是Java版或原始 NBT規範使用的大端序格式。
Version
中的零值用於記錄舊世界格式,更高的值被無限世界類型使用。
標籤字節 | 名稱 | 描述 | ||
---|---|---|---|---|
Dec | Hex | ASCII | ||
43 | 2B | + |
Data3D | 新版的三維生態域和海拔高度 |
44 | 2C | , |
Version | 一個字節 |
45 | 2D | - |
Data2D | 生態域和海拔高度 |
46 | 2E | . |
Data2DLegacy | 舊版生態域和海拔高度 |
47 | 2F | / |
SubChunkPrefix | 16×16×16子區塊的地形 |
48 | 30 | 0 |
LegacyTerrain | 整個區塊的地形 |
49 | 31 | 1 |
BlockEntity | 方塊實體資料(小端序NBT) |
50 | 32 | 2 |
Entity | 舊版實體資料(小端序NBT) |
51 | 33 | 3 |
PendingTicks | 計劃刻資料(小端序NBT) |
52 | 34 | 4 |
LegacyBlockExtraData | 舊版方塊額外資料 |
53 | 35 | 5 |
BiomeState | 生態域狀態 |
54 | 36 | 6 |
FinalizedState | 32位元小端序整數 |
55 | 37 | 7 |
ConversionData | 轉換器提供的資料,用於執行時中的融合等操作 |
56 | 38 | 8 |
BorderBlocks | 教育版獨有 |
57 | 39 | 9 |
HardcodedSpawners | 以二進制格式儲存的結構生成的邊界框 |
58 | 3A | : |
RandomTicks | 隨機刻資料(小端序NBT) |
59 | 3B | ; |
Checksums | 其他區塊記錄的xxHash校驗碼 |
60 | 3C | < |
GenerationSeed | |
61 | 3D | = |
GeneratedPreCavesAndCliffsBlending | 不再使用 |
62 | 3E | > |
BlendingBiomeHeight | 不再使用 |
63 | 3F | ? |
MetaDataHash | |
64 | 40 | @ |
BlendingData | |
65 | 41 | A |
ActorDigestVersion | 1.18.30之後新版實體儲存格式下的實體摘要版本 |
110 | 6E | n |
VersionEnchant | 中國版獨有 |
111 | 6F | o |
VersionMarkInsert | 中國版獨有 |
118 | 76 | v |
LegacyVersion | 一個字節。1.16.100為44。 |
其餘鍵值[]
實體資料存在特殊鍵值~local_player
來儲存本地玩家實體資料。如果這裡存在實體資料,則它優先於儲存在level.dat中的玩家資料。與~local_player
關聯的資料值使用NBT格式在父級根目錄裡有且只有一個複合標籤。
同時存在一個用於遠程控制玩家的特殊鍵值,它由兩個部分組成。第一個部分是前綴player_
,第二部分是用戶端ID,包含了遠程遙控玩家的clientid.txt檔案。例如,player_-12345678
是使用用戶端ID為-12345678
的控制遠程用戶端的鍵值。與前綴player_
鍵值關聯的值是一個NBT結構檔案,並且在根級別只有一個複合標籤。
此外,也有一個名為game_flatworldlayers
的長度為20的鍵值,被超平坦世界使用。與此鍵關聯的值是一組ASCII文字格式的數字。與game_flatworldlayers
鍵關聯的值的例子是[7,3,3,2]
,值長度為9。
一些鍵值與村民有關:
- VILLAGE_[0-9a-f\\-]+_DWELLERS
- 主要由實體/生物ID組成。包括村民、鐵魔像和貓。
- VILLAGE_[0-9a-f\\-]+_INFO
- 包含了村莊邊界。
- VILLAGE_[0-9a-f\\-]+_POI
- 包含了村民和工作站點之間的映射。床位分配似乎沒有被儲存。
- VILLAGE_[0-9a-f\\-]+_PLAYERS
基岩版leveldb解析器示例[]
基岩版存檔資料庫解析器的例子可以在minecraft_mmccoo找到。用於實現遍歷所有方塊、實體或生物、海拔和村莊相關項目的NBT檔案。
NBT結構[]
下列頁面記錄了方塊實體和實體的NBT結構文件:
level.dat[]
level.dat為NBT格式。
NBT結構[]
- :世界格式根目錄。
- abilities:玩家權限或能力。
- attackmobs:玩家是否能攻擊生物。
- attackplayers:玩家是否能攻擊其他玩家。
- build:玩家是否能放置方塊。
- doorsandswitches:玩家是否能打開或關閉門、打開或關閉控制桿等方塊。
- flying:玩家是否處於飛行狀態。
- instabuild:玩家是否能瞬間破壞方塊。
- invulnerable:玩家是否無敵。
- lightning:玩家是否能被閃電劈中。
- mayfly:玩家是否能飛行。
- mine:玩家是否能挖掘方塊。
- mute:玩家是否被禁言。
- noclip:玩家是否擁有自由視角。
- op:玩家是否擁有管理員權限。
- opencontainers:玩家是否能打開容器(例如儲物箱)。
- teleport:玩家是否能傳送。
- permissionsLevel:世界主人的權限等級。
- playerPermissionsLevel:其他玩家的權限等級。
- flySpeed:玩家的飛行速度。
- walkSpeed:玩家的移動速度。
- lastOpenedWithVersion:最後一次打開的遊戲版本。格式為
x.x.x.x.x
,x為下列整數的值,例如基岩版1.18.2為1.18.2.3.0
。- 0:主版本號。
- 1:次版本號。
- 2:補丁版本號。
- 3:修訂版本號。
- 4:搶鮮版本號。
- MinimumCompatibleClientVersion:最小可相容的用戶端版本。若遊戲用戶端版本低於此值,則不能打開目標存檔。格式為
x.x.x.x.x
,x為下列整數的值,例如基岩版1.18.10為1.18.10.0.0
。- 0:主版本號。
- 1:次版本號。
- 2:補丁版本號。
- 3:修訂版本號。
- 4:搶鮮版本號。
- allowdestructiveobjects:在教育版中是否允許破壞性物體(如TNT)出現。
- allowmobs:在教育版中是否允許生物生成。
- bonusChestEnabled:是否允許生成獎勵箱。
- bonusChestSpawned:是否在重生點處生成獎勵箱。
- CenterMapsToOrigin:玩家建立的地圖是否總是以玩家為中心,0表示對齊區塊。
- cheatsEnabled:是否啟用過作弊。
- codebuilder:在教育版中是否開啟Code Builder權限。
- commandblockoutput:是否展示指令方塊輸出資訊。
- commandblocksenabled:是否允許使用指令方塊。
- commandsEnabled:是否允許使用管理員權限的指令。
- ConfirmedPlatformLockedContent:是否已經確認平台鎖定的內容。
[需要驗證] - dodaylightcycle:是否啟用晝夜更替。
- doentitiydrops:非生物實體是否有掉落物。
- dofiretick:火是否蔓延及自然熄滅。
- doimmediaterespawn:玩家死後是否瞬間重生。
- doinsomnia:夜魅是否生成。
- domobloot:生物是否攜帶戰利品表生成。
- domobspawning:是否可以生成生物。不影響生怪磚生成生物。
- dotiledrops:方塊被破壞時是否掉落物品。
- doweathercycle:天氣是否變化。
- drowningdamage:玩家是否承受窒息傷害。
- educationFeaturesEnabled:是否啟用教育版特性。
-
experimentalgameplay:是否啟用實驗性玩法特性。在1.16.100.55及之後版本中會被替換為 experiments。 - experiments:實驗性玩法選項。
- data_driven_biomes:自訂生態域。
- data_driven_items:其他資料型驅動功能。
- experimental_molang_features:實驗性Molang功能。
- experiments_ever_used:存檔是否使用過實驗性功能。
- gametest:GameTest框架。
- saved_with_toggled_experiments:是否使用了自訂的實驗性功能儲存的世界。
[需要驗證] - upcoming_creator_features:即將到來的創作者功能。
- falldamage:是否受到墜落傷害。
- firedamage:是否受到火焰傷害。
- freezedamage:是否受到冰凍傷害。
- ForceGameType:強制使用的遊戲模式。0為生存模式,1為創造模式,2為冒險模式。
- globalmute:在教育版中是否全體玩家禁言。
- hasBeenLoadedInCreative:是否已經在創造模式打開過存檔。主要用於控制是否可以獲得成就。
- hasLockedBehaviorPack:是否包含已經鎖定的行為包。
- hasLockedResourcePack:是否包含已經鎖定的資源包。
- immutableWorld:是否開啟無World Builder權限玩家不能放置或破壞方塊的世界。
- isFromLockedTemplate:存檔是否為鎖定的模板世界。
- isFromWorldTemplate:存檔是否為世界模板。
- isSingleUseWorld:教育版中是否為單學生遊戲。
- isWorldTemplateOptionLocked:該模板世界是否解鎖全部選項。
- keepinventory:玩家死後是否保留物品欄。
- LANBroadcast:是否允許開放局域網聯機。
- LANBroadcastIntent:是否開啟局域網聯機。
- mobgriefing:生物是否能夠進行破壞性行為。詳見遊戲規則。
- MultiplayerGame:是否允許進行多人聯機遊戲。
- MultiplayerGameIntent:是否開啟局域網和Xbox多人遊戲。
- naturalregeneration:玩家是否能在飢餓值足夠時自然恢復生命值(不影響外部治療效果,如金蘋果、回復狀態效果等)。
- pvp:是否允許玩家互相攻擊。
- requiresCopiedPackRemovalCheck:是否需要去除複製過的資源包/行為包才能載入世界。
[需要驗證] - sendcommandfeedback:玩家執行指令的返回資訊是否在聊天框中顯示。
- showcoordinates:是否在GUI左上角顯示座標。
- showdeathmessages:是否展示死亡訊息。
- showtags:是否在玩家頭頂顯示使用者名稱。
- spawnMobs:控制生物生成。
- SpawnV1Villagers:是否生成舊版村民。
- startWithMapEnabled:玩家是否攜帶地圖首次生成。
- texturePacksRequired:是否需要攜帶特定紋理包生成。
- tntexplodes:TNT是否能夠破壞地形。
- useMsaGamertagsOnly:是否在僅在遊戲中使用玩家的Xbox代號。本地存檔預設為0,Realms世界預設為1。
- Difficulty:世界難易度。0為和平,1為簡單,2為普通,3為困難。
- eduOffer:是否為教育版獨有世界。設定為1時只能由教育版用戶端打開。
- functioncommandlimit:資料包的指令限制數量。
- Dimension:玩家所在的維度。0為主世界,1為地獄,2為終界。
- GameType:玩家的遊戲模式。0為生存模式,1為創造模式,2為冒險模式。
- Generator:世界格式。0為舊世界,1為無限,2為超平坦。
- lightningTime:下一次閃電出現前的剩餘時間(刻)。
- LimitedWorldOriginX:有限(舊)世界生成開始的X座標。
- LimitedWorldOriginY:有限(舊)世界生成開始的Y座標。
- LimitedWorldOriginZ:有限(舊)世界生成開始的Z座標。
- maxcommandchainlength:連鎖型指令方塊執行指令的數量限制。預設值為65535。
- NetherScale:地獄與主世界的比例尺。預設值為8。
- NetworkVersion:網路協議版本號。用於控制聯機時其餘玩家是否可以加入該世界。
- Platform:世界時使用何種平台儲存的,值總為2。
- PlatformBroadcastIntent:在平台間開放遊戲,值總為3。
- rainTime:下一次進入下雨或下雪天氣前的剩餘時間(刻)。
- randomtickspeed: 隨機刻速度。預設值為1。
- serverChunkTickRange:顯示距離。
- spawnradius:玩家重生點的座標。
- SpawnX: 玩家重生點座標X軸,預設值為0。
- SpawnY:玩家重生點座標Y軸,預設值為64。
- SpawnZ: 玩家重生點座標Z軸,預設值為0。
- StorageVersion:基岩版儲存工具版本,目前為8。
- XBLBroadcastIntent:允許什麼使用者進行Xbox聯機。1為僅邀請,2為僅好友,3為好友的好友。
- currentTick:目前的遊戲刻。
- LastPlayed:玩家在最後一次退出遊戲時的Unix時間戳(秒)。
- RandomSeed:世界的種子號。
- Time:以刻數形式儲存的遊戲內時間(遊戲日)。1秒20刻,完成一次晝夜更替需要14400刻(12分鐘,比標準情況下20分鐘還要快)。0為早晨時間,7200為日落時間,8280為晚上時間,13320為日出時間,14400是下一次早晨的時間。level.dat內儲存的數值會持續增加,且可以大於14400,但「遊戲日」始終是
Time
字段值整除14400的結果。 - worldStartCount:最後一次打開存檔的時間(時間戳)。
[需要驗證] - lightningLevel:暴風雨天氣的強度。
- rainLevel:下雨天氣的強度。
- baseGameVersion:世界模板使用的基礎用戶端版本。預設值為
*
。 - BiomeOverride:需要進行轉換的生態域。包含了在1.18.0移除的生態域。
- FlatWorldLayers:控制超平坦世界生成的JSON檔案。預設值:
{"biome_id":1,"block_layers":[{"block_data":0,"block_id":7,"count":1},{"block_data":0,"block_id":3,"count":2},{"block_data":0,"block_id":2,"count":1}],"encoding_version":3,"structure_options":null}
- InventoryVersion:物品欄使用的遊戲版本。若遊戲用戶端版本低於此值,則不能打開目標存檔。例如在基岩版1.18.10.26中建立的世界為
1.18.10-beta26
。 - LevelName:存檔的名稱。
- prid:世界模板的產品ID,由市場自動分配。
[需要驗證] - worldTemplateUUID:世界模板的UUID。
- worldTemplateVersion:世界模板的版本號。
- world_policies:世界的使用政策。
[需要驗證]
- abilities:玩家權限或能力。
LOG[]
LOG日誌檔案位於存檔的/db路徑裡,並且是leveldb格式的一部分,用於在LDB壓縮檔案之間使用。類似於程式的日誌檔案:
YYYY /MM/DD-Hour/Minute/Second.StepName "Info"
示例:
2014/07/24-22:20:08.400488 4a3638 Recovering log #3
歷史[]
攜帶版Alpha | |||||
---|---|---|---|---|---|
0.2.0 | level.dat現在是一個NBT格式檔案。 | ||||
player.dat被合併到level.dat裡。 | |||||
加入了entities.dat檔案。 | |||||
0.3.2 | Entities.dat現在用於儲存方塊實體資料。 | ||||
0.9.0 | build 1 | 加入了新的世界儲存格式和基於LevelDB 1.17的Zlib壓縮格式支持。舊世界在新版本打開後會自動轉換。 | |||
攜帶版 | |||||
1.0.0 | 0.17.0.1 | 現在每個子區塊會被分別儲存在不同的leveldb鍵中。 | |||
基岩版 | |||||
1.2.13 | ? | 子區塊現在使用託管。[1] |
參考[]
版本 |
| ||||||
---|---|---|---|---|---|---|---|
開發 |
| ||||||
技術性 | |||||||
多人遊戲 | |||||||
特色功能 |
語言