Extended Facing 对齐系统
基本信息
| 属性 | 值 |
|---|---|
| 核心枚举 | com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing |
| 辅助枚举 | Rotation、Flip |
| 接口 | com.gtnewhorizon.structurelib.alignment.IAlignment |
| 限制接口 | IAlignmentLimits / AlignmentLimits |
这是 StructureLib 表示"一个多方块结构件朝哪个方向、怎么转、怎么翻"的模型,比原版方块的 16 个 metadata 表达力强得多。
状态数量
对齐状态是 方向 × 旋转 × 翻转 的组合:
| 维度 | 取值 | 数量 |
|---|---|---|
方向(ForgeDirection) |
下、上、北、南、西、东 | 6 |
旋转(Rotation) |
无、顺时针 90°、180°、逆时针 90° | 4 |
翻转(Flip) |
无、水平、垂直、两者 | 4 |
合计 96 种状态,即 ExtendedFacing.STATES_COUNT 为 96,语言文件中也有 structurelib.facing.0 到 structurelib.facing.95 共 96 条名称。默认值是 NORTH_NORMAL_NONE(北 / 无旋转 / 无翻转)。
组合索引由 IAlignment.getAlignmentIndex 计算为 (方向序号 × 4 + 旋转序号) × 4 + 翻转序号。
IAlignment 接口
方块实体通过实现 IAlignment 暴露自身的对齐状态。工具交互相关的方法:
| 方法 | 作用 |
|---|---|
toolSetRotation(rotation) |
传 null 时循环尝试下一个旋转;传具体值时直接尝试该值 |
toolSetFlip(flip) |
传 null 时循环尝试下一个翻转;传具体值时直接尝试该值 |
isNewExtendedFacingValid / isNewRotationValid / isNewFlipValid |
由方块自己实现的合法性判定 |
canSetToDirectionAny(direction) |
该方向下是否存在任一合法状态 |
参数为 null 时的遍历是双重循环:先按翻转序号外层递增,再按旋转序号内层递增(内层起点是当前值 +1),逐个尝试直到某个状态通过合法性检查;全部失败返回 false。
这两个方法的默认实现都在 IAlignment 里,因此方块实体只需实现合法性判定方法即可获得完整的工具行为。对应的触发物品是 Front Rotation Tool。
IAlignmentLimits
用于限制允许的状态组合,是一个函数式接口 (direction, rotation, flip) -> boolean。预置常量:
| 常量 | 允许的范围 |
|---|---|
UNLIMITED |
全部 96 种 |
UPRIGHT |
方向无 Y 分量,即仅水平四向 |
NOT_UPSIDE_DOWN |
direction.offsetY != 0,即仅上下两向 |
FACING_UP |
仅 ForgeDirection.UP |
另有 allowOnly(ExtendedFacing...) 与 denyOnly(ExtendedFacing...) 两个静态工厂方法,以及一个 Builder(含 allowAll() / denyAll() 起点)用于组合更复杂的规则。
方向转换
ExtendedFacing.FOR_FACING 是一个 ForgeDirection → List<ExtendedFacing> 的映射,把 96 种状态按其方向分组,便于对某一朝向下的所有候选状态做遍历检查。
ExtendedFacing 还维护 NAME_LOOKUP(按名称反查),语言键 structurelib.facing.<0..95> 提供人类可读名,例如 down normal none、east counter clockwise。