EnumFluidLock
EnumFluidLock 是 BetterBuildersWands 中控制魔杖遇到流体时行为的枚举类型。
它在 BFS 的第一道过滤(WandWorker.shouldContinue)中生效。
枚举值
| 枚举值 | Mask 值 | 说明 |
|---|---|---|
STOPAT |
1 | 遇到流体时停止扩展(默认) |
IGNORE |
2 | 覆盖流体并继续扩展 |
魔杖支持
| 魔杖 | 物品类 | nextFluidMode() 实现 |
可达模式 |
|---|---|---|---|
| Stone Wand | ItemRestrictedWandBasic |
恒 setFluidMode(…, STOPAT) |
仅 STOPAT |
| Iron Wand | ItemRestrictedWandAdvanced |
恒 setFluidMode(…, STOPAT) |
仅 STOPAT |
| Diamond Wand | ItemUnrestrictedWand |
STOPAT ⇄ IGNORE 轮转 |
两种 |
| Unbreakable Wand | ItemUnrestrictedWand |
STOPAT ⇄ IGNORE 轮转 |
两种 |
⚠️ Stone Wand 和 Iron Wand 无法切换到
IGNORE: 它们的nextFluidMode()无条件写回STOPAT,按下热键不会有任何效果。
使用方式
玩家通过 bbw.key.fluidmode 热键切换,客户端发 PacketWandActivate 包
(keyFluidActive 字段为真)到服务端,由服务端调用 nextFluidMode()
改写 NBT 并回复一条聊天消息。
⚠️ 该热键默认没有绑定任何按键(
Keyboard.KEY_NONE), 必须在选项 → 按键设置 → 模组一栏手动绑定。详见 流体模式切换热键。
行为说明
判定发生在 WandWorker.shouldContinue 的第一道关卡:
if (!world.blockIsAir(currentCandidate)) {
Block b = world.getBlock(currentCandidate);
if (!(fluidLock == EnumFluidLock.IGNORE
&& (b instanceof IFluidBlock || b instanceof BlockLiquid)))
return false;
}
STOPAT 模式(mask 1)
候选位置只要不是空气就拒绝,扩展在该点终止:
| 遇到的方块 | 结果 |
|---|---|
| 水 / 岩浆源块 | ❌ 拒绝,扩展终止 |
| 水 / 岩浆流动块 | ❌ 拒绝,扩展终止 |
| 任意其他非空气方块 | ❌ 拒绝,扩展终止 |
IGNORE 模式(mask 2)
只放宽流体,其他非空气方块仍然拒绝:
| 遇到的方块 | 结果 |
|---|---|
IFluidBlock(Forge 流体,含 mod 流体) |
✅ 覆盖并继续扩展 |
BlockLiquid(原版水/岩浆,源块与流动块) |
✅ 覆盖并继续扩展 |
| 任意其他非空气方块 | ❌ 拒绝,扩展终止 |
en_US.lang 的描述与实现一致:
bbw.chat.fluidmode.ignore= “Fluid: Ignore - Builds through fluid (both source blocks and flowing blocks).”
⚠️
IGNORE不是"穿透一切"模式 —— 墙、箱子、方块实体依然会终止扩展。
内部实现
fromMask(int inputMask) 方法通过位掩码从 1-2 范围获取枚举值:
public static EnumFluidLock fromMask(int inputMask) {
EnumFluidLock locks[] = { STOPAT, IGNORE };
int safeMask = inputMask & 3;
return locks[safeMask - 1];
}
⚠️ 与
EnumLock一样,下标是safeMask - 1,掩码 0 会越界。ItemBasicWand.getFluidMode()读不到fluidmask时用EnumFluidLock.STOPAT.mask= 1 兜底,不会传入 0。另注意
ItemBasicWand.setFluidMode()写入时用的是mode.mask & 7(而不是& 3), 属于实现上的宽掩码;由于值只有 1、2,实际效果无差别。
相关条目
- BFS 方块扩展算法 - 流体过滤在搜索中的位置
- EnumLock - 另一套方向枚举(7 个值)
- 流体模式切换热键 - 触发
nextFluidMode的热键 - 魔杖等级系统 - 各魔杖的流体模式自由度