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 |
✅ | ✅ | ✅ |
❌ 的含义是种子被拒绝,一个方块都不会放,而不是换一种铺法。
相关条目
- BFS 方块扩展算法 - 掩码在搜索中的实际用法
- 魔杖等级系统 - 各魔杖的锁定模式自由度
- EnumFluidLock - 另一套枚举
- 模式切换热键 - 触发
nextMode的热键 - KeyEvents 网络处理 - 模式切换的服务端执行