失焦暂停菜单抑制

基本信息

属性 值
文件 net/sxmaa/headlessnh/mixins/early/EntityRendererMixin.java
目标类 net.minecraft.client.renderer.EntityRenderer
注入方法 updateCameraAndRender
注入方式 @ModifyExpressionValue @MIXINEXTRAS:EXPRESSION
Mixin 集 PREVENT_OUT_OF_FOCUS(EARLY)
依赖 MixinExtras ≥ 0.5.0

这是 5 个 Mixin 中最小的一个,也是唯一一个开关语义「反着来」的。

它改了什么

原版 1.7.10 EntityRenderer.updateCameraAndRender 里有一段「窗口失焦 500 ms 就自动打开暂停菜单」的判断。无人值守的 CI 环境下窗口通常没有焦点,这会导致世界一加载就被暂停菜单挡住,自动化随即卡死。

Mixin 用 MixinExtras 的 @Definition + @Expression 定位到那个布尔表达式并整体改写返回值:

@Definition(id = "prevFrameTime", field = "Lnet/minecraft/client/renderer/EntityRenderer;prevFrameTime:J")
@Expression("? - this.prevFrameTime > 500")
@ModifyExpressionValue(method = "updateCameraAndRender", at = @At("MIXINEXTRAS:EXPRESSION"))
private boolean preventOutOfFocusIngameMenu(boolean original) {
    return !Boolean.getBoolean("headlessnh.forcefocus");
}

[!NOTE] ? 是 MixinExtras 的类型通配符,编译期被替换成实际比较左值的类型,因此不必硬编码 long/int。original(原表达式结果)被完全忽略,返回值只看系统属性——headlessnh.forcefocus 未设时返回 true,让「已经失焦超时」这个条件恒真,等于永不自动开暂停菜单。

属性语义

headlessnh.forcefocus 返回值 效果
未设(false) true 条件恒真 → 抑制失焦暂停菜单(默认)
true false 条件恒假 → 保留原版失焦开菜单行为

这个属性名读作「强制保留焦点行为」,与其余 headlessnh.* 「设为 true 即开启某功能」的惯例相反:其它属性是 X=true 表示启用自动化,而这里是 forcefocus=true 表示恢复原版行为。

前置条件

三个 mixins.headlessnh.*.json 配置里声明了 "mixinextras": {"minVersion": "0.5.0"}(只在 mixins.headlessnh.early.json 中),compatibilityLevel 为 JAVA_8,minVersion 为 0.8.5-GTNH。没有 MixinExtras 的环境无法应用本 Mixin。

相关条目