按键与指令
基本信息
| 属性 | 值 |
|---|---|
| 按键数 | 1 |
| 按键 | L —— 切换光照覆盖层模式 |
| 按键分类 | InfoHUD.MODNAME = InfoHUD |
| 指令数 | 1 |
| 指令 | /hud —— 打开配置 GUI |
| 权限 | 不需要 OP(canCommandSenderUseCommand 显式返回 true) |
按键:光照覆盖层切换
keybinds/KeyBindHandler.java:18-32:
public static KeyBinding toggleLight = new KeyBinding(
tr("infohud.keybind.desc.light_overlay"),
Keyboard.KEY_L,
InfoHUD.MODNAME);
public KeyBindHandler() {
ClientRegistry.registerKeyBinding(toggleLight);
}
@SubscribeEvent
public void onKeyInput(InputEvent.KeyInputEvent event) {
if (toggleLight.isPressed()) {
LightLevelOverlayRenderer.toggleMode();
}
}
| 属性 | 值 | 行 |
|---|---|---|
| 字段名 | toggleLight(public static) |
18 |
| 默认键 | Keyboard.KEY_L |
20 |
| 分类 | InfoHUD.MODNAME → "InfoHUD" |
21 |
| 显示名 | tr("infohud.keybind.desc.light_overlay") → Toggle Light Overlay |
19 |
| 注册 | ClientRegistry.registerKeyBinding(...),在构造器里 |
24 |
| 监听 | InputEvent.KeyInputEvent |
28 |
唯一功能:调 LightLevelOverlayRenderer.toggleMode(),
在 5 个模式间循环(见 光照等级覆盖层)。
⚠️ 本 mod 只有一个按键。 HUD 本身没有开关按键——开关整个 HUD 要用配置项
HudConfig.hudGeneral.HudDisable(默认false), 只能在/hud配置界面里改,不能键盘切换。也就是说:不能一边玩一边用键盘开关 HUD,必须开配置界面。
📌 按键的
isPressed()在KeyInputEvent里调用—— 这是 Forge 1.7.10 的标准做法,没有 额外的「边沿检测」或冷却。
指令:/hud
commands/CommandHUD.java:
@Override
public String getCommandName() {
return "hud";
}
@Override
public String getCommandUsage(ICommandSender sender) {
return "/hud";
}
@Override
public void processCommand(ICommandSender sender, String[] args) {
try {
DelayedGuiDisplayTicker.create(new SimpleGuiConfig(null, MODID, MODNAME), 0);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean canCommandSenderUseCommand(ICommandSender sender) {
return true;
}
@Override
public List<String> addTabCompletionOptions(ICommandSender sender, String[] args) {
return Collections.emptyList();
}
(CommandHUD.java:17-44)
| 覆写 | 行 | 行为 |
|---|---|---|
getCommandName() |
17-20 |
"hud" |
getCommandUsage() |
22-25 |
"/hud"(无参数) |
processCommand() |
27-34 |
用 GTNHLib 的 SimpleGuiConfig 打开配置界面 |
canCommandSenderUseCommand() |
36-39 |
恒 true |
addTabCompletionOptions() |
41-44 |
恒返回 Collections.emptyList() |
关键特性
| 特性 | 说明 |
|---|---|
| 不需要 OP | canCommandSenderUseCommand 显式返回 true(37-38),任何玩家都能用 |
| 忽略所有参数 | processCommand 从不读 args——/hud xxx 与 /hud 效果相同 |
| 无 Tab 补全 | 恒空列表 |
| 延迟打开 | 经 DelayedGuiDisplayTicker.create(gui, 0),延迟 0 tick |
| 异常吞掉 | catch (Exception e) { e.printStackTrace(); }(31-32)——GUI 打不开只打堆栈,无聊天提示 |
📌
new SimpleGuiConfig(null, MODID, MODNAME)的第一个参数是null——不指定具体配置类,所以这个界面聚合本 mod 的全部 4 个配置文件 (正是ConfigRegister.init()注册的那 4 个)。 这也解释了为什么/hud是唯一的调整入口: 4 个配置文件(含那个文件名写错的)都通过它编辑。
与 /hud 无关的开关
| 想做的事 | 正确方式 |
|---|---|
| 开关整个 HUD | /hud → HUD General → HudDisable |
| 改光照层模式 | 按 L(比开界面快) |
| 开关经典条 | /hud → Classic Bar Settings → ClassicBarEnable |
| 调 HUD 缩放 | /hud → HUD General → HudScale(0.5–2.0) |
⚠️ 受 配置文件名冲突 影响,
Classic Bar Settings 与 Light Overlay Settings 可能在同一文件里互相覆盖。
客户端接线
ClientProxy / CommonProxy 负责按侧装配:
| 类 | 作用 |
|---|---|
ClientProxy |
客户端侧初始化(注册按键、Mixin 加载器等) |
CommonProxy |
服务端侧(空实现或最小实现) |
InfoHUD.java:26-29:
@SidedProxy(
clientSide = "com.gtnewhorizons.infohud.ClientProxy",
serverSide = "com.gtnewhorizons.infohud.CommonProxy")
public static CommonProxy proxy;
4 个生命周期(InfoHUD.java:31-49)全部转发给 proxy:
preInit / init / postInit / serverStarting。
/hud 的注册发生在 FMLServerStartingEvent
(InfoHUD.java:46-49 serverStarting)——
即便指令本身不需要 OP,它仍然由服务端注册。