pocketmine / bedrock-block-upgrade-schema

描述如何升级较旧Minecraft: Bedrock Edition世界存档中保存的方块数据的模式

4.4.0 2024-09-17 16:06 UTC

README

(大部分)自动生成的旧Minecraft: Bedrock世界中发现方块状态的升级模式

内容

nbt_upgrade_schema/*.json

这些模式描述了如何将一个版本的方块状态NBT升级到下一个版本。模式的结构在nbt_upgrade_schema_schema.json中描述。一个示例实现可以在PocketMine-MP 5.8.2中看到。

注释

  • Mojang在做出向后不兼容的更改时并不总是增加格式版本。一个突出的例子是0131_1.18.20.27_beta_to_1.18.30.json
  • remappedStates需要与其他规则不同的处理
    • 必须有最高优先级
    • 如果方块状态与重映射规则匹配,则 不要应用任何其他转换(新映射的状态将适用于新版本)。
    • oldState作为 搜索条件,而不是精确匹配
      • 因此,重映射状态规则必须按照从最多到最少的条件顺序进行测试(这是它们在JSON中提供的顺序)。
      • 例如,minecraft:concretesilver颜色与其他颜色不同,如0201_1.20.0.23_beta_to_1.20.10.24_beta.json所示。如果测试顺序错误,银色混凝土将无法正确转换。
  • 除了remappedStates之外,修改可以以任何顺序应用,例如,renamedIds可以在renamedProperties之前或之后应用。
    • 为了方便起见,addedPropertiesrenamedPropertiesremovedPropertiesremappedPropertyValues始终使用旧的方块ID和旧的属性名称进行索引。

block_legacy_id_map.json

此JSON文件包含从1.16.0起所有已知方块ID到旧ID的映射。

技术上,您只需要到1.2.13的所有内容,但多余的某些内容可能在某些情况下很有用。

id_meta_to_nbt/*.bin

这些二进制文件包含所有已知有效ID/meta组合到相应版本方块状态NBT的映射。例如,1.12.0.bin允许您将1.12.0 ID/meta转换为1.12.0 NBT。

用法

如果您只想升级到最新版本(撰写本文时为1.20.1),则只需1.12.0文件,该文件足以将所有旧方块(和方块物品)升级到1.12及更高版本。

但是,如果您想升级到1.9、1.10或1.11,则可能需要1.9.0文件,以便升级保存的方块物品,因为1.9开始使用块状态NBT在磁盘上保存方块物品。1.12.0文件不适用于此情况,因为它包含适用于1.12的NBT方块状态,这在早期版本上无法工作。

如果您以前使用现在已删除的1.12.0_to_1.18.10_blockstate_map.bin,则可以直接替换为1.12.0.bin。您需要像以前一样升级状态。

模式

文件结构如下所述。

  • 无符号varint32 - 条目数
    • 无符号varint32 - 块字符串ID长度
    • byte[] - 块字符串ID
    • 无符号varint32 - 元数据 -> 块状态配对数量
      • 无符号varint32 - 元数据值
      • TAG_Compound(标准小端)- 与ID和元数据对对应的NBT块状态(截至该文件的版本)

为新版本生成NBT升级方案

首先,您需要获取一个.bin映射文件,您可以使用BDS的当前版本和pmmp/mapping模组来获取。它要求您将前一个版本的调色板放置在input_files/old_block_palettes中。

输出文件将放置在mapping_files/old_palette_mappings中。然后,该文件作为方案生成脚本的输入,该脚本生成您在这个仓库中看到的JSON方案。

目前,所需的代码已集成在PocketMine-MP的实验分支中;计划在未来将其分离成自己的库。

背景

由于Minecraft基岩版不会自动升级地形或存档,除非它们在游戏会话中已加载,因此任何支持Minecraft基岩版世界的软件都必须适应所有旧块状态,从最早使用它们的版本开始,并且自那时以来已经做了许多不兼容的更改。如果不这样做,它们可能会随机加载在最新基岩版中运行良好的旧世界的块。

其他项目,如CloudburstMC/BlockStateUpdater,试图通过编写处理该问题的库代码来解决此问题;然而,这种方法存在一些问题

  • 它不可移植(不能由非JVM语言使用)
  • 它依赖于对Minecraft服务器二进制的手动分析
  • 它是人工创建的,这是一个自然容易出错的流程
  • 它可能不包括所有更改,因为游戏代码本身没有考虑到所有更改(即Mojang有时会错过某些内容,或者懒得考虑某些内容,例如添加item_frame_photo_bit

此项目旨在通过提供描述如何升级块状态的方案来解决此问题,而不将信息绑定到任何特定语言。这些方案是为PocketMine-MP的未来使用而开发的。

它具有以下优势,使其具有吸引力

  • 方案是JSON - 任何语言和任何实现都可以解析和使用它们
  • 映射的质量保证至少与基岩版自己的质量一样好,因为它是使用BDS本身创建的信息生成的1,并使用pmmp/mappingpmmp/BlockPaletteArchive
  • 它包括从分析游戏代码中不明显的变化 - 例如,添加了诸如item_frame_photo_bit之类的属性,而游戏本身没有升级器来添加它
  • 占用空间小 - 方案可以添加到二进制文件中,压缩后几乎不会增加大小