存档基础数据存储格式

来自Minecraft Wiki
跳转到导航 跳转到搜索
  本条目介绍的是Java版的存档基础数据存储格式。关于基岩版中有类似功能的文件及格式,请见“基岩版存档格式 § level.dat”。
本文章所述内容仅适用于Java版

存档基础数据存储文件是存档的核心文件,存储各种存档基础信息、维度信息和世界生成信息。

存储格式[编辑 | 编辑源代码]

存档基础数据存储文件位于<存档根目录>/level.dat。在不同情况下,此文件会有多个副本,见下文§ 存储行为

存档基础数据存储文件使用GZip压缩的NBT文件格式保存,其内部有下列NBT结构:

  • NBT复合标签/JSON对象 根标签
    • NBT复合标签/JSON对象*
      *
      Data
      :存档基础数据。
      • 整型*DataVersion:保存此存档基础数据存储文件的游戏的数据版本。如果此项不存在则游戏认为此项是-1。
      • 布尔型*allowCommands:存档是否启用命令。如果此项不存在,则游戏判断整型GameType是否为1(创造模式)。如果是则为true,否则为false
      • 双精度浮点数*BorderCenterX:世界边界中心的X坐标。如果此项不存在则游戏默认为0。
      • 双精度浮点数*BorderCenterZ:世界边界中心的Z坐标。如果此项不存在则游戏默认为0。
      • 双精度浮点数*BorderDamagePerBlock:超出边界安全区后,玩家每远离安全区一格增加的伤害值。如果此项不存在则游戏默认0.2。
      • 双精度浮点数*BorderSafeZone:超出边界后,玩家仍然不会受到伤害的安全区的宽度。如果此项不存在则游戏默认为5。
      • 双精度浮点数*BorderSize:边界宽度。如果此项不存在则游戏默认为59999968。
      • 双精度浮点数*BorderSizeLerpTarget:边界宽度过渡到的目标宽度。如果此项不存在则游戏默认为59999968。
      • 长整型*BorderSizeLerpTime:边界宽度的过渡时间。如果此项不存在则游戏默认为0。
      • 双精度浮点数*BorderWarningBlocks:玩家接近边界渲染出现红色警告框的最大距离。如果此项不存在则游戏默认为5。
      • 双精度浮点数*BorderWarningTime:当玩家接近边界距离小于边界过渡速度乘以此值时渲染出现红色警告框。如果此项不存在则游戏默认为15。
      • 整型*clearWeatherTime:存档内世界晴天剩余时间,在此期间天气将保持晴天,但此值大于0不是晴天的必要条件。当此值不存在时游戏默认为0。
      • NBT复合标签/JSON对象CustomBossEvents:自定义Boss栏数据。
        • NBT复合标签/JSON对象<Boss栏命名空间ID>:一项自定义Boss栏数据。
          • 字符串*
            *
            Color
            :Boss栏的颜色代码,可以为pink(粉色)、blue(蓝色)、red(红色)、green(绿色)、yellow(黄色)、purple(紫色)和white(白色)。
          • 布尔型*
            *
            CreateWorldFog
            :Boss栏是否创建世界迷雾效果。
          • 布尔型*
            *
            DarkenScreen
            :Boss栏是否会使天空变得黯淡。
          • 整型*
            *
            Max
            :Boss栏的最大值。
          • 字符串*
            *
            Name
            :(文本组件)Boss栏所显示的文本。
          • 字符串*
            *
            Overlay
            :Boss栏的显示样式。可以的值有progress(完整进度条)、notched_6(进度条分为6段)、notched_10(进度条分为10段)、notched_12(进度条分为12段)和notched_20(进度条分为20段)。
          • 布尔型*
            *
            PlayBossMusic
            :Boss栏是否播放boss音乐。
          • NBT列表/JSON数组*
            *
            Players
            :可以看见Boss栏的玩家列表。
            • 整型数组: (UUID)一个玩家。
          • 整型*
            *
            Value
            :Boss栏的当前值。
          • 布尔型*
            *
            Visible
            :Boss栏是否对列表中的玩家可见。
      • NBT复合标签/JSON对象DataPacks:存档启用和禁用的数据包。此值不存在时游戏默认为仅启用vanilla数据包。
        • NBT列表/JSON数组*
          *
          Disabled
          :禁用的数据包。
          • 字符串:数据包名称。
        • NBT列表/JSON数组*
          *
          Enabled
          :启用的数据包。
          • 字符串:数据包名称。
      • 长整型*DayTime:存档中游戏按照游戏昼夜循环而非游戏刻计算的游戏时间,可以被/time修改。当此值不存在时游戏默认为0。
      • 字节型*Difficulty:存档的游戏难度。0-3分别为和平、简单、普通和困难。当此项不存在时游戏默认为2,即普通。
      • 布尔型*DifficultyLocked:此存档难度是否被锁定。当此项不存在时游戏默认为false
      • NBT复合标签/JSON对象*DragonFight末影龙战斗数据。
        • 整型数组Dragon:(UUID)当前末影龙的UUID。
        • 布尔型DragonKilled:末影龙是否已经死亡。如果此项不存在游戏默认为false
        • 整型数组ExitPortalLocation:末影龙被击败后会飞往的地方,即返回传送门的位置。内部包含3个整数,分别代表XYZ坐标。
        • NBT列表/JSON数组Gateways:包含即将生成的末地折跃门的位置。刚创建世界时为20个数字,末影龙每死亡一次此列表长度减1,直到为全部清空后此项不再保存。
          • 整型:折跃门的角度,0为东方,数字按顺时针方向递增。
        • 布尔型IsRespawning:末影龙是否正在重生。如果此项不存在游戏默认为false
        • 布尔型*NeedsStateScanning:此世界是否没有进入过末地。如果此项不存在游戏默认为true
        • 布尔型*PreviouslyKilled:末影龙是否被击败过,决定下次击败末影龙获得的经验值。如果此项不存在游戏默认为false
      • NBT列表/JSON数组enabled_features:启用的功能开关。此值不存在时游戏默认为仅启用vanilla功能开关。
        • 字符串:(命名空间ID)一项功能开关。
      • NBT复合标签/JSON对象*
        *
        GameRules
        :存档的游戏规则
        • 字符串<游戏规则名称>:一项游戏规则和对应的值。
      • 整型*GameType:存档的默认游戏模式,控制玩家进入世界或重生时的游戏模式。0为生存模式,1为创造模式,2为冒险模式,3为旁观模式。如果此项不存在则游戏默认为0,即生存模式。
      • 布尔型*hardcore:存档内玩家死亡后是否自动转变为旁观模式。当此项不存在时游戏默认为false
      • 布尔型*initialized:存档是否被正确初始化。如果此项为false,游戏在加载存档之后会重新寻找世界出生点并重新放置奖励箱。当此项不存在时游戏默认为true
      • 长整型*LastPlayed:上次保存此存档的时间戳。当此项不存在时默认为0。
      • 字符串*LevelName:存档的名称。当此项不存在时游戏默认为空字符串。
      • NBT复合标签/JSON对象Player:存档保存的玩家信息。此信息只在单人游戏存档中有效,且优先级高于玩家数据存储文件。独立服务端存档中无此数据。
      • 布尔型*raining:当前存档内世界是否正在降雨。如果此项不存在游戏默认为false
      • 整型*rainTime:如果存档内世界目前不处于降雨天气,此值代表距离下一次降雨的时间。如果目前正处于降雨天气,此值表示距离降雨结束的时间。此值按游戏刻计算。如果此项不存在游戏默认为0。
      • NBT列表/JSON数组removed_features:此项无游戏逻辑作用,仅在崩溃中的Removed feature flags部分记录。
        • 字符串:一个字符串。
      • NBT列表/JSON数组*
        *
        ScheduledEvents
        :存档内未处理的计划事件。
        • NBT复合标签/JSON对象:一项计划事件。
          • NBT复合标签/JSON对象*
            *
            Callback
            :事件回调数据。
            • 字符串*
              *
              Type
              :(命名空间ID)事件回调类型。
              如果字符串Typefunction,则执行指定函数
            • 字符串*
              *
              Name
              :(命名空间ID)要执行的函数。
              如果字符串Typefunction_tag,则执行带有指定函数标签的函数。
            • 字符串*
              *
              Name
              :(命名空间ID)要执行的函数标签。
          • 字符串*
            *
            Name
            :此事件的名称。
          • 长整型*
            *
            TriggerTime
            :此事件的触发时间。以游戏时间作为基准。
      • NBT列表/JSON数组*ServerBrands:打开过此存档的服务端的铭牌列表。
        • 字符串:一个服务端铭牌。
      • 单精度浮点数*SpawnAngle:存档世界出生点出生时所看向的水平角度,以顺时针角度计,为0时代表Z轴正方向(正南方)。如果此项不存在则游戏默认为0。
      • 整型*SpawnX:存档世界出生点的X坐标。如果此项不存在则游戏默认为0。
      • 整型*SpawnY:存档世界出生点的Y坐标。如果此项不存在则游戏默认为0。
      • 整型*SpawnZ:存档世界出生点的Z坐标。如果此项不存在则游戏默认为0。
      • 布尔型*thundering:当前存档内世界是否正处于雷暴天气。如果此项不存在游戏默认为false
      • 整型*thunderTime:如果存档内世界目前不处于雷暴天气,此值代表距离下一次雷暴的时间。如果目前正处于雷暴天气,此值表示距离雷暴结束的时间。此值按游戏刻计算。如果此项不存在游戏默认为0。
      • 长整型*Time:存档的游戏时间。此时间从存档被创建开始计时,单位为游戏刻。如果此项不存在则游戏默认为0。
      • 整型*
        *
        version
        :存档区块文件的版本,对于Anvil文件格式(当前)为19133,对于MCRegion格式为19132,如果不为这两个值游戏获取存档信息时报错Unknown data version: <16进制此值>
      • NBT复合标签/JSON对象*
        *
        Version
        :存储此存档时游戏的详细版本信息。
        • 整型*Id:游戏的数据版本。如果此项不存在则使用当前正在加载此存档的游戏的数据版本。
        • 字符串*Name:游戏的版本名称。如果此项不存在则使用当前正在加载此存档的游戏的版本名称。
        • 字符串*Series:开发系列,用于标识开发分支。常规正式版和快照为main。如果此项不存在则使用当前正在加载此存档的游戏的开发系列。
        • 布尔型*Snapshot:表示此版本是否为快照版。如果此项不存在则使用当前正在加载此存档的游戏的类型。
      • 整型数组WanderingTraderId:(UUID)上一次成功生成的流浪商人的UUID。
      • 整型*WanderingTraderSpawnChance:游戏尝试生成流浪商人的成功概率。游戏加载时除以1000计算真实概率。如50表示5%的生成概率。如果此项不存在则游戏默认为0。
      • 整型*WanderingTraderSpawnDelay:距下次尝试生成流浪商人的时间,以游戏刻为单位。如果此项不存在则游戏默认为0。
      • 布尔型*WasModded:存档是否被修改过的客户端或服务端加载并保存。如果此项不存在游戏默认为false
      • NBT复合标签/JSON对象*
        *
        WorldGenSettings
        :此存档的世界生成设置。
        • 布尔型*bouns_chest:玩家首次进入游戏时,是否在出生点附近生成奖励箱。如果此项不存在游戏默认为false
        • NBT复合标签/JSON对象*
          *
          dimensions
          :定义存档包含的所有维度及其世界生成设置。
          • NBT复合标签/JSON对象<维度的命名空间ID>:定义维度和对应的数据。
            • NBT复合标签/JSON对象*
              *
              generator
              :世界生成器数据。
            • 字符串*
              *
              type
              :(命名空间ID)维度类型数据。
        • 布尔型*generate_features:世界是否生成结构。如果此项不存在游戏默认为true
        • 字符串legacy_custom_options:对世界生成不起到任何作用。存在此标签代表这个存档曾使用旧版自定义设置调整世界生成,在加载此存档时游戏会给出警告。
        • 长整型*
          *
          seed
          :数字形式的世界种子

存储行为[编辑 | 编辑源代码]

每个存档都至少有一个存档基础数据存储文件。如果一个目录下不存在level.datlevel.dat_old文件,那么这个目录就不会被作为存档识别。

游戏有两种读取存档基础数据存储文件的方式:

  • 选择世界菜单中,游戏会读取游戏存档目录,查找所有带有存档基础数据存储文件的目录作为存档,并读取这些文件的部分基础信息显示在菜单内。
  • 在游戏加载存档时,游戏会将存档基础数据存储文件的数据全部加载,并根据世界生成数据创建区块生成器等。

由于存档基础数据存储文件是存档最重要的文件,此文件在保存时会留下一个备份以减少数据损坏的可能性:

  1. 先将新的数据写入到level<随机字符串>.dat内。
  2. 将原先的level.dat移动到level.dat_old
  3. 删除level.dat
  4. 将刚才写入的level<随机字符串>.dat移动到level.dat
  5. 如果有任何一步出错,都将level.dat_old移动回level.dat

备份文件与主文件的结构相同,当主文件损坏时,游戏会自动尝试恢复:

  1. 先将原先的level.dat移动到level.dat_corrupted_<时间戳>
  2. 删除level.dat
  3. level.dat_old移动到level.dat
  4. 如果有任何一步出错,都将level.dat_corrupted_<时间戳>移动回level.dat

历史[编辑 | 编辑源代码]

Java版
1.112w01a加入了字符串generatorName
1.2?加入了整型generatorVersion
1.3.1?加入了布尔型allowCommands
加入了布尔型initialized
1.4.212w32a加入了NBT复合标签/JSON对象GameRules
加入了长整型DayTime
12w36a加入了字符串generatorOptions,内容为超平坦世界的预设码。
1.814w02a加入了字节型Difficulty布尔型DifficultyLocked
14w07a加入了整型clearWeatherTime
14w17a加入了双精度浮点数BorderCenterX双精度浮点数BorderCenterZ双精度浮点数BorderSize
现在字符串generatorName可接受值customized,此时字符串generatorOptions为旧版自定义世界的预设码。
14w19a加入了双精度浮点数BorderDamagePerBlock双精度浮点数BorderSafeZone双精度浮点数BorderSizeLerpTarget整型BorderSizeLerpTime双精度浮点数BorderWarningBlocks双精度浮点数BorderWarningTime
14w31aBorderSizeLerpTime的数据类型更改为长整型长整型
1.915w31a加入了NBT复合标签/JSON对象DimensionData,末影龙战斗数据存于其NBT复合标签/JSON对象1.DragonFight下。
15w32a加入了NBT复合标签/JSON对象Version整型DataVersion
1.1317w43a加入了NBT复合标签/JSON对象DataPacks
18w05a加入了NBT复合标签/JSON对象CustomBossEvents
18w16a现在字符串generatorName可接受值buffet,此时字符串generatorOptions格式如下:{"biome_source":{"type":"minecraft:fixed","biomes":[<若干生物群系ID>]},"chunk_generator":{"type":"<生成器ID>"}}
18w19a更改了字符串generatorNamebuffet字符串generatorOptions的格式。
pre8移除了字符串generatorOptions,由NBT复合标签/JSON对象generatorOptions代替。
加入了字符串legacy_custom_options
1.1419w05a加入了整型WanderingTraderSpawnChance整型WanderingTraderSpawnDelay整型数组WanderingTraderId
1.1620w17a加入了布尔型BonusChest
20w20a将所有世界生成相关设置都集中到了NBT复合标签/JSON对象WorldGenSettings内。
20w21a移除了长整型SizeOnDisk
末影龙战斗数据被移到NBT复合标签/JSON对象Data下,而非NBT复合标签/JSON对象Data.DimensionData.1下。
1.1821w37a加入了字符串Series标识开发分支。
1.1922w11a现在世界生成数据内的维度类型只能为命名空间ID。
1.19.322w42a加入了NBT列表/JSON数组enabled_features
1.2023w12a加入了NBT列表/JSON数组removed_features

导航[编辑 | 编辑源代码]