版本¶
版本(Version)是在Minecraft基岩版中广泛存在的概念。这些版本包括但不限于:
- 游戏版本
- 附加包版本
- 基游戏版本
- 引擎版本
- 格式版本
- 命令版本
- 网络协议版本
语义版本¶
语义版本(Semantic Version)并不是Minecraft基岩版中的某种版本类型,而是一种版本号的命名规范,在Minecraft基岩版中广泛使用。语义版本号由三个整数和两个字符串组成,分别是主版本号
、次版本号
、补丁版本号
、预发布类型
和构建元数据
。语义版本号的格式如下:
通常情况下,Minecraft基岩版中使用语义版本的版本类型只有前三个整数是有意义的,即主版本号
、次版本号
和补丁版本号
。例如,1.16.100
。但是一些情况下,预发布类型
和构建元数据
也会被使用,例如脚本API的一些模块版本。
当语义版本只有前三个整数时,语义版本之间可以比较大小。如果两个语义版本的主版本号
不同,那么较大的主版本号
的版本更大;如果两个语义版本的主版本号
相同,那么比较次版本号
;如果两个语义版本的次版本号
相同,那么比较补丁版本号
。如果两个语义版本的主版本号
、次版本号
和补丁版本号
都相同,那么这两个语义版本相等。
游戏版本¶
对每一个Minecraft基岩版的构建,游戏都会持有一个游戏版本(Game Version)。这意味着,无论是发布在哪个平台上的Minecraft基岩版,都会有一个游戏版本,而且无论这些平台上发布的Minecraft基岩版本身在平台上显示的版本如何(Android:1.16.100.04
,Windows:1.16.10004.0
,PS4:2.18
,服务端:1.16.100.04
),他们都使用同一套游戏版本且其格式相同。游戏版本通常由五个整数组成,用点.
分隔,例如1.16.100.4.0
,格式如下:
游戏版本的主版本号
、次版本号
和补丁版本号
与语义版本的主版本号
、次版本号
和补丁版本号
含义一致。修订版本号
是一个整数,用于修复游戏版本中的错误,即发布测试版和预览版时递增版本使用。是否是某种测试版本
本身是一个布尔值,用于标识游戏版本是否是某种测试版本,例如测试版、预览版等。当这个值被解析为游戏版本号的时候,真被解析为1
,假被解析为0
。
虽然游戏版本本身的格式不是一种语义版本,但是其可以被解析为语义版本。当解析为语义版本时,如果是否是某种测试版本
为1
,则解析为主版本号.次版本号.补丁版本号-beta.修订版本号
,否则解析为主版本号.次版本号.补丁版本号
。我们称这种版本号为游戏版本的语义版本号。
附加包版本¶
在Minecraft基岩版中,附加包是一种用于扩展游戏内容的资源包。每一个附加包都有一个附加包版本(Add-on Version)。附加包版本通常由三个整数组成,附加包版本是一个纯粹的语义版本,例如1.0.0
。附加包版本定义在每个附加包的清单文件的标头(header
)中,具体请查看相关参考文档。
附加包版本用于标识附加包的版本,当附加包的内容发生变化时,附加包版本应该递增。附加包版本被游戏用于判断哪个附加包更加新,当游戏导入附加包时,新版本的附加包会覆盖旧版本的附加包。玩家也可以在游戏内查看各个附加包的版本,以便了解附加包的更新情况。
附加包的模块版本¶
每个附加包在定义时可以包含多个模块,每个模块都有一个模块版本(Module Version)。模块版本也是一个纯粹的语义版本,例如1.0.0
。模块版本定义在每个附加包的清单文件的模块(modules
)数组中,具体请查看相关参考文档。
模块版本仅用于标识模块的版本,当模块的内容发生变化时,模块版本应该递增。目前并未观察到游戏针对模块版本有任何处理方式,但是模块版本依旧可以用于标识模块的更新情况。
脚本API的模块版本¶
脚本API是一种附加包中利用JavaScript脚本扩展游戏内容的方式。在每个附加包的清单文件中,需要告知游戏当前附加包使用的各个脚本API模块的版本,以供游戏提供相应的接口而不会产生兼容性错误。脚本API的模块版本也是一个纯粹的语义版本,例如1.16.0
或1.17.0-beta
。脚本API的模块版本定义在每个附加包的清单文件的依赖(dependencies
)数组中,具体请查看相关参考文档。
脚本API的模块版本在游戏中不会用于版本比较,但是游戏会根据脚本API的模块版本来加载相应的脚本API模块,以保证脚本API的正常运行。如果脚本API的模块版本不匹配,游戏可能会拒绝加载附加包,或者在加载附加包时产生错误。请确保自己使用了严格对应匹配的脚本API模块版本。
基游戏版本¶
对于每个Minecraft世界而言,都有一个基游戏版本(Base Game Version)。基游戏版本可以是一个语义版本,例如1.16.100
,也可以是由单独一个星号构成的字符串:*
,代表“与当前构建的游戏版本相同”。游戏在打开一个世界时,会根据该世界的基游戏版本来加载相应的基游戏内容,以保证世界的正常运行。
基游戏(Base Game)是一种抽象概念,用于代表一个世界所使用的基础游戏内容,这是用于兼容旧版世界(特别是世界模板)而制作的一种功能。当你使用旧版的基游戏打开世界时,在此基游戏版本下制作的世界将会被加载,而不会加载新版的游戏内容。这样可以保证世界的正常运行,同时也可以保证世界的兼容性。例如,当你在最新的游戏版本下打开了一个基游戏版本为1.16.100
的世界时,游戏只会加载1.16.100
版本的基础游戏内容,这包括下界更新以及之前游戏更新的内容,而不会加载1.17.0
版本及其之后的基础游戏内容,包括物品、方块、生物群系等,乃至在此之后的1.18.0
的新版世界生成器也不会应用,世界仍然以旧版世界生成器生成,旧版的自定义生物群系功能也可以正常发挥作用。
基游戏版本无需严格匹配,游戏引擎会通过语义版本之间的互相比较确定应该加载的基游戏内容。如果基游戏版本为*
,则游戏会以当前构建的游戏版本(的前三个版本号)作为基游戏版本加载基础游戏内容,即加载“迄今为止全部的游戏内容”。
引擎版本¶
游戏内加载和解析附加包并应用附加包内容的逻辑模块被称为基岩引擎(Bedrock Engine),这是一个抽象概念。引擎版本(Engine Version)用于表示基岩引擎的变化,确定解析的逻辑,防止附加包的兼容性错误。引擎版本是一个纯粹的语义版本,但只有前三个整数是有意义的,即主版本号
、次版本号
和补丁版本号
。
附加包可以在清单文件中定义一个最低引擎版本(Min Engine Version,min_engine_version
),以确保附加包不会被加载到不支持的引擎版本中。如果游戏引擎的版本(也就是当前构建的游戏版本的前三个版本号)低于附加包的最低引擎版本,游戏会拒绝加载附加包,以防止附加包的内容无法正常运行。此外,由于引擎版本的更新可能会导致附加包的内容无法正常运行,因此游戏在加载附加包时也不会以比最低引擎版本更高的引擎版本加载附加包。简而言之,游戏会以附加包定义的最低引擎版本为准加载附加包。
最低引擎版本影响附加包中的很多内容,例如Molang解释器的行为逻辑、命令的解析逻辑、实体的行为逻辑等。通常建议附加包的最低引擎版本设置为当前最新的游戏版本,但这也意味着开发者需要时刻关注在最新的引擎版本下,一些附加包内容的编写方式是否发生了变化。
每个实体可以在其定义文件中单独设置一个最低引擎版本,并同时定义不同的最低引擎版本的同一个实体,以确保游戏可以正确加载实体。具体的设置方法请查看相关参考文档。
格式版本¶
附加包中的几乎每个定义文件都有一个格式版本(Format Version)。清单文件中的格式版本是一个整数,用于标识清单文件的格式。其他文件中的格式版本都是一个语义版本,但只有前三个整数是有意义的,即主版本号
、次版本号
和补丁版本号
。
格式版本用于标识当前文件的格式,以便游戏可以正确解析文件内容。这里文件的格式专指游戏接口的解析格式,例如某个接口在一些格式版本下是一个整数,不允许填写浮点数,但是在另一些格式版本下允许填写浮点数。当游戏加载附加包时,会根据附加包中的格式版本来加载相应的文件解析逻辑,以保证附加包的正常运行。
格式版本只会影响到当前文件的解析逻辑,不会影响其他文件的解析逻辑,也不会影响不属于文件格式的内容,例如实体的行为逻辑、方块的行为逻辑、Molang的解释逻辑、命令的格式等。
注意
格式版本虽然形式上与游戏版本相似,但是两者的含义完全不同,不要混淆。此外,虽然引擎内会进行一些格式版本的比较,以供兼容性检查,但是格式版本永远不会与当前游戏版本互相比较,它与游戏版本完全无关。
命令版本¶
命令版本(Command Version)是一个用于标识命令的版本的概念。命令版本是一个整数,用于控制当前执行的命令的解析格式。当命令执行时,其上下文内会有一个命令版本,用于确定当前命令的解析逻辑。在以下场景中,命令版本会被使用:
- 玩家在聊天栏中、在服务端的控制台中输入命令时,命令版本会被设置为当前游戏最新的命令版本。不会受到所处世界的基游戏版本的影响。
- 命令方块在每一次保存时会读取当前游戏最新的命令版本并存储至NBT中,在命令方块激活时,以该保存的命令版本执行命令。
- 附加包中的命令会依赖于附加包的最低引擎版本。引擎版本和命令版本之间存在一个映射关系,附加包内的命令和函数会根据最低引擎版本确定其命令版本并执行。
网络协议版本¶
网络协议版本(Network Protocol Version)是一个用于标识网络协议的版本的概念,简称网络版本(Network Version)或协议版本(Protocol Version)。网络协议版本是一个整数,用于控制当前连接的网络协议的解析格式。当客户端与服务端建立连接时,会根据双方的网络协议版本来确定当前的连接是否可用。如果客户端和服务端的网络协议版本不相同,客户端将无法加入服务端游戏。网络协议版本用于控制网络数据的传输格式,以保证客户端与服务器端之间的通信正常进行。
Minecraft基岩版游戏不会保留旧版本的网络协议,因此在游戏更新后,旧版本的客户端将无法连接到新版本的服务端。关于各个游戏版本构建的网络协议版本,请查看相关参考文档。