模式切换热键
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 模式轮转 |
完整轮转顺序见 魔杖等级系统。