跳转至

方块置换

方块置换(Block Permutation)是由一个方块标识符及其全部方块状态取值共同确定的完整方块状态。方块置换描述的是“某一种方块在某一组状态下的具体形态”,是游戏在世界中识别方块实际表现的重要单位。

概述

一个方块标识符可以对应多个方块置换。例如,同一个楼梯方块可以根据朝向、上下半部和转角状态形成多种置换;同一个自定义机器方块也可以根据朝向和启用状态形成不同置换。每个置换仍然属于同一种方块,但其组件、外观或行为可以不同。

方块置换不是独立的方块类型。它依附于方块标识符和方块状态系统存在,不能脱离方块本身单独注册。

置换条件

在自定义方块定义中,permutations字段用于为特定状态组合指定额外组件。每个置换条目通常包含一个条件和一组组件。条件成立时,该组组件会应用到当前方块状态对应的置换上。

置换条件通常使用Molang表达式编写,并通过query.block_state()等方式读取方块状态的值。判定输入既可以来自开发者自行声明的自定义状态,也可以来自方块特质启用的原版状态。例如,开发者可以根据方块的朝向选择不同的几何体旋转,或根据开关状态改变光照、材质和碰撞箱。

组件合并

方块定义中的基础组件适用于该方块的所有置换,而permutations字段中的组件只在条件满足时应用。置换组件可以覆盖或补充基础组件,从而使同一方块在不同状态下表现出不同的行为。

多个置换条件可能同时成立。具体的合并结果取决于游戏对该格式版本的解析规则,因此应尽量避免多个置换同时修改同一组件,以降低定义歧义。

存储与同步

世界中保存的方块需要能够还原为确定的方块置换。对于普通方块,标识符和状态值足以表达其完整形态;对于需要额外复杂数据的方块,则还需要方块实体保存补充信息。

客户端渲染、服务端逻辑、命令检测和脚本API通常都会围绕方块置换读取方块的实际状态。脚本API中的BlockPermutation类型即用于表示这种完整状态。

与变种的关系

方块置换可以表达同一方块内部的变种,但并不等同于任意意义上的内容变种。若多个形态在语义上属于完全不同的方块,或需要被配方、战利品表、命令和玩家明确区分,使用独立标识符往往比使用方块状态更清晰。

合理的做法是:将“同一种方块的放置形态或运行状态”设计为方块状态和置换,将“不同种类的方块”设计为不同标识符。