流体模式切换热键
KeyEvents(core/client/KeyEvents.java)注册的第二个热键,控制魔杖遇到流体时是否继续扩展。
基本信息
| 属性 | 值 |
|---|---|
| 注册类 | portablejim.bbw.core.client.KeyEvents |
| 识别语言键 | bbw.key.fluidmode |
| 分类语言键 | bbw.key.category |
| 默认按键 | Keyboard.KEY_NONE(未绑定) |
| 中文名 | 转换流体模式 |
| 英文名 | Change Fluid Mode |
| 字段名 | keyBindingFluid |
与 模式切换热键 共用同一个 KeyEvents 实例、同一条
InputEvent 边沿检测逻辑、同一发包路径,仅语言键和初始状态字段不同
(isPressedFluid)。
⚠️ 默认未绑定,必须玩家自行在按键设置中指定。
客户端行为
与模式键共用一个 PacketWandActivate 包,两个 boolean 分别对应两个键:
PacketWandActivate packet = new PacketWandActivate(currentIsPressed, currentFluidIsPressed);
所以两个键在同一条包里传输,同一次边沿可能同时触发两个键的模式切换。
服务端行为
PacketWandActivate.Handler 收到后调用 nextFluidMode(itemStack, player),
回复聊天消息 bbw.chat.fluidmode.<当前模式名小写>。
nextFluidMode 的实现由物品类决定,因此三根魔杖的流体模式自由度不同:
| 物品类 | nextFluidMode() 实现 |
可达模式 |
|---|---|---|
ItemUnrestrictedWand |
STOPAT → IGNORE,IGNORE → STOPAT |
STOPAT、IGNORE |
ItemRestrictedWandAdvanced(Iron Wand) |
恒 setFluidMode(itemStack, EnumFluidLock.STOPAT) |
只有 STOPAT |
ItemRestrictedWandBasic(Stone Wand) |
恒 setFluidMode(itemStack, EnumFluidLock.STOPAT) |
只有 STOPAT |
⚠️ Stone Wand 和 Iron Wand 按下这个热键不会有任何效果,因为它们的
nextFluidMode()无条件写回STOPAT。只有 Diamond Wand 和 Unbreakable Wand 能在两种流体模式间切换。
两种模式的实际差异
差异发生在 BFS 的第一道过滤(WandWorker.shouldContinue):
| 模式 | mask | 遇到水/岩浆源块与流动块时 |
|---|---|---|
STOPAT |
1 | 判定为"非空气" → 拒绝该点 → 扩展在此终止 |
IGNORE |
2 | 判定为可覆盖 → 正常放置 → 继续向外 BFS |
IGNORE 匹配的范围包含 Forge 的 IFluidBlock(各 mod 的自定义流体)
和原版 BlockLiquid(水、岩浆),源码与 en_US.lang 的描述一致:
bbw.chat.fluidmode.ignore= “Fluid: Ignore - Builds through fluid (both source blocks and flowing blocks).”
| 模式 | 聊天消息(zh_CN) |
|---|---|
STOPAT |
流体模式:禁止 ——不会在流体中覆盖任何方块 |
IGNORE |
流体模式:忽略 ——会覆盖任何流体方块(包括源头和流动的部分) |
⚠️
IGNORE只放宽流体。其他非空气方块(墙、箱子、生物方块)依然会终止扩展。 它不是"穿透一切"模式。
相关条目
- 模式切换热键 - 同类的第一个热键
- EnumFluidLock - 两个枚举值的定义
- BFS 方块扩展算法 - 流体过滤在搜索中的位置
- 网络协议 -
PacketWandActivate包格式