跳到正文
烈焰甘蔗Wiki

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,实际效果无差别。

相关条目

浏览全部模组