We are currently performing an upgrade to our software. This upgrade will bring MediaWiki from version 1.31 to 1.33. While the upgrade is being performed on your wiki it will be in read-only mode. For more information check here.

Alpha世界格式

来自Minecraft Wiki
跳转至: 导航搜索
Grass Block Revision 2.png
该页面的内容关于过时或已移除的功能。
这些特性只存在于旧版本的Minecraft
Information icon.svg
此特性为Java版独有。

Infdev在开发过程中引入了新的数据存储挑战:由于其地图的大小(地球表面积的几倍),infdev中生成的地形有可能在内存中占大约为235PB,即240,640PB。 因此,为了减少文件大小和内存使用,Notch决定将地形分成16×128×16块,并在不可见时将它们存储在磁盘上。此外,地形仅在玩家视角的渲染距离内生成,大大减少了保存大小,因为大多数玩家只能在合理的时间范围内搜索地图的一小部分。Alpha使用了这种技术,而因为其成功,Beta1.0.0仍然使用这一般概念。

MinecraftJava版Beta 1.3中,此格式被区域文件格式取代,其中区块以32×32一组存储在区域文件中。

世界文件夹结构[编辑 | 编辑源代码]

Alpha世界实际上是一个包含至少一个名为level.dat的文件的文件夹。还有一个session.lock文件,以确保一次只有一个Minecraft打开该世界。

世界文件夹最多可包含64个子文件夹,每个子文件夹最多包含64个子文件夹。这些文件夹包含保存世界的地形和实体的区块文件。 每个区块文件由其区块位置xPos和zPos标识。区块文件名称的不同部分是通过获取xPos和zPos的base36表示来获得的。放置区块文件的文件夹的名称可以通过获取xPos和zPos,模除64(或按63进行位AND运算)和转换为base36来找到。负坐标必须通过wikipedia:zh:有符号数处理#补码按位解释为正数。因此,-13被视为243(如果它的大小为一个字节)。

例如,要查找位置为(-13,44)处的区块:

  • 第一个文件夹名为base36(-13 % 64),也就是{{{1}}},即"1f"。
  • 第二个文件夹名为base36(44 % 64)。也就是base36(44),即"18"。
  • 区块文件名为"c." + base36(-13) + "." + base36(44) + ".dat"。计算得"c.-d.18.dat"。
  • 所以位于(-13,44)的区块文件存储在"1f/18/c.-d.18.dat"。

每个区块都会独立于文件和文件夹名称记住其位置。请参阅下文,了解如何从文件数据中读取区块的位置。

维度[编辑 | 编辑源代码]

其他维度的保存方式与普通世界相同,但不是将世界文件混合在保存文件夹中,而是将文件存储在具有自己的区域和块数据的其他子文件夹中。它们的名称以DIM开头,后跟维度ID。

在Alpha中使用这些维度ID:

ID 文件夹 维度
0 saves/[世界]/ 正常世界(主世界),总是存储在不带DIM的世界文件夹中
-1 saves/[世界]/DIM-1/ 下界,在万圣节更新中加入

session.lock格式[编辑 | 编辑源代码]

此文件包含了该世界最后一次进入时的时间戳。文件为一64字节以大端字节序格式的整值数据,为自1970年(标准时区)开始的以百为单位的毫秒数。

与典型的lock文件不同,这一文件确保了最后访问这一世界的程序有读取和修改的权限。该过程通常如下所示:

  1. 程序打开 session.lock
  2. 程序在session.lock写入当前时间戳
  3. 程序对session.lock的变化进行监控
  4. 如果session.lock内容发生变化,则程序中断并锁定世界。

level.dat Format[编辑 | 编辑源代码]

level.dat文件是一个GZip压缩的NBT文件,用于存储全局级别数据(时间、玩家生命、背包、速度和地图中的位置等)。最重要的是,它存储了地形生成器用于在运行中无缝生成更多地形的随机种子。

这个文件有这个结构:


  • 根标签。

    •  Data: 全局世界数据。

      •  LastPlayed: 当玩家保存游戏时,存储Unix时间戳(以毫秒为单位)。

      •  SizeOnDisk: 估计整个世界的大小(以字节为单位)。

      •  RandomSeed: 为地形提供随机种子的随机数。

      •  SpawnX: 世界的生成位置的X坐标。

      •  SpawnY: 世界的生成位置的Y坐标。

      •  SpawnZ: 世界的生成位置的Z坐标。

      •  Time: 以刻为单位存储当前“一天中的时间”。每个实际秒数有20刻,每个Minecraft日夜交替有24000刻,使整个周期长度为20分钟。0是白天的开始,12000是日落的开始,13800是夜晚的开始,22200是日出的开始,24000又是白天的开始。 存储在level.dat中的值总是在增加,并且可以大于24000,但“时间”总是模除“时间”字段值的24000。

      •  Player: 世界的的单人游戏玩家。

        •  Dimension: 玩家所在的维度。0是主世界,1是下界

        •  Pos: 3个TAG_Doubles的列表,用于玩家的X,Y和Z位置。

        •  Rotation: 2个TAG_Floats的列表,用于玩家视角的偏航(Yaw)和俯仰(Pitch)。

        •  Motion: 3个TAG_Doubles的列表,用于X,Y和Z运动,以米每刻为单位。

        •  OnGround: 1或0(true/false) — 如果玩家在地上为true。

        •  FallDistance: 玩家掉落了多远。

        •  Health: 玩家拥有的生命值。20为10颗心。

        •  AttackTime: 玩家免受攻击的刻数。

        •  HurtTime: 玩家被攻击后红色的刻数。

        •  DeathTime: 玩家死亡的刻数 — 用于控制死亡动画。

        •  Air: 玩家开始溺水之前的刻数。从300开始。

        •  Fire: 当为负数时,玩家将被点燃之前的滴答数。当为正数时,火扑灭前的刻数。

        •  Score: 玩家的得分。该分数从未在Alpha或甚至beta中使用,因此该值无关紧要。

        •  Inventory: TAG_Compounds的列表,表示玩家背包中的物品。

          • 背包物品

            •  Slot: 物品所在的槽。

            •  id: 物品ID。

            •  Damage: 物品的数据值,或工具的损伤值。

            •  Count: 栈中此物品的编号。范围从-128到127。小于2的值不会在游戏中显示。

区块格式[编辑 | 编辑源代码]

区块文件,如上所示,是GZip压缩的NBT文件。他们有这个结构:


  • 根标签。

    •  Level: 该区块的世界数据。

      •  xPos: X区块坐标。

      •  zPos: Z区块坐标。

      •  TerrainPopulated: 1 or 0 (true/false) — 若Minecraft在这个区块中产生了特殊的功能,例如树木、花朵、矿石、地牢,则为true。

      •  LastUpdate: 区块最后加载时的刻。

      •  Blocks: 方块ID为32768字节,每个方块8位。

      •  Data: 方块数据为16384字节,每个方块4位。

      •  BlockLight: 方块光照为16384字节,每个方块4位。

      •  SkyLight: 天空光照为16384字节,每个方块4位。

      •  HeightMap: 高度地图信息为256字节,每个XZ列4位。用于加快天空光照计算。

      •  Entities: List of TAG_Compounds, 每一个用于区块中的每个实体。

      •  TileEntities: List of TAG_Compounds, 每一个用于区块中的每个实体。

另见[编辑 | 编辑源代码]