pocketmine / bedrock-block-upgrade-schema
描述如何升级较旧Minecraft: Bedrock Edition世界存档中保存的方块数据的模式
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:concrete
的silver
颜色与其他颜色不同,如0201_1.20.0.23_beta_to_1.20.10.24_beta.json
所示。如果测试顺序错误,银色混凝土将无法正确转换。
- 除了
remappedStates
之外,修改可以以任何顺序应用,例如,renamedIds
可以在renamedProperties
之前或之后应用。- 为了方便起见,
addedProperties
、renamedProperties
、removedProperties
和remappedPropertyValues
始终使用旧的方块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/mapping和pmmp/BlockPaletteArchive
- 它包括从分析游戏代码中不明显的变化 - 例如,添加了诸如
item_frame_photo_bit
之类的属性,而游戏本身没有升级器来添加它 - 占用空间小 - 方案可以添加到二进制文件中,压缩后几乎不会增加大小