按键与指令

基本信息

属性 值
按键数 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,它仍然由服务端注册。

关联