跳到正文
烈焰甘蔗Wiki

模式切换热键

KeyEvents(core/client/KeyEvents.java)在客户端注册两个热键,默认都没有绑定任何按键。

基本信息

属性 值
注册类 portablejim.bbw.core.client.KeyEvents
注册时机 ClientProxy.RegisterEvents(),由 init 阶段调用
识别语言键 bbw.key.mode
分类语言键 bbw.key.category
默认按键 Keyboard.KEY_NONE(未绑定)
中文名 转换模式
英文名 Change Mode
分类中文名 更好的建筑法杖
分类英文名 Better Builders Wands

⚠️ 本 mod 不占用 V 或 B 之类的默认键位。玩家必须自己在 选项 → 按键设置 → 模组一栏手动绑定,否则模式永远无法切换。

客户端行为

KeyEvents 订阅 InputEvent,做的是边沿检测而不是"按下即触发":

boolean currentIsPressed = keyBinding.getIsKeyPressed();
if (currentIsPressed != isPressed || currentFluidIsPressed != isPressedFluid) {
    isPressed = currentIsPressed;
    PacketWandActivate packet = new PacketWandActivate(currentIsPressed, currentFluidIsPressed);
    BetterBuildersWandsMod.instance.networkWrapper.sendToServer(packet);
}
环节 行为
触发条件 状态发生变化时发包(current != previous)
数据内容 两个 boolean:keyActive(模式键)、keyFluidActive(流体键)
方向 客户端 → 服务端,discriminator 0
实际执行 服务端 PacketWandActivate.Handler 调用 nextMode() 改写 NBT

按住不放不会重复切换 —— 只有"松开后再按下"(或按下时正好从未按下状态变为按下) 才会产生一次边沿。这就是为什么必须"点按"而不是"长按"来循环模式。

一次包里同时携带两个键的状态,但服务端分别独立判断:

if (packetWandActivate.keyActive && … instanceof IWandItem)  → wandItem.nextMode(…)
if (packetWandActivate.keyFluidActive && … instanceof IWandItem) → wandItem.nextFluidMode(…)

两个判断都要求手持物品是本 mod 的魔杖,否则静默忽略(不报错)。

服务端反馈

切换成功后服务端回复一条聊天消息,键名为 bbw.chat.mode.<当前模式名小写>:

模式 聊天消息(zh_CN)
NORTHSOUTH 模式:北-南 ——从起始方块向南,北方向延伸
VERTICAL 模式:竖直 ——从起始方块向上,下延伸
VERTICALEASTWEST 模式:东-西(+竖直) ——从起始方块向东,西,上和下方向延伸
EASTWEST 模式:东-西 ——从起始方块向东,西方向延伸
HORIZONTAL 模式:水平 ——从起始方块向左,右延伸
VERTICALNORTHSOUTH 模式:北-南(+竖直) ——从起始方块向南,北,上和下方向延伸
NOLOCK 模式:无锁定 ——从起始方块向左,右,上和下延伸

由于该消息只发给发包的那个玩家,多人游戏中他人看不到你的模式变更。

每根魔杖切换后的实际结果

魔杖 按一次的结果
Stone Wand 恒为 HORIZONTAL,按了没反应
Iron Wand HORIZONTAL ⇄ VERTICAL
Diamond Wand 7 模式轮转
Unbreakable Wand 7 模式轮转

完整轮转顺序见 魔杖等级系统。

相关条目

浏览全部模组