失焦暂停菜单抑制
基本信息
| 属性 | 值 |
|---|---|
| 文件 | 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。
相关条目
- System Properties -
headlessnh.forcefocus的完整属性表 - MinecraftMixin - 被抑制掉的暂停菜单也由该 Mixin 的分支兜底处理
- Mixin 加载与 Access Transformer - mixin 配置与 coremod