跳到正文
烈焰甘蔗Wiki

EnumLock

EnumLock 是 BetterBuildersWands 中控制魔杖扩展方向的枚举类型, 在 WandWorker 的 BFS 阶段被当作位掩码使用。

枚举值

枚举值 Mask 值 说明
NORTHSOUTH 1 只能在南北方向(-Z/+Z)扩展
VERTICAL 2 只能在垂直方向(Y 轴)扩展
VERTICALEASTWEST 3 垂直 + 东西方向(Y + X 轴)
EASTWEST 4 只能在东西方向(-X/+X)扩展
HORIZONTAL 5 水平面扩展(NORTHSOUTH + EASTWEST)
VERTICALNORTHSOUTH 6 垂直 + 南北方向(Y + Z 轴)
NOLOCK 7 无限制,全方向扩展

Mask 对照

Mask Bit 方向
1 (LSB) NORTH_SOUTH_MASK
2 UP_DOWN_MASK
4 (MSB) EAST_WEST_MASK

魔杖支持

EnumLock 有两个用途:getMode() 决定面内扩展方向, getFaceLock() 决定是否允许在点中的那个面上放置。两者共用同一枚举。

魔杖 getMode() 可切换值 getFaceLock() 返回值
Stone Wand HORIZONTAL(不可更改) 恒 HORIZONTAL
Iron Wand HORIZONTAL、VERTICAL 恒 NOLOCK
Diamond Wand 全部 7 种 模式为 HORIZONTAL 时 HORIZONTAL,否则 NOLOCK
Unbreakable Wand 全部 7 种 模式为 HORIZONTAL 时 HORIZONTAL,否则 NOLOCK

使用方式

玩家通过 bbw.key.mode 热键循环切换锁定模式,客户端发 PacketWandActivate 包到服务端,由服务端调用 nextMode() 改写 NBT。

⚠️ 该热键默认没有绑定任何按键(Keyboard.KEY_NONE), 必须在选项 → 按键设置 → 模组一栏手动绑定。详见 模式切换热键。

Stone Wand / Iron Wand 的 nextFluidMode() 类似地写死,导致 EnumFluidLock.IGNORE 对它们不可达(见 EnumFluidLock)。

内部实现

fromMask(int inputMask) 方法通过位掩码从 1-7 范围安全获取枚举值:

public static EnumLock fromMask(int inputMask) {
    EnumLock locks[] = { NORTHSOUTH, VERTICAL, VERTICALEASTWEST, EASTWEST,
                         HORIZONTAL, VERTICALNORTHSOUTH, NOLOCK };
    int safeMask = inputMask & 7;
    return locks[safeMask - 1];
}

⚠️ 数组下标是 safeMask - 1,所以掩码 0 会导致 ArrayIndexOutOfBoundsException。 实际调用方(ItemBasicWand.getMode)读不到 mask 时会用 EnumLock.NOLOCK.mask = 7 兜底, 不会传入 0。

setMode() 写入时做了 mode.mask & 7 归一化。

形状对照

mask 的三个位决定面内可扩展方向(BFS 阶段使用):

模式 mask 二进制 面内可扩展方向 铺出的形状
NORTHSOUTH 1 001 仅南北 一条线
VERTICAL 2 010 仅上下 一条线
VERTICALEASTWEST 3 011 上下 + 东西 竖墙(含东西)
EASTWEST 4 100 仅东西 一条线
HORIZONTAL 5 101 南北 + 东西 3×3 整层 / 十字墙
VERTICALNORTHSOUTH 6 110 南北 + 上下 竖墙(含南北)
NOLOCK 7 111 上下 + 南北 + 东西 3×3 整层 / 十字墙

各模式在点击不同面时的可用性(种子判定):

模式 点顶/底面 点北/南面 点东/西面
HORIZONTAL ❌ ✅ ✅
VERTICAL ❌ ✅ ✅
NORTHSOUTH ✅ ❌ ✅
EASTWEST ✅ ✅ ❌
VERTICALNORTHSOUTH ✅ ✅ ✅
VERTICALEASTWEST ✅ ✅ ✅
NOLOCK ✅ ✅ ✅

❌ 的含义是种子被拒绝,一个方块都不会放,而不是换一种铺法。

相关条目

浏览全部模组