本站文本內容除另有聲明外,均在知識共享 署名-非商業性使用-相同方式共享 3.0 協議下提供。(詳情…本站文本內容除另有聲明外,均在知識共享 署名-非商業性使用-相同方式共享 3.0 協議下提供。(詳情…中文Minecraft Wiki是完全公開的。請勇於擴充與修正內容!中文Minecraft Wiki是完全公開的。請勇於擴充與修正內容!Minecraft中文Wiki微博正在更新!或許有興趣去看看Minecraft中文Wiki微博正在更新!或許有興趣去看看想與其他用戶進行編輯上的溝通?社區專頁正是為此創建的。想與其他用戶進行編輯上的溝通?社區專頁正是為此創建的。翻譯或創建頁面之前,不妨看看譯名標準化Wiki條例頁面。翻譯或創建頁面之前,不妨看看譯名標準化Wiki條例頁面。需要管理員的協助?在管理員告示板留言也許可以幫到您。需要管理員的協助?在管理員告示板留言也許可以幫到您。

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, 每一个用于区块中的每个实体。

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